packaging: update homepage url
[platform/upstream/elfutils.git] / libcpu / i386_parse.y
1 %{
2 /* Parser for i386 CPU description.
3    Copyright (C) 2004, 2005, 2007, 2008, 2009 Red Hat, Inc.
4    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
5
6    This file is free software; you can redistribute it and/or modify
7    it under the terms of either
8
9      * the GNU Lesser General Public License as published by the Free
10        Software Foundation; either version 3 of the License, or (at
11        your option) any later version
12
13    or
14
15      * the GNU General Public License as published by the Free
16        Software Foundation; either version 2 of the License, or (at
17        your option) any later version
18
19    or both in parallel, as here.
20
21    elfutils is distributed in the hope that it will be useful, but
22    WITHOUT ANY WARRANTY; without even the implied warranty of
23    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24    General Public License for more details.
25
26    You should have received copies of the GNU General Public License and
27    the GNU Lesser General Public License along with this program.  If
28    not, see <http://www.gnu.org/licenses/>.  */
29
30 #ifdef HAVE_CONFIG_H
31 # include <config.h>
32 #endif
33
34 #include <assert.h>
35 #include <ctype.h>
36 #include <errno.h>
37 #include <error.h>
38 #include <inttypes.h>
39 #include <libintl.h>
40 #include <math.h>
41 #include <obstack.h>
42 #include <search.h>
43 #include <stdbool.h>
44 #include <stdio.h>
45 #include <stdlib.h>
46 #include <string.h>
47 #include <sys/param.h>
48
49 #include <system.h>
50
51 #define obstack_chunk_alloc xmalloc
52 #define obstack_chunk_free free
53
54 /* The error handler.  */
55 static void yyerror (const char *s);
56
57 extern int yylex (void);
58 extern int i386_lineno;
59 extern char *infname;
60
61
62 struct known_bitfield
63 {
64   char *name;
65   unsigned long int bits;
66   int tmp;
67 };
68
69
70 struct bitvalue
71 {
72   enum bittype { zeroone, field, failure } type;
73   union
74   {
75     unsigned int value;
76     struct known_bitfield *field;
77   };
78   struct bitvalue *next;
79 };
80
81
82 struct argname
83 {
84   enum nametype { string, nfield } type;
85   union
86   {
87     char *str;
88     struct known_bitfield *field;
89   };
90   struct argname *next;
91 };
92
93
94 struct argument
95 {
96   struct argname *name;
97   struct argument *next;
98 };
99
100
101 struct instruction
102 {
103   /* The byte encoding.  */
104   struct bitvalue *bytes;
105
106   /* Prefix possible.  */
107   int repe;
108   int rep;
109
110   /* Mnemonic.  */
111   char *mnemonic;
112
113   /* Suffix.  */
114   enum { suffix_none = 0, suffix_w, suffix_w0, suffix_W, suffix_tttn,
115          suffix_w1, suffix_W1, suffix_D } suffix;
116
117   /* Flag set if modr/m is used.  */
118   int modrm;
119
120   /* Operands.  */
121   struct operand
122   {
123     char *fct;
124     char *str;
125     int off1;
126     int off2;
127     int off3;
128   } operands[3];
129
130   struct instruction *next;
131 };
132
133
134 struct synonym
135 {
136   char *from;
137   char *to;
138 };
139
140
141 struct suffix
142 {
143   char *name;
144   int idx;
145 };
146
147
148 struct argstring
149 {
150   char *str;
151   int idx;
152   int off;
153 };
154
155
156 static struct known_bitfield ax_reg =
157   {
158     .name = "ax", .bits = 0, .tmp = 0
159   };
160
161 static struct known_bitfield dx_reg =
162   {
163     .name = "dx", .bits = 0, .tmp = 0
164   };
165
166 static struct known_bitfield di_reg =
167   {
168     .name = "es_di", .bits = 0, .tmp = 0
169   };
170
171 static struct known_bitfield si_reg =
172   {
173     .name = "ds_si", .bits = 0, .tmp = 0
174   };
175
176 static struct known_bitfield bx_reg =
177   {
178     .name = "ds_bx", .bits = 0, .tmp = 0
179   };
180
181
182 static int bitfield_compare (const void *p1, const void *p2);
183 static void new_bitfield (char *name, unsigned long int num);
184 static void check_bits (struct bitvalue *value);
185 static int check_duplicates (struct bitvalue *val);
186 static int check_argsdef (struct bitvalue *bitval, struct argument *args);
187 static int check_bitsused (struct bitvalue *bitval,
188                            struct known_bitfield *suffix,
189                            struct argument *args);
190 static struct argname *combine (struct argname *name);
191 static void fillin_arg (struct bitvalue *bytes, struct argname *name,
192                         struct instruction *instr, int n);
193 static void find_numbers (void);
194 static int compare_syn (const void *p1, const void *p2);
195 static int compare_suf (const void *p1, const void *p2);
196 static void instrtable_out (void);
197 #if 0
198 static void create_mnemonic_table (void);
199 #endif
200
201 static void *bitfields;
202 static struct instruction *instructions;
203 static size_t ninstructions;
204 static void *synonyms;
205 static void *suffixes;
206 static int nsuffixes;
207 static void *mnemonics;
208 size_t nmnemonics;
209 extern FILE *outfile;
210
211 /* Number of bits used mnemonics.  */
212 #if 0
213 static size_t best_mnemonic_bits;
214 #endif
215 %}
216
217 %union {
218   unsigned long int num;
219   char *str;
220   char ch;
221   struct known_bitfield *field;
222   struct bitvalue *bit;
223   struct argname *name;
224   struct argument *arg;
225 }
226
227 %token kMASK
228 %token kPREFIX
229 %token kSUFFIX
230 %token kSYNONYM
231 %token <str> kID
232 %token <num> kNUMBER
233 %token kPERCPERC
234 %token <str> kBITFIELD
235 %token <ch> kCHAR
236 %token kSPACE
237
238 %type <bit> bit byte bytes
239 %type <field> bitfieldopt
240 %type <name> argcomp arg
241 %type <arg> args optargs
242
243 %defines
244
245 %%
246
247 spec:             masks kPERCPERC '\n' instrs
248                     {
249                       if (error_message_count != 0)
250                         error (EXIT_FAILURE, 0,
251                                "terminated due to previous error");
252
253                       instrtable_out ();
254                     }
255                 ;
256
257 masks:            masks '\n' mask
258                 | mask
259                 ;
260
261 mask:             kMASK kBITFIELD kNUMBER
262                     { new_bitfield ($2, $3); }
263                 | kPREFIX kBITFIELD
264                     { new_bitfield ($2, -1); }
265                 | kSUFFIX kBITFIELD
266                     { new_bitfield ($2, -2); }
267                 | kSYNONYM kBITFIELD kBITFIELD
268                     {
269                       struct synonym *newp = xmalloc (sizeof (*newp));
270                       newp->from = $2;
271                       newp->to = $3;
272                       if (tfind (newp, &synonyms, compare_syn) != NULL)
273                         error (0, 0,
274                                "%d: duplicate definition for synonym '%s'",
275                                i386_lineno, $2);
276                       else if (tsearch ( newp, &synonyms, compare_syn) == NULL)
277                         error (EXIT_FAILURE, 0, "tsearch");
278                     }
279                 |
280                 ;
281
282 instrs:           instrs '\n' instr
283                 | instr
284                 ;
285
286 instr:            bytes ':' bitfieldopt kID bitfieldopt optargs
287                     {
288                       if ($3 != NULL && strcmp ($3->name, "RE") != 0
289                           && strcmp ($3->name, "R") != 0)
290                         {
291                           error (0, 0, "%d: only 'R' and 'RE' prefix allowed",
292                                  i386_lineno - 1);
293                         }
294                       if (check_duplicates ($1) == 0
295                           && check_argsdef ($1, $6) == 0
296                           && check_bitsused ($1, $5, $6) == 0)
297                         {
298                           struct instruction *newp = xcalloc (sizeof (*newp),
299                                                               1);
300                           if ($3 != NULL)
301                             {
302                               if (strcmp ($3->name, "RE") == 0)
303                                 newp->repe = 1;
304                               else if (strcmp ($3->name, "R") == 0)
305                                 newp->rep = 1;
306                             }
307
308                           newp->bytes = $1;
309                           newp->mnemonic = $4;
310                           if (newp->mnemonic != (void *) -1l
311                               && tfind ($4, &mnemonics,
312                                         (comparison_fn_t) strcmp) == NULL)
313                             {
314                               if (tsearch ($4, &mnemonics,
315                                            (comparison_fn_t) strcmp) == NULL)
316                                 error (EXIT_FAILURE, errno, "tsearch");
317                               ++nmnemonics;
318                             }
319
320                           if ($5 != NULL)
321                             {
322                               if (strcmp ($5->name, "w") == 0)
323                                 newp->suffix = suffix_w;
324                               else if (strcmp ($5->name, "w0") == 0)
325                                 newp->suffix = suffix_w0;
326                               else if (strcmp ($5->name, "tttn") == 0)
327                                 newp->suffix = suffix_tttn;
328                               else if (strcmp ($5->name, "w1") == 0)
329                                 newp->suffix = suffix_w1;
330                               else if (strcmp ($5->name, "W") == 0)
331                                 newp->suffix = suffix_W;
332                               else if (strcmp ($5->name, "W1") == 0)
333                                 newp->suffix = suffix_W1;
334                               else if (strcmp ($5->name, "D") == 0)
335                                 newp->suffix = suffix_D;
336                               else
337                                 error (EXIT_FAILURE, 0,
338                                        "%s: %d: unknown suffix '%s'",
339                                        infname, i386_lineno - 1, $5->name);
340
341                               struct suffix search = { .name = $5->name };
342                               if (tfind (&search, &suffixes, compare_suf)
343                                   == NULL)
344                                 {
345                                   struct suffix *ns = xmalloc (sizeof (*ns));
346                                   ns->name = $5->name;
347                                   ns->idx = ++nsuffixes;
348                                   if (tsearch (ns, &suffixes, compare_suf)
349                                       == NULL)
350                                     error (EXIT_FAILURE, errno, "tsearch");
351                                 }
352                             }
353
354                           struct argument *args = $6;
355                           int n = 0;
356                           while (args != NULL)
357                             {
358                               fillin_arg ($1, args->name, newp, n);
359
360                               args = args->next;
361                               ++n;
362                             }
363
364                           newp->next = instructions;
365                           instructions = newp;
366                           ++ninstructions;
367                         }
368                     }
369                 |
370                 ;
371
372 bitfieldopt:      kBITFIELD
373                     {
374                       struct known_bitfield search;
375                       search.name = $1;
376                       struct known_bitfield **res;
377                       res = tfind (&search, &bitfields, bitfield_compare);
378                       if (res == NULL)
379                         {
380                           error (0, 0, "%d: unknown bitfield '%s'",
381                                  i386_lineno, search.name);
382                           $$ = NULL;
383                         }
384                       else
385                         $$ = *res;
386                     }
387                 |
388                     { $$ = NULL; }
389                 ;
390
391 bytes:            bytes ',' byte
392                     {
393                       check_bits ($3);
394
395                       struct bitvalue *runp = $1;
396                       while (runp->next != NULL)
397                         runp = runp->next;
398                       runp->next = $3;
399                       $$ = $1;
400                     }
401                 | byte
402                     {
403                       check_bits ($1);
404                       $$ = $1;
405                     }
406                 ;
407
408 byte:             byte bit
409                     {
410                       struct bitvalue *runp = $1;
411                       while (runp->next != NULL)
412                         runp = runp->next;
413                       runp->next = $2;
414                       $$ = $1;
415                     }
416                 | bit
417                     { $$ = $1; }
418                 ;
419
420 bit:              '0'
421                     {
422                       $$ = xmalloc (sizeof (struct bitvalue));
423                       $$->type = zeroone;
424                       $$->value = 0;
425                       $$->next = NULL;
426                     }
427                 | '1'
428                     {
429                       $$ = xmalloc (sizeof (struct bitvalue));
430                       $$->type = zeroone;
431                       $$->value = 1;
432                       $$->next = NULL;
433                     }
434                 | kBITFIELD
435                     {
436                       $$ = xmalloc (sizeof (struct bitvalue));
437                       struct known_bitfield search;
438                       search.name = $1;
439                       struct known_bitfield **res;
440                       res = tfind (&search, &bitfields, bitfield_compare);
441                       if (res == NULL)
442                         {
443                           error (0, 0, "%d: unknown bitfield '%s'",
444                                  i386_lineno, search.name);
445                           $$->type = failure;
446                         }
447                       else
448                         {
449                           $$->type = field;
450                           $$->field = *res;
451                         }
452                       $$->next = NULL;
453                     }
454                 ;
455
456 optargs:          kSPACE args
457                     { $$ = $2; }
458                 |
459                     { $$ = NULL; }
460                 ;
461
462 args:             args ',' arg
463                     {
464                       struct argument *runp = $1;
465                       while (runp->next != NULL)
466                         runp = runp->next;
467                       runp->next = xmalloc (sizeof (struct argument));
468                       runp->next->name = combine ($3);
469                       runp->next->next = NULL;
470                       $$ = $1;
471                     }
472                 | arg
473                     {
474                       $$ = xmalloc (sizeof (struct argument));
475                       $$->name = combine ($1);
476                       $$->next = NULL;
477                     }
478                 ;
479
480 arg:              arg argcomp
481                     {
482                       struct argname *runp = $1;
483                       while (runp->next != NULL)
484                         runp = runp->next;
485                       runp->next = $2;
486                       $$ = $1;
487                     }
488                 | argcomp
489                     { $$ = $1; }
490                 ;
491 argcomp:          kBITFIELD
492                     {
493                       $$ = xmalloc (sizeof (struct argname));
494                       $$->type = nfield;
495                       $$->next = NULL;
496
497                       struct known_bitfield search;
498                       search.name = $1;
499                       struct known_bitfield **res;
500                       res = tfind (&search, &bitfields, bitfield_compare);
501                       if (res == NULL)
502                         {
503                           if (strcmp ($1, "ax") == 0)
504                             $$->field = &ax_reg;
505                           else if (strcmp ($1, "dx") == 0)
506                             $$->field = &dx_reg;
507                           else if (strcmp ($1, "es_di") == 0)
508                             $$->field = &di_reg;
509                           else if (strcmp ($1, "ds_si") == 0)
510                             $$->field = &si_reg;
511                           else if (strcmp ($1, "ds_bx") == 0)
512                             $$->field = &bx_reg;
513                           else
514                             {
515                               error (0, 0, "%d: unknown bitfield '%s'",
516                                      i386_lineno, search.name);
517                               $$->field = NULL;
518                             }
519                         }
520                       else
521                         $$->field = *res;
522                     }
523                 | kCHAR
524                     {
525                       $$ = xmalloc (sizeof (struct argname));
526                       $$->type = string;
527                       $$->next = NULL;
528                       $$->str = xmalloc (2);
529                       $$->str[0] = $1;
530                       $$->str[1] = '\0';
531                     }
532                 | kID
533                     {
534                       $$ = xmalloc (sizeof (struct argname));
535                       $$->type = string;
536                       $$->next = NULL;
537                       $$->str = $1;
538                     }
539                 | ':'
540                     {
541                       $$ = xmalloc (sizeof (struct argname));
542                       $$->type = string;
543                       $$->next = NULL;
544                       $$->str = xmalloc (2);
545                       $$->str[0] = ':';
546                       $$->str[1] = '\0';
547                     }
548                 ;
549
550 %%
551
552 static void
553 yyerror (const char *s)
554 {
555   error (0, 0, gettext ("while reading i386 CPU description: %s at line %d"),
556          gettext (s), i386_lineno);
557 }
558
559
560 static int
561 bitfield_compare (const void *p1, const void *p2)
562 {
563   struct known_bitfield *f1 = (struct known_bitfield *) p1;
564   struct known_bitfield *f2 = (struct known_bitfield *) p2;
565
566   return strcmp (f1->name, f2->name);
567 }
568
569
570 static void
571 new_bitfield (char *name, unsigned long int num)
572 {
573   struct known_bitfield *newp = xmalloc (sizeof (struct known_bitfield));
574   newp->name = name;
575   newp->bits = num;
576   newp->tmp = 0;
577
578   if (tfind (newp, &bitfields, bitfield_compare) != NULL)
579     {
580       error (0, 0, "%d: duplicated definition of bitfield '%s'",
581              i386_lineno, name);
582       free (name);
583       return;
584     }
585
586   if (tsearch (newp, &bitfields, bitfield_compare) == NULL)
587     error (EXIT_FAILURE, errno, "%d: cannot insert new bitfield '%s'",
588            i386_lineno, name);
589 }
590
591
592 /* Check that the number of bits is a multiple of 8.  */
593 static void
594 check_bits (struct bitvalue *val)
595 {
596   struct bitvalue *runp = val;
597   unsigned int total = 0;
598
599   while (runp != NULL)
600     {
601       if (runp->type == zeroone)
602         ++total;
603       else if (runp->field == NULL)
604         /* No sense doing anything, the field is not known.  */
605         return;
606       else
607         total += runp->field->bits;
608
609       runp = runp->next;
610     }
611
612   if (total % 8 != 0)
613     {
614       struct obstack os;
615       obstack_init (&os);
616
617       while (val != NULL)
618         {
619           if (val->type == zeroone)
620             obstack_printf (&os, "%u", val->value);
621           else
622             obstack_printf (&os, "{%s}", val->field->name);
623           val = val->next;
624         }
625       obstack_1grow (&os, '\0');
626
627       error (0, 0, "%d: field '%s' not a multiple of 8 bits in size",
628              i386_lineno, (char *) obstack_finish (&os));
629
630       obstack_free (&os, NULL);
631     }
632 }
633
634
635 static int
636 check_duplicates (struct bitvalue *val)
637 {
638   static int testcnt;
639   ++testcnt;
640
641   int result = 0;
642   while (val != NULL)
643     {
644       if (val->type == field && val->field != NULL)
645         {
646           if (val->field->tmp == testcnt)
647             {
648               error (0, 0, "%d: bitfield '%s' used more than once",
649                      i386_lineno - 1, val->field->name);
650               result = 1;
651             }
652           val->field->tmp = testcnt;
653         }
654
655       val = val->next;
656     }
657
658   return result;
659 }
660
661
662 static int
663 check_argsdef (struct bitvalue *bitval, struct argument *args)
664 {
665   int result = 0;
666
667   while (args != NULL)
668     {
669       for (struct argname *name = args->name; name != NULL; name = name->next)
670         if (name->type == nfield && name->field != NULL
671             && name->field != &ax_reg && name->field != &dx_reg
672             && name->field != &di_reg && name->field != &si_reg
673             && name->field != &bx_reg)
674           {
675             struct bitvalue *runp = bitval;
676
677             while (runp != NULL)
678               if (runp->type == field && runp->field == name->field)
679                 break;
680               else
681                 runp = runp->next;
682
683             if (runp == NULL)
684               {
685                 error (0, 0, "%d: unknown bitfield '%s' used in output format",
686                        i386_lineno - 1, name->field->name);
687                 result = 1;
688               }
689           }
690
691       args = args->next;
692     }
693
694   return result;
695 }
696
697
698 static int
699 check_bitsused (struct bitvalue *bitval, struct known_bitfield *suffix,
700                 struct argument *args)
701 {
702   int result = 0;
703
704   while (bitval != NULL)
705     {
706       if (bitval->type == field && bitval->field != NULL
707           && bitval->field != suffix
708           /* {w} is handled special.  */
709           && strcmp (bitval->field->name, "w") != 0)
710         {
711           struct argument *runp;
712           for (runp = args; runp != NULL; runp = runp->next)
713             {
714               struct argname *name = runp->name;
715
716               while (name != NULL)
717                 if (name->type == nfield && name->field == bitval->field)
718                   break;
719                 else
720                   name = name->next;
721
722               if (name != NULL)
723                 break;
724             }
725
726 #if 0
727           if (runp == NULL)
728             {
729               error (0, 0, "%d: bitfield '%s' not used",
730                      i386_lineno - 1, bitval->field->name);
731               result = 1;
732             }
733 #endif
734         }
735
736       bitval = bitval->next;
737     }
738
739   return result;
740 }
741
742
743 static struct argname *
744 combine (struct argname *name)
745 {
746   struct argname *last_str = NULL;
747   for (struct argname *runp = name; runp != NULL; runp = runp->next)
748     {
749       if (runp->type == string)
750         {
751           if (last_str == NULL)
752             last_str = runp;
753           else
754             {
755               last_str->str = xrealloc (last_str->str,
756                                         strlen (last_str->str)
757                                         + strlen (runp->str) + 1);
758               strcat (last_str->str, runp->str);
759               last_str->next = runp->next;
760             }
761         }
762       else
763         last_str = NULL;
764     }
765   return name;
766 }
767
768
769 #define obstack_grow_str(ob, str) obstack_grow (ob, str, strlen (str))
770
771
772 static void
773 fillin_arg (struct bitvalue *bytes, struct argname *name,
774             struct instruction *instr, int n)
775 {
776   static struct obstack ob;
777   static int initialized;
778   if (! initialized)
779     {
780       initialized = 1;
781       obstack_init (&ob);
782     }
783
784   struct argname *runp = name;
785   int cnt = 0;
786   while (runp != NULL)
787     {
788       /* We ignore strings in the function name.  */
789       if (runp->type == string)
790         {
791           if (instr->operands[n].str != NULL)
792             error (EXIT_FAILURE, 0,
793                    "%d: cannot have more than one string parameter",
794                    i386_lineno - 1);
795
796           instr->operands[n].str = runp->str;
797         }
798       else
799         {
800           assert (runp->type == nfield);
801
802           /* Construct the function name.  */
803           if (cnt++ > 0)
804             obstack_1grow (&ob, '$');
805
806           if (runp->field == NULL)
807             /* Add some string which contains invalid characters.  */
808             obstack_grow_str (&ob, "!!!INVALID!!!");
809           else
810             {
811               char *fieldname = runp->field->name;
812
813               struct synonym search = { .from = fieldname };
814
815               struct synonym **res = tfind (&search, &synonyms, compare_syn);
816               if (res != NULL)
817                 fieldname = (*res)->to;
818
819               obstack_grow_str (&ob, fieldname);
820             }
821
822           /* Now compute the bit offset of the field.  */
823           struct bitvalue *b = bytes;
824           int bitoff = 0;
825           if (runp->field != NULL)
826             while (b != NULL)
827               {
828                 if (b->type == field && b->field != NULL)
829                   {
830                     if (strcmp (b->field->name, runp->field->name) == 0)
831                       break;
832                     bitoff += b->field->bits;
833                   }
834                 else
835                   ++bitoff;
836
837                 b = b->next;
838               }
839           if (instr->operands[n].off1 == 0)
840             instr->operands[n].off1 = bitoff;
841           else if (instr->operands[n].off2 == 0)
842             instr->operands[n].off2 = bitoff;
843           else if (instr->operands[n].off3 == 0)
844             instr->operands[n].off3 = bitoff;
845           else
846             error (EXIT_FAILURE, 0,
847                    "%d: cannot have more than three fields in parameter",
848                    i386_lineno - 1);
849
850           if  (runp->field != NULL
851                && strncasecmp (runp->field->name, "mod", 3) == 0)
852             instr->modrm = 1;
853         }
854
855       runp = runp->next;
856     }
857   if (obstack_object_size (&ob) == 0)
858     obstack_grow_str (&ob, "string");
859   obstack_1grow (&ob, '\0');
860   char *fct = obstack_finish (&ob);
861
862   instr->operands[n].fct = fct;
863 }
864
865
866 #if 0
867 static void
868 nameout (const void *nodep, VISIT value, int level)
869 {
870   if (value == leaf || value == postorder)
871     printf ("  %s\n", *(const char **) nodep);
872 }
873 #endif
874
875
876 static int
877 compare_argstring (const void *p1, const void *p2)
878 {
879   const struct argstring *a1 = (const struct argstring *) p1;
880   const struct argstring *a2 = (const struct argstring *) p2;
881
882   return strcmp (a1->str, a2->str);
883 }
884
885
886 static int maxoff[3][3];
887 static int minoff[3][3] = { { 1000, 1000, 1000 },
888                             { 1000, 1000, 1000 },
889                             { 1000, 1000, 1000 } };
890 static int nbitoff[3][3];
891 static void *fct_names[3];
892 static int nbitfct[3];
893 static int nbitsuf;
894 static void *strs[3];
895 static int nbitstr[3];
896 static int total_bits = 2;      // Already counted the rep/repe bits.
897
898 static void
899 find_numbers (void)
900 {
901   int nfct_names[3] = { 0, 0, 0 };
902   int nstrs[3] = { 0, 0, 0 };
903
904   /* We reverse the order of the instruction list while processing it.
905      Later phases need it in the order in which the input file has
906      them.  */
907   struct instruction *reversed = NULL;
908
909   struct instruction *runp = instructions;
910   while (runp != NULL)
911     {
912       for (int i = 0; i < 3; ++i)
913         if (runp->operands[i].fct != NULL)
914           {
915             struct argstring search = { .str = runp->operands[i].fct };
916             if (tfind (&search, &fct_names[i], compare_argstring) == NULL)
917               {
918                 struct argstring *newp = xmalloc (sizeof (*newp));
919                 newp->str = runp->operands[i].fct;
920                 newp->idx = 0;
921                 if (tsearch (newp, &fct_names[i], compare_argstring) == NULL)
922                   error (EXIT_FAILURE, errno, "tsearch");
923                 ++nfct_names[i];
924               }
925
926             if (runp->operands[i].str != NULL)
927               {
928                 search.str = runp->operands[i].str;
929                 if (tfind (&search, &strs[i], compare_argstring) == NULL)
930                   {
931                     struct argstring *newp = xmalloc (sizeof (*newp));
932                     newp->str = runp->operands[i].str;
933                     newp->idx = 0;
934                     if (tsearch (newp, &strs[i], compare_argstring) == NULL)
935                       error (EXIT_FAILURE, errno, "tsearch");
936                     ++nstrs[i];
937                   }
938               }
939
940             maxoff[i][0] = MAX (maxoff[i][0], runp->operands[i].off1);
941             maxoff[i][1] = MAX (maxoff[i][1], runp->operands[i].off2);
942             maxoff[i][2] = MAX (maxoff[i][2], runp->operands[i].off3);
943
944             if (runp->operands[i].off1 > 0)
945               minoff[i][0] = MIN (minoff[i][0], runp->operands[i].off1);
946             if (runp->operands[i].off2 > 0)
947               minoff[i][1] = MIN (minoff[i][1], runp->operands[i].off2);
948             if (runp->operands[i].off3 > 0)
949               minoff[i][2] = MIN (minoff[i][2], runp->operands[i].off3);
950           }
951
952       struct instruction *old = runp;
953       runp = runp->next;
954
955       old->next = reversed;
956       reversed = old;
957     }
958   instructions = reversed;
959
960   int d;
961   int c;
962   for (int i = 0; i < 3; ++i)
963     {
964       // printf ("min1 = %d, min2 = %d, min3 = %d\n", minoff[i][0], minoff[i][1], minoff[i][2]);
965       // printf ("max1 = %d, max2 = %d, max3 = %d\n", maxoff[i][0], maxoff[i][1], maxoff[i][2]);
966
967       if (minoff[i][0] == 1000)
968         nbitoff[i][0] = 0;
969       else
970         {
971           nbitoff[i][0] = 1;
972           d = maxoff[i][0] - minoff[i][0];
973           c = 1;
974           while (c < d)
975             {
976               ++nbitoff[i][0];
977               c *= 2;
978             }
979           total_bits += nbitoff[i][0];
980         }
981
982       if (minoff[i][1] == 1000)
983         nbitoff[i][1] = 0;
984       else
985         {
986           nbitoff[i][1] = 1;
987           d = maxoff[i][1] - minoff[i][1];
988           c = 1;
989           while (c < d)
990             {
991               ++nbitoff[i][1];
992               c *= 2;
993             }
994           total_bits += nbitoff[i][1];
995         }
996
997       if (minoff[i][2] == 1000)
998         nbitoff[i][2] = 0;
999       else
1000         {
1001           nbitoff[i][2] = 1;
1002           d = maxoff[i][2] - minoff[i][2];
1003           c = 1;
1004           while (c < d)
1005             {
1006               ++nbitoff[i][2];
1007               c *= 2;
1008             }
1009           total_bits += nbitoff[i][2];
1010         }
1011       // printf ("off1 = %d, off2 = %d, off3 = %d\n", nbitoff[i][0], nbitoff[i][1], nbitoff[i][2]);
1012
1013       nbitfct[i] = 1;
1014       d = nfct_names[i];
1015       c = 1;
1016       while (c < d)
1017         {
1018           ++nbitfct[i];
1019           c *= 2;
1020         }
1021       total_bits += nbitfct[i];
1022       // printf ("%d fct[%d], %d bits\n", nfct_names[i], i, nbitfct[i]);
1023
1024       if (nstrs[i] != 0)
1025         {
1026           nbitstr[i] = 1;
1027           d = nstrs[i];
1028           c = 1;
1029           while (c < d)
1030             {
1031               ++nbitstr[i];
1032               c *= 2;
1033             }
1034           total_bits += nbitstr[i];
1035         }
1036
1037       // twalk (fct_names[i], nameout);
1038     }
1039
1040   nbitsuf = 0;
1041   d = nsuffixes;
1042   c = 1;
1043   while (c < d)
1044     {
1045       ++nbitsuf;
1046       c *= 2;
1047     }
1048   total_bits += nbitsuf;
1049   // printf ("%d suffixes, %d bits\n", nsuffixes, nbitsuf);
1050 }
1051
1052
1053 static int
1054 compare_syn (const void *p1, const void *p2)
1055 {
1056   const struct synonym *s1 = (const struct synonym *) p1;
1057   const struct synonym *s2 = (const struct synonym *) p2;
1058
1059   return strcmp (s1->from, s2->from);
1060 }
1061
1062
1063 static int
1064 compare_suf (const void *p1, const void *p2)
1065 {
1066   const struct suffix *s1 = (const struct suffix *) p1;
1067   const struct suffix *s2 = (const struct suffix *) p2;
1068
1069   return strcmp (s1->name, s2->name);
1070 }
1071
1072
1073 static int count_op_str;
1074 static int off_op_str;
1075 static void
1076 print_op_str (const void *nodep, VISIT value,
1077               int level __attribute__ ((unused)))
1078 {
1079   if (value == leaf || value == postorder)
1080     {
1081       const char *str = (*(struct argstring **) nodep)->str;
1082       fprintf (outfile, "%s\n  \"%s",
1083                count_op_str == 0 ? "" : "\\0\"", str);
1084       (*(struct argstring **) nodep)->idx = ++count_op_str;
1085       (*(struct argstring **) nodep)->off = off_op_str;
1086       off_op_str += strlen (str) + 1;
1087     }
1088 }
1089
1090
1091 static void
1092 print_op_str_idx (const void *nodep, VISIT value,
1093                   int level __attribute__ ((unused)))
1094 {
1095   if (value == leaf || value == postorder)
1096     printf ("  %d,\n", (*(struct argstring **) nodep)->off);
1097 }
1098
1099
1100 static void
1101 print_op_fct (const void *nodep, VISIT value,
1102               int level __attribute__ ((unused)))
1103 {
1104   if (value == leaf || value == postorder)
1105     {
1106       fprintf (outfile, "  FCT_%s,\n", (*(struct argstring **) nodep)->str);
1107       (*(struct argstring **) nodep)->idx = ++count_op_str;
1108     }
1109 }
1110
1111
1112 #if NMNES < 2
1113 # error "bogus NMNES value"
1114 #endif
1115
1116 static void
1117 instrtable_out (void)
1118 {
1119   find_numbers ();
1120
1121 #if 0
1122   create_mnemonic_table ();
1123
1124   fprintf (outfile, "#define MNEMONIC_BITS %zu\n", best_mnemonic_bits);
1125 #else
1126   fprintf (outfile, "#define MNEMONIC_BITS %ld\n",
1127            lrint (ceil (log2 (NMNES))));
1128 #endif
1129   fprintf (outfile, "#define SUFFIX_BITS %d\n", nbitsuf);
1130   for (int i = 0; i < 3; ++i)
1131     {
1132       fprintf (outfile, "#define FCT%d_BITS %d\n", i + 1, nbitfct[i]);
1133       if (nbitstr[i] != 0)
1134         fprintf (outfile, "#define STR%d_BITS %d\n", i + 1, nbitstr[i]);
1135       fprintf (outfile, "#define OFF%d_1_BITS %d\n", i + 1, nbitoff[i][0]);
1136       fprintf (outfile, "#define OFF%d_1_BIAS %d\n", i + 1, minoff[i][0]);
1137       if (nbitoff[i][1] != 0)
1138         {
1139           fprintf (outfile, "#define OFF%d_2_BITS %d\n", i + 1, nbitoff[i][1]);
1140           fprintf (outfile, "#define OFF%d_2_BIAS %d\n", i + 1, minoff[i][1]);
1141         }
1142       if (nbitoff[i][2] != 0)
1143         {
1144           fprintf (outfile, "#define OFF%d_3_BITS %d\n", i + 1, nbitoff[i][2]);
1145           fprintf (outfile, "#define OFF%d_3_BIAS %d\n", i + 1, minoff[i][2]);
1146         }
1147     }
1148
1149   fputs ("\n#include <i386_data.h>\n\n", outfile);
1150
1151
1152 #define APPEND(a, b) APPEND_ (a, b)
1153 #define APPEND_(a, b) a##b
1154 #define EMIT_SUFFIX(suf) \
1155   fprintf (outfile, "#define suffix_%s %d\n", #suf, APPEND (suffix_, suf))
1156   EMIT_SUFFIX (none);
1157   EMIT_SUFFIX (w);
1158   EMIT_SUFFIX (w0);
1159   EMIT_SUFFIX (W);
1160   EMIT_SUFFIX (tttn);
1161   EMIT_SUFFIX (D);
1162   EMIT_SUFFIX (w1);
1163   EMIT_SUFFIX (W1);
1164
1165   fputc_unlocked ('\n', outfile);
1166
1167   for (int i = 0; i < 3; ++i)
1168     {
1169       /* Functions.  */
1170       count_op_str = 0;
1171       fprintf (outfile, "static const opfct_t op%d_fct[] =\n{\n  NULL,\n",
1172                i + 1);
1173       twalk (fct_names[i], print_op_fct);
1174       fputs ("};\n", outfile);
1175
1176       /* The operand strings.  */
1177       if (nbitstr[i] != 0)
1178         {
1179           count_op_str = 0;
1180           off_op_str = 0;
1181           fprintf (outfile, "static const char op%d_str[] =", i + 1);
1182           twalk (strs[i], print_op_str);
1183           fputs ("\";\n", outfile);
1184
1185           fprintf (outfile, "static const uint8_t op%d_str_idx[] = {\n",
1186                    i + 1);
1187           twalk (strs[i], print_op_str_idx);
1188           fputs ("};\n", outfile);
1189         }
1190     }
1191
1192
1193   fputs ("static const struct instr_enc instrtab[] =\n{\n", outfile);
1194   struct instruction *instr;
1195   for (instr = instructions; instr != NULL; instr = instr->next)
1196     {
1197       fputs ("  {", outfile);
1198       if (instr->mnemonic == (void *) -1l)
1199         fputs (" .mnemonic = MNE_INVALID,", outfile);
1200       else
1201         fprintf (outfile, " .mnemonic = MNE_%s,", instr->mnemonic);
1202       fprintf (outfile, " .rep = %d,", instr->rep);
1203       fprintf (outfile, " .repe = %d,", instr->repe);
1204       fprintf (outfile, " .suffix = %d,", instr->suffix);
1205       fprintf (outfile, " .modrm = %d,", instr->modrm);
1206
1207       for (int i = 0; i < 3; ++i)
1208         {
1209           int idx = 0;
1210           if (instr->operands[i].fct != NULL)
1211             {
1212               struct argstring search = { .str = instr->operands[i].fct };
1213               struct argstring **res = tfind (&search, &fct_names[i],
1214                                               compare_argstring);
1215               assert (res != NULL);
1216               idx = (*res)->idx;
1217             }
1218           fprintf (outfile, " .fct%d = %d,", i + 1, idx);
1219
1220           idx = 0;
1221           if (instr->operands[i].str != NULL)
1222             {
1223               struct argstring search = { .str = instr->operands[i].str };
1224               struct argstring **res = tfind (&search, &strs[i],
1225                                               compare_argstring);
1226               assert (res != NULL);
1227               idx = (*res)->idx;
1228             }
1229           if (nbitstr[i] != 0)
1230             fprintf (outfile, " .str%d = %d,", i + 1, idx);
1231
1232           fprintf (outfile, " .off%d_1 = %d,", i + 1,
1233                    MAX (0, instr->operands[i].off1 - minoff[i][0]));
1234
1235           if (nbitoff[i][1] != 0)
1236             fprintf (outfile, " .off%d_2 = %d,", i + 1,
1237                      MAX (0, instr->operands[i].off2 - minoff[i][1]));
1238
1239           if (nbitoff[i][2] != 0)
1240             fprintf (outfile, " .off%d_3 = %d,", i + 1,
1241                      MAX (0, instr->operands[i].off3 - minoff[i][2]));
1242         }
1243
1244       fputs (" },\n", outfile);
1245     }
1246   fputs ("};\n", outfile);
1247
1248   fputs ("static const uint8_t match_data[] =\n{\n", outfile);
1249   size_t cnt = 0;
1250   for (instr = instructions; instr != NULL; instr = instr->next, ++cnt)
1251     {
1252       /* First count the number of bytes.  */
1253       size_t totalbits = 0;
1254       size_t zerobits = 0;
1255       bool leading_p = true;
1256       size_t leadingbits = 0;
1257       struct bitvalue *b = instr->bytes;
1258       while (b != NULL)
1259         {
1260           if (b->type == zeroone)
1261             {
1262               ++totalbits;
1263               zerobits = 0;
1264               if (leading_p)
1265                 ++leadingbits;
1266             }
1267           else
1268             {
1269               totalbits += b->field->bits;
1270               /* We must always count the mod/rm byte.  */
1271               if (strncasecmp (b->field->name, "mod", 3) == 0)
1272                 zerobits = 0;
1273               else
1274                 zerobits += b->field->bits;
1275               leading_p = false;
1276             }
1277           b = b->next;
1278         }
1279       size_t nbytes = (totalbits - zerobits + 7) / 8;
1280       assert (nbytes > 0);
1281       size_t leadingbytes = leadingbits / 8;
1282
1283       fprintf (outfile, "  %#zx,", nbytes | (leadingbytes << 4));
1284
1285       /* Now create the mask and byte values.  */
1286       uint8_t byte = 0;
1287       uint8_t mask = 0;
1288       int nbits = 0;
1289       b = instr->bytes;
1290       while (b != NULL)
1291         {
1292           if (b->type == zeroone)
1293             {
1294               byte = (byte << 1) | b->value;
1295               mask = (mask << 1) | 1;
1296               if (++nbits == 8)
1297                 {
1298                   if (leadingbytes > 0)
1299                     {
1300                       assert (mask == 0xff);
1301                       fprintf (outfile, " %#" PRIx8 ",", byte);
1302                       --leadingbytes;
1303                     }
1304                   else
1305                     fprintf (outfile, " %#" PRIx8 ", %#" PRIx8 ",",
1306                              mask, byte);
1307                   byte = mask = nbits = 0;
1308                   if (--nbytes == 0)
1309                     break;
1310                 }
1311             }
1312           else
1313             {
1314               assert (leadingbytes == 0);
1315
1316               unsigned long int remaining = b->field->bits;
1317               while (nbits + remaining > 8)
1318                 {
1319                   fprintf (outfile, " %#" PRIx8 ", %#" PRIx8 ",",
1320                            mask << (8 - nbits), byte << (8 - nbits));
1321                   remaining = nbits + remaining - 8;
1322                   byte = mask = nbits = 0;
1323                   if (--nbytes == 0)
1324                     break;
1325                 }
1326               byte <<= remaining;
1327               mask <<= remaining;
1328               nbits += remaining;
1329               if (nbits == 8)
1330                 {
1331                   fprintf (outfile, " %#" PRIx8 ", %#" PRIx8 ",", mask, byte);
1332                   byte = mask = nbits = 0;
1333                   if (--nbytes == 0)
1334                     break;
1335                 }
1336             }
1337           b = b->next;
1338         }
1339
1340       fputc_unlocked ('\n', outfile);
1341     }
1342   fputs ("};\n", outfile);
1343 }
1344
1345
1346 #if 0
1347 static size_t mnemonic_maxlen;
1348 static size_t mnemonic_minlen;
1349 static size_t
1350 which_chars (const char *str[], size_t nstr)
1351 {
1352   char used_char[256];
1353   memset (used_char, '\0', sizeof (used_char));
1354   mnemonic_maxlen = 0;
1355   mnemonic_minlen = 10000;
1356   for (size_t cnt = 0; cnt < nstr; ++cnt)
1357     {
1358       const unsigned char *cp = (const unsigned char *) str[cnt];
1359       mnemonic_maxlen = MAX (mnemonic_maxlen, strlen ((char *) cp));
1360       mnemonic_minlen = MIN (mnemonic_minlen, strlen ((char *) cp));
1361       do
1362         used_char[*cp++] = 1;
1363       while (*cp != '\0');
1364     }
1365   size_t nused_char = 0;
1366   for (size_t cnt = 0; cnt < 256; ++cnt)
1367     if (used_char[cnt] != 0)
1368       ++nused_char;
1369   return nused_char;
1370 }
1371
1372
1373 static const char **mnemonic_strs;
1374 static size_t nmnemonic_strs;
1375 static void
1376 add_mnemonics (const void *nodep, VISIT value,
1377                int level __attribute__ ((unused)))
1378 {
1379   if (value == leaf || value == postorder)
1380     mnemonic_strs[nmnemonic_strs++] = *(const char **) nodep;
1381 }
1382
1383
1384 struct charfreq
1385 {
1386   char ch;
1387   int freq;
1388 };
1389 static struct charfreq pfxfreq[256];
1390 static struct charfreq sfxfreq[256];
1391
1392
1393 static int
1394 compare_freq (const void *p1, const void *p2)
1395 {
1396   const struct charfreq *c1 = (const struct charfreq *) p1;
1397   const struct charfreq *c2 = (const struct charfreq *) p2;
1398
1399   if (c1->freq > c2->freq)
1400     return -1;
1401   if (c1->freq < c2->freq)
1402     return 1;
1403   return 0;
1404 }
1405
1406
1407 static size_t
1408 compute_pfxfreq (const char *str[], size_t nstr)
1409 {
1410   memset (pfxfreq, '\0', sizeof (pfxfreq));
1411
1412   for (size_t i = 0; i < nstr; ++i)
1413     pfxfreq[i].ch = i;
1414
1415   for (size_t i = 0; i < nstr; ++i)
1416     ++pfxfreq[*((const unsigned char *) str[i])].freq;
1417
1418   qsort (pfxfreq, 256, sizeof (struct charfreq), compare_freq);
1419
1420   size_t n = 0;
1421   while (n < 256 && pfxfreq[n].freq != 0)
1422     ++n;
1423   return n;
1424 }
1425
1426
1427 struct strsnlen
1428 {
1429   const char *str;
1430   size_t len;
1431 };
1432
1433 static size_t
1434 compute_sfxfreq (size_t nstr, struct strsnlen *strsnlen)
1435 {
1436   memset (sfxfreq, '\0', sizeof (sfxfreq));
1437
1438   for (size_t i = 0; i < nstr; ++i)
1439     sfxfreq[i].ch = i;
1440
1441   for (size_t i = 0; i < nstr; ++i)
1442     ++sfxfreq[((const unsigned char *) strchrnul (strsnlen[i].str, '\0'))[-1]].freq;
1443
1444   qsort (sfxfreq, 256, sizeof (struct charfreq), compare_freq);
1445
1446   size_t n = 0;
1447   while (n < 256 && sfxfreq[n].freq != 0)
1448     ++n;
1449   return n;
1450 }
1451
1452
1453 static void
1454 create_mnemonic_table (void)
1455 {
1456   mnemonic_strs = xmalloc (nmnemonics * sizeof (char *));
1457
1458   twalk (mnemonics, add_mnemonics);
1459
1460   (void) which_chars (mnemonic_strs, nmnemonic_strs);
1461
1462   size_t best_so_far = 100000000;
1463   char *best_prefix = NULL;
1464   char *best_suffix = NULL;
1465   char *best_table = NULL;
1466   size_t best_table_size = 0;
1467   size_t best_table_bits = 0;
1468   size_t best_prefix_bits = 0;
1469
1470   /* We can precompute the prefix characters.  */
1471   size_t npfx_char = compute_pfxfreq (mnemonic_strs, nmnemonic_strs);
1472
1473   /* Compute best size for string representation including explicit NUL.  */
1474   for (size_t pfxbits = 0; (1u << pfxbits) < 2 * npfx_char; ++pfxbits)
1475     {
1476       char prefix[1 << pfxbits];
1477       size_t i;
1478       for (i = 0; i < (1u << pfxbits) - 1; ++i)
1479         prefix[i] = pfxfreq[i].ch;
1480       prefix[i] = '\0';
1481
1482       struct strsnlen strsnlen[nmnemonic_strs];
1483
1484       for (i = 0; i < nmnemonic_strs; ++i)
1485         {
1486           if (strchr (prefix, *mnemonic_strs[i]) != NULL)
1487             strsnlen[i].str = mnemonic_strs[i] + 1;
1488           else
1489             strsnlen[i].str = mnemonic_strs[i];
1490           strsnlen[i].len = strlen (strsnlen[i].str);
1491         }
1492
1493       /* With the prefixes gone, try to combine strings.  */
1494       size_t nstrsnlen = 1;
1495       for (i = 1; i < nmnemonic_strs; ++i)
1496         {
1497           size_t j;
1498           for (j = 0; j < nstrsnlen; ++j)
1499             if (strsnlen[i].len > strsnlen[j].len
1500                 && strcmp (strsnlen[j].str,
1501                            strsnlen[i].str + (strsnlen[i].len
1502                                               - strsnlen[j].len)) == 0)
1503               {
1504                 strsnlen[j] = strsnlen[i];
1505                 break;
1506               }
1507             else if (strsnlen[i].len < strsnlen[j].len
1508                      && strcmp (strsnlen[i].str,
1509                                 strsnlen[j].str + (strsnlen[j].len
1510                                                    - strsnlen[i].len)) == 0)
1511               break;
1512 ;
1513           if (j == nstrsnlen)
1514               strsnlen[nstrsnlen++] = strsnlen[i];
1515         }
1516
1517       size_t nsfx_char = compute_sfxfreq (nstrsnlen, strsnlen);
1518
1519       for (size_t sfxbits = 0; (1u << sfxbits) < 2 * nsfx_char; ++sfxbits)
1520         {
1521           char suffix[1 << sfxbits];
1522
1523           for (i = 0; i < (1u << sfxbits) - 1; ++i)
1524             suffix[i] = sfxfreq[i].ch;
1525           suffix[i] = '\0';
1526
1527           size_t newlen[nstrsnlen];
1528
1529           for (i = 0; i < nstrsnlen; ++i)
1530             if (strchr (suffix, strsnlen[i].str[strsnlen[i].len - 1]) != NULL)
1531               newlen[i] = strsnlen[i].len - 1;
1532             else
1533               newlen[i] = strsnlen[i].len;
1534
1535           char charused[256];
1536           memset (charused, '\0', sizeof (charused));
1537           size_t ncharused = 0;
1538
1539           const char *tablestr[nstrsnlen];
1540           size_t ntablestr = 1;
1541           tablestr[0] = strsnlen[0].str;
1542           size_t table = newlen[0] + 1;
1543           for (i = 1; i < nstrsnlen; ++i)
1544             {
1545               size_t j;
1546               for (j = 0; j < ntablestr; ++j)
1547                 if (newlen[i] > newlen[j]
1548                     && memcmp (tablestr[j],
1549                                strsnlen[i].str + (newlen[i] - newlen[j]),
1550                                newlen[j]) == 0)
1551                   {
1552                     table += newlen[i] - newlen[j];
1553                     tablestr[j] = strsnlen[i].str;
1554                     newlen[j] = newlen[i];
1555                     break;
1556                   }
1557                 else if (newlen[i] < newlen[j]
1558                      && memcmp (strsnlen[i].str,
1559                                 tablestr[j] + (newlen[j] - newlen[i]),
1560                                 newlen[i]) == 0)
1561                   break;
1562
1563               if (j == ntablestr)
1564                 {
1565                   table += newlen[i] + 1;
1566                   tablestr[ntablestr] = strsnlen[i].str;
1567                   newlen[ntablestr] = newlen[i];
1568
1569                   ++ntablestr;
1570                 }
1571
1572               for (size_t x = 0; x < newlen[j]; ++x)
1573                 if (charused[((const unsigned char *) tablestr[j])[x]]++ == 0)
1574                   ++ncharused;
1575             }
1576
1577           size_t ncharused_bits = 0;
1578           i = 1;
1579           while (i < ncharused)
1580             {
1581               i *= 2;
1582               ++ncharused_bits;
1583             }
1584
1585           size_t table_bits = 0;
1586           i = 1;
1587           while (i < table)
1588             {
1589               i *= 2;
1590               ++table_bits;
1591             }
1592
1593           size_t mnemonic_bits = table_bits + pfxbits + sfxbits;
1594           size_t new_total = (((table + 7) / 8) * ncharused_bits + ncharused
1595                               + (pfxbits == 0 ? 0 : (1 << pfxbits) - 1)
1596                               + (sfxbits == 0 ? 0 : (1 << sfxbits) - 1)
1597                               + (((total_bits + mnemonic_bits + 7) / 8)
1598                                  * ninstructions));
1599
1600           if (new_total < best_so_far)
1601             {
1602               best_so_far = new_total;
1603               best_mnemonic_bits = mnemonic_bits;
1604
1605               free (best_suffix);
1606               best_suffix = xstrdup (suffix);
1607
1608               free (best_prefix);
1609               best_prefix = xstrdup (prefix);
1610               best_prefix_bits = pfxbits;
1611
1612               best_table_size = table;
1613               best_table_bits = table_bits;
1614               char *cp = best_table = xrealloc (best_table, table);
1615               for (i = 0; i < ntablestr; ++i)
1616                 {
1617                   assert (cp + newlen[i] + 1 <= best_table + table);
1618                   cp = mempcpy (cp, tablestr[i], newlen[i]);
1619                   *cp++ = '\0';
1620                 }
1621               assert (cp == best_table + table);
1622             }
1623         }
1624     }
1625
1626   fputs ("static const char mnemonic_table[] =\n\"", outfile);
1627   for (size_t i = 0; i < best_table_size; ++i)
1628     {
1629       if (((i + 1) % 60) == 0)
1630         fputs ("\"\n\"", outfile);
1631       if (!isascii (best_table[i]) || !isprint (best_table[i]))
1632         fprintf (outfile, "\\%03o", best_table[i]);
1633       else
1634         fputc (best_table[i], outfile);
1635     }
1636   fputs ("\";\n", outfile);
1637
1638   if (best_prefix[0] != '\0')
1639     fprintf (outfile,
1640              "static const char prefix[%zu] = \"%s\";\n"
1641              "#define PREFIXCHAR_BITS %zu\n",
1642              strlen (best_prefix), best_prefix, best_prefix_bits);
1643   else
1644     fputs ("#define NO_PREFIX\n", outfile);
1645
1646   if (best_suffix[0] != '\0')
1647     fprintf (outfile, "static const char suffix[%zu] = \"%s\";\n",
1648              strlen (best_suffix), best_suffix);
1649   else
1650     fputs ("#define NO_SUFFIX\n", outfile);
1651
1652   for (size_t i = 0; i < nmnemonic_strs; ++i)
1653     {
1654       const char *mne = mnemonic_strs[i];
1655
1656       size_t pfxval = 0;
1657       char *cp = strchr (best_prefix, *mne);
1658       if (cp != NULL)
1659         {
1660           pfxval = 1 + (cp - best_prefix);
1661           ++mne;
1662         }
1663
1664       size_t l = strlen (mne);
1665
1666       size_t sfxval = 0;
1667       cp = strchr (best_suffix, mne[l - 1]);
1668       if (cp != NULL)
1669         {
1670           sfxval = 1 + (cp - best_suffix);
1671           --l;
1672         }
1673
1674       char *off = memmem (best_table, best_table_size, mne, l);
1675       while (off[l] != '\0')
1676         {
1677           off = memmem (off + 1, best_table_size, mne, l);
1678           assert (off != NULL);
1679         }
1680
1681       fprintf (outfile, "#define MNE_%s %#zx\n",
1682                mnemonic_strs[i],
1683                (off - best_table)
1684                + ((pfxval + (sfxval << best_prefix_bits)) << best_table_bits));
1685     }
1686 }
1687 #endif