1a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#!/usr/bin/perl
2a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
3a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjuse 5.006;
4a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjuse strict;
5a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjuse warnings;
6a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
7a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjour %ArgTypes = (
8a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 r8 => "reg8_t",
9a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 r16 => "reg16_t",
10a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 r32 => "reg32_t",
11a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 r64 => "reg64_t",
12a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 mm => "reg64_t",
13a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 xmm => "reg128_t",
14a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 m8 => "reg8_t",
15a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 m16 => "reg16_t",
16a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 m32 => "reg32_t",
17a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 m64 => "reg64_t",
18a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 m128 => "reg128_t",
19a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 eflags => "reg32_t",
20a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 st => "reg64_t",
21a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 fpucw => "reg16_t",
22a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 fpusw => "reg16_t"
23a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 );
24a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
25a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjour %SubTypeFormats = (
26a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       sb => "%d",
27a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       ub => "%u",
28a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       sw => "%d",
29a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       uw => "%u",
30a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       sd => "%d",
31a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       ud => "%u",
32a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       sq => "%lld",
33a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       uq => "%llu",
34a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       ps => "%.16g",
35a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       pd => "%.16g"
36a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                       );
37a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
38a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjour %SubTypeSuffixes = (
39a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        sb => "",
40a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        ub => "U",
41a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        sw => "",
42a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        uw => "",
43a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        sd => "",
44a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        ud => "",
45a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        sq => "LL",
46a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        uq => "ULL",
47a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        ps => "F",
48a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        pd => ""
49a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        );
50a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
51a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjour %RegNums = (
527fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                r9b => 0, r9w => 0, r9d => 0, r9 => 0,
537fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                r10b => 1, r10w => 1, r10d => 1, r10 => 1,
547fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                r11b => 2, r11w => 2, r11d => 2, r11 => 2,
557fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                r12b => 3, r12w => 3, r12d => 3, r12 => 3,
567fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                al => 4, ax => 4, eax => 4, rax => 4,
577fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                bl => 5, bx => 5, ebx => 5, rbx => 5,
587fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                cl => 6, cx => 6, ecx => 6, rcx => 6,
597fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                dl => 7, dx => 7, edx => 7, rdx => 7,
607fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                ah => 8,
617fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                bh => 9,
627fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                ch => 10,
637fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                dh => 11,
64a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                st0 => 0, st1 => 1, st2 => 2, st3 => 3,
65a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                st4 => 4, st5 => 5, st6 => 6, st7 => 7
66a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                );
67a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
68a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjour %RegTypes = (
69a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 al => "r8", ah => "r8", ax => "r16", eax => "r32", rax => "r64",
70a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 bl => "r8", bh => "r8", bx => "r16", ebx => "r32", rbx => "r64",
71a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 cl => "r8", ch => "r8", cx => "r16", ecx => "r32", rcx => "r64",
72a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 dl => "r8", dh => "r8", dx => "r16", edx => "r32", rdx => "r64"
73a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                 );
74a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
75c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj#our @IntRegs = (
7678a8fecdaf87903644a088db2a1dbd437ff6999ftom#                { r8 => "al", r16 => "ax", r32 => "eax", r64 => "rax" },
7778a8fecdaf87903644a088db2a1dbd437ff6999ftom#                { r8 => "bl", r16 => "bx", r32 => "ebx", r64 => "rbx" },
7878a8fecdaf87903644a088db2a1dbd437ff6999ftom#                { r8 => "cl", r16 => "cx", r32 => "ecx", r64 => "rcx" },
7978a8fecdaf87903644a088db2a1dbd437ff6999ftom#                { r8 => "dl", r16 => "dx", r32 => "edx", r64 => "rdx" },
80c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj#                { r8 => "ah" },
81c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj#                { r8 => "bh" },
82c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj#                { r8 => "ch" },
83c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj#                { r8 => "dh" }
84c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj#                );
85c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj
8678a8fecdaf87903644a088db2a1dbd437ff6999ftomour @IntRegs = (
8778a8fecdaf87903644a088db2a1dbd437ff6999ftom                { r8 => "r9b", r16 => "r9w", r32 => "r9d", r64 => "r9" },
8878a8fecdaf87903644a088db2a1dbd437ff6999ftom                { r8 => "r10b", r16 => "r10w", r32 => "r10d", r64 => "r10" },
8978a8fecdaf87903644a088db2a1dbd437ff6999ftom                { r8 => "r11b", r16 => "r11w", r32 => "r11d", r64 => "r11" },
907fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                { r8 => "r12b", r16 => "r12w", r32 => "r12d", r64 => "r12" },
917fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                { r8 => "al", r16 => "ax", r32 => "eax", r64 => "rax" },
927fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                { r8 => "bl", r16 => "bx", r32 => "ebx", r64 => "rbx" },
937fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                { r8 => "cl", r16 => "cx", r32 => "ecx", r64 => "rcx" },
947fb9df9eb24e2f86729d2f7ccdf1042f6f2e69bdtom                { r8 => "dl", r16 => "dx", r32 => "edx", r64 => "rdx" },
9578a8fecdaf87903644a088db2a1dbd437ff6999ftom                { r8 => "ah" },
9678a8fecdaf87903644a088db2a1dbd437ff6999ftom                { r8 => "bh" },
9778a8fecdaf87903644a088db2a1dbd437ff6999ftom                { r8 => "ch" },
9878a8fecdaf87903644a088db2a1dbd437ff6999ftom                { r8 => "dh" }
9978a8fecdaf87903644a088db2a1dbd437ff6999ftom                );
10078a8fecdaf87903644a088db2a1dbd437ff6999ftom
101a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjprint <<EOF;
102a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#include <math.h>
103a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#include <setjmp.h>
104a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#include <signal.h>
105a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#include <stdio.h>
106a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#include <stdlib.h>
107a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
108a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjtypedef union {
109a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  char sb[1];
110a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned char ub[1];
111a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj} reg8_t;
112a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
113a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjtypedef union {
114a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  char sb[2];
115a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned char ub[2];
116a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  short sw[1];
117a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned short uw[1];
118a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj} reg16_t;
119a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
120a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjtypedef union {
121a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  char sb[4];
122a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned char ub[4];
123a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  short sw[2];
124a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned short uw[2];
125a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  int sd[1];
126a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned int ud[1];
127a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  float ps[1];
128a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj} reg32_t;
129a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
130a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjtypedef union {
131a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  char sb[8];
132a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned char ub[8];
133a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  short sw[4];
134a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned short uw[4];
135a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  int sd[2];
136a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned int ud[2];
137a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  long long int sq[1];
138a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned long long int uq[1];
139a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  float ps[2];
140a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  double pd[1];
141a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj} reg64_t __attribute__ ((aligned (8)));
142a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
143a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjtypedef union {
144a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  char sb[16];
145a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned char ub[16];
146a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  short sw[8];
147a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned short uw[8];
148a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  int sd[4];
149a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned int ud[4];
150a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  long long int sq[2];
151a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  unsigned long long int uq[2];
152a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  float ps[4];
153a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj  double pd[2];
154a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj} reg128_t __attribute__ ((aligned (16)));
155a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
156a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjstatic sigjmp_buf catchpoint;
157a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
158a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjstatic void handle_sigill(int signum)
159a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj{
160a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj   siglongjmp(catchpoint, 1);
161a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj}
162a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
163a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj__attribute__((unused))
164a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjstatic int eq_float(float f1, float f2)
165a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj{
166c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj   /* return f1 == f2 || fabsf(f1 - f2) < fabsf(f1) * 1.5 * powf(2,-12); */
167c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj   return f1 == f2 || fabsf(f1 - f2) < fabsf(f1) * 1.5 / 4096.0;
168a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj}
169a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
170a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj__attribute__((unused))
171a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjstatic int eq_double(double d1, double d2)
172a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj{
173c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj   /* return d1 == d2 || fabs(d1 - d2) < fabs(d1) * 1.5 * pow(2,-12); */
174c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj   return d1 == d2 || fabs(d1 - d2) < fabs(d1) * 1.5 / 4096.0;
175a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj}
176a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
177a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjEOF
178a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
179a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjmy %tests;
180a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjmy @tests;
181a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
182a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjwhile (<>)
183a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj{
184a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    next if /^#/;
185a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
186a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $insn;
187a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $presets;
188a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $args;
189a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $results;
190a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
191a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    if (/^(\S+)\s+(?:(\S+(?:\s+\S+)*)\s+:\s+)?((?:\S+\s+)*?)(?:=>\s+(\S+(?:\s+\S+)*))?$/)
192a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
193a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        $insn = $1;
194a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        $presets = $2 || "";
195a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        $args = $3 || "";
196a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        $results = $4 || "";
197a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
198a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#        print STDERR "insn: $insn\n";
199a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#        print STDERR "presets: $presets\n";
200a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#        print STDERR "args: $args\n";
201a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#        print STDERR "results: $results\n";
202a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
203a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    else
204a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
205a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        die "Can't parse test $_";
206a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
207a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
208a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    $tests{$insn}++;
209a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
210a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $test = "${insn}_$tests{$insn}";
211a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
212a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    push @tests, $test;
213a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
214a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|static void $test(void)\n|;
215a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\{\n|;
216a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
217a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my @intregs = @IntRegs;
218a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my @mmregs  = map { "mm$_" }  (6,7,0,1,2,3,4,5);
2194fa5e7cd3c38041ad07a7b69b1bfd7af65e78cb8sewardj#    my @xmmregs = map { "xmm$_" } (4,5,0,1,2,3,6,7);
2204fa5e7cd3c38041ad07a7b69b1bfd7af65e78cb8sewardj    my @xmmregs = map { "xmm$_" } (12,13,8,9,10,11,14,15);
221a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my @fpregs  = map { "st$_" }  (0 .. 7);
222a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
223a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my @presets;
224a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $presetc = 0;
225a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $eflagsmask;
226a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $eflagsset;
227a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $fpucwmask;
228a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $fpucwset;
229a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $fpuswmask;
230a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $fpuswset;
231a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
232a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $preset (split(/\s+/, $presets))
233a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
234a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if ($preset =~ /^([abcd][lh]|[abcd]x|e[abcd]x|r[abcd]x)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
235a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
236a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $name = "preset$presetc";
237a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $RegTypes{$1};
238a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $regnum = $RegNums{$1};
239a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $register = $intregs[$regnum];
240a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $2;
241a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $3);
242a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
243a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            die "Register $1 already used" unless defined($register);
244a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
245a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $preset = {
246a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
247a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => $type,
248a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => $subtype,
249a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                register => $register
250a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
251a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
252a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            delete($intregs[$regnum]);
253a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
254a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @presets, $preset;
255a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
256a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{$type} $name = \{ .$subtype = \{|;
257a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
258a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $valuec = 0;
259a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
260a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            foreach my $value (@values)
261a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
262a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|,| if $valuec > 0;
263a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq| $value$SubTypeSuffixes{$subtype}|;
264a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $valuec++;
265a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
266a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
267a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq| \} \};\n|;
268a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
269a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $presetc++;
270a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
271a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($preset =~ /^st([0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
272a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
273a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $name = "preset$presetc";
274a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = "st";
275a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $regnum = $1;
276a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $register = $fpregs[$regnum];
277a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $2;
278a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $3);
279a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
280a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            die "Register st$1 already used" unless defined($register);
281a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
282a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $preset = {
283a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
284a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => $type,
285a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => $subtype,
286a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                register => $register
287a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
288a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
289a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            delete($fpregs[$regnum]);
290a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
291a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @presets, $preset;
292a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
293a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{$type} $name = \{ .$subtype = \{|;
294a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
295a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $valuec = 0;
296a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
297a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            foreach my $value (@values)
298a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
299a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|,| if $valuec > 0;
300a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq| $value$SubTypeSuffixes{$subtype}|;
301a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $valuec++;
302a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
303a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
304a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq| \} \};\n|;
305a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
306a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $presetc++;
307a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
308a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($preset =~ /^(eflags)\[([^\]]+)\]$/)
309a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
310a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $1;
311a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $2);
312a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
313a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[0] = oct($values[0]) if $values[0] =~ /^0/;
314a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[1] = oct($values[1]) if $values[1] =~ /^0/;
315a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
316a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $eflagsmask = sprintf "0x%08x", $values[0] ^ 0xffffffff;
317a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $eflagsset = sprintf "0x%08x", $values[1];
318a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
319a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($preset =~ /^(fpucw)\[([^\]]+)\]$/)
320a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
321a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $1;
322a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $2);
323a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
324a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[0] = oct($values[0]) if $values[0] =~ /^0/;
325a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[1] = oct($values[1]) if $values[1] =~ /^0/;
326a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
327a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $fpucwmask = sprintf "0x%04x", $values[0] ^ 0xffff;
328a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $fpucwset = sprintf "0x%04x", $values[1];
329a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
330a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($preset =~ /^(fpusw)\[([^\]]+)\]$/)
331a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
332a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $1;
333a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $2);
334a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
335a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[0] = oct($values[0]) if $values[0] =~ /^0/;
336a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[1] = oct($values[1]) if $values[1] =~ /^0/;
337a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
338a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $fpuswmask = sprintf "0x%04x", $values[0] ^ 0xffff;
339a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $fpuswset = sprintf "0x%04x", $values[1];
340a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
341a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        else
342a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
343a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            die "Can't parse preset $preset";
344a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
345a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
346a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
347a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my @args;
348a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $argc = 0;
349a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
350a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $arg (split(/\s+/, $args))
351a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
352a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        my $name = "arg$argc";
353a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
354a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if ($arg =~ /^([abcd]l|[abcd]x|e[abcd]x|r[abcd]x|r8|r16|r32|r64|mm|xmm|m8|m16|m32|m64|m128)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
355a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
356a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $RegTypes{$1} || $1;
357a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $regnum = $RegNums{$1};
358a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $register = $intregs[$regnum] if defined($regnum);
359a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $2;
360a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $3);
361a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
362a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            die "Register $1 already used" if defined($regnum) && !defined($register);
363a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
364a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $arg = {
365a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
366a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => $type,
367a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => $subtype
368a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
369a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
370a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if (defined($register))
371a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
372a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $arg->{register} = $register;
373a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                delete($intregs[$regnum]);
374a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
375a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
376a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @args, $arg;
377a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
378a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{$type} $name = \{ .$subtype = \{|;
379a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
380a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $valuec = 0;
381a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
382a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            foreach my $value (@values)
383a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
384a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|,| if $valuec > 0;
385a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq| $value$SubTypeSuffixes{$subtype}|;
386a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $valuec++;
387a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
388a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
389a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq| \} \};\n|;
390a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
391a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg =~ /^st([0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
392a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
393a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = "st";
394a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $regnum = $1;
395a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $register = $fpregs[$regnum] if defined($regnum);
396a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $2;
397a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $3);
398a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
399a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            die "Register st$1 already used" if defined($regnum) && !defined($register);
400a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
401a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $arg = {
402a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
403a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => $type,
404a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => $subtype
405a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
406a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
407a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if (defined($register))
408a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
409a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $arg->{register} = $register;
410a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                delete($fpregs[$regnum]);
411a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
412a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
413a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @args, $arg;
414a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
415a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{$type} $name = \{ .$subtype = \{|;
416a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
417a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $valuec = 0;
418a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
419a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            foreach my $value (@values)
420a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
421a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|,| if $valuec > 0;
422a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq| $value$SubTypeSuffixes{$subtype}|;
423a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $valuec++;
424a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
425a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
426a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq| \} \};\n|;
427a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
42895f9ed651057e58dfb44144dd19ce79c887323b3tom        elsif ($arg =~ /^(imm8|imm16|imm32|imm64)\[([^\]]+)\]$/)
429a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
430a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $1;
431a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $value = $2;
432a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
433a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $arg = {
434a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => $type,
435a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                value => $value
436a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
437a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
438a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @args, $arg;
439a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
440a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        else
441a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
442a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            die "Can't parse argument $arg";
443a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
444a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
445a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        $argc++;
446a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
447a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
448a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $arg (@presets, @args)
449a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
450a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if ($arg->{type} =~ /^(r8|r16|r32|r64|m8|m16|m32)$/)
451a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
452a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            while (!exists($arg->{register}) || !defined($arg->{register}))
453a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
454a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $arg->{register} = shift @intregs;
455a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
456a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
457a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $arg->{register} = $arg->{register}->{$arg->{type}};
458a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
459a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} =~ /^(mm|m64)$/)
460a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
461a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $arg->{register} = shift @mmregs;
462a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
463a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} =~ /^(xmm|m128)$/)
464a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
465a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $arg->{register} = shift @xmmregs;
466a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
467a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} =~ /^st$/)
468a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
469a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            while (!exists($arg->{register}) || !defined($arg->{register}))
470a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
471a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $arg->{register} = shift @fpregs;
472a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
473a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
474a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
475a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
476a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my @results;
477a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $resultc = 0;
478a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
479a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $result (split(/\s+/, $results))
480a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
481a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        my $name = "result$resultc";
482a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
483a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if ($result =~ /^(\d+)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
484a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
485a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $index = $1;
486a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $args[$index]->{type};
487a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $2;
488a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $3);
489a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
490a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            die "Argument $index not specified" unless exists($args[$index]);
491a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
492a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $result = {
493a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
494a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => $type,
495a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => $subtype,
496a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                arg => $args[$index],
497a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                register => $args[$index]->{register},
498a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                values => [ @values ]
499a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
500a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
501a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @results, $result;
502a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
503a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{$type} $name|;
504a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq| = arg$index| if $type =~ /^m(8|16|32|64|128)$/;
505a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|;\n|;
506a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
507a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $args[$index]->{result} = $result;
508a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
509a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result =~ /^([abcd][lh]|[abcd]x|e[abcd]x|r[abcd]x)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
510a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
511a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $register = $1;
512a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $RegTypes{$register};
513a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $2;
514a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $3);
515a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
516a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $result = {
517a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
518a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => $type,
519a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => $subtype,
520a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                register => $register,
521a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                values => [ @values ]
522a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
523a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
524a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @results, $result;
525a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
526a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{$type} $name;\n|;
527a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
528a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result =~ /^(st[0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
529a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
530a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $register = $1;
531a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = "st";
532a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $2;
533a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $3);
534a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
535a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $result = {
536a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
537a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => $type,
538a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => $subtype,
539a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                register => $register,
540a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                values => [ @values ]
541a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
542a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
543a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @results, $result;
544a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
545a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{$type} $name;\n|;
546a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
547a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result =~ /^eflags\[([^\]]+)\]$/)
548a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
549a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $1);
550a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
551a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[0] = oct($values[0]) if $values[0] =~ /^0/;
552a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[1] = oct($values[1]) if $values[1] =~ /^0/;
553a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
554a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $result = {
555a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
556a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => "eflags",
557a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => "ud",
558a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                values => [ map { sprintf "0x%08x", $_ } @values ]
559a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
560a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
561a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @results, $result;
562a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
563a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{eflags} $name;\n|;
564a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
565a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if (!defined($eflagsmask) && !defined($eflagsset))
566a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
567a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $eflagsmask = sprintf "0x%08x", $values[0] ^ 0xffffffff;
568a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $eflagsset = sprintf "0x%08x", $values[0] & ~$values[1];
569a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
570a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
571a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result =~ /^fpucw\[([^\]]+)\]$/)
572a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
573a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $1);
574a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
575a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[0] = oct($values[0]) if $values[0] =~ /^0/;
576a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[1] = oct($values[1]) if $values[1] =~ /^0/;
577a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
578a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $result = {
579a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
580a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => "fpucw",
581a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => "ud",
582a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                values => [ map { sprintf "0x%04x", $_ } @values ]
583a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
584a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
585a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @results, $result;
586a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
587a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{fpucw} $name;\n|;
588a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
589a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if (!defined($fpucwmask) && !defined($fpucwset))
590a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
591a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $fpucwmask = sprintf "0x%04x", $values[0] ^ 0xffff;
592a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $fpucwset = sprintf "0x%04x", $values[0] & ~$values[1];
593a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
594a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
595a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result =~ /^fpusw\[([^\]]+)\]$/)
596a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
597a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = split(/,/, $1);
598a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
599a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[0] = oct($values[0]) if $values[0] =~ /^0/;
600a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $values[1] = oct($values[1]) if $values[1] =~ /^0/;
601a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
602a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $result = {
603a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                name => $name,
604a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                type => "fpusw",
605a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                subtype => "ud",
606a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                values => [ map { sprintf "0x%04x", $_ } @values ]
607a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            };
608a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
609a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            push @results, $result;
610a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
611a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|   $ArgTypes{fpusw} $name;\n|;
612a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
613a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if (!defined($fpuswmask) && !defined($fpuswset))
614a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
615a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $fpuswmask = sprintf "0x%04x", $values[0] ^ 0xffff;
616a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                $fpuswset = sprintf "0x%04x", $values[0] & ~$values[1];
617a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
618a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
619a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        else
620a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
621a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            die "Can't parse result $result";
622a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
623a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
624a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        $resultc++;
625a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
626a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
627a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $argnum = 0;
628a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
629a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $result (@results)
630a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
631d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        if ($result->{type} eq "xmm")
632d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        {
633d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            $result->{argnuml} = $argnum++;
634d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            $result->{argnumh} = $argnum++;
635d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        }
636d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        else
637d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        {
638d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            $result->{argnum} = $argnum++;
639d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        }
640a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
641a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
642a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $arg (@presets, @args)
643a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
644a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if (defined($arg->{name}))
645a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
646d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            if ($arg->{type} eq "xmm")
647d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            {
648d5ea6f504536f745bc8cc3b67da837bee6f8de25tom                $arg->{argnuml} = $argnum++;
649d5ea6f504536f745bc8cc3b67da837bee6f8de25tom                $arg->{argnumh} = $argnum++;
650d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            }
651d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            else
652d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            {
653d5ea6f504536f745bc8cc3b67da837bee6f8de25tom                $arg->{argnum} = $argnum++;
654d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            }
655a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
656a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
657a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
658a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $stateargnum = $argnum++;
659a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
660a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   char state\[108\];\n|;
661a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\n|;
662a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   if (sigsetjmp(catchpoint, 1) == 0)\n|;
663a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   \{\n|;
664a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|      asm\(\n|;
665a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#    print qq|         \"fsave %$stateargnum\\n\"\n|;
6669be19da2fe56b2a9a04c02035d28a4da451bc25asewardj    print qq|         \"ffree %%st(7)\\n\"\n|;
6679be19da2fe56b2a9a04c02035d28a4da451bc25asewardj    print qq|         \"ffree %%st(6)\\n\"\n|;
6689be19da2fe56b2a9a04c02035d28a4da451bc25asewardj    print qq|         \"ffree %%st(5)\\n\"\n|;
6699be19da2fe56b2a9a04c02035d28a4da451bc25asewardj    print qq|         \"ffree %%st(4)\\n\"\n|;
6709be19da2fe56b2a9a04c02035d28a4da451bc25asewardj
671a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my @fpargs;
672a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
673a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $arg (@presets, @args)
674a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
675a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if ($arg->{type} eq "r8")
676a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
677a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movb %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
678a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
679a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} eq "r16")
680a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
681a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movw %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
682a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
683a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} eq "r32")
684a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
685a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movl %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
686a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
687a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} eq "r64")
688a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
689a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movq %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
690a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
691a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} eq "mm")
692a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
693a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movq %$arg->{argnum}, %%$arg->{register}\\n\"\n|;
694a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
695a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} eq "xmm")
696a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
697d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            print qq|         \"movlps %$arg->{argnuml}, %%$arg->{register}\\n\"\n|;
698d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            print qq|         \"movhps %$arg->{argnumh}, %%$arg->{register}\\n\"\n|;
699a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
700a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} eq "st")
701a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
702a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $fpargs[$RegNums{$arg->{register}}] = $arg;
703a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
704a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
705a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
706a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $arg (reverse @fpargs)
707a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
708a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if (defined($arg))
709a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
710a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if ($arg->{subtype} eq "ps")
711a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
712a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|         \"flds %$arg->{argnum}\\n\"\n|;
713a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
714a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            elsif ($arg->{subtype} eq "pd")
715a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
716a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|         \"fldl %$arg->{argnum}\\n\"\n|;
717a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
718a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
719a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        else
720a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
721a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"fldz\\n\"\n|;
722a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
723a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
724a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
725a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    if (defined($eflagsmask) || defined($eflagsset))
726a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
727ed5417f426e3418a24c99756d4c89cd59a74a984sewardj        print qq|         \"pushfq\\n\"\n|;
728ed5417f426e3418a24c99756d4c89cd59a74a984sewardj        print qq|         \"andl \$$eflagsmask, (%%rsp)\\n\"\n| if defined($eflagsmask);
729c6fa942a3b180dac2ef763e252e1a6b2ba7eef0csewardj        print qq|         \"andl \$0, 4(%%rsp)\\n\"\n| if defined($eflagsmask);
730ed5417f426e3418a24c99756d4c89cd59a74a984sewardj        print qq|         \"orq \$$eflagsset, (%%rsp)\\n\"\n| if defined($eflagsset);
731ed5417f426e3418a24c99756d4c89cd59a74a984sewardj        print qq|         \"popfq\\n\"\n|;
732a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
733a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
734a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    if (defined($fpucwmask) || defined($fpucwset))
735a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
7369be19da2fe56b2a9a04c02035d28a4da451bc25asewardj        print qq|         \"subq \$2, %%rsp\\n\"\n|;
737ed5417f426e3418a24c99756d4c89cd59a74a984sewardj        print qq|         \"fstcw (%%rsp)\\n\"\n|;
738ed5417f426e3418a24c99756d4c89cd59a74a984sewardj        print qq|         \"andw \$$fpucwmask, (%%rsp)\\n\"\n| if defined($fpucwmask);
739ed5417f426e3418a24c99756d4c89cd59a74a984sewardj        print qq|         \"orw \$$fpucwset, (%%rsp)\\n\"\n| if defined($fpucwset);
740ed5417f426e3418a24c99756d4c89cd59a74a984sewardj        print qq|         \"fldcw (%%rsp)\\n\"\n|;
7419be19da2fe56b2a9a04c02035d28a4da451bc25asewardj        print qq|         \"addq \$2, %%rsp\\n\"\n|;
742a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
743a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
744a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|         \"$insn|;
745a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
746a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my $prefix = " ";
747a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
748a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $arg (@args)
749a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
750a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        next if $arg->{type} eq "eflags";
751a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
752a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if ($arg->{type} =~ /^(r8|r16|r32|r64|mm|xmm)$/)
753a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
754a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|$prefix%%$arg->{register}|;
755a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
756a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} =~ /^st$/)
757a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
758a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $register = $arg->{register};
759a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
760a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $register =~ s/st(\d+)/st\($1\)/;
761a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
762a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|$prefix%%$register|;
763a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
764a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($arg->{type} =~ /^(m(8|16|32|64|128))$/)
765a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
766a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if (exists($arg->{result}))
767a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
768a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|$prefix%$arg->{result}->{argnum}|;
769a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
770a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            else
771a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
772a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|$prefix%$arg->{argnum}|;
773a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
774a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
77595f9ed651057e58dfb44144dd19ce79c887323b3tom        elsif ($arg->{type} =~ /^imm(8|16|32|64)$/)
776a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
777a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|$prefix\$$arg->{value}|;
778a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
779a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
780a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        $prefix = ", ";
781a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
782a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
783a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\\n\"\n|;
784a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
785a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    my @fpresults;
786a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
787a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $result (@results)
788a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
789a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if ($result->{type} eq "r8")
790a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
791a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movb %%$result->{register}, %$result->{argnum}\\n\"\n|;
792a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
793a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "r16")
794a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
795a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movw %%$result->{register}, %$result->{argnum}\\n\"\n|;
796a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
797a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "r32")
798a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
799a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movl %%$result->{register}, %$result->{argnum}\\n\"\n|;
800a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
801a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "r64")
802a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
803a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movq %%$result->{register}, %$result->{argnum}\\n\"\n|;
804a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
805a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "mm")
806a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
807a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"movq %%$result->{register}, %$result->{argnum}\\n\"\n|;
808a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
809a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "xmm")
810a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
811d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            print qq|         \"movlps %%$result->{register}, %$result->{argnuml}\\n\"\n|;
812d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            print qq|         \"movhps %%$result->{register}, %$result->{argnumh}\\n\"\n|;
813a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
814a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "st")
815a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
816a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $fpresults[$RegNums{$result->{register}}] = $result;
817a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
818a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "eflags")
819a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
820ed5417f426e3418a24c99756d4c89cd59a74a984sewardj            print qq|         \"pushfq\\n\"\n|;
821ed5417f426e3418a24c99756d4c89cd59a74a984sewardj            print qq|         \"popq %$result->{argnum}\\n\"\n|;
822a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
823a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "fpucw")
824a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
825a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"fstcw %$result->{argnum}\\n\"\n|;
826a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
827a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        elsif ($result->{type} eq "fpusw")
828a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
829a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"fstsw %$result->{argnum}\\n\"\n|;
830a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
831a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
832a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
833a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $result (@fpresults)
834a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
835a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if (defined($result))
836a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
837a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if ($result->{subtype} eq "ps")
838a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
839a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|         \"fstps %$result->{argnum}\\n\"\n|;
840a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
841a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            elsif ($result->{subtype} eq "pd")
842a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
843a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|         \"fstpl %$result->{argnum}\\n\"\n|;
844a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
845a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
846a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        else
847a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
848a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            print qq|         \"fincstp\\n\"\n|;
849a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
850a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
851a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
852a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj#    print qq|         \"frstor %$stateargnum\\n\"\n|;
853b7e874977348549b1a10f2ee1e99513e4f6cdb73tom    print qq|         \"cld\\n\"\n|;
854a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
855a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|         :|;
856a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
857a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    $prefix = " ";
858a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
859a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $result (@results)
860a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
861d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        if ($result->{type} eq "xmm")
862d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        {
863d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            print qq|$prefix\"=m\" \($result->{name}.uq[0]\), \"=m\" \($result->{name}.uq[1]\)|;
864d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        }
865d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        else
866d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        {
867d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            print qq|$prefix\"=m\" \($result->{name}\)|;
868d5ea6f504536f745bc8cc3b67da837bee6f8de25tom        }
869d5ea6f504536f745bc8cc3b67da837bee6f8de25tom
8706647d5237ae9024c1780546f74275f81fd83c8d9tom        $prefix = ", ";
871a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
872a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
873a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\n|;
874a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
875a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    $prefix = "         : ";
876a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
877a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $arg (@presets, @args)
878a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
879a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if (defined($arg->{name}))
880a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
881d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            if ($arg->{type} eq "xmm")
882d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            {
883d5ea6f504536f745bc8cc3b67da837bee6f8de25tom                print qq|$prefix\"m\" \($arg->{name}.uq[0]\), \"m\" \($arg->{name}.uq[1]\)|;
884d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            }
885d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            else
886d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            {
887d5ea6f504536f745bc8cc3b67da837bee6f8de25tom                print qq|$prefix\"m\" \($arg->{name}\)|;
888d5ea6f504536f745bc8cc3b67da837bee6f8de25tom            }
889d5ea6f504536f745bc8cc3b67da837bee6f8de25tom
890a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $prefix = ", ";
891a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
892a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
893a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
894a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|$prefix\"m\" \(state[0]\)\n|;
895a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
896a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    $prefix = "         : ";
897a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
898a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    foreach my $arg (@presets, @args)
899a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
900a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        if ($arg->{register} && $arg->{type} ne "st")
901a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
90278a8fecdaf87903644a088db2a1dbd437ff6999ftom            my $register = $arg->{register};
90378a8fecdaf87903644a088db2a1dbd437ff6999ftom
90478a8fecdaf87903644a088db2a1dbd437ff6999ftom            $register =~ s/^(r[0-9]+)[bwd]$/$1/;
90578a8fecdaf87903644a088db2a1dbd437ff6999ftom            print qq|$prefix\"$register\"|;
906a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $prefix = ", ";
907a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
908a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
909a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
910a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\n|;
911a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
912a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|      \);\n|;
913a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\n|;
914a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
915a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    if (@results)
916a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
917a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|      if \(|;
918a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
919a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        $prefix = "";
920a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
921a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        foreach my $result (@results)
922a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
923a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $result->{type};
924a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $result->{subtype};
925a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $suffix = $SubTypeSuffixes{$subtype};
926a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = @{$result->{values}};
927a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
928a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if ($type eq "eflags")
929a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
930a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|${prefix}\($result->{name}.ud[0] & $values[0]UL\) == $values[1]UL|;
931a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
932a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            elsif ($type =~ /^fpu[cs]w$/)
933a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
934a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|${prefix}\($result->{name}.uw[0] & $values[0]\) == $values[1]|;
935a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
936a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            else
937a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
938a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                foreach my $value (0 .. $#values)
939a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                {
940a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    if ($subtype eq "ps")
941a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    {
942a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        print qq|${prefix}eq_float($result->{name}.$subtype\[$value\], $values[$value]$suffix)|;
943a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    }
944a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    elsif ($subtype eq "pd")
945a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    {
946a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        print qq|${prefix}eq_double($result->{name}.$subtype\[$value\], $values[$value]$suffix)|;
947a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    }
948a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    else
949a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    {
950a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                        print qq|${prefix}$result->{name}.$subtype\[$value\] == $values[$value]$suffix|;
951a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    }
952a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
953a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    $prefix = " && ";
954a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                }
955a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
956a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
957a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            $prefix = " &&\n          ";
958a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
959a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
960a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq| \)\n|;
961a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|      \{\n|;
962a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|         printf("$test ... ok\\n");\n|;
963a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|      \}\n|;
964a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|      else\n|;
965a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|      \{\n|;
966a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|         printf("$test ... not ok\\n");\n|;
967a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
968a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        foreach my $result (@results)
969a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        {
970a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $type = $result->{type};
971a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $subtype = $result->{subtype};
972a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my $suffix = $SubTypeSuffixes{$subtype};
973a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            my @values = @{$result->{values}};
974a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
975a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            if ($type eq "eflags")
976a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
977a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|         printf("  eflags & 0x%lx = 0x%lx (expected 0x%lx)\\n", $values[0]UL, $result->{name}.ud\[0\] & $values[0]UL, $values[1]UL);\n|;
978a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
979a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            elsif ($type =~ /^fpu[cs]w$/)
980a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
981a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                print qq|         printf("  $type & 0x%x = 0x%x (expected 0x%x)\\n", $values[0], $result->{name}.uw\[0\] & $values[0], $values[1]);\n|;
982a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
983a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            else
984a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            {
985a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                foreach my $value (0 .. $#values)
986a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                {
987a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                    print qq|         printf("  $result->{name}.$subtype\[$value\] = $SubTypeFormats{$subtype} (expected $SubTypeFormats{$subtype})\\n", $result->{name}.$subtype\[$value\], $values[$value]$suffix);\n|;
988a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj                }
989a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj            }
990a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        }
991a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
992a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|      \}\n|;
993a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
994a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    else
995a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    {
996a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj        print qq|      printf("$test ... ok\\n");\n|;
997a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    }
998a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
999a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   \}\n|;
1000a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   else\n|;
1001a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   \{\n|;
1002a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|      printf("$test ... failed\\n");\n|;
1003a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   \}\n|;
1004a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\n|;
1005a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   return;\n|;
1006a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\}\n|;
1007a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|\n|;
1008a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj}
1009a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
1010a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjprint qq|int main(int argc, char **argv)\n|;
1011a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjprint qq|\{\n|;
1012a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjprint qq|   signal(SIGILL, handle_sigill);\n|;
1013a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjprint qq|\n|;
1014a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
1015a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjforeach my $test (@tests)
1016a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj{
1017a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj    print qq|   $test();\n|;
1018a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj}
1019a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
1020a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjprint qq|\n|;
1021a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjprint qq|   exit(0);\n|;
1022a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjprint qq|\}\n|;
1023a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardj
1024a8532a30923cbcdda431a3e2768a8c99f8f4d34dsewardjexit 0;
1025