1(* x64Script.sml - generated by L3 - Thu Dec 21 10:44:50 2017 *)
2open HolKernel boolLib bossLib Import
3
4val () = Import.start "x64"
5
6val _ = Construct
7  [("Zreg",
8    [("RAX",[]),("RCX",[]),("RDX",[]),("RBX",[]),("RSP",[]),("RBP",[]),
9     ("RSI",[]),("RDI",[]),("zR8",[]),("zR9",[]),("zR10",[]),("zR11",[]),
10     ("zR12",[]),("zR13",[]),("zR14",[]),("zR15",[])])]
11;
12val _ = Record
13  ("MXCSR",
14   [("DAZ",bTy),("DE",bTy),("DM",bTy),("FZ",bTy),("IE",bTy),("IM",bTy),
15    ("OE",bTy),("OM",bTy),("PE",bTy),("PM",bTy),("RC",FTy 2),
16    ("Reserved",F16),("UE",bTy),("UM",bTy),("ZE",bTy),("ZM",bTy)])
17;
18val _ = Construct
19  [("Zeflags",
20    [("Z_CF",[]),("Z_PF",[]),("Z_AF",[]),("Z_ZF",[]),("Z_SF",[]),
21     ("Z_OF",[])])]
22;
23val _ = Construct
24  [("Zsize",[("Z16",[]),("Z32",[]),("Z64",[]),("Z8",[bTy])])]
25;
26val _ = Construct
27  [("Zbase",[("ZnoBase",[]),("ZregBase",[CTy"Zreg"]),("ZripBase",[])])]
28;
29val _ = Construct
30  [("Zrm",
31    [("Zm",[PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64))]),
32     ("Zr",[CTy"Zreg"])])]
33;
34val _ = Construct
35  [("Zdest_src",
36    [("Zr_rm",[PTy(CTy"Zreg",CTy"Zrm")]),("Zrm_i",[PTy(CTy"Zrm",F64)]),
37     ("Zrm_r",[PTy(CTy"Zrm",CTy"Zreg")])])]
38;
39val _ = Construct [("Zimm_rm",[("Zimm",[F64]),("Zrm",[CTy"Zrm"])])]
40;
41val _ = Construct
42  [("Zmonop_name",[("Zdec",[]),("Zinc",[]),("Znot",[]),("Zneg",[])])]
43;
44val _ = Construct
45  [("Zbinop_name",
46    [("Zadd",[]),("Zor",[]),("Zadc",[]),("Zsbb",[]),("Zand",[]),
47     ("Zsub",[]),("Zxor",[]),("Zcmp",[]),("Zrol",[]),("Zror",[]),
48     ("Zrcl",[]),("Zrcr",[]),("Zshl",[]),("Zshr",[]),("Ztest",[]),
49     ("Zsar",[])])]
50;
51val _ = Construct
52  [("Zbit_test_name",[("Zbt",[]),("Zbts",[]),("Zbtr",[]),("Zbtc",[])])]
53;
54val _ = Construct
55  [("Zcond",
56    [("Z_O",[]),("Z_NO",[]),("Z_B",[]),("Z_NB",[]),("Z_E",[]),("Z_NE",[]),
57     ("Z_NA",[]),("Z_A",[]),("Z_S",[]),("Z_NS",[]),("Z_P",[]),("Z_NP",[]),
58     ("Z_L",[]),("Z_NL",[]),("Z_NG",[]),("Z_G",[]),("Z_ALWAYS",[])])]
59;
60val _ = Construct
61  [("Zea",
62    [("Zea_i",[PTy(CTy"Zsize",F64)]),("Zea_m",[PTy(CTy"Zsize",F64)]),
63     ("Zea_r",[PTy(CTy"Zsize",CTy"Zreg")])])]
64;
65val _ = Construct
66  [("sse_binop",
67    [("sse_add",[]),("sse_sub",[]),("sse_mul",[]),("sse_div",[]),
68     ("sse_max",[]),("sse_min",[])])]
69;
70val _ = Construct
71  [("sse_logic",
72    [("sse_and",[]),("sse_andn",[]),("sse_or",[]),("sse_xor",[])])]
73;
74val _ = Construct
75  [("sse_compare",
76    [("sse_eq_oq",[]),("sse_lt_os",[]),("sse_le_os",[]),
77     ("sse_unord_q",[]),("sse_neq_uq",[]),("sse_nlt_us",[]),
78     ("sse_nle_us",[]),("sse_ord_q",[])])]
79;
80val _ = Construct
81  [("xmm_mem",
82    [("xmm_mem",[PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64))]),
83     ("xmm_reg",[FTy 3])])]
84;
85val _ = Construct
86  [("SSE",
87    [("CMPPD",[PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem"))]),
88     ("CMPPS",[PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem"))]),
89     ("CMPSD",[PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem"))]),
90     ("CMPSS",[PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem"))]),
91     ("COMISD",[PTy(FTy 3,CTy"xmm_mem")]),
92     ("COMISS",[PTy(FTy 3,CTy"xmm_mem")]),
93     ("CVTDQ2PD",[PTy(FTy 3,CTy"xmm_mem")]),
94     ("CVTDQ2PS",[PTy(FTy 3,CTy"xmm_mem")]),
95     ("CVTPD2DQ",[PTy(bTy,PTy(FTy 3,CTy"xmm_mem"))]),
96     ("CVTPD2PS",[PTy(FTy 3,CTy"xmm_mem")]),
97     ("CVTPS2DQ",[PTy(bTy,PTy(FTy 3,CTy"xmm_mem"))]),
98     ("CVTPS2PD",[PTy(FTy 3,CTy"xmm_mem")]),
99     ("CVTSD2SI",[PTy(bTy,PTy(bTy,PTy(CTy"Zreg",CTy"xmm_mem")))]),
100     ("CVTSD2SS",[PTy(FTy 3,CTy"xmm_mem")]),
101     ("CVTSI2SD",[PTy(bTy,PTy(FTy 3,CTy"Zrm"))]),
102     ("CVTSI2SS",[PTy(bTy,PTy(FTy 3,CTy"Zrm"))]),
103     ("CVTSS2SD",[PTy(FTy 3,CTy"xmm_mem")]),
104     ("CVTSS2SI",[PTy(bTy,PTy(bTy,PTy(CTy"Zreg",CTy"xmm_mem")))]),
105     ("MOVAP_D_S",[PTy(bTy,PTy(CTy"xmm_mem",CTy"xmm_mem"))]),
106     ("MOVQ",[PTy(CTy"xmm_mem",CTy"xmm_mem")]),
107     ("MOVSD",[PTy(CTy"xmm_mem",CTy"xmm_mem")]),
108     ("MOVSS",[PTy(CTy"xmm_mem",CTy"xmm_mem")]),
109     ("MOVUP_D_S",[PTy(bTy,PTy(CTy"xmm_mem",CTy"xmm_mem"))]),
110     ("MOV_D_Q",[PTy(bTy,PTy(bTy,PTy(FTy 3,CTy"Zrm")))]),
111     ("PCMPEQQ",[PTy(FTy 3,CTy"xmm_mem")]),("PSLLDQ",[PTy(FTy 3,F8)]),
112     ("PSLLD_imm",[PTy(FTy 3,F8)]),("PSLLQ_imm",[PTy(FTy 3,F8)]),
113     ("PSLLW_imm",[PTy(FTy 3,F8)]),("PSRAD_imm",[PTy(FTy 3,F8)]),
114     ("PSRAW_imm",[PTy(FTy 3,F8)]),("PSRLDQ",[PTy(FTy 3,F8)]),
115     ("PSRLD_imm",[PTy(FTy 3,F8)]),("PSRLQ_imm",[PTy(FTy 3,F8)]),
116     ("PSRLW_imm",[PTy(FTy 3,F8)]),("SQRTPD",[PTy(FTy 3,CTy"xmm_mem")]),
117     ("SQRTPS",[PTy(FTy 3,CTy"xmm_mem")]),
118     ("SQRTSD",[PTy(FTy 3,CTy"xmm_mem")]),
119     ("SQRTSS",[PTy(FTy 3,CTy"xmm_mem")]),
120     ("bin_PD",[PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem"))]),
121     ("bin_PS",[PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem"))]),
122     ("bin_SD",[PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem"))]),
123     ("bin_SS",[PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem"))]),
124     ("logic_PD",[PTy(CTy"sse_logic",PTy(FTy 3,CTy"xmm_mem"))]),
125     ("logic_PS",[PTy(CTy"sse_logic",PTy(FTy 3,CTy"xmm_mem"))])])]
126;
127val _ = Construct
128  [("instruction",
129    [("SSE",[CTy"SSE"]),
130     ("Zbinop",[PTy(CTy"Zbinop_name",PTy(CTy"Zsize",CTy"Zdest_src"))]),
131     ("Zbit_test",
132      [PTy(CTy"Zbit_test_name",PTy(CTy"Zsize",CTy"Zdest_src"))]),
133     ("Zcall",[CTy"Zimm_rm"]),("Zclc",[]),("Zcmc",[]),
134     ("Zcmpxchg",[PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg"))]),
135     ("Zdiv",[PTy(CTy"Zsize",CTy"Zrm")]),
136     ("Zidiv",[PTy(CTy"Zsize",CTy"Zrm")]),
137     ("Zimul",[PTy(CTy"Zsize",CTy"Zrm")]),
138     ("Zimul2",[PTy(CTy"Zsize",PTy(CTy"Zreg",CTy"Zrm"))]),
139     ("Zimul3",[PTy(CTy"Zsize",PTy(CTy"Zreg",PTy(CTy"Zrm",F64)))]),
140     ("Zjcc",[PTy(CTy"Zcond",F64)]),("Zjmp",[CTy"Zrm"]),
141     ("Zlea",[PTy(CTy"Zsize",CTy"Zdest_src")]),("Zleave",[]),
142     ("Zloop",[PTy(CTy"Zcond",F64)]),
143     ("Zmonop",[PTy(CTy"Zmonop_name",PTy(CTy"Zsize",CTy"Zrm"))]),
144     ("Zmov",[PTy(CTy"Zcond",PTy(CTy"Zsize",CTy"Zdest_src"))]),
145     ("Zmovsx",[PTy(CTy"Zsize",PTy(CTy"Zdest_src",CTy"Zsize"))]),
146     ("Zmovzx",[PTy(CTy"Zsize",PTy(CTy"Zdest_src",CTy"Zsize"))]),
147     ("Zmul",[PTy(CTy"Zsize",CTy"Zrm")]),("Znop",[nTy]),
148     ("Zpop",[CTy"Zrm"]),("Zpush",[CTy"Zimm_rm"]),("Zret",[F64]),
149     ("Zset",[PTy(CTy"Zcond",PTy(bTy,CTy"Zrm"))]),("Zstc",[]),
150     ("Zxadd",[PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg"))]),
151     ("Zxchg",[PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg"))])])]
152;
153val _ = Construct
154  [("Zinst",
155    [("Zdec_fail",[sTy]),
156     ("Zfull_inst",[PTy(LTy F8,PTy(CTy"instruction",OTy(LTy F8)))])])]
157;
158val _ = Record ("REX",[("B",bTy),("R",bTy),("W",bTy),("X",bTy)])
159;
160val _ = Construct
161  [("exception",
162    [("BadFlagAccess",[sTy]),("FAILURE",[sTy]),
163     ("INTERRUPT_EXCEPTION",[F8]),("NoException",[])])]
164;
165val _ = Record
166  ("x64_state",
167   [("EFLAGS",ATy(CTy"Zeflags",OTy bTy)),("MEM",ATy(F64,F8)),
168    ("MXCSR",CTy"MXCSR"),("REG",ATy(CTy"Zreg",F64)),("RIP",F64),
169    ("XMM_REG",ATy(FTy 3,FTy 128)),("exception",CTy"exception")])
170;
171val qTy = CTy "x64_state";
172fun qVar v = Term.mk_var (v, ParseDatatype.pretypeToType qTy);
173val raise'exception_def = Def
174  ("raise'exception",Var("e",CTy"exception"),
175   Close
176     (qVar"state",
177      TP[LX(VTy"a"),
178         ITE(EQ(Dest("exception",CTy"exception",qVar"state"),
179                Const("NoException",CTy"exception")),
180             Rupd("exception",TP[qVar"state",Var("e",CTy"exception")]),
181             qVar"state")]))
182;
183val DE_exception_def = Def
184  ("DE_exception",qVar"state",
185   Mop(Snd,
186       Apply
187         (Call
188            ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
189             Call("INTERRUPT_EXCEPTION",CTy"exception",LW(0,8))),
190          qVar"state")))
191;
192val UD_exception_def = Def
193  ("UD_exception",qVar"state",
194   Mop(Snd,
195       Apply
196         (Call
197            ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
198             Call("INTERRUPT_EXCEPTION",CTy"exception",LW(6,8))),
199          qVar"state")))
200;
201val GP_exception_def = Def
202  ("GP_exception",qVar"state",
203   Mop(Snd,
204       Apply
205         (Call
206            ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
207             Call("INTERRUPT_EXCEPTION",CTy"exception",LW(13,8))),
208          qVar"state")))
209;
210val XM_exception_def = Def
211  ("XM_exception",qVar"state",
212   Mop(Snd,
213       Apply
214         (Call
215            ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
216             Call("INTERRUPT_EXCEPTION",CTy"exception",LW(19,8))),
217          qVar"state")))
218;
219val rec'MXCSR_def = Def
220  ("rec'MXCSR",Var("x",F32),
221   Rec(CTy"MXCSR",
222       [Bop(Bit,Var("x",F32),LN 6),Bop(Bit,Var("x",F32),LN 1),
223        Bop(Bit,Var("x",F32),LN 8),Bop(Bit,Var("x",F32),LN 15),
224        Bop(Bit,Var("x",F32),LN 0),Bop(Bit,Var("x",F32),LN 7),
225        Bop(Bit,Var("x",F32),LN 3),Bop(Bit,Var("x",F32),LN 10),
226        Bop(Bit,Var("x",F32),LN 5),Bop(Bit,Var("x",F32),LN 12),
227        EX(Var("x",F32),LN 14,LN 13,FTy 2),
228        EX(Var("x",F32),LN 31,LN 16,F16),Bop(Bit,Var("x",F32),LN 4),
229        Bop(Bit,Var("x",F32),LN 11),Bop(Bit,Var("x",F32),LN 2),
230        Bop(Bit,Var("x",F32),LN 9)]))
231;
232val reg'MXCSR_def = Def
233  ("reg'MXCSR",Var("x",CTy"MXCSR"),
234   CS(Var("x",CTy"MXCSR"),
235      [(Rec(CTy"MXCSR",
236            [bVar"DAZ",bVar"DE",bVar"DM",bVar"FZ",bVar"IE",bVar"IM",
237             bVar"OE",bVar"OM",bVar"PE",bVar"PM",Var("RC",FTy 2),
238             Var("Reserved",F16),bVar"UE",bVar"UM",bVar"ZE",bVar"ZM"]),
239        CC[Var("Reserved",F16),Mop(Cast F1,bVar"FZ"),Var("RC",FTy 2),
240           Mop(Cast F1,bVar"PM"),Mop(Cast F1,bVar"UM"),
241           Mop(Cast F1,bVar"OM"),Mop(Cast F1,bVar"ZM"),
242           Mop(Cast F1,bVar"DM"),Mop(Cast F1,bVar"IM"),
243           Mop(Cast F1,bVar"DAZ"),Mop(Cast F1,bVar"PE"),
244           Mop(Cast F1,bVar"UE"),Mop(Cast F1,bVar"OE"),
245           Mop(Cast F1,bVar"ZE"),Mop(Cast F1,bVar"DE"),
246           Mop(Cast F1,bVar"IE")])]))
247;
248val write'rec'MXCSR_def = Def
249  ("write'rec'MXCSR",TP[AVar F32,Var("x",CTy"MXCSR")],
250   Call("reg'MXCSR",F32,Var("x",CTy"MXCSR")))
251;
252val write'reg'MXCSR_def = Def
253  ("write'reg'MXCSR",TP[AVar(CTy"MXCSR"),Var("x",F32)],
254   Call("rec'MXCSR",CTy"MXCSR",Var("x",F32)))
255;
256val mem8_def = Def
257  ("mem8",Var("addr",F64),
258   Close
259     (qVar"state",
260      Apply(Dest("MEM",ATy(F64,F8),qVar"state"),Var("addr",F64))))
261;
262val write'mem8_def = Def
263  ("write'mem8",TP[Var("b",F8),Var("addr",F64)],
264   Close
265     (qVar"state",
266      Rupd
267        ("MEM",
268         TP[qVar"state",
269            Fupd
270              (Dest("MEM",ATy(F64,F8),qVar"state"),Var("addr",F64),
271               Var("b",F8))])))
272;
273val mem16_def = Def
274  ("mem16",Var("addr",F64),
275   Close
276     (qVar"state",
277      CC[Apply
278           (Call("mem8",ATy(qTy,F8),Bop(Add,Var("addr",F64),LW(1,64))),
279            qVar"state"),
280         Apply(Call("mem8",ATy(qTy,F8),Var("addr",F64)),qVar"state")]))
281;
282val write'mem16_def = Def
283  ("write'mem16",TP[Var("w",F16),Var("addr",F64)],
284   Close
285     (qVar"state",
286      Apply
287        (Call
288           ("write'mem8",ATy(qTy,qTy),
289            TP[EX(Var("w",F16),LN 15,LN 8,F8),
290               Bop(Add,Var("addr",F64),LW(1,64))]),
291         Apply
292           (Call
293              ("write'mem8",ATy(qTy,qTy),
294               TP[EX(Var("w",F16),LN 7,LN 0,F8),Var("addr",F64)]),
295            qVar"state"))))
296;
297val mem32_def = Def
298  ("mem32",Var("addr",F64),
299   Close
300     (qVar"state",
301      CC[Apply
302           (Call("mem16",ATy(qTy,F16),Bop(Add,Var("addr",F64),LW(2,64))),
303            qVar"state"),
304         Apply(Call("mem16",ATy(qTy,F16),Var("addr",F64)),qVar"state")]))
305;
306val write'mem32_def = Def
307  ("write'mem32",TP[Var("w",F32),Var("addr",F64)],
308   Close
309     (qVar"state",
310      Apply
311        (Call
312           ("write'mem16",ATy(qTy,qTy),
313            TP[EX(Var("w",F32),LN 31,LN 16,F16),
314               Bop(Add,Var("addr",F64),LW(2,64))]),
315         Apply
316           (Call
317              ("write'mem16",ATy(qTy,qTy),
318               TP[EX(Var("w",F32),LN 15,LN 0,F16),Var("addr",F64)]),
319            qVar"state"))))
320;
321val mem64_def = Def
322  ("mem64",Var("addr",F64),
323   Close
324     (qVar"state",
325      CC[Apply
326           (Call("mem32",ATy(qTy,F32),Bop(Add,Var("addr",F64),LW(4,64))),
327            qVar"state"),
328         Apply(Call("mem32",ATy(qTy,F32),Var("addr",F64)),qVar"state")]))
329;
330val write'mem64_def = Def
331  ("write'mem64",TP[Var("w",F64),Var("addr",F64)],
332   Close
333     (qVar"state",
334      Apply
335        (Call
336           ("write'mem32",ATy(qTy,qTy),
337            TP[EX(Var("w",F64),LN 63,LN 32,F32),
338               Bop(Add,Var("addr",F64),LW(4,64))]),
339         Apply
340           (Call
341              ("write'mem32",ATy(qTy,qTy),
342               TP[EX(Var("w",F64),LN 31,LN 0,F32),Var("addr",F64)]),
343            qVar"state"))))
344;
345val mem128_def = Def
346  ("mem128",Var("addr",F64),
347   Close
348     (qVar"state",
349      CC[Apply
350           (Call("mem64",ATy(qTy,F64),Bop(Add,Var("addr",F64),LW(8,64))),
351            qVar"state"),
352         Apply(Call("mem64",ATy(qTy,F64),Var("addr",F64)),qVar"state")]))
353;
354val write'mem128_def = Def
355  ("write'mem128",TP[Var("w",FTy 128),Var("addr",F64)],
356   Close
357     (qVar"state",
358      Apply
359        (Call
360           ("write'mem64",ATy(qTy,qTy),
361            TP[EX(Var("w",FTy 128),LN 127,LN 64,F64),
362               Bop(Add,Var("addr",F64),LW(8,64))]),
363         Apply
364           (Call
365              ("write'mem64",ATy(qTy,qTy),
366               TP[EX(Var("w",FTy 128),LN 63,LN 0,F64),Var("addr",F64)]),
367            qVar"state"))))
368;
369val Eflag_def = Def
370  ("Eflag",Var("flag",CTy"Zeflags"),
371   Close
372     (qVar"state",
373      CS(Apply
374           (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
375            Var("flag",CTy"Zeflags")),
376         [(Mop(Some,bVar"b"),TP[bVar"b",qVar"state"]),
377          (LO bTy,
378           Apply
379             (Call
380                ("raise'exception",ATy(qTy,PTy(bTy,qTy)),
381                 Call
382                   ("BadFlagAccess",CTy"exception",
383                    Mop(Cast sTy,Var("flag",CTy"Zeflags")))),qVar"state"))])))
384;
385val write'Eflag_def = Def
386  ("write'Eflag",TP[bVar"b",Var("flag",CTy"Zeflags")],
387   Close
388     (qVar"state",
389      Rupd
390        ("EFLAGS",
391         TP[qVar"state",
392            Fupd
393              (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
394               Var("flag",CTy"Zeflags"),Mop(Some,bVar"b"))])))
395;
396val FlagUnspecified_def = Def
397  ("FlagUnspecified",Var("flag",CTy"Zeflags"),
398   Close
399     (qVar"state",
400      Rupd
401        ("EFLAGS",
402         TP[qVar"state",
403            Fupd
404              (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
405               Var("flag",CTy"Zeflags"),LO bTy)])))
406;
407val CF_def = Def
408  ("CF",qVar"state",
409   Apply
410     (Call("Eflag",ATy(qTy,PTy(bTy,qTy)),LC("Z_CF",CTy"Zeflags")),
411      qVar"state"))
412;
413val write'CF_def = Def
414  ("write'CF",bVar"b",
415   Close
416     (qVar"state",
417      Apply
418        (Call
419           ("write'Eflag",ATy(qTy,qTy),TP[bVar"b",LC("Z_CF",CTy"Zeflags")]),
420         qVar"state")))
421;
422val PF_def = Def
423  ("PF",qVar"state",
424   Apply
425     (Call("Eflag",ATy(qTy,PTy(bTy,qTy)),LC("Z_PF",CTy"Zeflags")),
426      qVar"state"))
427;
428val write'PF_def = Def
429  ("write'PF",bVar"b",
430   Close
431     (qVar"state",
432      Apply
433        (Call
434           ("write'Eflag",ATy(qTy,qTy),TP[bVar"b",LC("Z_PF",CTy"Zeflags")]),
435         qVar"state")))
436;
437val AF_def = Def
438  ("AF",qVar"state",
439   Apply
440     (Call("Eflag",ATy(qTy,PTy(bTy,qTy)),LC("Z_AF",CTy"Zeflags")),
441      qVar"state"))
442;
443val write'AF_def = Def
444  ("write'AF",bVar"b",
445   Close
446     (qVar"state",
447      Apply
448        (Call
449           ("write'Eflag",ATy(qTy,qTy),TP[bVar"b",LC("Z_AF",CTy"Zeflags")]),
450         qVar"state")))
451;
452val ZF_def = Def
453  ("ZF",qVar"state",
454   Apply
455     (Call("Eflag",ATy(qTy,PTy(bTy,qTy)),LC("Z_ZF",CTy"Zeflags")),
456      qVar"state"))
457;
458val write'ZF_def = Def
459  ("write'ZF",bVar"b",
460   Close
461     (qVar"state",
462      Apply
463        (Call
464           ("write'Eflag",ATy(qTy,qTy),TP[bVar"b",LC("Z_ZF",CTy"Zeflags")]),
465         qVar"state")))
466;
467val SF_def = Def
468  ("SF",qVar"state",
469   Apply
470     (Call("Eflag",ATy(qTy,PTy(bTy,qTy)),LC("Z_SF",CTy"Zeflags")),
471      qVar"state"))
472;
473val write'SF_def = Def
474  ("write'SF",bVar"b",
475   Close
476     (qVar"state",
477      Apply
478        (Call
479           ("write'Eflag",ATy(qTy,qTy),TP[bVar"b",LC("Z_SF",CTy"Zeflags")]),
480         qVar"state")))
481;
482val OF_def = Def
483  ("OF",qVar"state",
484   Apply
485     (Call("Eflag",ATy(qTy,PTy(bTy,qTy)),LC("Z_OF",CTy"Zeflags")),
486      qVar"state"))
487;
488val write'OF_def = Def
489  ("write'OF",bVar"b",
490   Close
491     (qVar"state",
492      Apply
493        (Call
494           ("write'Eflag",ATy(qTy,qTy),TP[bVar"b",LC("Z_OF",CTy"Zeflags")]),
495         qVar"state")))
496;
497val ea_index_def = Def
498  ("ea_index",Var("index",OTy(PTy(FTy 2,CTy"Zreg"))),
499   Close
500     (qVar"state",
501      CS(Var("index",OTy(PTy(FTy 2,CTy"Zreg"))),
502         [(LO(PTy(FTy 2,CTy"Zreg")),LW(0,64)),
503          (Mop(Some,TP[Var("scale",FTy 2),Var("idx",CTy"Zreg")]),
504           Bop(Mul,Bop(Lsl,LW(1,64),Mop(Cast nTy,Var("scale",FTy 2))),
505               Apply
506                 (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
507                  Var("idx",CTy"Zreg"))))])))
508;
509val ea_base_def = Def
510  ("ea_base",Var("base",CTy"Zbase"),
511   Close
512     (qVar"state",
513      CS(Var("base",CTy"Zbase"),
514         [(Const("ZnoBase",CTy"Zbase"),LW(0,64)),
515          (Const("ZripBase",CTy"Zbase"),Dest("RIP",F64,qVar"state")),
516          (Call("ZregBase",CTy"Zbase",Var("b",CTy"Zreg")),
517           Apply
518             (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
519              Var("b",CTy"Zreg")))])))
520;
521val mem_addr_def = Def
522  ("mem_addr",Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64))),
523   Close
524     (qVar"state",
525      Let(TP[Var("index",OTy(PTy(FTy 2,CTy"Zreg"))),
526             Var("base",CTy"Zbase"),Var("displacement",F64)],
527          Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64))),
528          Bop(Add,
529              Bop(Add,
530                  Apply
531                    (Call
532                       ("ea_index",ATy(qTy,F64),
533                        Var("index",OTy(PTy(FTy 2,CTy"Zreg")))),
534                     qVar"state"),
535                  Apply
536                    (Call("ea_base",ATy(qTy,F64),Var("base",CTy"Zbase")),
537                     qVar"state")),Var("displacement",F64)))))
538;
539val ea_Zrm_def = Def
540  ("ea_Zrm",TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")],
541   Close
542     (qVar"state",
543      CS(Var("rm",CTy"Zrm"),
544         [(Call("Zr",CTy"Zrm",Var("r",CTy"Zreg")),
545           Call
546             ("Zea_r",CTy"Zea",
547              TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg")])),
548          (Call
549             ("Zm",CTy"Zrm",
550              Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
551           Call
552             ("Zea_m",CTy"Zea",
553              TP[Var("size",CTy"Zsize"),
554                 Apply
555                   (Call
556                      ("mem_addr",ATy(qTy,F64),
557                       Var("m",
558                           PTy(OTy(PTy(FTy 2,CTy"Zreg")),
559                               PTy(CTy"Zbase",F64)))),qVar"state")]))])))
560;
561val ea_Zdest_def = Def
562  ("ea_Zdest",TP[Var("size",CTy"Zsize"),Var("ds",CTy"Zdest_src")],
563   Close
564     (qVar"state",
565      CS(Var("ds",CTy"Zdest_src"),
566         [(Call("Zrm_i",CTy"Zdest_src",TP[Var("rm",CTy"Zrm"),AVar F64]),
567           Apply
568             (Call
569                ("ea_Zrm",ATy(qTy,CTy"Zea"),
570                 TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")]),
571              qVar"state")),
572          (Call
573             ("Zrm_r",CTy"Zdest_src",
574              TP[Var("rm",CTy"Zrm"),AVar(CTy"Zreg")]),
575           Apply
576             (Call
577                ("ea_Zrm",ATy(qTy,CTy"Zea"),
578                 TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")]),
579              qVar"state")),
580          (Call
581             ("Zr_rm",CTy"Zdest_src",TP[Var("r",CTy"Zreg"),AVar(CTy"Zrm")]),
582           Call
583             ("Zea_r",CTy"Zea",
584              TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg")]))])))
585;
586val ea_Zsrc_def = Def
587  ("ea_Zsrc",TP[Var("size",CTy"Zsize"),Var("ds",CTy"Zdest_src")],
588   Close
589     (qVar"state",
590      CS(Var("ds",CTy"Zdest_src"),
591         [(Call("Zrm_i",CTy"Zdest_src",TP[AVar(CTy"Zrm"),Var("i",F64)]),
592           Call("Zea_i",CTy"Zea",TP[Var("size",CTy"Zsize"),Var("i",F64)])),
593          (Call
594             ("Zrm_r",CTy"Zdest_src",TP[AVar(CTy"Zrm"),Var("r",CTy"Zreg")]),
595           Call
596             ("Zea_r",CTy"Zea",
597              TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg")])),
598          (Call
599             ("Zr_rm",CTy"Zdest_src",
600              TP[AVar(CTy"Zreg"),Var("rm",CTy"Zrm")]),
601           Apply
602             (Call
603                ("ea_Zrm",ATy(qTy,CTy"Zea"),
604                 TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")]),
605              qVar"state"))])))
606;
607val ea_Zimm_rm_def = Def
608  ("ea_Zimm_rm",Var("imm_rm",CTy"Zimm_rm"),
609   Close
610     (qVar"state",
611      CS(Var("imm_rm",CTy"Zimm_rm"),
612         [(Call("Zrm",CTy"Zimm_rm",Var("rm",CTy"Zrm")),
613           Apply
614             (Call
615                ("ea_Zrm",ATy(qTy,CTy"Zea"),
616                 TP[Const("Z64",CTy"Zsize"),Var("rm",CTy"Zrm")]),
617              qVar"state")),
618          (Call("Zimm",CTy"Zimm_rm",Var("imm",F64)),
619           Call
620             ("Zea_i",CTy"Zea",TP[Const("Z64",CTy"Zsize"),Var("imm",F64)]))])))
621;
622val modSize_def = Def
623  ("modSize",TP[Var("size",CTy"Zsize"),Var("imm",F64)],
624   CS(Var("size",CTy"Zsize"),
625      [(Call("Z8",CTy"Zsize",AVar bTy),Bop(Mod,Var("imm",F64),LW(8,64))),
626       (Const("Z16",CTy"Zsize"),Bop(Mod,Var("imm",F64),LW(16,64))),
627       (Const("Z32",CTy"Zsize"),Bop(Mod,Var("imm",F64),LW(32,64))),
628       (Const("Z64",CTy"Zsize"),Bop(Mod,Var("imm",F64),LW(64,64)))]))
629;
630val restrictSize_def = Def
631  ("restrictSize",TP[Var("size",CTy"Zsize"),Var("imm",F64)],
632   CS(Var("size",CTy"Zsize"),
633      [(Call("Z8",CTy"Zsize",AVar bTy),Bop(BAnd,Var("imm",F64),LW(255,64))),
634       (Const("Z16",CTy"Zsize"),Bop(BAnd,Var("imm",F64),LW(65535,64))),
635       (Const("Z32",CTy"Zsize"),Bop(BAnd,Var("imm",F64),LW(4294967295,64))),
636       (Const("Z64",CTy"Zsize"),Var("imm",F64))]))
637;
638val EA_def = Def
639  ("EA",Var("ea",CTy"Zea"),
640   Close
641     (qVar"state",
642      CS(Var("ea",CTy"Zea"),
643         [(Call("Zea_i",CTy"Zea",Var("i",PTy(CTy"Zsize",F64))),
644           Call("restrictSize",F64,Var("i",PTy(CTy"Zsize",F64)))),
645          (Call
646             ("Zea_r",CTy"Zea",
647              TP[Call("Z8",CTy"Zsize",bVar"have_rex"),Var("r",CTy"Zreg")]),
648           Bop(BAnd,
649               ITE(Bop(Or,bVar"have_rex",
650                       Mop(Not,
651                           Bop(In,Var("r",CTy"Zreg"),
652                               SL[LC("RSP",CTy"Zreg"),LC("RBP",CTy"Zreg"),
653                                  LC("RSI",CTy"Zreg"),LC("RDI",CTy"Zreg")]))),
654                   Apply
655                     (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
656                      Var("r",CTy"Zreg")),
657                   Bop(Lsr,
658                       Apply
659                         (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
660                          Mop(Cast(CTy"Zreg"),
661                              Bop(Sub,Mop(Cast nTy,Var("r",CTy"Zreg")),
662                                  LN 4))),LN 8)),LW(255,64))),
663          (Call
664             ("Zea_r",CTy"Zea",TP[Var("s",CTy"Zsize"),Var("r",CTy"Zreg")]),
665           Call
666             ("restrictSize",F64,
667              TP[Var("s",CTy"Zsize"),
668                 Apply
669                   (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
670                    Var("r",CTy"Zreg"))])),
671          (Call
672             ("Zea_m",CTy"Zea",
673              TP[Call("Z8",CTy"Zsize",AVar bTy),Var("a",F64)]),
674           Mop(Cast F64,
675               Apply(Call("mem8",ATy(qTy,F8),Var("a",F64)),qVar"state"))),
676          (Call("Zea_m",CTy"Zea",TP[Const("Z16",CTy"Zsize"),Var("a",F64)]),
677           Mop(Cast F64,
678               Apply(Call("mem16",ATy(qTy,F16),Var("a",F64)),qVar"state"))),
679          (Call("Zea_m",CTy"Zea",TP[Const("Z32",CTy"Zsize"),Var("a",F64)]),
680           Mop(Cast F64,
681               Apply(Call("mem32",ATy(qTy,F32),Var("a",F64)),qVar"state"))),
682          (Call("Zea_m",CTy"Zea",TP[Const("Z64",CTy"Zsize"),Var("a",F64)]),
683           Apply(Call("mem64",ATy(qTy,F64),Var("a",F64)),qVar"state"))])))
684;
685val write'EA_def = Def
686  ("write'EA",TP[Var("w",F64),Var("ea",CTy"Zea")],
687   Close
688     (qVar"state",
689      CS(Var("ea",CTy"Zea"),
690         [(Call("Zea_i",CTy"Zea",Var("i",PTy(CTy"Zsize",F64))),
691           Mop(Snd,
692               Apply
693                 (Call
694                    ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
695                     Call("FAILURE",CTy"exception",LS"write to constant")),
696                  qVar"state"))),
697          (Call
698             ("Zea_r",CTy"Zea",
699              TP[Call("Z8",CTy"Zsize",bVar"have_rex"),Var("r",CTy"Zreg")]),
700           ITE(Bop(Or,bVar"have_rex",
701                   Mop(Not,
702                       Bop(In,Var("r",CTy"Zreg"),
703                           SL[LC("RSP",CTy"Zreg"),LC("RBP",CTy"Zreg"),
704                              LC("RSI",CTy"Zreg"),LC("RDI",CTy"Zreg")]))),
705               Rupd
706                 ("REG",
707                  TP[qVar"state",
708                     Fupd
709                       (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
710                        Var("r",CTy"Zreg"),
711                        BFI(LN 7,LN 0,EX(Var("w",F64),LN 7,LN 0,F8),
712                            Apply
713                              (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
714                               Var("r",CTy"Zreg"))))]),
715               Let(Var("x",CTy"Zreg"),
716                   Mop(Cast(CTy"Zreg"),
717                       Bop(Sub,Mop(Cast nTy,Var("r",CTy"Zreg")),LN 4)),
718                   Rupd
719                     ("REG",
720                      TP[qVar"state",
721                         Fupd
722                           (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
723                            Var("x",CTy"Zreg"),
724                            BFI(LN 15,LN 8,EX(Var("w",F64),LN 7,LN 0,F8),
725                                Apply
726                                  (Dest
727                                     ("REG",ATy(CTy"Zreg",F64),qVar"state"),
728                                   Var("x",CTy"Zreg"))))])))),
729          (Call
730             ("Zea_r",CTy"Zea",
731              TP[Const("Z16",CTy"Zsize"),Var("r",CTy"Zreg")]),
732           Rupd
733             ("REG",
734              TP[qVar"state",
735                 Fupd
736                   (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
737                    Var("r",CTy"Zreg"),
738                    BFI(LN 15,LN 0,EX(Var("w",F64),LN 15,LN 0,F16),
739                        Apply
740                          (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
741                           Var("r",CTy"Zreg"))))])),
742          (Call
743             ("Zea_r",CTy"Zea",
744              TP[Const("Z32",CTy"Zsize"),Var("r",CTy"Zreg")]),
745           Rupd
746             ("REG",
747              TP[qVar"state",
748                 Fupd
749                   (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
750                    Var("r",CTy"Zreg"),
751                    Mop(Cast F64,EX(Var("w",F64),LN 31,LN 0,F32)))])),
752          (Call
753             ("Zea_r",CTy"Zea",
754              TP[Const("Z64",CTy"Zsize"),Var("r",CTy"Zreg")]),
755           Rupd
756             ("REG",
757              TP[qVar"state",
758                 Fupd
759                   (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
760                    Var("r",CTy"Zreg"),Var("w",F64))])),
761          (Call
762             ("Zea_m",CTy"Zea",
763              TP[Call("Z8",CTy"Zsize",AVar bTy),Var("a",F64)]),
764           Apply
765             (Call
766                ("write'mem8",ATy(qTy,qTy),
767                 TP[EX(Var("w",F64),LN 7,LN 0,F8),Var("a",F64)]),
768              qVar"state")),
769          (Call("Zea_m",CTy"Zea",TP[Const("Z16",CTy"Zsize"),Var("a",F64)]),
770           Apply
771             (Call
772                ("write'mem16",ATy(qTy,qTy),
773                 TP[EX(Var("w",F64),LN 15,LN 0,F16),Var("a",F64)]),
774              qVar"state")),
775          (Call("Zea_m",CTy"Zea",TP[Const("Z32",CTy"Zsize"),Var("a",F64)]),
776           Apply
777             (Call
778                ("write'mem32",ATy(qTy,qTy),
779                 TP[EX(Var("w",F64),LN 31,LN 0,F32),Var("a",F64)]),
780              qVar"state")),
781          (Call("Zea_m",CTy"Zea",TP[Const("Z64",CTy"Zsize"),Var("a",F64)]),
782           Apply
783             (Call
784                ("write'mem64",ATy(qTy,qTy),TP[Var("w",F64),Var("a",F64)]),
785              qVar"state"))])))
786;
787val read_dest_src_ea_def = Def
788  ("read_dest_src_ea",Var("sd",PTy(CTy"Zsize",CTy"Zdest_src")),
789   Close
790     (qVar"state",
791      Let(Var("v",CTy"Zea"),
792          Apply
793            (Call
794               ("ea_Zdest",ATy(qTy,CTy"Zea"),
795                Var("sd",PTy(CTy"Zsize",CTy"Zdest_src"))),qVar"state"),
796          TP[Var("v",CTy"Zea"),
797             Apply(Call("EA",ATy(qTy,F64),Var("v",CTy"Zea")),qVar"state"),
798             Apply
799               (Call
800                  ("EA",ATy(qTy,F64),
801                   Apply
802                     (Call
803                        ("ea_Zsrc",ATy(qTy,CTy"Zea"),
804                         Var("sd",PTy(CTy"Zsize",CTy"Zdest_src"))),
805                      qVar"state")),qVar"state")])))
806;
807val call_dest_from_ea_def = Def
808  ("call_dest_from_ea",Var("ea",CTy"Zea"),
809   Close
810     (qVar"state",
811      CS(Var("ea",CTy"Zea"),
812         [(Call("Zea_i",CTy"Zea",TP[AVar(CTy"Zsize"),Var("i",F64)]),
813           Bop(Add,Dest("RIP",F64,qVar"state"),Var("i",F64))),
814          (Call("Zea_r",CTy"Zea",TP[AVar(CTy"Zsize"),Var("r",CTy"Zreg")]),
815           Apply
816             (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
817              Var("r",CTy"Zreg"))),
818          (Call("Zea_m",CTy"Zea",TP[AVar(CTy"Zsize"),Var("a",F64)]),
819           Apply(Call("mem64",ATy(qTy,F64),Var("a",F64)),qVar"state"))])))
820;
821val get_ea_address_def = Def
822  ("get_ea_address",Var("ea",CTy"Zea"),
823   CS(Var("ea",CTy"Zea"),
824      [(Call("Zea_i",CTy"Zea",TP[AVar(CTy"Zsize"),Var("i",F64)]),LW(0,64)),
825       (Call("Zea_r",CTy"Zea",TP[AVar(CTy"Zsize"),Var("r",CTy"Zreg")]),
826        LW(0,64)),
827       (Call("Zea_m",CTy"Zea",TP[AVar(CTy"Zsize"),Var("a",F64)]),
828        Var("a",F64))]))
829;
830val jump_to_ea_def = Def
831  ("jump_to_ea",Var("ea",CTy"Zea"),
832   Close
833     (qVar"state",
834      Rupd
835        ("RIP",
836         TP[qVar"state",
837            Apply
838              (Call("call_dest_from_ea",ATy(qTy,F64),Var("ea",CTy"Zea")),
839               qVar"state")])))
840;
841val ByteParity_def = Def
842  ("ByteParity",Var("b",F8),
843   EQ(Bop(Mod,
844          Bop(Add,
845              Bop(Add,
846                  Bop(Add,
847                      Bop(Add,
848                          Bop(Add,
849                              Bop(Add,
850                                  Bop(Add,
851                                      Mop(Cast nTy,
852                                          Bop(Bit,Var("b",F8),LN 7)),
853                                      Mop(Cast nTy,
854                                          Bop(Bit,Var("b",F8),LN 6))),
855                                  Mop(Cast nTy,Bop(Bit,Var("b",F8),LN 5))),
856                              Mop(Cast nTy,Bop(Bit,Var("b",F8),LN 4))),
857                          Mop(Cast nTy,Bop(Bit,Var("b",F8),LN 3))),
858                      Mop(Cast nTy,Bop(Bit,Var("b",F8),LN 2))),
859                  Mop(Cast nTy,Bop(Bit,Var("b",F8),LN 1))),
860              Mop(Cast nTy,Bop(Bit,Var("b",F8),LN 0))),LN 2),LN 0))
861;
862val Zsize_width_def = Def
863  ("Zsize_width",Var("size",CTy"Zsize"),
864   CS(Var("size",CTy"Zsize"),
865      [(Call("Z8",CTy"Zsize",AVar bTy),LN 8),
866       (Const("Z16",CTy"Zsize"),LN 16),(Const("Z32",CTy"Zsize"),LN 32),
867       (Const("Z64",CTy"Zsize"),LN 64)]))
868;
869val word_size_msb_def = Def
870  ("word_size_msb",TP[Var("size",CTy"Zsize"),Var("w",F64)],
871   Bop(Bit,Var("w",F64),
872       Bop(Sub,Call("Zsize_width",nTy,Var("size",CTy"Zsize")),LN 1)))
873;
874val write_PF_def = Def
875  ("write_PF",Var("w",F64),
876   Close
877     (qVar"state",
878      Apply
879        (Call
880           ("write'PF",ATy(qTy,qTy),
881            Call("ByteParity",bTy,EX(Var("w",F64),LN 7,LN 0,F8))),
882         qVar"state")))
883;
884val write_SF_def = Def
885  ("write_SF",Var("s_w",PTy(CTy"Zsize",F64)),
886   Close
887     (qVar"state",
888      Apply
889        (Call
890           ("write'SF",ATy(qTy,qTy),
891            Call("word_size_msb",bTy,Var("s_w",PTy(CTy"Zsize",F64)))),
892         qVar"state")))
893;
894val write_ZF_def = Def
895  ("write_ZF",TP[Var("size",CTy"Zsize"),Var("w",F64)],
896   Close
897     (qVar"state",
898      Apply
899        (Call
900           ("write'ZF",ATy(qTy,qTy),
901            CS(Var("size",CTy"Zsize"),
902               [(Call("Z8",CTy"Zsize",AVar bTy),
903                 EQ(Mop(Cast F8,Var("w",F64)),LW(0,8))),
904                (Const("Z16",CTy"Zsize"),
905                 EQ(Mop(Cast F16,Var("w",F64)),LW(0,16))),
906                (Const("Z32",CTy"Zsize"),
907                 EQ(Mop(Cast F32,Var("w",F64)),LW(0,32))),
908                (Const("Z64",CTy"Zsize"),EQ(Var("w",F64),LW(0,64)))])),
909         qVar"state")))
910;
911val write_arith_eflags_except_CF_OF_def = Def
912  ("write_arith_eflags_except_CF_OF",
913   TP[Var("size",CTy"Zsize"),Var("w",F64)],
914   Close
915     (qVar"state",
916      Apply
917        (Call("FlagUnspecified",ATy(qTy,qTy),LC("Z_AF",CTy"Zeflags")),
918         Apply
919           (Call
920              ("write_ZF",ATy(qTy,qTy),
921               TP[Var("size",CTy"Zsize"),Var("w",F64)]),
922            Apply
923              (Call
924                 ("write_SF",ATy(qTy,qTy),
925                  TP[Var("size",CTy"Zsize"),Var("w",F64)]),
926               Apply
927                 (Call("write_PF",ATy(qTy,qTy),Var("w",F64)),qVar"state"))))))
928;
929val write_arith_eflags_def = Def
930  ("write_arith_eflags",
931   TP[Var("size",CTy"Zsize"),Var("w",F64),bVar"c",bVar"x"],
932   Close
933     (qVar"state",
934      Apply
935        (Call
936           ("write_arith_eflags_except_CF_OF",ATy(qTy,qTy),
937            TP[Var("size",CTy"Zsize"),Var("w",F64)]),
938         Apply
939           (Call("write'OF",ATy(qTy,qTy),bVar"x"),
940            Apply(Call("write'CF",ATy(qTy,qTy),bVar"c"),qVar"state")))))
941;
942val write_logical_eflags_def = Def
943  ("write_logical_eflags",TP[Var("size",CTy"Zsize"),Var("w",F64)],
944   Close
945     (qVar"state",
946      Apply
947        (Call
948           ("write_arith_eflags",ATy(qTy,qTy),
949            TP[Var("size",CTy"Zsize"),Var("w",F64),LF,LF]),qVar"state")))
950;
951val erase_eflags_def = Def
952  ("erase_eflags",qVar"state",
953   Rupd("EFLAGS",TP[qVar"state",Mop(K1(CTy"Zeflags"),LO bTy)]))
954;
955val value_width_def = Def
956  ("value_width",Var("s",CTy"Zsize"),
957   Bop(Exp,LN 2,Call("Zsize_width",nTy,Var("s",CTy"Zsize"))))
958;
959val word_signed_overflow_add_def = Def
960  ("word_signed_overflow_add",
961   TP[Var("size",CTy"Zsize"),Var("a",F64),Var("b",F64)],
962   Bop(And,
963       EQ(Call
964            ("word_size_msb",bTy,TP[Var("size",CTy"Zsize"),Var("a",F64)]),
965          Call
966            ("word_size_msb",bTy,TP[Var("size",CTy"Zsize"),Var("b",F64)])),
967       Mop(Not,
968           EQ(Call
969                ("word_size_msb",bTy,
970                 TP[Var("size",CTy"Zsize"),
971                    Bop(Add,Var("a",F64),Var("b",F64))]),
972              Call
973                ("word_size_msb",bTy,
974                 TP[Var("size",CTy"Zsize"),Var("a",F64)])))))
975;
976val word_signed_overflow_sub_def = Def
977  ("word_signed_overflow_sub",
978   TP[Var("size",CTy"Zsize"),Var("a",F64),Var("b",F64)],
979   Bop(And,
980       Mop(Not,
981           EQ(Call
982                ("word_size_msb",bTy,
983                 TP[Var("size",CTy"Zsize"),Var("a",F64)]),
984              Call
985                ("word_size_msb",bTy,
986                 TP[Var("size",CTy"Zsize"),Var("b",F64)]))),
987       Mop(Not,
988           EQ(Call
989                ("word_size_msb",bTy,
990                 TP[Var("size",CTy"Zsize"),
991                    Bop(Sub,Var("a",F64),Var("b",F64))]),
992              Call
993                ("word_size_msb",bTy,
994                 TP[Var("size",CTy"Zsize"),Var("a",F64)])))))
995;
996val add_with_carry_out_def = Def
997  ("add_with_carry_out",
998   TP[Var("size",CTy"Zsize"),Var("x",F64),Var("y",F64)],
999   TP[Bop(Add,Var("x",F64),Var("y",F64)),
1000      Bop(Le,Call("value_width",nTy,Var("size",CTy"Zsize")),
1001          Bop(Add,Mop(Cast nTy,Var("x",F64)),Mop(Cast nTy,Var("y",F64)))),
1002      Call
1003        ("word_signed_overflow_add",bTy,
1004         TP[Var("size",CTy"Zsize"),Var("x",F64),Var("y",F64)])])
1005;
1006val sub_with_borrow_def = Def
1007  ("sub_with_borrow",TP[Var("size",CTy"Zsize"),Var("x",F64),Var("y",F64)],
1008   TP[Bop(Sub,Var("x",F64),Var("y",F64)),
1009      Bop(Ult,Var("x",F64),Var("y",F64)),
1010      Call
1011        ("word_signed_overflow_sub",bTy,
1012         TP[Var("size",CTy"Zsize"),Var("x",F64),Var("y",F64)])])
1013;
1014val write_arith_result_def = Def
1015  ("write_arith_result",
1016   TP[Var("size",CTy"Zsize"),Var("r",PTy(F64,PTy(bTy,bTy))),
1017      Var("ea",CTy"Zea")],
1018   Close
1019     (qVar"state",
1020      Apply
1021        (Call
1022           ("write'EA",ATy(qTy,qTy),
1023            TP[Mop(Fst,Var("r",PTy(F64,PTy(bTy,bTy)))),Var("ea",CTy"Zea")]),
1024         Apply
1025           (Call
1026              ("write_arith_eflags",ATy(qTy,qTy),
1027               TP[Var("size",CTy"Zsize"),Var("r",PTy(F64,PTy(bTy,bTy)))]),
1028            qVar"state"))))
1029;
1030val write_arith_result_no_CF_OF_def = Def
1031  ("write_arith_result_no_CF_OF",
1032   TP[Var("size",CTy"Zsize"),Var("w",F64),Var("ea",CTy"Zea")],
1033   Close
1034     (qVar"state",
1035      Apply
1036        (Call("write'EA",ATy(qTy,qTy),TP[Var("w",F64),Var("ea",CTy"Zea")]),
1037         Apply
1038           (Call
1039              ("write_arith_eflags_except_CF_OF",ATy(qTy,qTy),
1040               TP[Var("size",CTy"Zsize"),Var("w",F64)]),qVar"state"))))
1041;
1042val write_logical_result_def = Def
1043  ("write_logical_result",
1044   TP[Var("size",CTy"Zsize"),Var("w",F64),Var("ea",CTy"Zea")],
1045   Close
1046     (qVar"state",
1047      Apply
1048        (Call("write'EA",ATy(qTy,qTy),TP[Var("w",F64),Var("ea",CTy"Zea")]),
1049         Apply
1050           (Call
1051              ("write_logical_eflags",ATy(qTy,qTy),
1052               TP[Var("size",CTy"Zsize"),Var("w",F64)]),qVar"state"))))
1053;
1054val write_result_erase_eflags_def = Def
1055  ("write_result_erase_eflags",TP[Var("w",F64),Var("ea",CTy"Zea")],
1056   Close
1057     (qVar"state",
1058      Apply
1059        (Call("write'EA",ATy(qTy,qTy),TP[Var("w",F64),Var("ea",CTy"Zea")]),
1060         Apply(Const("erase_eflags",ATy(qTy,qTy)),qVar"state"))))
1061;
1062val SignExtension_def = Def
1063  ("SignExtension",
1064   TP[Var("w",F64),Var("size1",CTy"Zsize"),Var("size2",CTy"Zsize")],
1065   Close
1066     (qVar"state",
1067      Let(TP[Var("r",F64),Var("s1",PTy(F64,qTy))],
1068          Let(Var("s",PTy(F64,qTy)),
1069              CS(TP[Var("size1",CTy"Zsize"),Var("size2",CTy"Zsize")],
1070                 [(TP[Call("Z8",CTy"Zsize",AVar bTy),
1071                      Const("Z16",CTy"Zsize")],
1072                   TP[BFI(LN 15,LN 0,
1073                          Mop(SE F16,EX(Var("w",F64),LN 7,LN 0,F8)),
1074                          Var("w",F64)),qVar"state"]),
1075                  (TP[Call("Z8",CTy"Zsize",AVar bTy),
1076                      Const("Z32",CTy"Zsize")],
1077                   TP[BFI(LN 31,LN 0,
1078                          Mop(SE F32,EX(Var("w",F64),LN 7,LN 0,F8)),
1079                          Var("w",F64)),qVar"state"]),
1080                  (TP[Call("Z8",CTy"Zsize",AVar bTy),
1081                      Const("Z64",CTy"Zsize")],
1082                   TP[Mop(SE F64,EX(Var("w",F64),LN 7,LN 0,F8)),
1083                      qVar"state"]),
1084                  (TP[Const("Z16",CTy"Zsize"),Const("Z32",CTy"Zsize")],
1085                   TP[BFI(LN 31,LN 0,
1086                          Mop(SE F32,EX(Var("w",F64),LN 15,LN 0,F16)),
1087                          Var("w",F64)),qVar"state"]),
1088                  (TP[Const("Z16",CTy"Zsize"),Const("Z64",CTy"Zsize")],
1089                   TP[Mop(SE F64,EX(Var("w",F64),LN 15,LN 0,F16)),
1090                      qVar"state"]),
1091                  (TP[Const("Z32",CTy"Zsize"),Const("Z64",CTy"Zsize")],
1092                   TP[Mop(SE F64,EX(Var("w",F64),LN 31,LN 0,F32)),
1093                      qVar"state"]),
1094                  (AVar(PTy(CTy"Zsize",CTy"Zsize")),
1095                   TP[Var("w",F64),
1096                      Mop(Snd,
1097                          Apply
1098                            (Call
1099                               ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
1100                                Call
1101                                  ("FAILURE",CTy"exception",
1102                                   LS"SignExtension")),qVar"state"))])]),
1103              TP[Mop(Fst,Var("s",PTy(F64,qTy))),Var("s",PTy(F64,qTy))]),
1104          TP[Var("r",F64),Mop(Snd,Var("s1",PTy(F64,qTy)))])))
1105;
1106val SignExtension64_def = Def
1107  ("SignExtension64",TP[Var("w",F64),Var("size",CTy"Zsize")],
1108   Close
1109     (qVar"state",
1110      ITE(EQ(Var("size",CTy"Zsize"),Const("Z64",CTy"Zsize")),
1111          TP[Var("w",F64),qVar"state"],
1112          Apply
1113            (Call
1114               ("SignExtension",ATy(qTy,PTy(F64,qTy)),
1115                TP[Var("w",F64),Var("size",CTy"Zsize"),
1116                   Const("Z64",CTy"Zsize")]),qVar"state"))))
1117;
1118val maskShift_def = Def
1119  ("maskShift",TP[Var("size",CTy"Zsize"),Var("w",F64)],
1120   ITE(EQ(Var("size",CTy"Zsize"),Const("Z64",CTy"Zsize")),
1121       Mop(Cast nTy,EX(Var("w",F64),LN 5,LN 0,FTy 6)),
1122       Mop(Cast nTy,EX(Var("w",F64),LN 4,LN 0,FTy 5))))
1123;
1124val ROL_def = Def
1125  ("ROL",TP[Var("size",CTy"Zsize"),Var("x",F64),Var("y",F64)],
1126   CS(Var("size",CTy"Zsize"),
1127      [(Call("Z8",CTy"Zsize",AVar bTy),
1128        Mop(Cast F64,
1129            Bop(Rol,EX(Var("x",F64),LN 7,LN 0,F8),
1130                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1131       (Const("Z16",CTy"Zsize"),
1132        Mop(Cast F64,
1133            Bop(Rol,EX(Var("x",F64),LN 15,LN 0,F16),
1134                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1135       (Const("Z32",CTy"Zsize"),
1136        Mop(Cast F64,
1137            Bop(Rol,EX(Var("x",F64),LN 31,LN 0,F32),
1138                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1139       (Const("Z64",CTy"Zsize"),
1140        Bop(Rol,Var("x",F64),
1141            Mop(Cast nTy,EX(Var("y",F64),LN 5,LN 0,FTy 6))))]))
1142;
1143val ROR_def = Def
1144  ("ROR",TP[Var("size",CTy"Zsize"),Var("x",F64),Var("y",F64)],
1145   CS(Var("size",CTy"Zsize"),
1146      [(Call("Z8",CTy"Zsize",AVar bTy),
1147        Mop(Cast F64,
1148            Bop(Ror,EX(Var("x",F64),LN 7,LN 0,F8),
1149                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1150       (Const("Z16",CTy"Zsize"),
1151        Mop(Cast F64,
1152            Bop(Ror,EX(Var("x",F64),LN 15,LN 0,F16),
1153                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1154       (Const("Z32",CTy"Zsize"),
1155        Mop(Cast F64,
1156            Bop(Ror,EX(Var("x",F64),LN 31,LN 0,F32),
1157                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1158       (Const("Z64",CTy"Zsize"),
1159        Bop(Ror,Var("x",F64),
1160            Mop(Cast nTy,EX(Var("y",F64),LN 5,LN 0,FTy 6))))]))
1161;
1162val SAR_def = Def
1163  ("SAR",TP[Var("size",CTy"Zsize"),Var("x",F64),Var("y",F64)],
1164   CS(Var("size",CTy"Zsize"),
1165      [(Call("Z8",CTy"Zsize",AVar bTy),
1166        Mop(Cast F64,
1167            Bop(Asr,EX(Var("x",F64),LN 7,LN 0,F8),
1168                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1169       (Const("Z16",CTy"Zsize"),
1170        Mop(Cast F64,
1171            Bop(Asr,EX(Var("x",F64),LN 15,LN 0,F16),
1172                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1173       (Const("Z32",CTy"Zsize"),
1174        Mop(Cast F64,
1175            Bop(Asr,EX(Var("x",F64),LN 31,LN 0,F32),
1176                Mop(Cast nTy,EX(Var("y",F64),LN 4,LN 0,FTy 5))))),
1177       (Const("Z64",CTy"Zsize"),
1178        Bop(Asr,Var("x",F64),
1179            Mop(Cast nTy,EX(Var("y",F64),LN 5,LN 0,FTy 6))))]))
1180;
1181val write_binop_def = Def
1182  ("write_binop",
1183   TP[Var("s",CTy"Zsize"),Var("bop",CTy"Zbinop_name"),Var("x",F64),
1184      Var("y",F64),Var("ea",CTy"Zea")],
1185   Close
1186     (qVar"state",
1187      CS(Var("bop",CTy"Zbinop_name"),
1188         [(LC("Zadd",CTy"Zbinop_name"),
1189           Apply
1190             (Call
1191                ("write_arith_result",ATy(qTy,qTy),
1192                 TP[Var("s",CTy"Zsize"),
1193                    Call
1194                      ("add_with_carry_out",PTy(F64,PTy(bTy,bTy)),
1195                       TP[Var("s",CTy"Zsize"),Var("x",F64),Var("y",F64)]),
1196                    Var("ea",CTy"Zea")]),qVar"state")),
1197          (LC("Zsub",CTy"Zbinop_name"),
1198           Apply
1199             (Call
1200                ("write_arith_result",ATy(qTy,qTy),
1201                 TP[Var("s",CTy"Zsize"),
1202                    Call
1203                      ("sub_with_borrow",PTy(F64,PTy(bTy,bTy)),
1204                       TP[Var("s",CTy"Zsize"),Var("x",F64),Var("y",F64)]),
1205                    Var("ea",CTy"Zea")]),qVar"state")),
1206          (LC("Zcmp",CTy"Zbinop_name"),
1207           Apply
1208             (Call
1209                ("write_arith_eflags",ATy(qTy,qTy),
1210                 TP[Var("s",CTy"Zsize"),
1211                    Call
1212                      ("sub_with_borrow",PTy(F64,PTy(bTy,bTy)),
1213                       TP[Var("s",CTy"Zsize"),Var("x",F64),Var("y",F64)])]),
1214              qVar"state")),
1215          (LC("Ztest",CTy"Zbinop_name"),
1216           Apply
1217             (Call
1218                ("write_logical_eflags",ATy(qTy,qTy),
1219                 TP[Var("s",CTy"Zsize"),
1220                    Bop(BAnd,Var("x",F64),Var("y",F64))]),qVar"state")),
1221          (LC("Zand",CTy"Zbinop_name"),
1222           Apply
1223             (Call
1224                ("write_logical_result",ATy(qTy,qTy),
1225                 TP[Var("s",CTy"Zsize"),
1226                    Bop(BAnd,Var("x",F64),Var("y",F64)),Var("ea",CTy"Zea")]),
1227              qVar"state")),
1228          (LC("Zxor",CTy"Zbinop_name"),
1229           Apply
1230             (Call
1231                ("write_logical_result",ATy(qTy,qTy),
1232                 TP[Var("s",CTy"Zsize"),
1233                    Bop(BXor,Var("x",F64),Var("y",F64)),Var("ea",CTy"Zea")]),
1234              qVar"state")),
1235          (LC("Zor",CTy"Zbinop_name"),
1236           Apply
1237             (Call
1238                ("write_logical_result",ATy(qTy,qTy),
1239                 TP[Var("s",CTy"Zsize"),
1240                    Bop(BOr,Var("x",F64),Var("y",F64)),Var("ea",CTy"Zea")]),
1241              qVar"state")),
1242          (LC("Zrol",CTy"Zbinop_name"),
1243           Apply
1244             (Call
1245                ("write_result_erase_eflags",ATy(qTy,qTy),
1246                 TP[Call
1247                      ("ROL",F64,
1248                       TP[Var("s",CTy"Zsize"),Var("x",F64),Var("y",F64)]),
1249                    Var("ea",CTy"Zea")]),qVar"state")),
1250          (LC("Zror",CTy"Zbinop_name"),
1251           Apply
1252             (Call
1253                ("write_result_erase_eflags",ATy(qTy,qTy),
1254                 TP[Call
1255                      ("ROR",F64,
1256                       TP[Var("s",CTy"Zsize"),Var("x",F64),Var("y",F64)]),
1257                    Var("ea",CTy"Zea")]),qVar"state")),
1258          (LC("Zsar",CTy"Zbinop_name"),
1259           Apply
1260             (Call
1261                ("write_result_erase_eflags",ATy(qTy,qTy),
1262                 TP[Call
1263                      ("SAR",F64,
1264                       TP[Var("s",CTy"Zsize"),Var("x",F64),Var("y",F64)]),
1265                    Var("ea",CTy"Zea")]),qVar"state")),
1266          (LC("Zshl",CTy"Zbinop_name"),
1267           Apply
1268             (Call
1269                ("write_result_erase_eflags",ATy(qTy,qTy),
1270                 TP[Bop(Lsl,Var("x",F64),
1271                        Call
1272                          ("maskShift",nTy,
1273                           TP[Var("s",CTy"Zsize"),Var("y",F64)])),
1274                    Var("ea",CTy"Zea")]),qVar"state")),
1275          (LC("Zshr",CTy"Zbinop_name"),
1276           Apply
1277             (Call
1278                ("write_result_erase_eflags",ATy(qTy,qTy),
1279                 TP[Bop(Lsr,Var("x",F64),
1280                        Call
1281                          ("maskShift",nTy,
1282                           TP[Var("s",CTy"Zsize"),Var("y",F64)])),
1283                    Var("ea",CTy"Zea")]),qVar"state")),
1284          (LC("Zadc",CTy"Zbinop_name"),
1285           Let(TP[bVar"v",qVar"s0"],
1286               Apply(Const("CF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1287               Apply
1288                 (Call
1289                    ("write_arith_result_no_CF_OF",ATy(qTy,qTy),
1290                     TP[Var("s",CTy"Zsize"),
1291                        Bop(Add,Bop(Add,Var("x",F64),Var("y",F64)),
1292                            Mop(Cast F64,bVar"v")),Var("ea",CTy"Zea")]),
1293                  Apply
1294                    (Call
1295                       ("FlagUnspecified",ATy(qTy,qTy),
1296                        LC("Z_OF",CTy"Zeflags")),
1297                     Apply
1298                       (Call
1299                          ("write'CF",ATy(qTy,qTy),
1300                           Bop(Le,
1301                               Call("value_width",nTy,Var("s",CTy"Zsize")),
1302                               Bop(Add,
1303                                   Bop(Add,Mop(Cast nTy,Var("x",F64)),
1304                                       Mop(Cast nTy,Var("y",F64))),
1305                                   Mop(Cast nTy,bVar"v")))),qVar"s0"))))),
1306          (LC("Zsbb",CTy"Zbinop_name"),
1307           Let(TP[bVar"v",qVar"s0"],
1308               Apply(Const("CF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1309               Apply
1310                 (Call
1311                    ("write_arith_result_no_CF_OF",ATy(qTy,qTy),
1312                     TP[Var("s",CTy"Zsize"),
1313                        Bop(Sub,Var("x",F64),
1314                            Bop(Add,Var("y",F64),Mop(Cast F64,bVar"v"))),
1315                        Var("ea",CTy"Zea")]),
1316                  Apply
1317                    (Call
1318                       ("FlagUnspecified",ATy(qTy,qTy),
1319                        LC("Z_OF",CTy"Zeflags")),
1320                     Apply
1321                       (Call
1322                          ("write'CF",ATy(qTy,qTy),
1323                           Bop(Lt,Mop(Cast nTy,Var("x",F64)),
1324                               Bop(Add,Mop(Cast nTy,Var("y",F64)),
1325                                   Mop(Cast nTy,bVar"v")))),qVar"s0"))))),
1326          (AVar(CTy"Zbinop_name"),
1327           Mop(Snd,
1328               Apply
1329                 (Call
1330                    ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
1331                     Call
1332                       ("FAILURE",CTy"exception",
1333                        CC[LS"Binary op not implemented: ",
1334                           Mop(Cast sTy,Var("bop",CTy"Zbinop_name"))])),
1335                  qVar"state")))])))
1336;
1337val write_monop_def = Def
1338  ("write_monop",
1339   TP[Var("s",CTy"Zsize"),Var("mop",CTy"Zmonop_name"),Var("x",F64),
1340      Var("ea",CTy"Zea")],
1341   Close
1342     (qVar"state",
1343      CS(Var("mop",CTy"Zmonop_name"),
1344         [(LC("Znot",CTy"Zmonop_name"),
1345           Apply
1346             (Call
1347                ("write'EA",ATy(qTy,qTy),
1348                 TP[Mop(BNot,Var("x",F64)),Var("ea",CTy"Zea")]),
1349              qVar"state")),
1350          (LC("Zdec",CTy"Zmonop_name"),
1351           Apply
1352             (Call
1353                ("write_arith_result_no_CF_OF",ATy(qTy,qTy),
1354                 TP[Var("s",CTy"Zsize"),Bop(Sub,Var("x",F64),LW(1,64)),
1355                    Var("ea",CTy"Zea")]),qVar"state")),
1356          (LC("Zinc",CTy"Zmonop_name"),
1357           Apply
1358             (Call
1359                ("write_arith_result_no_CF_OF",ATy(qTy,qTy),
1360                 TP[Var("s",CTy"Zsize"),Bop(Add,Var("x",F64),LW(1,64)),
1361                    Var("ea",CTy"Zea")]),qVar"state")),
1362          (LC("Zneg",CTy"Zmonop_name"),
1363           Apply
1364             (Call("FlagUnspecified",ATy(qTy,qTy),LC("Z_CF",CTy"Zeflags")),
1365              Apply
1366                (Call
1367                   ("write_arith_result_no_CF_OF",ATy(qTy,qTy),
1368                    TP[Var("s",CTy"Zsize"),Mop(Neg,Var("x",F64)),
1369                       Var("ea",CTy"Zea")]),qVar"state")))])))
1370;
1371val bit_test_def = Def
1372  ("bit_test",
1373   TP[Var("bt",CTy"Zbit_test_name"),Var("base",CTy"Zea"),nVar"offset"],
1374   Close
1375     (qVar"state",
1376      Let(bVar"v",
1377          Bop(Bit,
1378              Apply
1379                (Call("EA",ATy(qTy,F64),Var("base",CTy"Zea")),qVar"state"),
1380              nVar"offset"),
1381          Let(qVar"s",
1382              Apply(Call("write'CF",ATy(qTy,qTy),bVar"v"),qVar"state"),
1383              CS(Var("bt",CTy"Zbit_test_name"),
1384                 [(LC("Zbt",CTy"Zbit_test_name"),qVar"s"),
1385                  (LC("Zbtc",CTy"Zbit_test_name"),
1386                   Apply
1387                     (Call
1388                        ("write'EA",ATy(qTy,qTy),
1389                         TP[BFI(nVar"offset",nVar"offset",
1390                                Mop(Cast F1,Mop(Not,bVar"v")),
1391                                Apply
1392                                  (Call
1393                                     ("EA",ATy(qTy,F64),
1394                                      Var("base",CTy"Zea")),qVar"s")),
1395                            Var("base",CTy"Zea")]),qVar"s")),
1396                  (LC("Zbtr",CTy"Zbit_test_name"),
1397                   Apply
1398                     (Call
1399                        ("write'EA",ATy(qTy,qTy),
1400                         TP[BFI(nVar"offset",nVar"offset",Mop(Cast F1,LF),
1401                                Apply
1402                                  (Call
1403                                     ("EA",ATy(qTy,F64),
1404                                      Var("base",CTy"Zea")),qVar"s")),
1405                            Var("base",CTy"Zea")]),qVar"s")),
1406                  (LC("Zbts",CTy"Zbit_test_name"),
1407                   Apply
1408                     (Call
1409                        ("write'EA",ATy(qTy,qTy),
1410                         TP[BFI(nVar"offset",nVar"offset",Mop(Cast F1,LT),
1411                                Apply
1412                                  (Call
1413                                     ("EA",ATy(qTy,F64),
1414                                      Var("base",CTy"Zea")),qVar"s")),
1415                            Var("base",CTy"Zea")]),qVar"s"))])))))
1416;
1417val read_cond_def = Def
1418  ("read_cond",Var("c",CTy"Zcond"),
1419   Close
1420     (qVar"state",
1421      CS(Var("c",CTy"Zcond"),
1422         [(LC("Z_A",CTy"Zcond"),
1423           CS(TP[Apply
1424                   (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1425                    LC("Z_CF",CTy"Zeflags")),
1426                 Apply
1427                   (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1428                    LC("Z_ZF",CTy"Zeflags"))],
1429              [(TP[Mop(Some,LF),Mop(Some,LF)],TP[LT,qVar"state"]),
1430               (TP[Mop(Some,LT),AVar(OTy bTy)],TP[LF,qVar"state"]),
1431               (TP[AVar(OTy bTy),Mop(Some,LT)],TP[LF,qVar"state"]),
1432               (AVar(PTy(OTy bTy,OTy bTy)),
1433                Apply
1434                  (Call
1435                     ("raise'exception",ATy(qTy,PTy(bTy,qTy)),
1436                      Call
1437                        ("BadFlagAccess",CTy"exception",
1438                         CC[LS"read_cond: ",
1439                            Mop(Cast sTy,Var("c",CTy"Zcond"))])),
1440                   qVar"state"))])),
1441          (LC("Z_NB",CTy"Zcond"),
1442           Let(TP[bVar"v",qVar"s"],
1443               Apply(Const("CF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1444               TP[Mop(Not,bVar"v"),qVar"s"])),
1445          (LC("Z_B",CTy"Zcond"),
1446           Apply(Const("CF",ATy(qTy,PTy(bTy,qTy))),qVar"state")),
1447          (LC("Z_NA",CTy"Zcond"),
1448           CS(TP[Apply
1449                   (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1450                    LC("Z_CF",CTy"Zeflags")),
1451                 Apply
1452                   (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1453                    LC("Z_ZF",CTy"Zeflags"))],
1454              [(TP[Mop(Some,LT),AVar(OTy bTy)],TP[LT,qVar"state"]),
1455               (TP[AVar(OTy bTy),Mop(Some,LT)],TP[LT,qVar"state"]),
1456               (TP[Mop(Some,LF),Mop(Some,LF)],TP[LF,qVar"state"]),
1457               (AVar(PTy(OTy bTy,OTy bTy)),
1458                Apply
1459                  (Call
1460                     ("raise'exception",ATy(qTy,PTy(bTy,qTy)),
1461                      Call
1462                        ("BadFlagAccess",CTy"exception",
1463                         CC[LS"read_cond: ",
1464                            Mop(Cast sTy,Var("c",CTy"Zcond"))])),
1465                   qVar"state"))])),
1466          (LC("Z_E",CTy"Zcond"),
1467           Apply(Const("ZF",ATy(qTy,PTy(bTy,qTy))),qVar"state")),
1468          (LC("Z_G",CTy"Zcond"),
1469           CS(TP[Apply
1470                   (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1471                    LC("Z_SF",CTy"Zeflags")),
1472                 Apply
1473                   (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1474                    LC("Z_OF",CTy"Zeflags"))],
1475              [(TP[Mop(Some,bVar"a"),Mop(Some,bVar"b")],
1476                ITE(EQ(bVar"a",bVar"b"),
1477                    Let(TP[bVar"v",qVar"s"],
1478                        Apply
1479                          (Const("ZF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1480                        TP[Mop(Not,bVar"v"),qVar"s"]),TP[LF,qVar"state"])),
1481               (AVar(PTy(OTy bTy,OTy bTy)),
1482                CS(Apply
1483                     (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1484                      LC("Z_ZF",CTy"Zeflags")),
1485                   [(Mop(Some,LT),TP[LF,qVar"state"]),
1486                    (AVar(OTy bTy),
1487                     Apply
1488                       (Call
1489                          ("raise'exception",ATy(qTy,PTy(bTy,qTy)),
1490                           Call
1491                             ("BadFlagAccess",CTy"exception",
1492                              CC[LS"read_cond: ",
1493                                 Mop(Cast sTy,Var("c",CTy"Zcond"))])),
1494                        qVar"state"))]))])),
1495          (LC("Z_NL",CTy"Zcond"),
1496           Let(TP[bVar"v",qVar"s"],
1497               Apply(Const("SF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1498               Let(TP[bVar"v0",qVar"s"],
1499                   Apply(Const("OF",ATy(qTy,PTy(bTy,qTy))),qVar"s"),
1500                   TP[EQ(bVar"v",bVar"v0"),qVar"s"]))),
1501          (LC("Z_L",CTy"Zcond"),
1502           Let(TP[bVar"v",qVar"s"],
1503               Apply(Const("SF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1504               Let(TP[bVar"v",qVar"s"],
1505                   Let(TP[bVar"v0",qVar"s"],
1506                       Apply(Const("OF",ATy(qTy,PTy(bTy,qTy))),qVar"s"),
1507                       TP[EQ(bVar"v",bVar"v0"),qVar"s"]),
1508                   TP[Mop(Not,bVar"v"),qVar"s"]))),
1509          (LC("Z_NG",CTy"Zcond"),
1510           CS(TP[Apply
1511                   (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1512                    LC("Z_SF",CTy"Zeflags")),
1513                 Apply
1514                   (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1515                    LC("Z_OF",CTy"Zeflags"))],
1516              [(TP[Mop(Some,bVar"a"),Mop(Some,bVar"b")],
1517                ITE(Mop(Not,EQ(bVar"a",bVar"b")),TP[LT,qVar"state"],
1518                    Apply(Const("ZF",ATy(qTy,PTy(bTy,qTy))),qVar"state"))),
1519               (AVar(PTy(OTy bTy,OTy bTy)),
1520                CS(Apply
1521                     (Dest("EFLAGS",ATy(CTy"Zeflags",OTy bTy),qVar"state"),
1522                      LC("Z_ZF",CTy"Zeflags")),
1523                   [(Mop(Some,LT),TP[LT,qVar"state"]),
1524                    (AVar(OTy bTy),
1525                     Apply
1526                       (Call
1527                          ("raise'exception",ATy(qTy,PTy(bTy,qTy)),
1528                           Call
1529                             ("BadFlagAccess",CTy"exception",
1530                              CC[LS"read_cond: ",
1531                                 Mop(Cast sTy,Var("c",CTy"Zcond"))])),
1532                        qVar"state"))]))])),
1533          (LC("Z_NE",CTy"Zcond"),
1534           Let(TP[bVar"v",qVar"s"],
1535               Apply(Const("ZF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1536               TP[Mop(Not,bVar"v"),qVar"s"])),
1537          (LC("Z_NO",CTy"Zcond"),
1538           Let(TP[bVar"v",qVar"s"],
1539               Apply(Const("OF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1540               TP[Mop(Not,bVar"v"),qVar"s"])),
1541          (LC("Z_NP",CTy"Zcond"),
1542           Let(TP[bVar"v",qVar"s"],
1543               Apply(Const("PF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1544               TP[Mop(Not,bVar"v"),qVar"s"])),
1545          (LC("Z_NS",CTy"Zcond"),
1546           Let(TP[bVar"v",qVar"s"],
1547               Apply(Const("SF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
1548               TP[Mop(Not,bVar"v"),qVar"s"])),
1549          (LC("Z_O",CTy"Zcond"),
1550           Apply(Const("OF",ATy(qTy,PTy(bTy,qTy))),qVar"state")),
1551          (LC("Z_P",CTy"Zcond"),
1552           Apply(Const("PF",ATy(qTy,PTy(bTy,qTy))),qVar"state")),
1553          (LC("Z_S",CTy"Zcond"),
1554           Apply(Const("SF",ATy(qTy,PTy(bTy,qTy))),qVar"state")),
1555          (LC("Z_ALWAYS",CTy"Zcond"),TP[LT,qVar"state"])])))
1556;
1557val x64_pop_aux_def = Def
1558  ("x64_pop_aux",qVar"state",
1559   Let(Var("v",F64),
1560       Apply
1561         (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),LC("RSP",CTy"Zreg")),
1562       TP[Apply(Call("mem64",ATy(qTy,F64),Var("v",F64)),qVar"state"),
1563          Rupd
1564            ("REG",
1565             TP[qVar"state",
1566                Fupd
1567                  (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
1568                   LC("RSP",CTy"Zreg"),Bop(Add,Var("v",F64),LW(8,64)))])]))
1569;
1570val x64_pop_def = Def
1571  ("x64_pop",Var("rm",CTy"Zrm"),
1572   Close
1573     (qVar"state",
1574      Let(TP[Var("v0",F64),qVar"s"],
1575          Apply(Const("x64_pop_aux",ATy(qTy,PTy(F64,qTy))),qVar"state"),
1576          Apply
1577            (Call
1578               ("write'EA",ATy(qTy,qTy),
1579                TP[Var("v0",F64),
1580                   Apply
1581                     (Call
1582                        ("ea_Zrm",ATy(qTy,CTy"Zea"),
1583                         TP[Const("Z64",CTy"Zsize"),Var("rm",CTy"Zrm")]),
1584                      qVar"state")]),qVar"s"))))
1585;
1586val x64_pop_rip_def = Def
1587  ("x64_pop_rip",qVar"state",
1588   Let(TP[Var("v",F64),qVar"s"],
1589       Apply(Const("x64_pop_aux",ATy(qTy,PTy(F64,qTy))),qVar"state"),
1590       Rupd("RIP",TP[qVar"s",Var("v",F64)])))
1591;
1592val x64_push_aux_def = Def
1593  ("x64_push_aux",Var("w",F64),
1594   Close
1595     (qVar"state",
1596      Let(Var("v",F64),
1597          Bop(Sub,
1598              Apply
1599                (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
1600                 LC("RSP",CTy"Zreg")),LW(8,64)),
1601          Apply
1602            (Call
1603               ("write'mem64",ATy(qTy,qTy),TP[Var("w",F64),Var("v",F64)]),
1604             Rupd
1605               ("REG",
1606                TP[qVar"state",
1607                   Fupd
1608                     (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
1609                      LC("RSP",CTy"Zreg"),Var("v",F64))])))))
1610;
1611val x64_push_def = Def
1612  ("x64_push",Var("imm_rm",CTy"Zimm_rm"),
1613   Close
1614     (qVar"state",
1615      Apply
1616        (Call
1617           ("x64_push_aux",ATy(qTy,qTy),
1618            Apply
1619              (Call
1620                 ("EA",ATy(qTy,F64),
1621                  Apply
1622                    (Call
1623                       ("ea_Zimm_rm",ATy(qTy,CTy"Zea"),
1624                        Var("imm_rm",CTy"Zimm_rm")),qVar"state")),
1625               qVar"state")),qVar"state")))
1626;
1627val x64_push_rip_def = Def
1628  ("x64_push_rip",qVar"state",
1629   Apply
1630     (Call("x64_push_aux",ATy(qTy,qTy),Dest("RIP",F64,qVar"state")),
1631      qVar"state"))
1632;
1633val x64_drop_def = Def
1634  ("x64_drop",Var("imm",F64),
1635   Close
1636     (qVar"state",
1637      Let(qVar"s",
1638          ITE(Mop(Not,EQ(EX(Var("imm",F64),LN 7,LN 0,F8),LW(0,8))),
1639              Mop(Snd,
1640                  Apply
1641                    (Call
1642                       ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
1643                        Call("FAILURE",CTy"exception",LS"x64_drop")),
1644                     qVar"state")),qVar"state"),
1645          Rupd
1646            ("REG",
1647             TP[qVar"s",
1648                Fupd
1649                  (Dest("REG",ATy(CTy"Zreg",F64),qVar"s"),
1650                   LC("RSP",CTy"Zreg"),
1651                   Bop(Add,
1652                       Apply
1653                         (Dest("REG",ATy(CTy"Zreg",F64),qVar"s"),
1654                          LC("RSP",CTy"Zreg")),Var("imm",F64)))]))))
1655;
1656val initial_ieee_flags_def = Def
1657  ("initial_ieee_flags",bVar"invalid",
1658   Rupd
1659     ("Underflow",
1660      TP[Rupd
1661           ("Precision",
1662            TP[Rupd
1663                 ("Overflow",
1664                  TP[Rupd
1665                       ("InvalidOp",
1666                        TP[Rupd("DivideByZero",TP[LX fTy,LF]),
1667                           bVar"invalid"]),LF]),LF]),LF]))
1668;
1669val set_precision_def = Def
1670  ("set_precision",TP[Var("flags",fTy),bVar"b"],
1671   Rupd("Precision",TP[Var("flags",fTy),bVar"b"]))
1672;
1673val zero32_def = Def
1674  ("zero32",Var("a",F32),ITE(Mop(Msb,Var("a",F32)),NEGZERO32,POSZERO32))
1675;
1676val zero64_def = Def
1677  ("zero64",Var("a",F64),ITE(Mop(Msb,Var("a",F64)),NEGZERO64,POSZERO64))
1678;
1679val denormal_to_zero32_def = Def
1680  ("denormal_to_zero32",Var("a",F32),
1681   Close
1682     (qVar"state",
1683      ITE(Bop(And,Dest("DAZ",bTy,Dest("MXCSR",CTy"MXCSR",qVar"state")),
1684              Mop(FPIsSubnormal 32,Var("a",F32))),
1685          Call("zero32",F32,Var("a",F32)),Var("a",F32))))
1686;
1687val denormal_to_zero64_def = Def
1688  ("denormal_to_zero64",Var("a",F64),
1689   Close
1690     (qVar"state",
1691      ITE(Bop(And,Dest("DAZ",bTy,Dest("MXCSR",CTy"MXCSR",qVar"state")),
1692              Mop(FPIsSubnormal 64,Var("a",F64))),
1693          Call("zero64",F64,Var("a",F64)),Var("a",F64))))
1694;
1695val flush_to_zero32_def = Def
1696  ("flush_to_zero32",TP[Var("flags",fTy),Var("a",F32)],
1697   Close
1698     (qVar"state",
1699      ITE(Bop(And,Dest("FZ",bTy,Dest("MXCSR",CTy"MXCSR",qVar"state")),
1700              Bop(And,Dest("UM",bTy,Dest("MXCSR",CTy"MXCSR",qVar"state")),
1701                  Dest("Underflow",bTy,Var("flags",fTy)))),
1702          TP[Call("set_precision",fTy,TP[Var("flags",fTy),LT]),
1703             Call("zero32",F32,Var("a",F32))],
1704          TP[Var("flags",fTy),Var("a",F32)])))
1705;
1706val flush_to_zero64_def = Def
1707  ("flush_to_zero64",TP[Var("flags",fTy),Var("a",F64)],
1708   Close
1709     (qVar"state",
1710      ITE(Bop(And,Dest("FZ",bTy,Dest("MXCSR",CTy"MXCSR",qVar"state")),
1711              Bop(And,Dest("UM",bTy,Dest("MXCSR",CTy"MXCSR",qVar"state")),
1712                  Dest("Underflow",bTy,Var("flags",fTy)))),
1713          TP[Call("set_precision",fTy,TP[Var("flags",fTy),LT]),
1714             Call("zero64",F64,Var("a",F64))],
1715          TP[Var("flags",fTy),Var("a",F64)])))
1716;
1717val sse_from_int64_def = Def
1718  ("sse_from_int64",TP[Var("m",rTy),Var("w",BTy"N")],
1719   Let(iVar"i",Mop(Cast iTy,Var("w",BTy"N")),
1720       Let(Var("q",F64),Mop(FPFromInt 64,TP[Var("m",rTy),iVar"i"]),
1721           TP[Call
1722                ("set_precision",fTy,
1723                 TP[Call("initial_ieee_flags",fTy,LF),
1724                    Mop(Not,
1725                        EQ(Mop(FPToInt 64,TP[Var("m",rTy),Var("q",F64)]),
1726                           Mop(Some,iVar"i")))]),Var("q",F64)])))
1727;
1728val sse_from_int32_def = Def
1729  ("sse_from_int32",TP[Var("m",rTy),Var("w",BTy"N")],
1730   Let(iVar"i",Mop(Cast iTy,Var("w",BTy"N")),
1731       Let(Var("d",F32),Mop(FPFromInt 32,TP[Var("m",rTy),iVar"i"]),
1732           TP[Call
1733                ("set_precision",fTy,
1734                 TP[Call("initial_ieee_flags",fTy,LF),
1735                    Mop(Not,
1736                        EQ(Mop(FPToInt 32,TP[Var("m",rTy),Var("d",F32)]),
1737                           Mop(Some,iVar"i")))]),Var("d",F32)])))
1738;
1739val sse_to_int64_def = Def
1740  ("sse_to_int64",TP[Var("m",rTy),Var("a",F64)],
1741   CS(Mop(FPToInt 64,TP[Var("m",rTy),Var("a",F64)]),
1742      [(Mop(Some,iVar"i"),
1743        ITE(Bop(And,
1744                Bop(Le,
1745                    Mop(Neg,
1746                        Bop(Exp,LI 2,Bop(Sub,Mop(Size,LY(0,"N")),LN 1))),
1747                    iVar"i"),
1748                Bop(Le,iVar"i",
1749                    Bop(Sub,
1750                        Bop(Exp,LI 2,Bop(Sub,Mop(Size,LY(0,"N")),LN 1)),
1751                        LI 1))),
1752            Let(Var("w",BTy"N"),Mop(Cast(BTy"N"),iVar"i"),
1753                TP[Call
1754                     ("set_precision",fTy,
1755                      TP[Call("initial_ieee_flags",fTy,LF),
1756                         Mop(Not,
1757                             Mop(FPEq 64,
1758                                 TP[Mop(FPFromInt 64,
1759                                        TP[Var("m",rTy),
1760                                           Mop(Cast iTy,Var("w",BTy"N"))]),
1761                                    Var("a",F64)]))]),Var("w",BTy"N")]),
1762            TP[Call("initial_ieee_flags",fTy,LT),Bop(Ror,LY(1,"N"),LN 1)])),
1763       (LO iTy,
1764        TP[Call("initial_ieee_flags",fTy,LT),Bop(Ror,LY(1,"N"),LN 1)])]))
1765;
1766val sse_to_int32_def = Def
1767  ("sse_to_int32",TP[Var("m",rTy),Var("a",F32)],
1768   CS(Mop(FPToInt 32,TP[Var("m",rTy),Var("a",F32)]),
1769      [(Mop(Some,iVar"i"),
1770        ITE(Bop(And,
1771                Bop(Le,
1772                    Mop(Neg,
1773                        Bop(Exp,LI 2,Bop(Sub,Mop(Size,LY(0,"N")),LN 1))),
1774                    iVar"i"),
1775                Bop(Le,iVar"i",
1776                    Bop(Sub,
1777                        Bop(Exp,LI 2,Bop(Sub,Mop(Size,LY(0,"N")),LN 1)),
1778                        LI 1))),
1779            Let(Var("w",BTy"N"),Mop(Cast(BTy"N"),iVar"i"),
1780                TP[Call
1781                     ("set_precision",fTy,
1782                      TP[Call("initial_ieee_flags",fTy,LF),
1783                         Mop(Not,
1784                             Mop(FPEq 32,
1785                                 TP[Mop(FPFromInt 32,
1786                                        TP[Var("m",rTy),
1787                                           Mop(Cast iTy,Var("w",BTy"N"))]),
1788                                    Var("a",F32)]))]),Var("w",BTy"N")]),
1789            TP[Call("initial_ieee_flags",fTy,LT),Bop(Ror,LY(1,"N"),LN 1)])),
1790       (LO iTy,
1791        TP[Call("initial_ieee_flags",fTy,LT),Bop(Ror,LY(1,"N"),LN 1)])]))
1792;
1793val float_min32_def = Def
1794  ("float_min32",TP[Var("a",F32),Var("b",F32)],
1795   Let(Var("flags",fTy),
1796       Call
1797         ("initial_ieee_flags",fTy,
1798          EQ(Mop(FPCmp 32,TP[Var("a",F32),Var("b",F32)]),
1799             binary_ieeeSyntax.UN_tm)),
1800       TP[Var("flags",fTy),
1801          ITE(Bop(And,Mop(Not,Dest("InvalidOp",bTy,Var("flags",fTy))),
1802                  Mop(FPLt 32,TP[Var("a",F32),Var("b",F32)])),
1803              Var("a",F32),Var("b",F32))]))
1804;
1805val float_max32_def = Def
1806  ("float_max32",TP[Var("a",F32),Var("b",F32)],
1807   Let(Var("flags",fTy),
1808       Call
1809         ("initial_ieee_flags",fTy,
1810          EQ(Mop(FPCmp 32,TP[Var("a",F32),Var("b",F32)]),
1811             binary_ieeeSyntax.UN_tm)),
1812       TP[Var("flags",fTy),
1813          ITE(Bop(Or,Dest("InvalidOp",bTy,Var("flags",fTy)),
1814                  Mop(FPLe 32,TP[Var("a",F32),Var("b",F32)])),
1815              Var("b",F32),Var("a",F32))]))
1816;
1817val float_min64_def = Def
1818  ("float_min64",TP[Var("a",F64),Var("b",F64)],
1819   Let(Var("flags",fTy),
1820       Call
1821         ("initial_ieee_flags",fTy,
1822          EQ(Mop(FPCmp 64,TP[Var("a",F64),Var("b",F64)]),
1823             binary_ieeeSyntax.UN_tm)),
1824       TP[Var("flags",fTy),
1825          ITE(Bop(And,Mop(Not,Dest("InvalidOp",bTy,Var("flags",fTy))),
1826                  Mop(FPLt 64,TP[Var("a",F64),Var("b",F64)])),
1827              Var("a",F64),Var("b",F64))]))
1828;
1829val float_max64_def = Def
1830  ("float_max64",TP[Var("a",F64),Var("b",F64)],
1831   Let(Var("flags",fTy),
1832       Call
1833         ("initial_ieee_flags",fTy,
1834          EQ(Mop(FPCmp 64,TP[Var("a",F64),Var("b",F64)]),
1835             binary_ieeeSyntax.UN_tm)),
1836       TP[Var("flags",fTy),
1837          ITE(Bop(Or,Dest("InvalidOp",bTy,Var("flags",fTy)),
1838                  Mop(FPLe 64,TP[Var("a",F64),Var("b",F64)])),
1839              Var("b",F64),Var("a",F64))]))
1840;
1841val process_float_flags_def = Def
1842  ("process_float_flags",Var("l",LTy(PTy(bTy,fTy))),
1843   Close
1844     (qVar"state",
1845      Let(Var("s",PTy(fTy,PTy(bTy,qTy))),
1846          Mop(Snd,
1847              Apply
1848                (Foreach
1849                   (TP[Var("l",LTy(PTy(bTy,fTy))),
1850                       Close
1851                         (Var("x",PTy(bTy,fTy)),
1852                          Close
1853                            (Var("state",PTy(fTy,PTy(bTy,qTy))),
1854                             Let(TP[bVar"d",Var("flags",fTy)],
1855                                 Var("x",PTy(bTy,fTy)),
1856                                 Let(Var("s0",fTy),
1857                                     Mop(Fst,
1858                                         Var("state",PTy(fTy,PTy(bTy,qTy)))),
1859                                     Let(Var("s0",fTy),
1860                                         Rupd
1861                                           ("DivideByZero",
1862                                            TP[Var("s0",fTy),
1863                                               Bop(Or,
1864                                                   Dest
1865                                                     ("DivideByZero",bTy,
1866                                                      Var("s0",fTy)),
1867                                                   Dest
1868                                                     ("DivideByZero",bTy,
1869                                                      Var("flags",fTy)))]),
1870                                         Let(Var("s0",fTy),
1871                                             Rupd
1872                                               ("InvalidOp",
1873                                                TP[Var("s0",fTy),
1874                                                   Bop(Or,
1875                                                       Dest
1876                                                         ("InvalidOp",bTy,
1877                                                          Var("s0",fTy)),
1878                                                       Dest
1879                                                         ("InvalidOp",bTy,
1880                                                          Var("flags",fTy)))]),
1881                                             Let(Var("s0",fTy),
1882                                                 Rupd
1883                                                   ("Overflow",
1884                                                    TP[Var("s0",fTy),
1885                                                       Bop(Or,
1886                                                           Dest
1887                                                             ("Overflow",
1888                                                              bTy,
1889                                                              Var("s0",fTy)),
1890                                                           Dest
1891                                                             ("Overflow",
1892                                                              bTy,
1893                                                              Var("flags",
1894                                                                  fTy)))]),
1895                                                 Let(Var("s0",fTy),
1896                                                     Rupd
1897                                                       ("Precision",
1898                                                        TP[Var("s0",fTy),
1899                                                           Bop(Or,
1900                                                               Dest
1901                                                                 ("Precision",
1902                                                                  bTy,
1903                                                                  Var("s0",
1904                                                                      fTy)),
1905                                                               Dest
1906                                                                 ("Precision",
1907                                                                  bTy,
1908                                                                  Var("flags",
1909                                                                      fTy)))]),
1910                                                     TP[LU,
1911                                                        Rupd
1912                                                          ("Underflow",
1913                                                           TP[Var("s0",fTy),
1914                                                              Bop(Or,
1915                                                                  Dest
1916                                                                    ("Underflow",
1917                                                                     bTy,
1918                                                                     Var("s0",
1919                                                                         fTy)),
1920                                                                  Dest
1921                                                                    ("Underflow",
1922                                                                     bTy,
1923                                                                     Var("flags",
1924                                                                         fTy)))]),
1925                                                        Bop(Or,
1926                                                            Mop(Fst,
1927                                                                Mop(Snd,
1928                                                                    Var("state",
1929                                                                        PTy(fTy,
1930                                                                            PTy(bTy,
1931                                                                                qTy))))),
1932                                                            bVar"d"),
1933                                                        Mop(Snd,
1934                                                            Mop(Snd,
1935                                                                Var("state",
1936                                                                    PTy(fTy,
1937                                                                        PTy(bTy,
1938                                                                            qTy)))))]))))))))]),
1939                 TP[Call("initial_ieee_flags",fTy,LF),LF,qVar"state"])),
1940          Let(Var("s",PTy(fTy,PTy(bTy,qTy))),
1941              TP[Mop(Fst,Var("s",PTy(fTy,PTy(bTy,qTy)))),
1942                 Let(Var("s0",PTy(bTy,qTy)),
1943                     Mop(Snd,Var("s",PTy(fTy,PTy(bTy,qTy)))),
1944                     TP[Mop(Fst,Var("s0",PTy(bTy,qTy))),
1945                        Rupd
1946                          ("MXCSR",
1947                           TP[Mop(Snd,Var("s0",PTy(bTy,qTy))),
1948                              Rupd
1949                                ("IE",
1950                                 TP[Dest
1951                                      ("MXCSR",CTy"MXCSR",
1952                                       Mop(Snd,
1953                                           Mop(Snd,
1954                                               Var("s",
1955                                                   PTy(fTy,PTy(bTy,qTy)))))),
1956                                    Bop(Or,
1957                                        Dest
1958                                          ("IE",bTy,
1959                                           Dest
1960                                             ("MXCSR",CTy"MXCSR",
1961                                              Mop(Snd,
1962                                                  Mop(Snd,
1963                                                      Var("s",
1964                                                          PTy(fTy,
1965                                                              PTy(bTy,qTy))))))),
1966                                        Dest
1967                                          ("InvalidOp",bTy,
1968                                           Mop(Fst,
1969                                               Var("s",
1970                                                   PTy(fTy,PTy(bTy,qTy))))))])])])],
1971              Let(Var("s",PTy(fTy,PTy(bTy,qTy))),
1972                  TP[Mop(Fst,Var("s",PTy(fTy,PTy(bTy,qTy)))),
1973                     Let(Var("s0",PTy(bTy,qTy)),
1974                         Mop(Snd,Var("s",PTy(fTy,PTy(bTy,qTy)))),
1975                         TP[Mop(Fst,Var("s0",PTy(bTy,qTy))),
1976                            Rupd
1977                              ("MXCSR",
1978                               TP[Mop(Snd,Var("s0",PTy(bTy,qTy))),
1979                                  Rupd
1980                                    ("DE",
1981                                     TP[Dest
1982                                          ("MXCSR",CTy"MXCSR",
1983                                           Mop(Snd,
1984                                               Mop(Snd,
1985                                                   Var("s",
1986                                                       PTy(fTy,
1987                                                           PTy(bTy,qTy)))))),
1988                                        Bop(Or,
1989                                            Dest
1990                                              ("DE",bTy,
1991                                               Dest
1992                                                 ("MXCSR",CTy"MXCSR",
1993                                                  Mop(Snd,
1994                                                      Mop(Snd,
1995                                                          Var("s",
1996                                                              PTy(fTy,
1997                                                                  PTy(bTy,
1998                                                                      qTy))))))),
1999                                            Mop(Fst,
2000                                                Mop(Snd,
2001                                                    Var("s",
2002                                                        PTy(fTy,
2003                                                            PTy(bTy,qTy))))))])])])],
2004                  Let(Var("s",PTy(fTy,PTy(bTy,qTy))),
2005                      TP[Mop(Fst,Var("s",PTy(fTy,PTy(bTy,qTy)))),
2006                         Let(Var("s0",PTy(bTy,qTy)),
2007                             Mop(Snd,Var("s",PTy(fTy,PTy(bTy,qTy)))),
2008                             TP[Mop(Fst,Var("s0",PTy(bTy,qTy))),
2009                                Rupd
2010                                  ("MXCSR",
2011                                   TP[Mop(Snd,Var("s0",PTy(bTy,qTy))),
2012                                      Rupd
2013                                        ("ZE",
2014                                         TP[Dest
2015                                              ("MXCSR",CTy"MXCSR",
2016                                               Mop(Snd,
2017                                                   Mop(Snd,
2018                                                       Var("s",
2019                                                           PTy(fTy,
2020                                                               PTy(bTy,qTy)))))),
2021                                            Bop(Or,
2022                                                Dest
2023                                                  ("ZE",bTy,
2024                                                   Dest
2025                                                     ("MXCSR",CTy"MXCSR",
2026                                                      Mop(Snd,
2027                                                          Mop(Snd,
2028                                                              Var("s",
2029                                                                  PTy(fTy,
2030                                                                      PTy(bTy,
2031                                                                          qTy))))))),
2032                                                Dest
2033                                                  ("DivideByZero",bTy,
2034                                                   Mop(Fst,
2035                                                       Var("s",
2036                                                           PTy(fTy,
2037                                                               PTy(bTy,qTy))))))])])])],
2038                      Let(Var("s",PTy(fTy,PTy(bTy,qTy))),
2039                          ITE(Bop(Or,
2040                                  Bop(And,
2041                                      Dest
2042                                        ("InvalidOp",bTy,
2043                                         Mop(Fst,
2044                                             Var("s",PTy(fTy,PTy(bTy,qTy))))),
2045                                      Mop(Not,
2046                                          Dest
2047                                            ("IM",bTy,
2048                                             Dest
2049                                               ("MXCSR",CTy"MXCSR",
2050                                                Mop(Snd,
2051                                                    Mop(Snd,
2052                                                        Var("s",
2053                                                            PTy(fTy,
2054                                                                PTy(bTy,
2055                                                                    qTy))))))))),
2056                                  Bop(Or,
2057                                      Bop(And,
2058                                          Mop(Fst,
2059                                              Mop(Snd,
2060                                                  Var("s",
2061                                                      PTy(fTy,PTy(bTy,qTy))))),
2062                                          Mop(Not,
2063                                              Dest
2064                                                ("DM",bTy,
2065                                                 Dest
2066                                                   ("MXCSR",CTy"MXCSR",
2067                                                    Mop(Snd,
2068                                                        Mop(Snd,
2069                                                            Var("s",
2070                                                                PTy(fTy,
2071                                                                    PTy(bTy,
2072                                                                        qTy))))))))),
2073                                      Bop(And,
2074                                          Dest
2075                                            ("DivideByZero",bTy,
2076                                             Mop(Fst,
2077                                                 Var("s",
2078                                                     PTy(fTy,PTy(bTy,qTy))))),
2079                                          Mop(Not,
2080                                              Dest
2081                                                ("ZM",bTy,
2082                                                 Dest
2083                                                   ("MXCSR",CTy"MXCSR",
2084                                                    Mop(Snd,
2085                                                        Mop(Snd,
2086                                                            Var("s",
2087                                                                PTy(fTy,
2088                                                                    PTy(bTy,
2089                                                                        qTy))))))))))),
2090                              TP[Mop(Fst,Var("s",PTy(fTy,PTy(bTy,qTy)))),
2091                                 Mop(Fst,
2092                                     Mop(Snd,
2093                                         Var("s",PTy(fTy,PTy(bTy,qTy))))),
2094                                 Apply
2095                                   (Const("XM_exception",ATy(qTy,qTy)),
2096                                    Mop(Snd,
2097                                        Mop(Snd,
2098                                            Var("s",PTy(fTy,PTy(bTy,qTy))))))],
2099                              Var("s",PTy(fTy,PTy(bTy,qTy)))),
2100                          Let(Var("s",PTy(fTy,PTy(bTy,qTy))),
2101                              TP[Mop(Fst,Var("s",PTy(fTy,PTy(bTy,qTy)))),
2102                                 Let(Var("s0",PTy(bTy,qTy)),
2103                                     Mop(Snd,
2104                                         Var("s",PTy(fTy,PTy(bTy,qTy)))),
2105                                     TP[Mop(Fst,Var("s0",PTy(bTy,qTy))),
2106                                        Rupd
2107                                          ("MXCSR",
2108                                           TP[Mop(Snd,
2109                                                  Var("s0",PTy(bTy,qTy))),
2110                                              Rupd
2111                                                ("OE",
2112                                                 TP[Dest
2113                                                      ("MXCSR",CTy"MXCSR",
2114                                                       Mop(Snd,
2115                                                           Mop(Snd,
2116                                                               Var("s",
2117                                                                   PTy(fTy,
2118                                                                       PTy(bTy,
2119                                                                           qTy)))))),
2120                                                    Bop(Or,
2121                                                        Dest
2122                                                          ("OE",bTy,
2123                                                           Dest
2124                                                             ("MXCSR",
2125                                                              CTy"MXCSR",
2126                                                              Mop(Snd,
2127                                                                  Mop(Snd,
2128                                                                      Var("s",
2129                                                                          PTy(fTy,
2130                                                                              PTy(bTy,
2131                                                                                  qTy))))))),
2132                                                        Dest
2133                                                          ("Overflow",bTy,
2134                                                           Mop(Fst,
2135                                                               Var("s",
2136                                                                   PTy(fTy,
2137                                                                       PTy(bTy,
2138                                                                           qTy))))))])])])],
2139                              Let(Var("s",PTy(fTy,PTy(bTy,qTy))),
2140                                  TP[Mop(Fst,
2141                                         Var("s",PTy(fTy,PTy(bTy,qTy)))),
2142                                     Let(Var("s0",PTy(bTy,qTy)),
2143                                         Mop(Snd,
2144                                             Var("s",PTy(fTy,PTy(bTy,qTy)))),
2145                                         TP[Mop(Fst,Var("s0",PTy(bTy,qTy))),
2146                                            Rupd
2147                                              ("MXCSR",
2148                                               TP[Mop(Snd,
2149                                                      Var("s0",
2150                                                          PTy(bTy,qTy))),
2151                                                  Rupd
2152                                                    ("PE",
2153                                                     TP[Dest
2154                                                          ("MXCSR",
2155                                                           CTy"MXCSR",
2156                                                           Mop(Snd,
2157                                                               Mop(Snd,
2158                                                                   Var("s",
2159                                                                       PTy(fTy,
2160                                                                           PTy(bTy,
2161                                                                               qTy)))))),
2162                                                        Bop(Or,
2163                                                            Dest
2164                                                              ("PE",bTy,
2165                                                               Dest
2166                                                                 ("MXCSR",
2167                                                                  CTy"MXCSR",
2168                                                                  Mop(Snd,
2169                                                                      Mop(Snd,
2170                                                                          Var("s",
2171                                                                              PTy(fTy,
2172                                                                                  PTy(bTy,
2173                                                                                      qTy))))))),
2174                                                            Dest
2175                                                              ("Precision",
2176                                                               bTy,
2177                                                               Mop(Fst,
2178                                                                   Var("s",
2179                                                                       PTy(fTy,
2180                                                                           PTy(bTy,
2181                                                                               qTy))))))])])])],
2182                                  Let(Var("s",PTy(fTy,PTy(bTy,qTy))),
2183                                      TP[Mop(Fst,
2184                                             Var("s",PTy(fTy,PTy(bTy,qTy)))),
2185                                         Let(Var("s0",PTy(bTy,qTy)),
2186                                             Mop(Snd,
2187                                                 Var("s",
2188                                                     PTy(fTy,PTy(bTy,qTy)))),
2189                                             TP[Mop(Fst,
2190                                                    Var("s0",PTy(bTy,qTy))),
2191                                                Rupd
2192                                                  ("MXCSR",
2193                                                   TP[Mop(Snd,
2194                                                          Var("s0",
2195                                                              PTy(bTy,qTy))),
2196                                                      Rupd
2197                                                        ("UE",
2198                                                         TP[Dest
2199                                                              ("MXCSR",
2200                                                               CTy"MXCSR",
2201                                                               Mop(Snd,
2202                                                                   Mop(Snd,
2203                                                                       Var("s",
2204                                                                           PTy(fTy,
2205                                                                               PTy(bTy,
2206                                                                                   qTy)))))),
2207                                                            Bop(Or,
2208                                                                Dest
2209                                                                  ("UE",
2210                                                                   bTy,
2211                                                                   Dest
2212                                                                     ("MXCSR",
2213                                                                      CTy"MXCSR",
2214                                                                      Mop(Snd,
2215                                                                          Mop(Snd,
2216                                                                              Var("s",
2217                                                                                  PTy(fTy,
2218                                                                                      PTy(bTy,
2219                                                                                          qTy))))))),
2220                                                                Dest
2221                                                                  ("Underflow",
2222                                                                   bTy,
2223                                                                   Mop(Fst,
2224                                                                       Var("s",
2225                                                                           PTy(fTy,
2226                                                                               PTy(bTy,
2227                                                                                   qTy))))))])])])],
2228                                      ITE(Bop(Or,
2229                                              Bop(And,
2230                                                  Dest
2231                                                    ("Overflow",bTy,
2232                                                     Mop(Fst,
2233                                                         Var("s",
2234                                                             PTy(fTy,
2235                                                                 PTy(bTy,
2236                                                                     qTy))))),
2237                                                  Mop(Not,
2238                                                      Dest
2239                                                        ("OM",bTy,
2240                                                         Dest
2241                                                           ("MXCSR",
2242                                                            CTy"MXCSR",
2243                                                            Mop(Snd,
2244                                                                Mop(Snd,
2245                                                                    Var("s",
2246                                                                        PTy(fTy,
2247                                                                            PTy(bTy,
2248                                                                                qTy))))))))),
2249                                              Bop(Or,
2250                                                  Bop(And,
2251                                                      Dest
2252                                                        ("Precision",bTy,
2253                                                         Mop(Fst,
2254                                                             Var("s",
2255                                                                 PTy(fTy,
2256                                                                     PTy(bTy,
2257                                                                         qTy))))),
2258                                                      Mop(Not,
2259                                                          Dest
2260                                                            ("PM",bTy,
2261                                                             Dest
2262                                                               ("MXCSR",
2263                                                                CTy"MXCSR",
2264                                                                Mop(Snd,
2265                                                                    Mop(Snd,
2266                                                                        Var("s",
2267                                                                            PTy(fTy,
2268                                                                                PTy(bTy,
2269                                                                                    qTy))))))))),
2270                                                  Bop(And,
2271                                                      Dest
2272                                                        ("Underflow",bTy,
2273                                                         Mop(Fst,
2274                                                             Var("s",
2275                                                                 PTy(fTy,
2276                                                                     PTy(bTy,
2277                                                                         qTy))))),
2278                                                      Mop(Not,
2279                                                          Dest
2280                                                            ("UM",bTy,
2281                                                             Dest
2282                                                               ("MXCSR",
2283                                                                CTy"MXCSR",
2284                                                                Mop(Snd,
2285                                                                    Mop(Snd,
2286                                                                        Var("s",
2287                                                                            PTy(fTy,
2288                                                                                PTy(bTy,
2289                                                                                    qTy))))))))))),
2290                                          Apply
2291                                            (Const
2292                                               ("XM_exception",
2293                                                ATy(qTy,qTy)),
2294                                             Mop(Snd,
2295                                                 Mop(Snd,
2296                                                     Var("s",
2297                                                         PTy(fTy,
2298                                                             PTy(bTy,qTy)))))),
2299                                          Mop(Snd,
2300                                              Mop(Snd,
2301                                                  Var("s",
2302                                                      PTy(fTy,PTy(bTy,qTy))))))))))))))))
2303;
2304val RoundingMode_def = Def
2305  ("RoundingMode",qVar"state",
2306   CS(Dest("RC",FTy 2,Dest("MXCSR",CTy"MXCSR",qVar"state")),
2307      [(LW(0,2),binary_ieeeSyntax.roundTiesToEven_tm),
2308       (LW(1,2),binary_ieeeSyntax.roundTowardNegative_tm),
2309       (LW(2,2),binary_ieeeSyntax.roundTowardPositive_tm),
2310       (LW(3,2),binary_ieeeSyntax.roundTowardZero_tm)]))
2311;
2312val sse_binop32_def = Def
2313  ("sse_binop32",TP[Var("bop",CTy"sse_binop"),Var("a",F32),Var("b",F32)],
2314   Close
2315     (qVar"state",
2316      Let(Var("v",F32),
2317          Apply
2318            (Call("denormal_to_zero32",ATy(qTy,F32),Var("a",F32)),
2319             qVar"state"),
2320          Let(Var("v0",F32),
2321              Apply
2322                (Call("denormal_to_zero32",ATy(qTy,F32),Var("b",F32)),
2323                 qVar"state"),
2324              Let(TP[Var("v",PTy(fTy,F32)),qVar"s"],
2325                  CS(Var("bop",CTy"sse_binop"),
2326                     [(LC("sse_add",CTy"sse_binop"),
2327                       TP[Apply
2328                            (Call
2329                               ("flush_to_zero32",ATy(qTy,PTy(fTy,F32)),
2330                                Mop(FPAdd_ 32,
2331                                    TP[Apply
2332                                         (Const
2333                                            ("RoundingMode",ATy(qTy,rTy)),
2334                                          qVar"state"),Var("v",F32),
2335                                       Var("v0",F32)])),qVar"state"),
2336                          qVar"state"]),
2337                      (LC("sse_sub",CTy"sse_binop"),
2338                       TP[Apply
2339                            (Call
2340                               ("flush_to_zero32",ATy(qTy,PTy(fTy,F32)),
2341                                Mop(FPSub_ 32,
2342                                    TP[Apply
2343                                         (Const
2344                                            ("RoundingMode",ATy(qTy,rTy)),
2345                                          qVar"state"),Var("v",F32),
2346                                       Var("v0",F32)])),qVar"state"),
2347                          qVar"state"]),
2348                      (LC("sse_mul",CTy"sse_binop"),
2349                       TP[Apply
2350                            (Call
2351                               ("flush_to_zero32",ATy(qTy,PTy(fTy,F32)),
2352                                Mop(FPMul_ 32,
2353                                    TP[Apply
2354                                         (Const
2355                                            ("RoundingMode",ATy(qTy,rTy)),
2356                                          qVar"state"),Var("v",F32),
2357                                       Var("v0",F32)])),qVar"state"),
2358                          qVar"state"]),
2359                      (LC("sse_div",CTy"sse_binop"),
2360                       TP[Apply
2361                            (Call
2362                               ("flush_to_zero32",ATy(qTy,PTy(fTy,F32)),
2363                                Mop(FPDiv_ 32,
2364                                    TP[Apply
2365                                         (Const
2366                                            ("RoundingMode",ATy(qTy,rTy)),
2367                                          qVar"state"),Var("v",F32),
2368                                       Var("v0",F32)])),qVar"state"),
2369                          qVar"state"]),
2370                      (LC("sse_max",CTy"sse_binop"),
2371                       TP[Call
2372                            ("float_max32",PTy(fTy,F32),
2373                             TP[Var("v",F32),Var("v0",F32)]),qVar"state"]),
2374                      (LC("sse_min",CTy"sse_binop"),
2375                       TP[Call
2376                            ("float_min32",PTy(fTy,F32),
2377                             TP[Var("v",F32),Var("v0",F32)]),qVar"state"])]),
2378                  CS(Var("v",PTy(fTy,F32)),
2379                     [(TP[Var("f",fTy),Var("r",F32)],
2380                       TP[TP[Bop(Or,Mop(FPIsSubnormal 32,Var("a",F32)),
2381                                 Mop(FPIsSubnormal 32,Var("b",F32))),
2382                             Var("f",fTy)],Var("r",F32)])]))))))
2383;
2384val sse_binop64_def = Def
2385  ("sse_binop64",TP[Var("bop",CTy"sse_binop"),Var("a",F64),Var("b",F64)],
2386   Close
2387     (qVar"state",
2388      Let(Var("v",F64),
2389          Apply
2390            (Call("denormal_to_zero64",ATy(qTy,F64),Var("a",F64)),
2391             qVar"state"),
2392          Let(Var("v0",F64),
2393              Apply
2394                (Call("denormal_to_zero64",ATy(qTy,F64),Var("b",F64)),
2395                 qVar"state"),
2396              Let(TP[Var("v",PTy(fTy,F64)),qVar"s"],
2397                  CS(Var("bop",CTy"sse_binop"),
2398                     [(LC("sse_add",CTy"sse_binop"),
2399                       TP[Apply
2400                            (Call
2401                               ("flush_to_zero64",ATy(qTy,PTy(fTy,F64)),
2402                                Mop(FPAdd_ 64,
2403                                    TP[Apply
2404                                         (Const
2405                                            ("RoundingMode",ATy(qTy,rTy)),
2406                                          qVar"state"),Var("v",F64),
2407                                       Var("v0",F64)])),qVar"state"),
2408                          qVar"state"]),
2409                      (LC("sse_sub",CTy"sse_binop"),
2410                       TP[Apply
2411                            (Call
2412                               ("flush_to_zero64",ATy(qTy,PTy(fTy,F64)),
2413                                Mop(FPSub_ 64,
2414                                    TP[Apply
2415                                         (Const
2416                                            ("RoundingMode",ATy(qTy,rTy)),
2417                                          qVar"state"),Var("v",F64),
2418                                       Var("v0",F64)])),qVar"state"),
2419                          qVar"state"]),
2420                      (LC("sse_mul",CTy"sse_binop"),
2421                       TP[Apply
2422                            (Call
2423                               ("flush_to_zero64",ATy(qTy,PTy(fTy,F64)),
2424                                Mop(FPMul_ 64,
2425                                    TP[Apply
2426                                         (Const
2427                                            ("RoundingMode",ATy(qTy,rTy)),
2428                                          qVar"state"),Var("v",F64),
2429                                       Var("v0",F64)])),qVar"state"),
2430                          qVar"state"]),
2431                      (LC("sse_div",CTy"sse_binop"),
2432                       TP[Apply
2433                            (Call
2434                               ("flush_to_zero64",ATy(qTy,PTy(fTy,F64)),
2435                                Mop(FPDiv_ 64,
2436                                    TP[Apply
2437                                         (Const
2438                                            ("RoundingMode",ATy(qTy,rTy)),
2439                                          qVar"state"),Var("v",F64),
2440                                       Var("v0",F64)])),qVar"state"),
2441                          qVar"state"]),
2442                      (LC("sse_max",CTy"sse_binop"),
2443                       TP[Call
2444                            ("float_max64",PTy(fTy,F64),
2445                             TP[Var("v",F64),Var("v0",F64)]),qVar"state"]),
2446                      (LC("sse_min",CTy"sse_binop"),
2447                       TP[Call
2448                            ("float_min64",PTy(fTy,F64),
2449                             TP[Var("v",F64),Var("v0",F64)]),qVar"state"])]),
2450                  CS(Var("v",PTy(fTy,F64)),
2451                     [(TP[Var("f",fTy),Var("r",F64)],
2452                       TP[TP[Bop(Or,Mop(FPIsSubnormal 64,Var("a",F64)),
2453                                 Mop(FPIsSubnormal 64,Var("b",F64))),
2454                             Var("f",fTy)],Var("r",F64)])]))))))
2455;
2456val sse_sqrt32_def = Def
2457  ("sse_sqrt32",Var("a",F32),
2458   Close
2459     (qVar"state",
2460      CS(Mop(FPSqrt_ 32,
2461             TP[Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state"),
2462                Apply
2463                  (Call("denormal_to_zero32",ATy(qTy,F32),Var("a",F32)),
2464                   qVar"state")]),
2465         [(TP[Var("f",fTy),Var("r",F32)],
2466           TP[TP[Mop(FPIsSubnormal 32,Var("a",F32)),Var("f",fTy)],
2467              Var("r",F32)])])))
2468;
2469val sse_sqrt64_def = Def
2470  ("sse_sqrt64",Var("a",F64),
2471   Close
2472     (qVar"state",
2473      CS(Mop(FPSqrt_ 64,
2474             TP[Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state"),
2475                Apply
2476                  (Call("denormal_to_zero64",ATy(qTy,F64),Var("a",F64)),
2477                   qVar"state")]),
2478         [(TP[Var("f",fTy),Var("r",F64)],
2479           TP[TP[Mop(FPIsSubnormal 64,Var("a",F64)),Var("f",fTy)],
2480              Var("r",F64)])])))
2481;
2482val sse_logic_def = Def
2483  ("sse_logic",
2484   TP[Var("bop",CTy"sse_logic"),Var("a",BTy"N"),Var("b",BTy"N")],
2485   CS(Var("bop",CTy"sse_logic"),
2486      [(LC("sse_and",CTy"sse_logic"),
2487        Bop(BAnd,Var("a",BTy"N"),Var("b",BTy"N"))),
2488       (LC("sse_or",CTy"sse_logic"),
2489        Bop(BOr,Var("a",BTy"N"),Var("b",BTy"N"))),
2490       (LC("sse_xor",CTy"sse_logic"),
2491        Bop(BXor,Var("a",BTy"N"),Var("b",BTy"N"))),
2492       (LC("sse_andn",CTy"sse_logic"),
2493        Bop(BAnd,Mop(BNot,Var("a",BTy"N")),Var("b",BTy"N")))]))
2494;
2495val sse_compare_signalling_def = Def
2496  ("sse_compare_signalling",Var("cmp",CTy"sse_compare"),
2497   Bop(In,Var("cmp",CTy"sse_compare"),
2498       SL[LC("sse_lt_os",CTy"sse_compare"),
2499          LC("sse_le_os",CTy"sse_compare"),
2500          LC("sse_nlt_us",CTy"sse_compare"),
2501          LC("sse_nle_us",CTy"sse_compare")]))
2502;
2503val sse_compare32_def = Def
2504  ("sse_compare32",
2505   TP[Var("cmp",CTy"sse_compare"),Var("a",F32),Var("b",F32)],
2506   Let(bVar"unordered",
2507       EQ(Mop(FPCmp 32,TP[Var("a",F32),Var("b",F32)]),
2508          binary_ieeeSyntax.UN_tm),
2509       TP[TP[Bop(Or,Mop(FPIsSubnormal 32,Var("a",F32)),
2510                 Mop(FPIsSubnormal 32,Var("b",F32))),
2511             Call
2512               ("initial_ieee_flags",fTy,
2513                Bop(Or,Mop(FPIsSignallingNan 32,Var("a",F32)),
2514                    Bop(Or,Mop(FPIsSignallingNan 32,Var("b",F32)),
2515                        Bop(And,bVar"unordered",
2516                            Call
2517                              ("sse_compare_signalling",bTy,
2518                               Var("cmp",CTy"sse_compare"))))))],
2519          Mop(SE F32,
2520              Mop(Cast F1,
2521                  CS(Var("cmp",CTy"sse_compare"),
2522                     [(LC("sse_eq_oq",CTy"sse_compare"),
2523                       Mop(FPEq 32,TP[Var("a",F32),Var("b",F32)])),
2524                      (LC("sse_lt_os",CTy"sse_compare"),
2525                       Mop(FPLt 32,TP[Var("a",F32),Var("b",F32)])),
2526                      (LC("sse_le_os",CTy"sse_compare"),
2527                       Mop(FPLe 32,TP[Var("a",F32),Var("b",F32)])),
2528                      (LC("sse_unord_q",CTy"sse_compare"),bVar"unordered"),
2529                      (LC("sse_neq_uq",CTy"sse_compare"),
2530                       Bop(Or,bVar"unordered",
2531                           Mop(Not,
2532                               Mop(FPEq 32,TP[Var("a",F32),Var("b",F32)])))),
2533                      (LC("sse_nlt_us",CTy"sse_compare"),
2534                       Bop(Or,bVar"unordered",
2535                           Mop(Not,
2536                               Mop(FPLt 32,TP[Var("a",F32),Var("b",F32)])))),
2537                      (LC("sse_nle_us",CTy"sse_compare"),
2538                       Bop(Or,bVar"unordered",
2539                           Mop(Not,
2540                               Mop(FPLe 32,TP[Var("a",F32),Var("b",F32)])))),
2541                      (Var("sss_ord_q",CTy"sse_compare"),
2542                       Mop(Not,bVar"unordered"))])))]))
2543;
2544val sse_compare64_def = Def
2545  ("sse_compare64",
2546   TP[Var("cmp",CTy"sse_compare"),Var("a",F64),Var("b",F64)],
2547   Let(bVar"unordered",
2548       EQ(Mop(FPCmp 64,TP[Var("a",F64),Var("b",F64)]),
2549          binary_ieeeSyntax.UN_tm),
2550       TP[TP[Bop(Or,Mop(FPIsSubnormal 64,Var("a",F64)),
2551                 Mop(FPIsSubnormal 64,Var("b",F64))),
2552             Call
2553               ("initial_ieee_flags",fTy,
2554                Bop(Or,Mop(FPIsSignallingNan 64,Var("a",F64)),
2555                    Bop(Or,Mop(FPIsSignallingNan 64,Var("b",F64)),
2556                        Bop(And,bVar"unordered",
2557                            Call
2558                              ("sse_compare_signalling",bTy,
2559                               Var("cmp",CTy"sse_compare"))))))],
2560          Mop(SE F64,
2561              Mop(Cast F1,
2562                  CS(Var("cmp",CTy"sse_compare"),
2563                     [(LC("sse_eq_oq",CTy"sse_compare"),
2564                       Mop(FPEq 64,TP[Var("a",F64),Var("b",F64)])),
2565                      (LC("sse_lt_os",CTy"sse_compare"),
2566                       Mop(FPLt 64,TP[Var("a",F64),Var("b",F64)])),
2567                      (LC("sse_le_os",CTy"sse_compare"),
2568                       Mop(FPLe 64,TP[Var("a",F64),Var("b",F64)])),
2569                      (LC("sse_unord_q",CTy"sse_compare"),bVar"unordered"),
2570                      (LC("sse_neq_uq",CTy"sse_compare"),
2571                       Bop(Or,bVar"unordered",
2572                           Mop(Not,
2573                               Mop(FPEq 64,TP[Var("a",F64),Var("b",F64)])))),
2574                      (LC("sse_nlt_us",CTy"sse_compare"),
2575                       Bop(Or,bVar"unordered",
2576                           Mop(Not,
2577                               Mop(FPLt 64,TP[Var("a",F64),Var("b",F64)])))),
2578                      (LC("sse_nle_us",CTy"sse_compare"),
2579                       Bop(Or,bVar"unordered",
2580                           Mop(Not,
2581                               Mop(FPLe 64,TP[Var("a",F64),Var("b",F64)])))),
2582                      (Var("sss_ord_q",CTy"sse_compare"),
2583                       Mop(Not,bVar"unordered"))])))]))
2584;
2585val rm_to_xmm_mem_def = Def
2586  ("rm_to_xmm_mem",Var("rm",CTy"Zrm"),
2587   CS(Var("rm",CTy"Zrm"),
2588      [(Call("Zr",CTy"Zrm",Var("r",CTy"Zreg")),
2589        Call("xmm_reg",CTy"xmm_mem",Mop(Cast(FTy 3),Var("r",CTy"Zreg")))),
2590       (Call
2591          ("Zm",CTy"Zrm",
2592           Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
2593        Call
2594          ("xmm_mem",CTy"xmm_mem",
2595           Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))))]))
2596;
2597val XMM_def = Def
2598  ("XMM",Var("xm",CTy"xmm_mem"),
2599   Close
2600     (qVar"state",
2601      CS(Var("xm",CTy"xmm_mem"),
2602         [(Call("xmm_reg",CTy"xmm_mem",Var("r",FTy 3)),
2603           Apply
2604             (Dest("XMM_REG",ATy(FTy 3,FTy 128),qVar"state"),
2605              Var("r",FTy 3))),
2606          (Call
2607             ("xmm_mem",CTy"xmm_mem",
2608              Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
2609           Apply
2610             (Call
2611                ("mem128",ATy(qTy,FTy 128),
2612                 Apply
2613                   (Call
2614                      ("mem_addr",ATy(qTy,F64),
2615                       Var("m",
2616                           PTy(OTy(PTy(FTy 2,CTy"Zreg")),
2617                               PTy(CTy"Zbase",F64)))),qVar"state")),
2618              qVar"state"))])))
2619;
2620val write'XMM_def = Def
2621  ("write'XMM",TP[Var("dqw",FTy 128),Var("xm",CTy"xmm_mem")],
2622   Close
2623     (qVar"state",
2624      CS(Var("xm",CTy"xmm_mem"),
2625         [(Call("xmm_reg",CTy"xmm_mem",Var("r",FTy 3)),
2626           Rupd
2627             ("XMM_REG",
2628              TP[qVar"state",
2629                 Fupd
2630                   (Dest("XMM_REG",ATy(FTy 3,FTy 128),qVar"state"),
2631                    Var("r",FTy 3),Var("dqw",FTy 128))])),
2632          (Call
2633             ("xmm_mem",CTy"xmm_mem",
2634              Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
2635           Apply
2636             (Call
2637                ("write'mem128",ATy(qTy,qTy),
2638                 TP[Var("dqw",FTy 128),
2639                    Apply
2640                      (Call
2641                         ("mem_addr",ATy(qTy,F64),
2642                          Var("m",
2643                              PTy(OTy(PTy(FTy 2,CTy"Zreg")),
2644                                  PTy(CTy"Zbase",F64)))),qVar"state")]),
2645              qVar"state"))])))
2646;
2647val CheckAlignedXMM_def = Def
2648  ("CheckAlignedXMM",TP[Var("xm",CTy"xmm_mem"),nVar"n"],
2649   Close
2650     (qVar"state",
2651      CS(Var("xm",CTy"xmm_mem"),
2652         [(Call("xmm_reg",CTy"xmm_mem",Var("r",FTy 3)),qVar"state"),
2653          (Call
2654             ("xmm_mem",CTy"xmm_mem",
2655              Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
2656           Let(Var("v",F64),
2657               Apply
2658                 (Call
2659                    ("mem_addr",ATy(qTy,F64),
2660                     Var("m",
2661                         PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
2662                  qVar"state"),
2663               ITE(Mop(Not,
2664                       EQ(Bop(Lsl,Bop(Lsr,Var("v",F64),nVar"n"),nVar"n"),
2665                          Var("v",F64))),
2666                   Apply(Const("GP_exception",ATy(qTy,qTy)),qVar"state"),
2667                   qVar"state")))])))
2668;
2669val dfn'bin_PD_def = Def
2670  ("dfn'bin_PD",
2671   TP[Var("bop",CTy"sse_binop"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
2672   Close
2673     (qVar"state",
2674      Let(Var("dst",CTy"xmm_mem"),
2675          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
2676          Let(Var("v",FTy 128),
2677              Apply
2678                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
2679                 qVar"state"),
2680              Let(Var("v0",FTy 128),
2681                  Apply
2682                    (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
2683                     qVar"state"),
2684                  Let(TP[Var("f1",PTy(bTy,fTy)),Var("r1",F64)],
2685                      Apply
2686                        (Call
2687                           ("sse_binop64",ATy(qTy,PTy(PTy(bTy,fTy),F64)),
2688                            TP[Var("bop",CTy"sse_binop"),
2689                               EX(Var("v",FTy 128),LN 127,LN 64,F64),
2690                               EX(Var("v0",FTy 128),LN 127,LN 64,F64)]),
2691                         qVar"state"),
2692                      Let(TP[Var("f2",PTy(bTy,fTy)),Var("r2",F64)],
2693                          Apply
2694                            (Call
2695                               ("sse_binop64",
2696                                ATy(qTy,PTy(PTy(bTy,fTy),F64)),
2697                                TP[Var("bop",CTy"sse_binop"),
2698                                   EX(Var("v",FTy 128),LN 63,LN 0,F64),
2699                                   EX(Var("v0",FTy 128),LN 63,LN 0,F64)]),
2700                             qVar"state"),
2701                          Apply
2702                            (Call
2703                               ("write'XMM",ATy(qTy,qTy),
2704                                TP[CC[Var("r1",F64),Var("r2",F64)],
2705                                   Var("dst",CTy"xmm_mem")]),
2706                             Apply
2707                               (Call
2708                                  ("process_float_flags",ATy(qTy,qTy),
2709                                   LL[Var("f1",PTy(bTy,fTy)),
2710                                      Var("f2",PTy(bTy,fTy))]),qVar"state")))))))))
2711;
2712val dfn'bin_PS_def = Def
2713  ("dfn'bin_PS",
2714   TP[Var("bop",CTy"sse_binop"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
2715   Close
2716     (qVar"state",
2717      Let(Var("dst",CTy"xmm_mem"),
2718          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
2719          Let(Var("v",FTy 128),
2720              Apply
2721                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
2722                 qVar"state"),
2723              Let(Var("v0",FTy 128),
2724                  Apply
2725                    (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
2726                     qVar"state"),
2727                  Let(TP[Var("f1",PTy(bTy,fTy)),Var("r1",F32)],
2728                      Apply
2729                        (Call
2730                           ("sse_binop32",ATy(qTy,PTy(PTy(bTy,fTy),F32)),
2731                            TP[Var("bop",CTy"sse_binop"),
2732                               EX(Var("v",FTy 128),LN 127,LN 96,F32),
2733                               EX(Var("v0",FTy 128),LN 127,LN 96,F32)]),
2734                         qVar"state"),
2735                      Let(TP[Var("f2",PTy(bTy,fTy)),Var("r2",F32)],
2736                          Apply
2737                            (Call
2738                               ("sse_binop32",
2739                                ATy(qTy,PTy(PTy(bTy,fTy),F32)),
2740                                TP[Var("bop",CTy"sse_binop"),
2741                                   EX(Var("v",FTy 128),LN 95,LN 64,F32),
2742                                   EX(Var("v0",FTy 128),LN 95,LN 64,F32)]),
2743                             qVar"state"),
2744                          Let(TP[Var("f3",PTy(bTy,fTy)),Var("r3",F32)],
2745                              Apply
2746                                (Call
2747                                   ("sse_binop32",
2748                                    ATy(qTy,PTy(PTy(bTy,fTy),F32)),
2749                                    TP[Var("bop",CTy"sse_binop"),
2750                                       EX(Var("v",FTy 128),LN 63,LN 32,F32),
2751                                       EX(Var("v0",FTy 128),LN 63,LN 32,
2752                                          F32)]),qVar"state"),
2753                              Let(TP[Var("f4",PTy(bTy,fTy)),Var("r4",F32)],
2754                                  Apply
2755                                    (Call
2756                                       ("sse_binop32",
2757                                        ATy(qTy,PTy(PTy(bTy,fTy),F32)),
2758                                        TP[Var("bop",CTy"sse_binop"),
2759                                           EX(Var("v",FTy 128),LN 31,LN 0,
2760                                              F32),
2761                                           EX(Var("v0",FTy 128),LN 31,
2762                                              LN 0,F32)]),qVar"state"),
2763                                  Apply
2764                                    (Call
2765                                       ("write'XMM",ATy(qTy,qTy),
2766                                        TP[CC[Var("r1",F32),Var("r2",F32),
2767                                              Var("r3",F32),Var("r4",F32)],
2768                                           Var("dst",CTy"xmm_mem")]),
2769                                     Apply
2770                                       (Call
2771                                          ("process_float_flags",
2772                                           ATy(qTy,qTy),
2773                                           LL[Var("f1",PTy(bTy,fTy)),
2774                                              Var("f2",PTy(bTy,fTy)),
2775                                              Var("f3",PTy(bTy,fTy)),
2776                                              Var("f4",PTy(bTy,fTy))]),
2777                                        qVar"state")))))))))))
2778;
2779val dfn'bin_SD_def = Def
2780  ("dfn'bin_SD",
2781   TP[Var("bop",CTy"sse_binop"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
2782   Close
2783     (qVar"state",
2784      Let(Var("dst",CTy"xmm_mem"),
2785          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
2786          Let(TP[Var("f",PTy(bTy,fTy)),Var("r",F64)],
2787              Apply
2788                (Call
2789                   ("sse_binop64",ATy(qTy,PTy(PTy(bTy,fTy),F64)),
2790                    TP[Var("bop",CTy"sse_binop"),
2791                       EX(Apply
2792                            (Call
2793                               ("XMM",ATy(qTy,FTy 128),
2794                                Var("dst",CTy"xmm_mem")),qVar"state"),
2795                          LN 63,LN 0,F64),
2796                       EX(Apply
2797                            (Call
2798                               ("XMM",ATy(qTy,FTy 128),
2799                                Var("src",CTy"xmm_mem")),qVar"state"),
2800                          LN 63,LN 0,F64)]),qVar"state"),
2801              Let(TP[Var("v",FTy 128),qVar"s"],
2802                  Let(qVar"s0",
2803                      Apply
2804                        (Call
2805                           ("process_float_flags",ATy(qTy,qTy),
2806                            LL[Var("f",PTy(bTy,fTy))]),qVar"state"),
2807                      TP[Apply
2808                           (Call
2809                              ("XMM",ATy(qTy,FTy 128),
2810                               Var("dst",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
2811                  Apply
2812                    (Call
2813                       ("write'XMM",ATy(qTy,qTy),
2814                        TP[BFI(LN 63,LN 0,Var("r",F64),Var("v",FTy 128)),
2815                           Var("dst",CTy"xmm_mem")]),qVar"s"))))))
2816;
2817val dfn'bin_SS_def = Def
2818  ("dfn'bin_SS",
2819   TP[Var("bop",CTy"sse_binop"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
2820   Close
2821     (qVar"state",
2822      Let(Var("dst",CTy"xmm_mem"),
2823          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
2824          Let(TP[Var("f",PTy(bTy,fTy)),Var("r",F32)],
2825              Apply
2826                (Call
2827                   ("sse_binop32",ATy(qTy,PTy(PTy(bTy,fTy),F32)),
2828                    TP[Var("bop",CTy"sse_binop"),
2829                       EX(Apply
2830                            (Call
2831                               ("XMM",ATy(qTy,FTy 128),
2832                                Var("dst",CTy"xmm_mem")),qVar"state"),
2833                          LN 31,LN 0,F32),
2834                       EX(Apply
2835                            (Call
2836                               ("XMM",ATy(qTy,FTy 128),
2837                                Var("src",CTy"xmm_mem")),qVar"state"),
2838                          LN 31,LN 0,F32)]),qVar"state"),
2839              Let(TP[Var("v",FTy 128),qVar"s"],
2840                  Let(qVar"s0",
2841                      Apply
2842                        (Call
2843                           ("process_float_flags",ATy(qTy,qTy),
2844                            LL[Var("f",PTy(bTy,fTy))]),qVar"state"),
2845                      TP[Apply
2846                           (Call
2847                              ("XMM",ATy(qTy,FTy 128),
2848                               Var("dst",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
2849                  Apply
2850                    (Call
2851                       ("write'XMM",ATy(qTy,qTy),
2852                        TP[BFI(LN 31,LN 0,Var("r",F32),Var("v",FTy 128)),
2853                           Var("dst",CTy"xmm_mem")]),qVar"s"))))))
2854;
2855val dfn'logic_PD_def = Def
2856  ("dfn'logic_PD",
2857   TP[Var("bop",CTy"sse_logic"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
2858   Close
2859     (qVar"state",
2860      Let(Var("dst",CTy"xmm_mem"),
2861          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
2862          Let(Var("v",FTy 128),
2863              Apply
2864                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
2865                 qVar"state"),
2866              Let(Var("v0",FTy 128),
2867                  Apply
2868                    (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
2869                     qVar"state"),
2870                  Apply
2871                    (Call
2872                       ("write'XMM",ATy(qTy,qTy),
2873                        TP[CC[Call
2874                                ("sse_logic",F64,
2875                                 TP[Var("bop",CTy"sse_logic"),
2876                                    EX(Var("v",FTy 128),LN 127,LN 64,F64),
2877                                    EX(Var("v0",FTy 128),LN 127,LN 64,F64)]),
2878                              Call
2879                                ("sse_logic",F64,
2880                                 TP[Var("bop",CTy"sse_logic"),
2881                                    EX(Var("v",FTy 128),LN 63,LN 0,F64),
2882                                    EX(Var("v0",FTy 128),LN 63,LN 0,F64)])],
2883                           Var("dst",CTy"xmm_mem")]),qVar"state"))))))
2884;
2885val dfn'logic_PS_def = Def
2886  ("dfn'logic_PS",
2887   TP[Var("bop",CTy"sse_logic"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
2888   Close
2889     (qVar"state",
2890      Let(Var("dst",CTy"xmm_mem"),
2891          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
2892          Let(Var("v",FTy 128),
2893              Apply
2894                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
2895                 qVar"state"),
2896              Let(Var("v0",FTy 128),
2897                  Apply
2898                    (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
2899                     qVar"state"),
2900                  Apply
2901                    (Call
2902                       ("write'XMM",ATy(qTy,qTy),
2903                        TP[CC[Call
2904                                ("sse_logic",F32,
2905                                 TP[Var("bop",CTy"sse_logic"),
2906                                    EX(Var("v",FTy 128),LN 127,LN 96,F32),
2907                                    EX(Var("v0",FTy 128),LN 127,LN 96,F32)]),
2908                              Call
2909                                ("sse_logic",F32,
2910                                 TP[Var("bop",CTy"sse_logic"),
2911                                    EX(Var("v",FTy 128),LN 95,LN 64,F32),
2912                                    EX(Var("v0",FTy 128),LN 95,LN 64,F32)]),
2913                              Call
2914                                ("sse_logic",F32,
2915                                 TP[Var("bop",CTy"sse_logic"),
2916                                    EX(Var("v",FTy 128),LN 63,LN 32,F32),
2917                                    EX(Var("v0",FTy 128),LN 63,LN 32,F32)]),
2918                              Call
2919                                ("sse_logic",F32,
2920                                 TP[Var("bop",CTy"sse_logic"),
2921                                    EX(Var("v",FTy 128),LN 31,LN 0,F32),
2922                                    EX(Var("v0",FTy 128),LN 31,LN 0,F32)])],
2923                           Var("dst",CTy"xmm_mem")]),qVar"state"))))))
2924;
2925val dfn'CMPPD_def = Def
2926  ("dfn'CMPPD",
2927   TP[Var("cmp",CTy"sse_compare"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
2928   Close
2929     (qVar"state",
2930      Let(Var("dst",CTy"xmm_mem"),
2931          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
2932          Let(Var("v",FTy 128),
2933              Apply
2934                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
2935                 qVar"state"),
2936              Let(Var("v0",FTy 128),
2937                  Apply
2938                    (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
2939                     qVar"state"),
2940                  Let(TP[Var("f1",PTy(bTy,fTy)),Var("r1",F64)],
2941                      Call
2942                        ("sse_compare64",PTy(PTy(bTy,fTy),F64),
2943                         TP[Var("cmp",CTy"sse_compare"),
2944                            EX(Var("v",FTy 128),LN 127,LN 64,F64),
2945                            EX(Var("v0",FTy 128),LN 127,LN 64,F64)]),
2946                      Let(TP[Var("f2",PTy(bTy,fTy)),Var("r2",F64)],
2947                          Call
2948                            ("sse_compare64",PTy(PTy(bTy,fTy),F64),
2949                             TP[Var("cmp",CTy"sse_compare"),
2950                                EX(Var("v",FTy 128),LN 63,LN 0,F64),
2951                                EX(Var("v0",FTy 128),LN 63,LN 0,F64)]),
2952                          Apply
2953                            (Call
2954                               ("write'XMM",ATy(qTy,qTy),
2955                                TP[CC[Var("r1",F64),Var("r2",F64)],
2956                                   Var("dst",CTy"xmm_mem")]),
2957                             Apply
2958                               (Call
2959                                  ("process_float_flags",ATy(qTy,qTy),
2960                                   LL[Var("f1",PTy(bTy,fTy)),
2961                                      Var("f2",PTy(bTy,fTy))]),qVar"state")))))))))
2962;
2963val dfn'CMPPS_def = Def
2964  ("dfn'CMPPS",
2965   TP[Var("cmp",CTy"sse_compare"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
2966   Close
2967     (qVar"state",
2968      Let(Var("dst",CTy"xmm_mem"),
2969          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
2970          Let(Var("v",FTy 128),
2971              Apply
2972                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
2973                 qVar"state"),
2974              Let(Var("v0",FTy 128),
2975                  Apply
2976                    (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
2977                     qVar"state"),
2978                  Let(TP[Var("f1",PTy(bTy,fTy)),Var("r1",F32)],
2979                      Call
2980                        ("sse_compare32",PTy(PTy(bTy,fTy),F32),
2981                         TP[Var("cmp",CTy"sse_compare"),
2982                            EX(Var("v",FTy 128),LN 127,LN 96,F32),
2983                            EX(Var("v0",FTy 128),LN 127,LN 96,F32)]),
2984                      Let(TP[Var("f2",PTy(bTy,fTy)),Var("r2",F32)],
2985                          Call
2986                            ("sse_compare32",PTy(PTy(bTy,fTy),F32),
2987                             TP[Var("cmp",CTy"sse_compare"),
2988                                EX(Var("v",FTy 128),LN 95,LN 64,F32),
2989                                EX(Var("v0",FTy 128),LN 95,LN 64,F32)]),
2990                          Let(TP[Var("f3",PTy(bTy,fTy)),Var("r3",F32)],
2991                              Call
2992                                ("sse_compare32",PTy(PTy(bTy,fTy),F32),
2993                                 TP[Var("cmp",CTy"sse_compare"),
2994                                    EX(Var("v",FTy 128),LN 63,LN 32,F32),
2995                                    EX(Var("v0",FTy 128),LN 63,LN 32,F32)]),
2996                              Let(TP[Var("f4",PTy(bTy,fTy)),Var("r4",F32)],
2997                                  Call
2998                                    ("sse_compare32",
2999                                     PTy(PTy(bTy,fTy),F32),
3000                                     TP[Var("cmp",CTy"sse_compare"),
3001                                        EX(Var("v",FTy 128),LN 31,LN 0,F32),
3002                                        EX(Var("v0",FTy 128),LN 31,LN 0,
3003                                           F32)]),
3004                                  Apply
3005                                    (Call
3006                                       ("write'XMM",ATy(qTy,qTy),
3007                                        TP[CC[Var("r1",F32),Var("r2",F32),
3008                                              Var("r3",F32),Var("r4",F32)],
3009                                           Var("dst",CTy"xmm_mem")]),
3010                                     Apply
3011                                       (Call
3012                                          ("process_float_flags",
3013                                           ATy(qTy,qTy),
3014                                           LL[Var("f1",PTy(bTy,fTy)),
3015                                              Var("f2",PTy(bTy,fTy)),
3016                                              Var("f3",PTy(bTy,fTy)),
3017                                              Var("f4",PTy(bTy,fTy))]),
3018                                        qVar"state")))))))))))
3019;
3020val dfn'CMPSD_def = Def
3021  ("dfn'CMPSD",
3022   TP[Var("cmp",CTy"sse_compare"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3023   Close
3024     (qVar"state",
3025      Let(Var("dst",CTy"xmm_mem"),
3026          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3027          Let(TP[Var("f",PTy(bTy,fTy)),Var("r",F64)],
3028              Call
3029                ("sse_compare64",PTy(PTy(bTy,fTy),F64),
3030                 TP[Var("cmp",CTy"sse_compare"),
3031                    EX(Apply
3032                         (Call
3033                            ("XMM",ATy(qTy,FTy 128),
3034                             Var("dst",CTy"xmm_mem")),qVar"state"),LN 63,
3035                       LN 0,F64),
3036                    EX(Apply
3037                         (Call
3038                            ("XMM",ATy(qTy,FTy 128),
3039                             Var("src",CTy"xmm_mem")),qVar"state"),LN 63,
3040                       LN 0,F64)]),
3041              Let(TP[Var("v",FTy 128),qVar"s"],
3042                  Let(qVar"s0",
3043                      Apply
3044                        (Call
3045                           ("process_float_flags",ATy(qTy,qTy),
3046                            LL[Var("f",PTy(bTy,fTy))]),qVar"state"),
3047                      TP[Apply
3048                           (Call
3049                              ("XMM",ATy(qTy,FTy 128),
3050                               Var("dst",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
3051                  Apply
3052                    (Call
3053                       ("write'XMM",ATy(qTy,qTy),
3054                        TP[BFI(LN 63,LN 0,Var("r",F64),Var("v",FTy 128)),
3055                           Var("dst",CTy"xmm_mem")]),qVar"s"))))))
3056;
3057val dfn'CMPSS_def = Def
3058  ("dfn'CMPSS",
3059   TP[Var("cmp",CTy"sse_compare"),Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3060   Close
3061     (qVar"state",
3062      Let(Var("dst",CTy"xmm_mem"),
3063          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3064          Let(TP[Var("f",PTy(bTy,fTy)),Var("r",F32)],
3065              Call
3066                ("sse_compare32",PTy(PTy(bTy,fTy),F32),
3067                 TP[Var("cmp",CTy"sse_compare"),
3068                    EX(Apply
3069                         (Call
3070                            ("XMM",ATy(qTy,FTy 128),
3071                             Var("dst",CTy"xmm_mem")),qVar"state"),LN 31,
3072                       LN 0,F32),
3073                    EX(Apply
3074                         (Call
3075                            ("XMM",ATy(qTy,FTy 128),
3076                             Var("src",CTy"xmm_mem")),qVar"state"),LN 31,
3077                       LN 0,F32)]),
3078              Let(TP[Var("v",FTy 128),qVar"s"],
3079                  Let(qVar"s0",
3080                      Apply
3081                        (Call
3082                           ("process_float_flags",ATy(qTy,qTy),
3083                            LL[Var("f",PTy(bTy,fTy))]),qVar"state"),
3084                      TP[Apply
3085                           (Call
3086                              ("XMM",ATy(qTy,FTy 128),
3087                               Var("dst",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
3088                  Apply
3089                    (Call
3090                       ("write'XMM",ATy(qTy,qTy),
3091                        TP[BFI(LN 31,LN 0,Var("r",F32),Var("v",FTy 128)),
3092                           Var("dst",CTy"xmm_mem")]),qVar"s"))))))
3093;
3094val dfn'COMISD_def = Def
3095  ("dfn'COMISD",TP[Var("src1",FTy 3),Var("src2",CTy"xmm_mem")],
3096   Close
3097     (qVar"state",
3098      Apply
3099        (Call("write'SF",ATy(qTy,qTy),LF),
3100         Apply
3101           (Call("write'AF",ATy(qTy,qTy),LF),
3102            Apply
3103              (Call("write'OF",ATy(qTy,qTy),LF),
3104               CS(Mop(FPCmp 64,
3105                      TP[EX(Apply
3106                              (Call
3107                                 ("XMM",ATy(qTy,FTy 128),
3108                                  Call
3109                                    ("xmm_reg",CTy"xmm_mem",
3110                                     Var("src1",FTy 3))),qVar"state"),
3111                            LN 63,LN 0,F64),
3112                         EX(Apply
3113                              (Call
3114                                 ("XMM",ATy(qTy,FTy 128),
3115                                  Var("src2",CTy"xmm_mem")),qVar"state"),
3116                            LN 63,LN 0,F64)]),
3117                  [(binary_ieeeSyntax.UN_tm,
3118                    Apply
3119                      (Call("write'CF",ATy(qTy,qTy),LT),
3120                       Apply
3121                         (Call("write'PF",ATy(qTy,qTy),LT),
3122                          Apply
3123                            (Call("write'ZF",ATy(qTy,qTy),LT),qVar"state")))),
3124                   (binary_ieeeSyntax.GT_tm,
3125                    Apply
3126                      (Call("write'CF",ATy(qTy,qTy),LF),
3127                       Apply
3128                         (Call("write'PF",ATy(qTy,qTy),LF),
3129                          Apply
3130                            (Call("write'ZF",ATy(qTy,qTy),LF),qVar"state")))),
3131                   (binary_ieeeSyntax.LT_tm,
3132                    Apply
3133                      (Call("write'CF",ATy(qTy,qTy),LT),
3134                       Apply
3135                         (Call("write'PF",ATy(qTy,qTy),LF),
3136                          Apply
3137                            (Call("write'ZF",ATy(qTy,qTy),LF),qVar"state")))),
3138                   (binary_ieeeSyntax.EQ_tm,
3139                    Apply
3140                      (Call("write'CF",ATy(qTy,qTy),LF),
3141                       Apply
3142                         (Call("write'PF",ATy(qTy,qTy),LF),
3143                          Apply
3144                            (Call("write'ZF",ATy(qTy,qTy),LT),qVar"state"))))]))))))
3145;
3146val dfn'COMISS_def = Def
3147  ("dfn'COMISS",TP[Var("src1",FTy 3),Var("src2",CTy"xmm_mem")],
3148   Close
3149     (qVar"state",
3150      Apply
3151        (Call("write'SF",ATy(qTy,qTy),LF),
3152         Apply
3153           (Call("write'AF",ATy(qTy,qTy),LF),
3154            Apply
3155              (Call("write'OF",ATy(qTy,qTy),LF),
3156               CS(Mop(FPCmp 32,
3157                      TP[EX(Apply
3158                              (Call
3159                                 ("XMM",ATy(qTy,FTy 128),
3160                                  Call
3161                                    ("xmm_reg",CTy"xmm_mem",
3162                                     Var("src1",FTy 3))),qVar"state"),
3163                            LN 31,LN 0,F32),
3164                         EX(Apply
3165                              (Call
3166                                 ("XMM",ATy(qTy,FTy 128),
3167                                  Var("src2",CTy"xmm_mem")),qVar"state"),
3168                            LN 31,LN 0,F32)]),
3169                  [(binary_ieeeSyntax.UN_tm,
3170                    Apply
3171                      (Call("write'CF",ATy(qTy,qTy),LT),
3172                       Apply
3173                         (Call("write'PF",ATy(qTy,qTy),LT),
3174                          Apply
3175                            (Call("write'ZF",ATy(qTy,qTy),LT),qVar"state")))),
3176                   (binary_ieeeSyntax.GT_tm,
3177                    Apply
3178                      (Call("write'CF",ATy(qTy,qTy),LF),
3179                       Apply
3180                         (Call("write'PF",ATy(qTy,qTy),LF),
3181                          Apply
3182                            (Call("write'ZF",ATy(qTy,qTy),LF),qVar"state")))),
3183                   (binary_ieeeSyntax.LT_tm,
3184                    Apply
3185                      (Call("write'CF",ATy(qTy,qTy),LT),
3186                       Apply
3187                         (Call("write'PF",ATy(qTy,qTy),LF),
3188                          Apply
3189                            (Call("write'ZF",ATy(qTy,qTy),LF),qVar"state")))),
3190                   (binary_ieeeSyntax.EQ_tm,
3191                    Apply
3192                      (Call("write'CF",ATy(qTy,qTy),LF),
3193                       Apply
3194                         (Call("write'PF",ATy(qTy,qTy),LF),
3195                          Apply
3196                            (Call("write'ZF",ATy(qTy,qTy),LT),qVar"state"))))]))))))
3197;
3198val dfn'CVTDQ2PD_def = Def
3199  ("dfn'CVTDQ2PD",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3200   Close
3201     (qVar"state",
3202      Let(Var("v",FTy 128),
3203          Apply
3204            (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3205             qVar"state"),
3206          Let(Var("v0",rTy),
3207              Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state"),
3208              Apply
3209                (Call
3210                   ("write'XMM",ATy(qTy,qTy),
3211                    TP[CC[Mop(FPFromInt 64,
3212                              TP[Var("v0",rTy),
3213                                 Mop(Cast iTy,
3214                                     EX(Var("v",FTy 128),LN 63,LN 32,F32))]),
3215                          Mop(FPFromInt 64,
3216                              TP[Var("v0",rTy),
3217                                 Mop(Cast iTy,
3218                                     EX(Var("v",FTy 128),LN 31,LN 0,F32))])],
3219                       Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3))]),
3220                 qVar"state")))))
3221;
3222val dfn'CVTDQ2PS_def = Def
3223  ("dfn'CVTDQ2PS",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3224   Close
3225     (qVar"state",
3226      Let(Var("v",FTy 128),
3227          Apply
3228            (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3229             qVar"state"),
3230          Let(Var("v0",rTy),
3231              Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state"),
3232              Let(TP[Var("f1",fTy),Var("d1",F32)],
3233                  Call
3234                    ("sse_from_int32",PTy(fTy,F32),
3235                     TP[Var("v0",rTy),
3236                        EX(Var("v",FTy 128),LN 127,LN 96,F32)]),
3237                  Let(TP[Var("f2",fTy),Var("d2",F32)],
3238                      Call
3239                        ("sse_from_int32",PTy(fTy,F32),
3240                         TP[Var("v0",rTy),
3241                            EX(Var("v",FTy 128),LN 95,LN 64,F32)]),
3242                      Let(TP[Var("f3",fTy),Var("d3",F32)],
3243                          Call
3244                            ("sse_from_int32",PTy(fTy,F32),
3245                             TP[Var("v0",rTy),
3246                                EX(Var("v",FTy 128),LN 63,LN 32,F32)]),
3247                          Let(TP[Var("f4",fTy),Var("d4",F32)],
3248                              Call
3249                                ("sse_from_int32",PTy(fTy,F32),
3250                                 TP[Var("v0",rTy),
3251                                    EX(Var("v",FTy 128),LN 31,LN 0,F32)]),
3252                              Apply
3253                                (Call
3254                                   ("write'XMM",ATy(qTy,qTy),
3255                                    TP[CC[Var("d1",F32),Var("d2",F32),
3256                                          Var("d3",F32),Var("d4",F32)],
3257                                       Call
3258                                         ("xmm_reg",CTy"xmm_mem",
3259                                          Var("dst",FTy 3))]),
3260                                 Apply
3261                                   (Call
3262                                      ("process_float_flags",ATy(qTy,qTy),
3263                                       LL[TP[LF,Var("f1",fTy)],
3264                                          TP[LF,Var("f2",fTy)],
3265                                          TP[LF,Var("f3",fTy)],
3266                                          TP[LF,Var("f4",fTy)]]),
3267                                    qVar"state"))))))))))
3268;
3269val dfn'CVTPD2DQ_def = Def
3270  ("dfn'CVTPD2DQ",
3271   TP[bVar"truncate",Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3272   Close
3273     (qVar"state",
3274      Let(Var("v",FTy 128),
3275          Apply
3276            (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3277             qVar"state"),
3278          Let(Var("v0",rTy),
3279              ITE(bVar"truncate",binary_ieeeSyntax.roundTowardZero_tm,
3280                  Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state")),
3281              Let(TP[Var("f1",fTy),Var("w1",F32)],
3282                  Call
3283                    ("sse_to_int64",PTy(fTy,F32),
3284                     TP[Var("v0",rTy),
3285                        EX(Var("v",FTy 128),LN 127,LN 64,F64)]),
3286                  Let(TP[Var("f2",fTy),Var("w2",F32)],
3287                      Call
3288                        ("sse_to_int64",PTy(fTy,F32),
3289                         TP[Var("v0",rTy),
3290                            EX(Var("v",FTy 128),LN 63,LN 0,F64)]),
3291                      Let(Var("x",CTy"xmm_mem"),
3292                          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3293                          Let(TP[Var("v",FTy 128),qVar"s"],
3294                              Let(qVar"s0",
3295                                  Apply
3296                                    (Call
3297                                       ("process_float_flags",
3298                                        ATy(qTy,qTy),
3299                                        LL[TP[LF,Var("f1",fTy)],
3300                                           TP[LF,Var("f2",fTy)]]),
3301                                     qVar"state"),
3302                                  TP[Apply
3303                                       (Call
3304                                          ("XMM",ATy(qTy,FTy 128),
3305                                           Var("x",CTy"xmm_mem")),qVar"s0"),
3306                                     qVar"s0"]),
3307                              Apply
3308                                (Call
3309                                   ("write'XMM",ATy(qTy,qTy),
3310                                    TP[BFI(LN 63,LN 0,
3311                                           CC[Var("w1",F32),Var("w2",F32)],
3312                                           Var("v",FTy 128)),
3313                                       Var("x",CTy"xmm_mem")]),qVar"s")))))))))
3314;
3315val dfn'CVTPD2PS_def = Def
3316  ("dfn'CVTPD2PS",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3317   Close
3318     (qVar"state",
3319      Let(Var("v",FTy 128),
3320          Apply
3321            (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3322             qVar"state"),
3323          Let(Var("q1",F64),EX(Var("v",FTy 128),LN 127,LN 64,F64),
3324              Let(Var("v0",rTy),
3325                  Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state"),
3326                  Let(TP[Var("f1",fTy),Var("r1",F32)],
3327                      Mop(FP64To32_,TP[Var("v0",rTy),Var("q1",F64)]),
3328                      Let(TP[Var("f2",fTy),Var("r2",F32)],
3329                          Mop(FP64To32_,TP[Var("v0",rTy),Var("q1",F64)]),
3330                          Let(Var("x0",CTy"xmm_mem"),
3331                              Call
3332                                ("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3333                              Let(TP[Var("v",FTy 128),qVar"s"],
3334                                  Let(qVar"s0",
3335                                      Apply
3336                                        (Call
3337                                           ("process_float_flags",
3338                                            ATy(qTy,qTy),
3339                                            LL[TP[Mop(FPIsSubnormal 64,
3340                                                      Var("q1",F64)),
3341                                                  Var("f1",fTy)],
3342                                               TP[Mop(FPIsSubnormal 64,
3343                                                      EX(Var("v",FTy 128),
3344                                                         LN 63,LN 0,F64)),
3345                                                  Var("f2",fTy)]]),
3346                                         qVar"state"),
3347                                      TP[Apply
3348                                           (Call
3349                                              ("XMM",ATy(qTy,FTy 128),
3350                                               Var("x0",CTy"xmm_mem")),
3351                                            qVar"s0"),qVar"s0"]),
3352                                  Apply
3353                                    (Call
3354                                       ("write'XMM",ATy(qTy,qTy),
3355                                        TP[BFI(LN 63,LN 0,
3356                                               CC[Var("r1",F32),
3357                                                  Var("r2",F32)],
3358                                               Var("v",FTy 128)),
3359                                           Var("x0",CTy"xmm_mem")]),
3360                                     qVar"s"))))))))))
3361;
3362val dfn'CVTPS2DQ_def = Def
3363  ("dfn'CVTPS2DQ",
3364   TP[bVar"truncate",Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3365   Close
3366     (qVar"state",
3367      Let(Var("v",FTy 128),
3368          Apply
3369            (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3370             qVar"state"),
3371          Let(Var("v0",rTy),
3372              ITE(bVar"truncate",binary_ieeeSyntax.roundTowardZero_tm,
3373                  Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state")),
3374              Let(TP[Var("f1",fTy),Var("w1",F32)],
3375                  Call
3376                    ("sse_to_int32",PTy(fTy,F32),
3377                     TP[Var("v0",rTy),
3378                        EX(Var("v",FTy 128),LN 127,LN 96,F32)]),
3379                  Let(TP[Var("f2",fTy),Var("w2",F32)],
3380                      Call
3381                        ("sse_to_int32",PTy(fTy,F32),
3382                         TP[Var("v0",rTy),
3383                            EX(Var("v",FTy 128),LN 95,LN 64,F32)]),
3384                      Let(TP[Var("f3",fTy),Var("w3",F32)],
3385                          Call
3386                            ("sse_to_int32",PTy(fTy,F32),
3387                             TP[Var("v0",rTy),
3388                                EX(Var("v",FTy 128),LN 63,LN 32,F32)]),
3389                          Let(TP[Var("f4",fTy),Var("w4",F32)],
3390                              Call
3391                                ("sse_to_int32",PTy(fTy,F32),
3392                                 TP[Var("v0",rTy),
3393                                    EX(Var("v",FTy 128),LN 31,LN 0,F32)]),
3394                              Apply
3395                                (Call
3396                                   ("write'XMM",ATy(qTy,qTy),
3397                                    TP[CC[Var("w1",F32),Var("w2",F32),
3398                                          Var("w3",F32),Var("w4",F32)],
3399                                       Call
3400                                         ("xmm_reg",CTy"xmm_mem",
3401                                          Var("dst",FTy 3))]),
3402                                 Apply
3403                                   (Call
3404                                      ("process_float_flags",ATy(qTy,qTy),
3405                                       LL[TP[LF,Var("f1",fTy)],
3406                                          TP[LF,Var("f2",fTy)],
3407                                          TP[LF,Var("f3",fTy)],
3408                                          TP[LF,Var("f4",fTy)]]),
3409                                    qVar"state"))))))))))
3410;
3411val dfn'CVTPS2PD_def = Def
3412  ("dfn'CVTPS2PD",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3413   Close
3414     (qVar"state",
3415      Let(Var("v",FTy 128),
3416          Apply
3417            (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3418             qVar"state"),
3419          Let(Var("d1",F32),EX(Var("v",FTy 128),LN 63,LN 32,F32),
3420              Let(Var("d2",F32),EX(Var("v",FTy 128),LN 31,LN 0,F32),
3421                  Apply
3422                    (Call
3423                       ("write'XMM",ATy(qTy,qTy),
3424                        TP[CC[Mop(FP32To64,Var("d1",F32)),
3425                              Mop(FP32To64,Var("d2",F32))],
3426                           Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3))]),
3427                     Apply
3428                       (Call
3429                          ("process_float_flags",ATy(qTy,qTy),
3430                           LL[TP[Mop(FPIsSubnormal 32,Var("d1",F32)),
3431                                 Call
3432                                   ("initial_ieee_flags",fTy,
3433                                    Mop(FPIsSignallingNan 32,Var("d1",F32)))],
3434                              TP[Mop(FPIsSubnormal 32,Var("d2",F32)),
3435                                 Call
3436                                   ("initial_ieee_flags",fTy,
3437                                    Mop(FPIsSignallingNan 32,Var("d2",F32)))]]),
3438                        qVar"state")))))))
3439;
3440val dfn'CVTSD2SI_def = Def
3441  ("dfn'CVTSD2SI",
3442   TP[bVar"truncate",bVar"quad",Var("dst",CTy"Zreg"),
3443      Var("src",CTy"xmm_mem")],
3444   Close
3445     (qVar"state",
3446      Let(Var("q",F64),
3447          EX(Apply
3448               (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3449                qVar"state"),LN 63,LN 0,F64),
3450          Let(Var("v",rTy),
3451              ITE(bVar"truncate",binary_ieeeSyntax.roundTowardZero_tm,
3452                  Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state")),
3453              ITE(bVar"quad",
3454                  Let(TP[Var("f",fTy),Var("w",F64)],
3455                      Call
3456                        ("sse_to_int64",PTy(fTy,F64),
3457                         TP[Var("v",rTy),Var("q",F64)]),
3458                      Apply
3459                        (Call
3460                           ("write'EA",ATy(qTy,qTy),
3461                            TP[Var("w",F64),
3462                               Call
3463                                 ("Zea_r",CTy"Zea",
3464                                  TP[Const("Z64",CTy"Zsize"),
3465                                     Var("dst",CTy"Zreg")])]),
3466                         Apply
3467                           (Call
3468                              ("process_float_flags",ATy(qTy,qTy),
3469                               LL[TP[LF,Var("f",fTy)]]),qVar"state"))),
3470                  Let(TP[Var("f",fTy),Var("w",F32)],
3471                      Call
3472                        ("sse_to_int64",PTy(fTy,F32),
3473                         TP[Var("v",rTy),Var("q",F64)]),
3474                      Apply
3475                        (Call
3476                           ("write'EA",ATy(qTy,qTy),
3477                            TP[Mop(Cast F64,Var("w",F32)),
3478                               Call
3479                                 ("Zea_r",CTy"Zea",
3480                                  TP[Const("Z32",CTy"Zsize"),
3481                                     Var("dst",CTy"Zreg")])]),
3482                         Apply
3483                           (Call
3484                              ("process_float_flags",ATy(qTy,qTy),
3485                               LL[TP[LF,Var("f",fTy)]]),qVar"state"))))))))
3486;
3487val dfn'CVTSD2SS_def = Def
3488  ("dfn'CVTSD2SS",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3489   Close
3490     (qVar"state",
3491      Let(Var("q",F64),
3492          EX(Apply
3493               (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3494                qVar"state"),LN 63,LN 0,F64),
3495          Let(TP[Var("f",fTy),Var("r",F32)],
3496              Mop(FP64To32_,
3497                  TP[Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state"),
3498                     Var("q",F64)]),
3499              Let(Var("x",CTy"xmm_mem"),
3500                  Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3501                  Let(TP[Var("v",FTy 128),qVar"s"],
3502                      Let(qVar"s0",
3503                          Apply
3504                            (Call
3505                               ("process_float_flags",ATy(qTy,qTy),
3506                                LL[TP[Mop(FPIsSubnormal 64,Var("q",F64)),
3507                                      Var("f",fTy)]]),qVar"state"),
3508                          TP[Apply
3509                               (Call
3510                                  ("XMM",ATy(qTy,FTy 128),
3511                                   Var("x",CTy"xmm_mem")),qVar"s0"),
3512                             qVar"s0"]),
3513                      Apply
3514                        (Call
3515                           ("write'XMM",ATy(qTy,qTy),
3516                            TP[BFI(LN 31,LN 0,Var("r",F32),
3517                                   Var("v",FTy 128)),Var("x",CTy"xmm_mem")]),
3518                         qVar"s")))))))
3519;
3520val dfn'CVTSI2SD_def = Def
3521  ("dfn'CVTSI2SD",TP[bVar"quad",Var("dst",FTy 3),Var("src",CTy"Zrm")],
3522   Close
3523     (qVar"state",
3524      Let(TP[Var("f",fTy),Var("q",F64)],
3525          Call
3526            ("sse_from_int64",PTy(fTy,F64),
3527             TP[Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state"),
3528                Apply
3529                  (Call
3530                     ("EA",ATy(qTy,F64),
3531                      Apply
3532                        (Call
3533                           ("ea_Zrm",ATy(qTy,CTy"Zea"),
3534                            TP[ITE(bVar"quad",Const("Z64",CTy"Zsize"),
3535                                   Const("Z32",CTy"Zsize")),
3536                               Var("src",CTy"Zrm")]),qVar"state")),
3537                   qVar"state")]),
3538          Let(Var("x",CTy"xmm_mem"),
3539              Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3540              Let(TP[Var("v",FTy 128),qVar"s"],
3541                  Let(qVar"s0",
3542                      Apply
3543                        (Call
3544                           ("process_float_flags",ATy(qTy,qTy),
3545                            LL[TP[LF,Var("f",fTy)]]),qVar"state"),
3546                      TP[Apply
3547                           (Call
3548                              ("XMM",ATy(qTy,FTy 128),
3549                               Var("x",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
3550                  Apply
3551                    (Call
3552                       ("write'XMM",ATy(qTy,qTy),
3553                        TP[BFI(LN 63,LN 0,Var("q",F64),Var("v",FTy 128)),
3554                           Var("x",CTy"xmm_mem")]),qVar"s"))))))
3555;
3556val dfn'CVTSI2SS_def = Def
3557  ("dfn'CVTSI2SS",TP[bVar"quad",Var("dst",FTy 3),Var("src",CTy"Zrm")],
3558   Close
3559     (qVar"state",
3560      Let(TP[Var("f",fTy),Var("d",F32)],
3561          Call
3562            ("sse_from_int32",PTy(fTy,F32),
3563             TP[Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state"),
3564                Apply
3565                  (Call
3566                     ("EA",ATy(qTy,F64),
3567                      Apply
3568                        (Call
3569                           ("ea_Zrm",ATy(qTy,CTy"Zea"),
3570                            TP[ITE(bVar"quad",Const("Z64",CTy"Zsize"),
3571                                   Const("Z32",CTy"Zsize")),
3572                               Var("src",CTy"Zrm")]),qVar"state")),
3573                   qVar"state")]),
3574          Let(Var("x",CTy"xmm_mem"),
3575              Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3576              Let(TP[Var("v",FTy 128),qVar"s"],
3577                  Let(qVar"s0",
3578                      Apply
3579                        (Call
3580                           ("process_float_flags",ATy(qTy,qTy),
3581                            LL[TP[LF,Var("f",fTy)]]),qVar"state"),
3582                      TP[Apply
3583                           (Call
3584                              ("XMM",ATy(qTy,FTy 128),
3585                               Var("x",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
3586                  Apply
3587                    (Call
3588                       ("write'XMM",ATy(qTy,qTy),
3589                        TP[BFI(LN 31,LN 0,Var("d",F32),Var("v",FTy 128)),
3590                           Var("x",CTy"xmm_mem")]),qVar"s"))))))
3591;
3592val dfn'CVTSS2SD_def = Def
3593  ("dfn'CVTSS2SD",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3594   Close
3595     (qVar"state",
3596      Let(Var("d",F32),
3597          EX(Apply
3598               (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3599                qVar"state"),LN 31,LN 0,F32),
3600          Let(Var("x",CTy"xmm_mem"),
3601              Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3602              Let(TP[Var("v",FTy 128),qVar"s"],
3603                  Let(qVar"s0",
3604                      Apply
3605                        (Call
3606                           ("process_float_flags",ATy(qTy,qTy),
3607                            LL[TP[Mop(FPIsSubnormal 32,Var("d",F32)),
3608                                  Call
3609                                    ("initial_ieee_flags",fTy,
3610                                     Mop(FPIsSignallingNan 32,Var("d",F32)))]]),
3611                         qVar"state"),
3612                      TP[Apply
3613                           (Call
3614                              ("XMM",ATy(qTy,FTy 128),
3615                               Var("x",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
3616                  Apply
3617                    (Call
3618                       ("write'XMM",ATy(qTy,qTy),
3619                        TP[BFI(LN 63,LN 0,Mop(FP32To64,Var("d",F32)),
3620                               Var("v",FTy 128)),Var("x",CTy"xmm_mem")]),
3621                     qVar"s"))))))
3622;
3623val dfn'CVTSS2SI_def = Def
3624  ("dfn'CVTSS2SI",
3625   TP[bVar"truncate",bVar"quad",Var("dst",CTy"Zreg"),
3626      Var("src",CTy"xmm_mem")],
3627   Close
3628     (qVar"state",
3629      Let(Var("d",F32),
3630          EX(Apply
3631               (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3632                qVar"state"),LN 31,LN 0,F32),
3633          Let(Var("v",rTy),
3634              ITE(bVar"truncate",binary_ieeeSyntax.roundTowardZero_tm,
3635                  Apply(Const("RoundingMode",ATy(qTy,rTy)),qVar"state")),
3636              ITE(bVar"quad",
3637                  Let(TP[Var("f",fTy),Var("w",F64)],
3638                      Call
3639                        ("sse_to_int32",PTy(fTy,F64),
3640                         TP[Var("v",rTy),Var("d",F32)]),
3641                      Apply
3642                        (Call
3643                           ("write'EA",ATy(qTy,qTy),
3644                            TP[Var("w",F64),
3645                               Call
3646                                 ("Zea_r",CTy"Zea",
3647                                  TP[Const("Z64",CTy"Zsize"),
3648                                     Var("dst",CTy"Zreg")])]),
3649                         Apply
3650                           (Call
3651                              ("process_float_flags",ATy(qTy,qTy),
3652                               LL[TP[LF,Var("f",fTy)]]),qVar"state"))),
3653                  Let(TP[Var("f",fTy),Var("w",F32)],
3654                      Call
3655                        ("sse_to_int32",PTy(fTy,F32),
3656                         TP[Var("v",rTy),Var("d",F32)]),
3657                      Apply
3658                        (Call
3659                           ("write'EA",ATy(qTy,qTy),
3660                            TP[Mop(Cast F64,Var("w",F32)),
3661                               Call
3662                                 ("Zea_r",CTy"Zea",
3663                                  TP[Const("Z32",CTy"Zsize"),
3664                                     Var("dst",CTy"Zreg")])]),
3665                         Apply
3666                           (Call
3667                              ("process_float_flags",ATy(qTy,qTy),
3668                               LL[TP[LF,Var("f",fTy)]]),qVar"state"))))))))
3669;
3670val dfn'MOVAP_D_S_def = Def
3671  ("dfn'MOVAP_D_S",
3672   TP[bVar"double",Var("dst",CTy"xmm_mem"),Var("src",CTy"xmm_mem")],
3673   Close
3674     (qVar"state",
3675      Let(TP[Var("v",FTy 128),qVar"s"],
3676          Let(qVar"s",
3677              Apply
3678                (Call
3679                   ("CheckAlignedXMM",ATy(qTy,qTy),
3680                    TP[Var("src",CTy"xmm_mem"),LN 4]),
3681                 Apply
3682                   (Call
3683                      ("CheckAlignedXMM",ATy(qTy,qTy),
3684                       TP[Var("dst",CTy"xmm_mem"),LN 4]),qVar"state")),
3685              TP[Apply
3686                   (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3687                    qVar"s"),qVar"s"]),
3688          Apply
3689            (Call
3690               ("write'XMM",ATy(qTy,qTy),
3691                TP[Var("v",FTy 128),Var("dst",CTy"xmm_mem")]),qVar"s"))))
3692;
3693val dfn'MOVUP_D_S_def = Def
3694  ("dfn'MOVUP_D_S",
3695   TP[bVar"double",Var("dst",CTy"xmm_mem"),Var("src",CTy"xmm_mem")],
3696   Close
3697     (qVar"state",
3698      Apply
3699        (Call
3700           ("write'XMM",ATy(qTy,qTy),
3701            TP[Apply
3702                 (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3703                  qVar"state"),Var("dst",CTy"xmm_mem")]),qVar"state")))
3704;
3705val dfn'MOV_D_Q_def = Def
3706  ("dfn'MOV_D_Q",
3707   TP[bVar"to_xmm",bVar"quad",Var("xmm",FTy 3),Var("rm",CTy"Zrm")],
3708   Close
3709     (qVar"state",
3710      CS(TP[bVar"to_xmm",bVar"quad"],
3711         [(TP[LF,LF],
3712           Apply
3713             (Call
3714                ("write'EA",ATy(qTy,qTy),
3715                 TP[Mop(Cast F64,
3716                        EX(Apply
3717                             (Call
3718                                ("XMM",ATy(qTy,FTy 128),
3719                                 Call
3720                                   ("xmm_reg",CTy"xmm_mem",
3721                                    Var("xmm",FTy 3))),qVar"state"),LN 31,
3722                           LN 0,F32)),
3723                    Apply
3724                      (Call
3725                         ("ea_Zrm",ATy(qTy,CTy"Zea"),
3726                          TP[Const("Z32",CTy"Zsize"),Var("rm",CTy"Zrm")]),
3727                       qVar"state")]),qVar"state")),
3728          (TP[LF,LT],
3729           Apply
3730             (Call
3731                ("write'EA",ATy(qTy,qTy),
3732                 TP[EX(Apply
3733                         (Call
3734                            ("XMM",ATy(qTy,FTy 128),
3735                             Call("xmm_reg",CTy"xmm_mem",Var("xmm",FTy 3))),
3736                          qVar"state"),LN 63,LN 0,F64),
3737                    Apply
3738                      (Call
3739                         ("ea_Zrm",ATy(qTy,CTy"Zea"),
3740                          TP[Const("Z64",CTy"Zsize"),Var("rm",CTy"Zrm")]),
3741                       qVar"state")]),qVar"state")),
3742          (TP[LT,LF],
3743           Apply
3744             (Call
3745                ("write'XMM",ATy(qTy,qTy),
3746                 TP[Mop(Cast(FTy 128),
3747                        EX(Apply
3748                             (Call
3749                                ("EA",ATy(qTy,F64),
3750                                 Apply
3751                                   (Call
3752                                      ("ea_Zrm",ATy(qTy,CTy"Zea"),
3753                                       TP[Const("Z32",CTy"Zsize"),
3754                                          Var("rm",CTy"Zrm")]),qVar"state")),
3755                              qVar"state"),LN 31,LN 0,F32)),
3756                    Call("xmm_reg",CTy"xmm_mem",Var("xmm",FTy 3))]),
3757              qVar"state")),
3758          (TP[LT,LT],
3759           Apply
3760             (Call
3761                ("write'XMM",ATy(qTy,qTy),
3762                 TP[Mop(Cast(FTy 128),
3763                        Apply
3764                          (Call
3765                             ("EA",ATy(qTy,F64),
3766                              Apply
3767                                (Call
3768                                   ("ea_Zrm",ATy(qTy,CTy"Zea"),
3769                                    TP[Const("Z64",CTy"Zsize"),
3770                                       Var("rm",CTy"Zrm")]),qVar"state")),
3771                           qVar"state")),
3772                    Call("xmm_reg",CTy"xmm_mem",Var("xmm",FTy 3))]),
3773              qVar"state"))])))
3774;
3775val dfn'MOVQ_def = Def
3776  ("dfn'MOVQ",TP[Var("dst",CTy"xmm_mem"),Var("src",CTy"xmm_mem")],
3777   Close
3778     (qVar"state",
3779      CS(Var("dst",CTy"xmm_mem"),
3780         [(Call("xmm_reg",CTy"xmm_mem",AVar(FTy 3)),
3781           Apply
3782             (Call
3783                ("write'XMM",ATy(qTy,qTy),
3784                 TP[Mop(Cast(FTy 128),
3785                        EX(Apply
3786                             (Call
3787                                ("XMM",ATy(qTy,FTy 128),
3788                                 Var("src",CTy"xmm_mem")),qVar"state"),
3789                           LN 63,LN 0,F64)),Var("dst",CTy"xmm_mem")]),
3790              qVar"state")),
3791          (Call
3792             ("xmm_mem",CTy"xmm_mem",
3793              Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
3794           Apply
3795             (Call
3796                ("write'EA",ATy(qTy,qTy),
3797                 TP[EX(Apply
3798                         (Call
3799                            ("XMM",ATy(qTy,FTy 128),
3800                             Var("src",CTy"xmm_mem")),qVar"state"),LN 63,
3801                       LN 0,F64),
3802                    Apply
3803                      (Call
3804                         ("ea_Zrm",ATy(qTy,CTy"Zea"),
3805                          TP[Const("Z64",CTy"Zsize"),
3806                             Call
3807                               ("Zm",CTy"Zrm",
3808                                Var("m",
3809                                    PTy(OTy(PTy(FTy 2,CTy"Zreg")),
3810                                        PTy(CTy"Zbase",F64))))]),
3811                       qVar"state")]),qVar"state"))])))
3812;
3813val dfn'MOVSD_def = Def
3814  ("dfn'MOVSD",TP[Var("dst",CTy"xmm_mem"),Var("src",CTy"xmm_mem")],
3815   Close
3816     (qVar"state",
3817      CS(Var("src",CTy"xmm_mem"),
3818         [(Call("xmm_reg",CTy"xmm_mem",AVar(FTy 3)),
3819           Apply
3820             (Call
3821                ("write'XMM",ATy(qTy,qTy),
3822                 TP[BFI(LN 63,LN 0,
3823                        EX(Apply
3824                             (Call
3825                                ("XMM",ATy(qTy,FTy 128),
3826                                 Var("src",CTy"xmm_mem")),qVar"state"),
3827                           LN 63,LN 0,F64),
3828                        Apply
3829                          (Call
3830                             ("XMM",ATy(qTy,FTy 128),
3831                              Var("dst",CTy"xmm_mem")),qVar"state")),
3832                    Var("dst",CTy"xmm_mem")]),qVar"state")),
3833          (Call
3834             ("xmm_mem",CTy"xmm_mem",
3835              AVar(PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
3836           Apply
3837             (Call
3838                ("write'XMM",ATy(qTy,qTy),
3839                 TP[Mop(Cast(FTy 128),
3840                        EX(Apply
3841                             (Call
3842                                ("XMM",ATy(qTy,FTy 128),
3843                                 Var("src",CTy"xmm_mem")),qVar"state"),
3844                           LN 63,LN 0,F64)),Var("dst",CTy"xmm_mem")]),
3845              qVar"state"))])))
3846;
3847val dfn'MOVSS_def = Def
3848  ("dfn'MOVSS",TP[Var("dst",CTy"xmm_mem"),Var("src",CTy"xmm_mem")],
3849   Close
3850     (qVar"state",
3851      CS(Var("src",CTy"xmm_mem"),
3852         [(Call("xmm_reg",CTy"xmm_mem",AVar(FTy 3)),
3853           Apply
3854             (Call
3855                ("write'XMM",ATy(qTy,qTy),
3856                 TP[BFI(LN 31,LN 0,
3857                        EX(Apply
3858                             (Call
3859                                ("XMM",ATy(qTy,FTy 128),
3860                                 Var("src",CTy"xmm_mem")),qVar"state"),
3861                           LN 31,LN 0,F32),
3862                        Apply
3863                          (Call
3864                             ("XMM",ATy(qTy,FTy 128),
3865                              Var("dst",CTy"xmm_mem")),qVar"state")),
3866                    Var("dst",CTy"xmm_mem")]),qVar"state")),
3867          (Call
3868             ("xmm_mem",CTy"xmm_mem",
3869              AVar(PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
3870           Apply
3871             (Call
3872                ("write'XMM",ATy(qTy,qTy),
3873                 TP[Mop(Cast(FTy 128),
3874                        EX(Apply
3875                             (Call
3876                                ("XMM",ATy(qTy,FTy 128),
3877                                 Var("src",CTy"xmm_mem")),qVar"state"),
3878                           LN 31,LN 0,F32)),Var("dst",CTy"xmm_mem")]),
3879              qVar"state"))])))
3880;
3881val dfn'PCMPEQQ_def = Def
3882  ("dfn'PCMPEQQ",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
3883   Close
3884     (qVar"state",
3885      Let(Var("dst",CTy"xmm_mem"),
3886          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3887          Let(Var("v",FTy 128),
3888              Apply
3889                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
3890                 qVar"state"),
3891              Let(Var("v0",FTy 128),
3892                  Apply
3893                    (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
3894                     qVar"state"),
3895                  Apply
3896                    (Call
3897                       ("write'XMM",ATy(qTy,qTy),
3898                        TP[CC[ITE(EQ(EX(Var("v",FTy 128),LN 127,LN 64,F64),
3899                                     EX(Var("v0",FTy 128),LN 127,LN 64,F64)),
3900                                  Mop(Neg,LW(1,64)),LW(0,64)),
3901                              ITE(EQ(EX(Var("v",FTy 128),LN 63,LN 0,F64),
3902                                     EX(Var("v0",FTy 128),LN 63,LN 0,F64)),
3903                                  Mop(Neg,LW(1,64)),LW(0,64))],
3904                           Var("dst",CTy"xmm_mem")]),qVar"state"))))))
3905;
3906val dfn'PSLLDQ_def = Def
3907  ("dfn'PSLLDQ",TP[Var("dst",FTy 3),Var("imm",F8)],
3908   Close
3909     (qVar"state",
3910      Let(Var("dst",CTy"xmm_mem"),
3911          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3912          Apply
3913            (Call
3914               ("write'XMM",ATy(qTy,qTy),
3915                TP[Bop(Lsl,
3916                       Apply
3917                         (Call
3918                            ("XMM",ATy(qTy,FTy 128),
3919                             Var("dst",CTy"xmm_mem")),qVar"state"),
3920                       Bop(Mul,
3921                           Mop(Min,TP[LN 16,Mop(Cast nTy,Var("imm",F8))]),
3922                           LN 8)),Var("dst",CTy"xmm_mem")]),qVar"state"))))
3923;
3924val dfn'PSLLD_imm_def = Def
3925  ("dfn'PSLLD_imm",TP[Var("dst",FTy 3),Var("imm",F8)],
3926   Close
3927     (qVar"state",
3928      Let(Var("dst",CTy"xmm_mem"),
3929          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3930          Let(Var("v",FTy 128),
3931              Apply
3932                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
3933                 qVar"state"),
3934              Let(nVar"i",Mop(Cast nTy,Var("imm",F8)),
3935                  Apply
3936                    (Call
3937                       ("write'XMM",ATy(qTy,qTy),
3938                        TP[CC[Bop(Lsl,
3939                                  EX(Var("v",FTy 128),LN 127,LN 96,F32),
3940                                  nVar"i"),
3941                              Bop(Lsl,
3942                                  EX(Var("v",FTy 128),LN 95,LN 64,F32),
3943                                  nVar"i"),
3944                              Bop(Lsl,
3945                                  EX(Var("v",FTy 128),LN 63,LN 32,F32),
3946                                  nVar"i"),
3947                              Bop(Lsl,EX(Var("v",FTy 128),LN 31,LN 0,F32),
3948                                  nVar"i")],Var("dst",CTy"xmm_mem")]),
3949                     qVar"state"))))))
3950;
3951val dfn'PSLLQ_imm_def = Def
3952  ("dfn'PSLLQ_imm",TP[Var("dst",FTy 3),Var("imm",F8)],
3953   Close
3954     (qVar"state",
3955      Let(Var("dst",CTy"xmm_mem"),
3956          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3957          Let(Var("v",FTy 128),
3958              Apply
3959                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
3960                 qVar"state"),
3961              Let(nVar"i",Mop(Cast nTy,Var("imm",F8)),
3962                  Apply
3963                    (Call
3964                       ("write'XMM",ATy(qTy,qTy),
3965                        TP[CC[Bop(Lsl,
3966                                  EX(Var("v",FTy 128),LN 127,LN 64,F64),
3967                                  nVar"i"),
3968                              Bop(Lsl,EX(Var("v",FTy 128),LN 63,LN 0,F64),
3969                                  nVar"i")],Var("dst",CTy"xmm_mem")]),
3970                     qVar"state"))))))
3971;
3972val dfn'PSLLW_imm_def = Def
3973  ("dfn'PSLLW_imm",TP[Var("dst",FTy 3),Var("imm",F8)],
3974   Close
3975     (qVar"state",
3976      Let(Var("dst",CTy"xmm_mem"),
3977          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
3978          Let(Var("v",FTy 128),
3979              Apply
3980                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
3981                 qVar"state"),
3982              Let(nVar"i",Mop(Cast nTy,Var("imm",F8)),
3983                  Apply
3984                    (Call
3985                       ("write'XMM",ATy(qTy,qTy),
3986                        TP[CC[Bop(Lsl,
3987                                  EX(Var("v",FTy 128),LN 127,LN 112,F16),
3988                                  nVar"i"),
3989                              Bop(Lsl,
3990                                  EX(Var("v",FTy 128),LN 111,LN 96,F16),
3991                                  nVar"i"),
3992                              Bop(Lsl,
3993                                  EX(Var("v",FTy 128),LN 95,LN 80,F16),
3994                                  nVar"i"),
3995                              Bop(Lsl,
3996                                  EX(Var("v",FTy 128),LN 79,LN 64,F16),
3997                                  nVar"i"),
3998                              Bop(Lsl,
3999                                  EX(Var("v",FTy 128),LN 63,LN 48,F16),
4000                                  nVar"i"),
4001                              Bop(Lsl,
4002                                  EX(Var("v",FTy 128),LN 47,LN 32,F16),
4003                                  nVar"i"),
4004                              Bop(Lsl,
4005                                  EX(Var("v",FTy 128),LN 31,LN 16,F16),
4006                                  nVar"i"),
4007                              Bop(Lsl,EX(Var("v",FTy 128),LN 15,LN 0,F16),
4008                                  nVar"i")],Var("dst",CTy"xmm_mem")]),
4009                     qVar"state"))))))
4010;
4011val dfn'PSRAD_imm_def = Def
4012  ("dfn'PSRAD_imm",TP[Var("dst",FTy 3),Var("imm",F8)],
4013   Close
4014     (qVar"state",
4015      Let(Var("dst",CTy"xmm_mem"),
4016          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
4017          Let(Var("v",FTy 128),
4018              Apply
4019                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
4020                 qVar"state"),
4021              Let(nVar"i",Mop(Cast nTy,Var("imm",F8)),
4022                  Apply
4023                    (Call
4024                       ("write'XMM",ATy(qTy,qTy),
4025                        TP[CC[Bop(Asr,
4026                                  EX(Var("v",FTy 128),LN 127,LN 96,F32),
4027                                  nVar"i"),
4028                              Bop(Asr,
4029                                  EX(Var("v",FTy 128),LN 95,LN 64,F32),
4030                                  nVar"i"),
4031                              Bop(Asr,
4032                                  EX(Var("v",FTy 128),LN 63,LN 32,F32),
4033                                  nVar"i"),
4034                              Bop(Asr,EX(Var("v",FTy 128),LN 31,LN 0,F32),
4035                                  nVar"i")],Var("dst",CTy"xmm_mem")]),
4036                     qVar"state"))))))
4037;
4038val dfn'PSRAW_imm_def = Def
4039  ("dfn'PSRAW_imm",TP[Var("dst",FTy 3),Var("imm",F8)],
4040   Close
4041     (qVar"state",
4042      Let(Var("dst",CTy"xmm_mem"),
4043          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
4044          Let(Var("v",FTy 128),
4045              Apply
4046                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
4047                 qVar"state"),
4048              Let(nVar"i",Mop(Cast nTy,Var("imm",F8)),
4049                  Apply
4050                    (Call
4051                       ("write'XMM",ATy(qTy,qTy),
4052                        TP[CC[Bop(Asr,
4053                                  EX(Var("v",FTy 128),LN 127,LN 112,F16),
4054                                  nVar"i"),
4055                              Bop(Asr,
4056                                  EX(Var("v",FTy 128),LN 111,LN 96,F16),
4057                                  nVar"i"),
4058                              Bop(Asr,
4059                                  EX(Var("v",FTy 128),LN 95,LN 80,F16),
4060                                  nVar"i"),
4061                              Bop(Asr,
4062                                  EX(Var("v",FTy 128),LN 79,LN 64,F16),
4063                                  nVar"i"),
4064                              Bop(Asr,
4065                                  EX(Var("v",FTy 128),LN 63,LN 48,F16),
4066                                  nVar"i"),
4067                              Bop(Asr,
4068                                  EX(Var("v",FTy 128),LN 47,LN 32,F16),
4069                                  nVar"i"),
4070                              Bop(Asr,
4071                                  EX(Var("v",FTy 128),LN 31,LN 16,F16),
4072                                  nVar"i"),
4073                              Bop(Asr,EX(Var("v",FTy 128),LN 15,LN 0,F16),
4074                                  nVar"i")],Var("dst",CTy"xmm_mem")]),
4075                     qVar"state"))))))
4076;
4077val dfn'PSRLDQ_def = Def
4078  ("dfn'PSRLDQ",TP[Var("dst",FTy 3),Var("imm",F8)],
4079   Close
4080     (qVar"state",
4081      Let(Var("dst",CTy"xmm_mem"),
4082          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
4083          Apply
4084            (Call
4085               ("write'XMM",ATy(qTy,qTy),
4086                TP[Bop(Lsr,
4087                       Apply
4088                         (Call
4089                            ("XMM",ATy(qTy,FTy 128),
4090                             Var("dst",CTy"xmm_mem")),qVar"state"),
4091                       Bop(Mul,
4092                           Mop(Min,TP[LN 16,Mop(Cast nTy,Var("imm",F8))]),
4093                           LN 8)),Var("dst",CTy"xmm_mem")]),qVar"state"))))
4094;
4095val dfn'PSRLD_imm_def = Def
4096  ("dfn'PSRLD_imm",TP[Var("dst",FTy 3),Var("imm",F8)],
4097   Close
4098     (qVar"state",
4099      Let(Var("dst",CTy"xmm_mem"),
4100          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
4101          Let(Var("v",FTy 128),
4102              Apply
4103                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
4104                 qVar"state"),
4105              Let(nVar"i",Mop(Cast nTy,Var("imm",F8)),
4106                  Apply
4107                    (Call
4108                       ("write'XMM",ATy(qTy,qTy),
4109                        TP[CC[Bop(Lsr,
4110                                  EX(Var("v",FTy 128),LN 127,LN 96,F32),
4111                                  nVar"i"),
4112                              Bop(Lsr,
4113                                  EX(Var("v",FTy 128),LN 95,LN 64,F32),
4114                                  nVar"i"),
4115                              Bop(Lsr,
4116                                  EX(Var("v",FTy 128),LN 63,LN 32,F32),
4117                                  nVar"i"),
4118                              Bop(Lsr,EX(Var("v",FTy 128),LN 31,LN 0,F32),
4119                                  nVar"i")],Var("dst",CTy"xmm_mem")]),
4120                     qVar"state"))))))
4121;
4122val dfn'PSRLQ_imm_def = Def
4123  ("dfn'PSRLQ_imm",TP[Var("dst",FTy 3),Var("imm",F8)],
4124   Close
4125     (qVar"state",
4126      Let(Var("dst",CTy"xmm_mem"),
4127          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
4128          Let(Var("v",FTy 128),
4129              Apply
4130                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
4131                 qVar"state"),
4132              Let(nVar"i",Mop(Cast nTy,Var("imm",F8)),
4133                  Apply
4134                    (Call
4135                       ("write'XMM",ATy(qTy,qTy),
4136                        TP[CC[Bop(Lsr,
4137                                  EX(Var("v",FTy 128),LN 127,LN 64,F64),
4138                                  nVar"i"),
4139                              Bop(Lsr,EX(Var("v",FTy 128),LN 63,LN 0,F64),
4140                                  nVar"i")],Var("dst",CTy"xmm_mem")]),
4141                     qVar"state"))))))
4142;
4143val dfn'PSRLW_imm_def = Def
4144  ("dfn'PSRLW_imm",TP[Var("dst",FTy 3),Var("imm",F8)],
4145   Close
4146     (qVar"state",
4147      Let(Var("dst",CTy"xmm_mem"),
4148          Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
4149          Let(Var("v",FTy 128),
4150              Apply
4151                (Call("XMM",ATy(qTy,FTy 128),Var("dst",CTy"xmm_mem")),
4152                 qVar"state"),
4153              Let(nVar"i",Mop(Cast nTy,Var("imm",F8)),
4154                  Apply
4155                    (Call
4156                       ("write'XMM",ATy(qTy,qTy),
4157                        TP[CC[Bop(Lsr,
4158                                  EX(Var("v",FTy 128),LN 127,LN 112,F16),
4159                                  nVar"i"),
4160                              Bop(Lsr,
4161                                  EX(Var("v",FTy 128),LN 111,LN 96,F16),
4162                                  nVar"i"),
4163                              Bop(Lsr,
4164                                  EX(Var("v",FTy 128),LN 95,LN 80,F16),
4165                                  nVar"i"),
4166                              Bop(Lsr,
4167                                  EX(Var("v",FTy 128),LN 79,LN 64,F16),
4168                                  nVar"i"),
4169                              Bop(Lsr,
4170                                  EX(Var("v",FTy 128),LN 63,LN 48,F16),
4171                                  nVar"i"),
4172                              Bop(Lsr,
4173                                  EX(Var("v",FTy 128),LN 47,LN 32,F16),
4174                                  nVar"i"),
4175                              Bop(Lsr,
4176                                  EX(Var("v",FTy 128),LN 31,LN 16,F16),
4177                                  nVar"i"),
4178                              Bop(Lsr,EX(Var("v",FTy 128),LN 15,LN 0,F16),
4179                                  nVar"i")],Var("dst",CTy"xmm_mem")]),
4180                     qVar"state"))))))
4181;
4182val dfn'SQRTPD_def = Def
4183  ("dfn'SQRTPD",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
4184   Close
4185     (qVar"state",
4186      Let(Var("v",FTy 128),
4187          Apply
4188            (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
4189             qVar"state"),
4190          Let(TP[Var("f1",PTy(bTy,fTy)),Var("r1",F64)],
4191              Apply
4192                (Call
4193                   ("sse_sqrt64",ATy(qTy,PTy(PTy(bTy,fTy),F64)),
4194                    EX(Var("v",FTy 128),LN 127,LN 64,F64)),qVar"state"),
4195              Let(TP[Var("f2",PTy(bTy,fTy)),Var("r2",F64)],
4196                  Apply
4197                    (Call
4198                       ("sse_sqrt64",ATy(qTy,PTy(PTy(bTy,fTy),F64)),
4199                        EX(Var("v",FTy 128),LN 63,LN 0,F64)),qVar"state"),
4200                  Apply
4201                    (Call
4202                       ("write'XMM",ATy(qTy,qTy),
4203                        TP[CC[Var("r1",F64),Var("r2",F64)],
4204                           Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3))]),
4205                     Apply
4206                       (Call
4207                          ("process_float_flags",ATy(qTy,qTy),
4208                           LL[Var("f1",PTy(bTy,fTy)),
4209                              Var("f2",PTy(bTy,fTy))]),qVar"state")))))))
4210;
4211val dfn'SQRTSD_def = Def
4212  ("dfn'SQRTSD",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
4213   Close
4214     (qVar"state",
4215      Let(TP[Var("f",PTy(bTy,fTy)),Var("r",F64)],
4216          Apply
4217            (Call
4218               ("sse_sqrt64",ATy(qTy,PTy(PTy(bTy,fTy),F64)),
4219                EX(Apply
4220                     (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
4221                      qVar"state"),LN 63,LN 0,F64)),qVar"state"),
4222          Let(Var("x",CTy"xmm_mem"),
4223              Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
4224              Let(TP[Var("v",FTy 128),qVar"s"],
4225                  Let(qVar"s0",
4226                      Apply
4227                        (Call
4228                           ("process_float_flags",ATy(qTy,qTy),
4229                            LL[Var("f",PTy(bTy,fTy))]),qVar"state"),
4230                      TP[Apply
4231                           (Call
4232                              ("XMM",ATy(qTy,FTy 128),
4233                               Var("x",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
4234                  Apply
4235                    (Call
4236                       ("write'XMM",ATy(qTy,qTy),
4237                        TP[BFI(LN 63,LN 0,Var("r",F64),Var("v",FTy 128)),
4238                           Var("x",CTy"xmm_mem")]),qVar"s"))))))
4239;
4240val dfn'SQRTPS_def = Def
4241  ("dfn'SQRTPS",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
4242   Close
4243     (qVar"state",
4244      Let(Var("v",FTy 128),
4245          Apply
4246            (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
4247             qVar"state"),
4248          Let(TP[Var("f1",PTy(bTy,fTy)),Var("r1",F32)],
4249              Apply
4250                (Call
4251                   ("sse_sqrt32",ATy(qTy,PTy(PTy(bTy,fTy),F32)),
4252                    EX(Var("v",FTy 128),LN 127,LN 96,F32)),qVar"state"),
4253              Let(TP[Var("f2",PTy(bTy,fTy)),Var("r2",F32)],
4254                  Apply
4255                    (Call
4256                       ("sse_sqrt32",ATy(qTy,PTy(PTy(bTy,fTy),F32)),
4257                        EX(Var("v",FTy 128),LN 95,LN 64,F32)),qVar"state"),
4258                  Let(TP[Var("f3",PTy(bTy,fTy)),Var("r3",F32)],
4259                      Apply
4260                        (Call
4261                           ("sse_sqrt32",ATy(qTy,PTy(PTy(bTy,fTy),F32)),
4262                            EX(Var("v",FTy 128),LN 63,LN 32,F32)),
4263                         qVar"state"),
4264                      Let(TP[Var("f4",PTy(bTy,fTy)),Var("r4",F32)],
4265                          Apply
4266                            (Call
4267                               ("sse_sqrt32",
4268                                ATy(qTy,PTy(PTy(bTy,fTy),F32)),
4269                                EX(Var("v",FTy 128),LN 31,LN 0,F32)),
4270                             qVar"state"),
4271                          Apply
4272                            (Call
4273                               ("write'XMM",ATy(qTy,qTy),
4274                                TP[CC[Var("r1",F32),Var("r2",F32),
4275                                      Var("r3",F32),Var("r4",F32)],
4276                                   Call
4277                                     ("xmm_reg",CTy"xmm_mem",
4278                                      Var("dst",FTy 3))]),
4279                             Apply
4280                               (Call
4281                                  ("process_float_flags",ATy(qTy,qTy),
4282                                   LL[Var("f1",PTy(bTy,fTy)),
4283                                      Var("f2",PTy(bTy,fTy)),
4284                                      Var("f3",PTy(bTy,fTy)),
4285                                      Var("f4",PTy(bTy,fTy))]),qVar"state")))))))))
4286;
4287val dfn'SQRTSS_def = Def
4288  ("dfn'SQRTSS",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")],
4289   Close
4290     (qVar"state",
4291      Let(TP[Var("f",PTy(bTy,fTy)),Var("r",F32)],
4292          Apply
4293            (Call
4294               ("sse_sqrt32",ATy(qTy,PTy(PTy(bTy,fTy),F32)),
4295                EX(Apply
4296                     (Call("XMM",ATy(qTy,FTy 128),Var("src",CTy"xmm_mem")),
4297                      qVar"state"),LN 31,LN 0,F32)),qVar"state"),
4298          Let(Var("x",CTy"xmm_mem"),
4299              Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
4300              Let(TP[Var("v",FTy 128),qVar"s"],
4301                  Let(qVar"s0",
4302                      Apply
4303                        (Call
4304                           ("process_float_flags",ATy(qTy,qTy),
4305                            LL[Var("f",PTy(bTy,fTy))]),qVar"state"),
4306                      TP[Apply
4307                           (Call
4308                              ("XMM",ATy(qTy,FTy 128),
4309                               Var("x",CTy"xmm_mem")),qVar"s0"),qVar"s0"]),
4310                  Apply
4311                    (Call
4312                       ("write'XMM",ATy(qTy,qTy),
4313                        TP[BFI(LN 31,LN 0,Var("r",F32),Var("v",FTy 128)),
4314                           Var("x",CTy"xmm_mem")]),qVar"s"))))))
4315;
4316val dfn'Zbinop_def = Def
4317  ("dfn'Zbinop",
4318   TP[Var("bop",CTy"Zbinop_name"),Var("size",CTy"Zsize"),
4319      Var("dst_src",CTy"Zdest_src")],
4320   Close
4321     (qVar"state",
4322      Let(TP[Var("ea",CTy"Zea"),Var("val_dst",F64),Var("val_src",F64)],
4323          Apply
4324            (Call
4325               ("read_dest_src_ea",ATy(qTy,PTy(CTy"Zea",PTy(F64,F64))),
4326                TP[Var("size",CTy"Zsize"),Var("dst_src",CTy"Zdest_src")]),
4327             qVar"state"),
4328          Apply
4329            (Call
4330               ("write_binop",ATy(qTy,qTy),
4331                TP[Var("size",CTy"Zsize"),Var("bop",CTy"Zbinop_name"),
4332                   Var("val_dst",F64),Var("val_src",F64),
4333                   Var("ea",CTy"Zea")]),qVar"state"))))
4334;
4335val dfn'Zbit_test_def = Def
4336  ("dfn'Zbit_test",
4337   TP[Var("bt",CTy"Zbit_test_name"),Var("size",CTy"Zsize"),
4338      Var("dst_src",CTy"Zdest_src")],
4339   Close
4340     (qVar"state",
4341      Let(Var("v",F64),
4342          Apply
4343            (Call
4344               ("EA",ATy(qTy,F64),
4345                Apply
4346                  (Call
4347                     ("ea_Zsrc",ATy(qTy,CTy"Zea"),
4348                      TP[Var("size",CTy"Zsize"),
4349                         Var("dst_src",CTy"Zdest_src")]),qVar"state")),
4350             qVar"state"),
4351          CS(Var("dst_src",CTy"Zdest_src"),
4352             [(Call("Zr_rm",CTy"Zdest_src",AVar(PTy(CTy"Zreg",CTy"Zrm"))),
4353               Apply(Const("UD_exception",ATy(qTy,qTy)),qVar"state")),
4354              (Call
4355                 ("Zrm_r",CTy"Zdest_src",
4356                  TP[Call("Zr",CTy"Zrm",AVar(CTy"Zreg")),AVar(CTy"Zreg")]),
4357               Apply
4358                 (Call
4359                    ("bit_test",ATy(qTy,qTy),
4360                     TP[Var("bt",CTy"Zbit_test_name"),
4361                        Apply
4362                          (Call
4363                             ("ea_Zdest",ATy(qTy,CTy"Zea"),
4364                              TP[Var("size",CTy"Zsize"),
4365                                 Var("dst_src",CTy"Zdest_src")]),
4366                           qVar"state"),
4367                        Mop(Cast nTy,
4368                            Call
4369                              ("modSize",F64,
4370                               TP[Var("size",CTy"Zsize"),Var("v",F64)]))]),
4371                  qVar"state")),
4372              (Call
4373                 ("Zrm_i",CTy"Zdest_src",
4374                  TP[Call("Zr",CTy"Zrm",AVar(CTy"Zreg")),AVar F64]),
4375               Apply
4376                 (Call
4377                    ("bit_test",ATy(qTy,qTy),
4378                     TP[Var("bt",CTy"Zbit_test_name"),
4379                        Apply
4380                          (Call
4381                             ("ea_Zdest",ATy(qTy,CTy"Zea"),
4382                              TP[Var("size",CTy"Zsize"),
4383                                 Var("dst_src",CTy"Zdest_src")]),
4384                           qVar"state"),
4385                        Mop(Cast nTy,
4386                            Call
4387                              ("modSize",F64,
4388                               TP[Var("size",CTy"Zsize"),Var("v",F64)]))]),
4389                  qVar"state")),
4390              (Call
4391                 ("Zrm_i",CTy"Zdest_src",
4392                  TP[Call
4393                       ("Zm",CTy"Zrm",
4394                        TP[Var("si",OTy(PTy(FTy 2,CTy"Zreg"))),
4395                           Var("base",CTy"Zbase"),Var("disp",F64)]),
4396                     AVar F64]),
4397               Let(Var("offset",F64),
4398                   Call
4399                     ("modSize",F64,
4400                      TP[Var("size",CTy"Zsize"),Var("v",F64)]),
4401                   Apply
4402                     (Call
4403                        ("bit_test",ATy(qTy,qTy),
4404                         TP[Var("bt",CTy"Zbit_test_name"),
4405                            Apply
4406                              (Call
4407                                 ("ea_Zrm",ATy(qTy,CTy"Zea"),
4408                                  TP[Call("Z8",CTy"Zsize",LF),
4409                                     Call
4410                                       ("Zm",CTy"Zrm",
4411                                        TP[Var("si",
4412                                               OTy(PTy(FTy 2,CTy"Zreg"))),
4413                                           Var("base",CTy"Zbase"),
4414                                           Bop(Add,Var("disp",F64),
4415                                               Bop(SDiv,Var("offset",F64),
4416                                                   LW(8,64)))])]),
4417                               qVar"state"),
4418                            Mop(Cast nTy,
4419                                Bop(SMod,Var("offset",F64),LW(8,64)))]),
4420                      qVar"state"))),
4421              (Call
4422                 ("Zrm_r",CTy"Zdest_src",
4423                  TP[Call
4424                       ("Zm",CTy"Zrm",
4425                        TP[Var("si",OTy(PTy(FTy 2,CTy"Zreg"))),
4426                           Var("base",CTy"Zbase"),Var("disp",F64)]),
4427                     AVar(CTy"Zreg")]),
4428               Let(TP[Var("v",F64),qVar"s"],
4429                   Apply
4430                     (Call
4431                        ("SignExtension64",ATy(qTy,PTy(F64,qTy)),
4432                         TP[Var("v",F64),Var("size",CTy"Zsize")]),
4433                      qVar"state"),
4434                   Apply
4435                     (Call
4436                        ("bit_test",ATy(qTy,qTy),
4437                         TP[Var("bt",CTy"Zbit_test_name"),
4438                            Apply
4439                              (Call
4440                                 ("ea_Zrm",ATy(qTy,CTy"Zea"),
4441                                  TP[Call("Z8",CTy"Zsize",LF),
4442                                     Call
4443                                       ("Zm",CTy"Zrm",
4444                                        TP[Var("si",
4445                                               OTy(PTy(FTy 2,CTy"Zreg"))),
4446                                           Var("base",CTy"Zbase"),
4447                                           Bop(Add,Var("disp",F64),
4448                                               Bop(SDiv,Var("v",F64),
4449                                                   LW(8,64)))])]),qVar"s"),
4450                            Mop(Cast nTy,Bop(SMod,Var("v",F64),LW(8,64)))]),
4451                      qVar"s")))]))))
4452;
4453val dfn'Zcall_def = Def
4454  ("dfn'Zcall",Var("imm_rm",CTy"Zimm_rm"),
4455   Close
4456     (qVar"state",
4457      Let(TP[Var("v",CTy"Zea"),qVar"s"],
4458          Let(qVar"s",
4459              Apply(Const("x64_push_rip",ATy(qTy,qTy)),qVar"state"),
4460              TP[Apply
4461                   (Call
4462                      ("ea_Zimm_rm",ATy(qTy,CTy"Zea"),
4463                       Var("imm_rm",CTy"Zimm_rm")),qVar"s"),qVar"s"]),
4464          Apply(Call("jump_to_ea",ATy(qTy,qTy),Var("v",CTy"Zea")),qVar"s"))))
4465;
4466val dfn'Zcmpxchg_def = Def
4467  ("dfn'Zcmpxchg",
4468   TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("r",CTy"Zreg")],
4469   Close
4470     (qVar"state",
4471      Let(Var("ea_src",CTy"Zea"),
4472          Call
4473            ("Zea_r",CTy"Zea",
4474             TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg")]),
4475          Let(Var("v",CTy"Zea"),
4476              Apply
4477                (Call
4478                   ("ea_Zrm",ATy(qTy,CTy"Zea"),
4479                    TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")]),
4480                 qVar"state"),
4481              Let(Var("v0",F64),
4482                  Apply
4483                    (Call("EA",ATy(qTy,F64),Var("v",CTy"Zea")),qVar"state"),
4484                  Let(Var("v1",F64),
4485                      Apply
4486                        (Call("EA",ATy(qTy,F64),Var("ea_src",CTy"Zea")),
4487                         qVar"state"),
4488                      Let(qVar"s",
4489                          Apply
4490                            (Call
4491                               ("write_binop",ATy(qTy,qTy),
4492                                TP[Var("size",CTy"Zsize"),
4493                                   LC("Zcmp",CTy"Zbinop_name"),
4494                                   Var("v1",F64),Var("v0",F64),
4495                                   Var("ea_src",CTy"Zea")]),qVar"state"),
4496                          ITE(EQ(Var("v1",F64),Var("v0",F64)),
4497                              Apply
4498                                (Call
4499                                   ("write'EA",ATy(qTy,qTy),
4500                                    TP[Apply
4501                                         (Call
4502                                            ("EA",ATy(qTy,F64),
4503                                             Var("ea_src",CTy"Zea")),
4504                                          qVar"s"),Var("v",CTy"Zea")]),
4505                                 qVar"s"),
4506                              Apply
4507                                (Call
4508                                   ("write'EA",ATy(qTy,qTy),
4509                                    TP[Var("v0",F64),
4510                                       Call
4511                                         ("Zea_r",CTy"Zea",
4512                                          TP[Var("size",CTy"Zsize"),
4513                                             LC("RAX",CTy"Zreg")])]),
4514                                 qVar"s")))))))))
4515;
4516val dfn'Zdiv_def = Def
4517  ("dfn'Zdiv",TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")],
4518   Close
4519     (qVar"state",
4520      Let(nVar"w",Call("value_width",nTy,Var("size",CTy"Zsize")),
4521          Let(Var("ea_eax",CTy"Zea"),
4522              Call
4523                ("Zea_r",CTy"Zea",
4524                 TP[Var("size",CTy"Zsize"),LC("RAX",CTy"Zreg")]),
4525              Let(Var("ea_edx",CTy"Zea"),
4526                  Call
4527                    ("Zea_r",CTy"Zea",
4528                     TP[Var("size",CTy"Zsize"),LC("RDX",CTy"Zreg")]),
4529                  Let(nVar"v0",
4530                      Bop(Add,
4531                          Bop(Mul,
4532                              Mop(Cast nTy,
4533                                  Apply
4534                                    (Call
4535                                       ("EA",ATy(qTy,F64),
4536                                        Var("ea_edx",CTy"Zea")),
4537                                     qVar"state")),nVar"w"),
4538                          Mop(Cast nTy,
4539                              Apply
4540                                (Call
4541                                   ("EA",ATy(qTy,F64),
4542                                    Var("ea_eax",CTy"Zea")),qVar"state"))),
4543                      Let(nVar"v1",
4544                          Mop(Cast nTy,
4545                              Apply
4546                                (Call
4547                                   ("EA",ATy(qTy,F64),
4548                                    Apply
4549                                      (Call
4550                                         ("ea_Zrm",ATy(qTy,CTy"Zea"),
4551                                          TP[Var("size",CTy"Zsize"),
4552                                             Var("rm",CTy"Zrm")]),
4553                                       qVar"state")),qVar"state")),
4554                          Let(nVar"q",Bop(Div,nVar"v0",nVar"v1"),
4555                              Apply
4556                                (Const("erase_eflags",ATy(qTy,qTy)),
4557                                 Apply
4558                                   (Call
4559                                      ("write'EA",ATy(qTy,qTy),
4560                                       TP[Mop(Cast F64,
4561                                              Bop(Mod,nVar"v0",nVar"v1")),
4562                                          Var("ea_edx",CTy"Zea")]),
4563                                    Apply
4564                                      (Call
4565                                         ("write'EA",ATy(qTy,qTy),
4566                                          TP[Mop(Cast F64,nVar"q"),
4567                                             Var("ea_eax",CTy"Zea")]),
4568                                       ITE(Bop(Or,EQ(nVar"v1",LN 0),
4569                                               Bop(Le,nVar"w",nVar"q")),
4570                                           Apply
4571                                             (Const
4572                                                ("DE_exception",
4573                                                 ATy(qTy,qTy)),qVar"state"),
4574                                           qVar"state"))))))))))))
4575;
4576val dfn'Zidiv_def = Def
4577  ("dfn'Zidiv",TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")],
4578   Close
4579     (qVar"state",
4580      Let(iVar"w",
4581          Mop(Cast iTy,Call("value_width",nTy,Var("size",CTy"Zsize"))),
4582          Let(Var("ea_eax",CTy"Zea"),
4583              Call
4584                ("Zea_r",CTy"Zea",
4585                 TP[Var("size",CTy"Zsize"),LC("RAX",CTy"Zreg")]),
4586              Let(Var("ea_edx",CTy"Zea"),
4587                  Call
4588                    ("Zea_r",CTy"Zea",
4589                     TP[Var("size",CTy"Zsize"),LC("RDX",CTy"Zreg")]),
4590                  Let(TP[iVar"v0",qVar"s"],
4591                      Let(TP[iVar"v",qVar"s"],
4592                          Let(TP[iVar"v",qVar"s"],
4593                              Let(TP[Var("v",F64),qVar"s"],
4594                                  Apply
4595                                    (Call
4596                                       ("SignExtension64",
4597                                        ATy(qTy,PTy(F64,qTy)),
4598                                        TP[Apply
4599                                             (Call
4600                                                ("EA",ATy(qTy,F64),
4601                                                 Var("ea_edx",CTy"Zea")),
4602                                              qVar"state"),
4603                                           Var("size",CTy"Zsize")]),
4604                                     qVar"state"),
4605                                  TP[Mop(Cast iTy,Var("v",F64)),qVar"s"]),
4606                              TP[Bop(Mul,iVar"v",iVar"w"),qVar"s"]),
4607                          TP[Bop(Add,iVar"v",
4608                                 Mop(Cast iTy,
4609                                     Mop(Cast nTy,
4610                                         Apply
4611                                           (Call
4612                                              ("EA",ATy(qTy,F64),
4613                                               Var("ea_eax",CTy"Zea")),
4614                                            qVar"s")))),qVar"s"]),
4615                      Let(TP[iVar"v1",qVar"s"],
4616                          Let(TP[Var("v",F64),qVar"s"],
4617                              Apply
4618                                (Call
4619                                   ("SignExtension64",
4620                                    ATy(qTy,PTy(F64,qTy)),
4621                                    TP[Apply
4622                                         (Call
4623                                            ("EA",ATy(qTy,F64),
4624                                             Apply
4625                                               (Call
4626                                                  ("ea_Zrm",
4627                                                   ATy(qTy,CTy"Zea"),
4628                                                   TP[Var("size",
4629                                                          CTy"Zsize"),
4630                                                      Var("rm",CTy"Zrm")]),
4631                                                qVar"state")),qVar"s"),
4632                                       Var("size",CTy"Zsize")]),qVar"s"),
4633                              TP[Mop(Cast iTy,Var("v",F64)),qVar"s"]),
4634                          Let(iVar"q",Bop(Quot,iVar"v0",iVar"v1"),
4635                              Apply
4636                                (Const("erase_eflags",ATy(qTy,qTy)),
4637                                 Apply
4638                                   (Call
4639                                      ("write'EA",ATy(qTy,qTy),
4640                                       TP[Mop(Cast F64,
4641                                              Bop(Rem,iVar"v0",iVar"v1")),
4642                                          Var("ea_edx",CTy"Zea")]),
4643                                    Apply
4644                                      (Call
4645                                         ("write'EA",ATy(qTy,qTy),
4646                                          TP[Mop(Cast F64,iVar"q"),
4647                                             Var("ea_eax",CTy"Zea")]),
4648                                       ITE(Bop(Or,EQ(iVar"v1",LI 0),
4649                                               Bop(Or,
4650                                                   Bop(Lt,iVar"q",
4651                                                       Mop(Neg,
4652                                                           Bop(Div,
4653                                                               iVar"w",
4654                                                               LI 2))),
4655                                                   Bop(Le,
4656                                                       Bop(Div,iVar"w",
4657                                                           LI 2),iVar"q"))),
4658                                           Apply
4659                                             (Const
4660                                                ("DE_exception",
4661                                                 ATy(qTy,qTy)),qVar"s"),
4662                                           qVar"s"))))))))))))
4663;
4664val dfn'Zjcc_def = Def
4665  ("dfn'Zjcc",TP[Var("cond",CTy"Zcond"),Var("imm",F64)],
4666   Close
4667     (qVar"state",
4668      Let(TP[bVar"v",qVar"s"],
4669          Apply
4670            (Call
4671               ("read_cond",ATy(qTy,PTy(bTy,qTy)),Var("cond",CTy"Zcond")),
4672             qVar"state"),
4673          ITE(bVar"v",
4674              Rupd
4675                ("RIP",
4676                 TP[qVar"s",
4677                    Bop(Add,Dest("RIP",F64,qVar"s"),Var("imm",F64))]),
4678              qVar"s"))))
4679;
4680val dfn'Zjmp_def = Def
4681  ("dfn'Zjmp",Var("rm",CTy"Zrm"),
4682   Close
4683     (qVar"state",
4684      Rupd
4685        ("RIP",
4686         TP[qVar"state",
4687            Apply
4688              (Call
4689                 ("EA",ATy(qTy,F64),
4690                  Apply
4691                    (Call
4692                       ("ea_Zrm",ATy(qTy,CTy"Zea"),
4693                        TP[Const("Z64",CTy"Zsize"),Var("rm",CTy"Zrm")]),
4694                     qVar"state")),qVar"state")])))
4695;
4696val dfn'Zlea_def = Def
4697  ("dfn'Zlea",TP[Var("size",CTy"Zsize"),Var("dst_src",CTy"Zdest_src")],
4698   Close
4699     (qVar"state",
4700      Apply
4701        (Call
4702           ("write'EA",ATy(qTy,qTy),
4703            TP[Call
4704                 ("get_ea_address",F64,
4705                  Apply
4706                    (Call
4707                       ("ea_Zsrc",ATy(qTy,CTy"Zea"),
4708                        TP[Var("size",CTy"Zsize"),
4709                           Var("dst_src",CTy"Zdest_src")]),qVar"state")),
4710               Apply
4711                 (Call
4712                    ("ea_Zdest",ATy(qTy,CTy"Zea"),
4713                     TP[Var("size",CTy"Zsize"),
4714                        Var("dst_src",CTy"Zdest_src")]),qVar"state")]),
4715         qVar"state")))
4716;
4717val dfn'Zleave_def = Def
4718  ("dfn'Zleave",qVar"state",
4719   Apply
4720     (Call("x64_pop",ATy(qTy,qTy),Call("Zr",CTy"Zrm",LC("RBP",CTy"Zreg"))),
4721      Rupd
4722        ("REG",
4723         TP[qVar"state",
4724            Fupd
4725              (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
4726               LC("RSP",CTy"Zreg"),
4727               Apply
4728                 (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
4729                  LC("RBP",CTy"Zreg")))])))
4730;
4731val dfn'Zloop_def = Def
4732  ("dfn'Zloop",TP[Var("cond",CTy"Zcond"),Var("imm",F64)],
4733   Close
4734     (qVar"state",
4735      Let(Var("v",F64),
4736          Bop(Sub,
4737              Apply
4738                (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
4739                 LC("RCX",CTy"Zreg")),LW(1,64)),
4740          Let(qVar"s",
4741              Rupd
4742                ("REG",
4743                 TP[qVar"state",
4744                    Fupd
4745                      (Dest("REG",ATy(CTy"Zreg",F64),qVar"state"),
4746                       LC("RCX",CTy"Zreg"),Var("v",F64))]),
4747              Let(TP[bVar"v",qVar"s"],
4748                  ITE(Mop(Not,EQ(Var("v",F64),LW(0,64))),
4749                      Apply
4750                        (Call
4751                           ("read_cond",ATy(qTy,PTy(bTy,qTy)),
4752                            Var("cond",CTy"Zcond")),qVar"s"),
4753                      TP[LF,qVar"s"]),
4754                  ITE(bVar"v",
4755                      Rupd
4756                        ("RIP",
4757                         TP[qVar"s",
4758                            Bop(Add,Dest("RIP",F64,qVar"s"),Var("imm",F64))]),
4759                      qVar"s"))))))
4760;
4761val dfn'Zmonop_def = Def
4762  ("dfn'Zmonop",
4763   TP[Var("mop",CTy"Zmonop_name"),Var("size",CTy"Zsize"),
4764      Var("rm",CTy"Zrm")],
4765   Close
4766     (qVar"state",
4767      Let(Var("v",CTy"Zea"),
4768          Apply
4769            (Call
4770               ("ea_Zrm",ATy(qTy,CTy"Zea"),
4771                TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")]),qVar"state"),
4772          Apply
4773            (Call
4774               ("write_monop",ATy(qTy,qTy),
4775                TP[Var("size",CTy"Zsize"),Var("mop",CTy"Zmonop_name"),
4776                   Apply
4777                     (Call("EA",ATy(qTy,F64),Var("v",CTy"Zea")),
4778                      qVar"state"),Var("v",CTy"Zea")]),qVar"state"))))
4779;
4780val dfn'Zmov_def = Def
4781  ("dfn'Zmov",
4782   TP[Var("cond",CTy"Zcond"),Var("size",CTy"Zsize"),
4783      Var("dst_src",CTy"Zdest_src")],
4784   Close
4785     (qVar"state",
4786      Let(TP[bVar"v",qVar"s"],
4787          Apply
4788            (Call
4789               ("read_cond",ATy(qTy,PTy(bTy,qTy)),Var("cond",CTy"Zcond")),
4790             qVar"state"),
4791          ITE(bVar"v",
4792              Apply
4793                (Call
4794                   ("write'EA",ATy(qTy,qTy),
4795                    TP[Apply
4796                         (Call
4797                            ("EA",ATy(qTy,F64),
4798                             Apply
4799                               (Call
4800                                  ("ea_Zsrc",ATy(qTy,CTy"Zea"),
4801                                   TP[Var("size",CTy"Zsize"),
4802                                      Var("dst_src",CTy"Zdest_src")]),
4803                                qVar"s")),qVar"s"),
4804                       Apply
4805                         (Call
4806                            ("ea_Zdest",ATy(qTy,CTy"Zea"),
4807                             TP[Var("size",CTy"Zsize"),
4808                                Var("dst_src",CTy"Zdest_src")]),qVar"s")]),
4809                 qVar"s"),qVar"s"))))
4810;
4811val dfn'Zmovsx_def = Def
4812  ("dfn'Zmovsx",
4813   TP[Var("size1",CTy"Zsize"),Var("dst_src",CTy"Zdest_src"),
4814      Var("size2",CTy"Zsize")],
4815   Close
4816     (qVar"state",
4817      Let(TP[Var("v",PTy(F64,CTy"Zea")),qVar"s"],
4818          Let(TP[Var("v0",F64),qVar"s"],
4819              Apply
4820                (Call
4821                   ("SignExtension",ATy(qTy,PTy(F64,qTy)),
4822                    TP[Apply
4823                         (Call
4824                            ("EA",ATy(qTy,F64),
4825                             Apply
4826                               (Call
4827                                  ("ea_Zsrc",ATy(qTy,CTy"Zea"),
4828                                   TP[Var("size1",CTy"Zsize"),
4829                                      Var("dst_src",CTy"Zdest_src")]),
4830                                qVar"state")),qVar"state"),
4831                       Var("size1",CTy"Zsize"),Var("size2",CTy"Zsize")]),
4832                 qVar"state"),
4833              TP[TP[Var("v0",F64),
4834                    Apply
4835                      (Call
4836                         ("ea_Zdest",ATy(qTy,CTy"Zea"),
4837                          TP[Var("size2",CTy"Zsize"),
4838                             Var("dst_src",CTy"Zdest_src")]),qVar"state")],
4839                 qVar"s"]),
4840          Apply
4841            (Call("write'EA",ATy(qTy,qTy),Var("v",PTy(F64,CTy"Zea"))),
4842             qVar"s"))))
4843;
4844val dfn'Zmovzx_def = Def
4845  ("dfn'Zmovzx",
4846   TP[Var("size1",CTy"Zsize"),Var("dst_src",CTy"Zdest_src"),
4847      Var("size2",CTy"Zsize")],
4848   Close
4849     (qVar"state",
4850      Apply
4851        (Call
4852           ("write'EA",ATy(qTy,qTy),
4853            TP[Apply
4854                 (Call
4855                    ("EA",ATy(qTy,F64),
4856                     Apply
4857                       (Call
4858                          ("ea_Zsrc",ATy(qTy,CTy"Zea"),
4859                           TP[Var("size1",CTy"Zsize"),
4860                              Var("dst_src",CTy"Zdest_src")]),qVar"state")),
4861                  qVar"state"),
4862               Apply
4863                 (Call
4864                    ("ea_Zdest",ATy(qTy,CTy"Zea"),
4865                     TP[Var("size2",CTy"Zsize"),
4866                        Var("dst_src",CTy"Zdest_src")]),qVar"state")]),
4867         qVar"state")))
4868;
4869val dfn'Zmul_def = Def
4870  ("dfn'Zmul",TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")],
4871   Close
4872     (qVar"state",
4873      Let(Var("ea_eax",CTy"Zea"),
4874          Call
4875            ("Zea_r",CTy"Zea",
4876             TP[Var("size",CTy"Zsize"),LC("RAX",CTy"Zreg")]),
4877          Let(Var("v",F64),
4878              Apply
4879                (Call("EA",ATy(qTy,F64),Var("ea_eax",CTy"Zea")),
4880                 qVar"state"),
4881              Let(Var("v0",F64),
4882                  Apply
4883                    (Call
4884                       ("EA",ATy(qTy,F64),
4885                        Apply
4886                          (Call
4887                             ("ea_Zrm",ATy(qTy,CTy"Zea"),
4888                              TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")]),
4889                           qVar"state")),qVar"state"),
4890                  Apply
4891                    (Const("erase_eflags",ATy(qTy,qTy)),
4892                     CS(Var("size",CTy"Zsize"),
4893                        [(Call("Z8",CTy"Zsize",AVar bTy),
4894                          Apply
4895                            (Call
4896                               ("write'EA",ATy(qTy,qTy),
4897                                TP[Bop(Mul,Var("v",F64),Var("v0",F64)),
4898                                   Call
4899                                     ("Zea_r",CTy"Zea",
4900                                      TP[Const("Z16",CTy"Zsize"),
4901                                         LC("RAX",CTy"Zreg")])]),
4902                             qVar"state")),
4903                         (AVar(CTy"Zsize"),
4904                          Apply
4905                            (Call
4906                               ("write'EA",ATy(qTy,qTy),
4907                                TP[Mop(Cast F64,
4908                                       Bop(Div,
4909                                           Bop(Mul,
4910                                               Mop(Cast nTy,Var("v",F64)),
4911                                               Mop(Cast nTy,Var("v0",F64))),
4912                                           Call
4913                                             ("value_width",nTy,
4914                                              Var("size",CTy"Zsize")))),
4915                                   Call
4916                                     ("Zea_r",CTy"Zea",
4917                                      TP[Var("size",CTy"Zsize"),
4918                                         LC("RDX",CTy"Zreg")])]),
4919                             Apply
4920                               (Call
4921                                  ("write'EA",ATy(qTy,qTy),
4922                                   TP[Bop(Mul,Var("v",F64),Var("v0",F64)),
4923                                      Var("ea_eax",CTy"Zea")]),qVar"state")))])))))))
4924;
4925val dfn'Zimul_def = Def
4926  ("dfn'Zimul",TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")],
4927   Close
4928     (qVar"state",
4929      Let(Var("ea_eax",CTy"Zea"),
4930          Call
4931            ("Zea_r",CTy"Zea",
4932             TP[Var("size",CTy"Zsize"),LC("RAX",CTy"Zreg")]),
4933          Let(TP[Var("v",F64),qVar"s"],
4934              Apply
4935                (Call
4936                   ("SignExtension64",ATy(qTy,PTy(F64,qTy)),
4937                    TP[Apply
4938                         (Call("EA",ATy(qTy,F64),Var("ea_eax",CTy"Zea")),
4939                          qVar"state"),Var("size",CTy"Zsize")]),
4940                 qVar"state"),
4941              Let(TP[Var("v0",F64),qVar"s"],
4942                  Apply
4943                    (Call
4944                       ("SignExtension64",ATy(qTy,PTy(F64,qTy)),
4945                        TP[Apply
4946                             (Call
4947                                ("EA",ATy(qTy,F64),
4948                                 Apply
4949                                   (Call
4950                                      ("ea_Zrm",ATy(qTy,CTy"Zea"),
4951                                       TP[Var("size",CTy"Zsize"),
4952                                          Var("rm",CTy"Zrm")]),qVar"s")),
4953                              qVar"s"),Var("size",CTy"Zsize")]),qVar"s"),
4954                  Let(iVar"product",
4955                      Bop(Mul,Mop(Cast iTy,Var("v",F64)),
4956                          Mop(Cast iTy,Var("v0",F64))),
4957                      Let(Var("product64",F64),
4958                          Mop(Cast F64,iVar"product"),
4959                          Let(qVar"s",
4960                              Apply
4961                                (Const("erase_eflags",ATy(qTy,qTy)),
4962                                 qVar"s"),
4963                              Let(TP[bVar"v",qVar"s"],
4964                                  ITE(EQ(Var("size",CTy"Zsize"),
4965                                         Const("Z64",CTy"Zsize")),
4966                                      TP[EQ(Mop(Cast iTy,
4967                                                Var("product64",F64)),
4968                                            iVar"product"),qVar"s"],
4969                                      Let(TP[Var("v",F64),qVar"s"],
4970                                          Apply
4971                                            (Call
4972                                               ("SignExtension64",
4973                                                ATy(qTy,PTy(F64,qTy)),
4974                                                TP[Var("product64",F64),
4975                                                   Var("size",CTy"Zsize")]),
4976                                             qVar"s"),
4977                                          TP[EQ(Var("v",F64),
4978                                                Var("product64",F64)),
4979                                             qVar"s"])),
4980                                  Let(bVar"v",Mop(Not,bVar"v"),
4981                                      Let(qVar"s",
4982                                          Apply
4983                                            (Call
4984                                               ("write'OF",ATy(qTy,qTy),
4985                                                bVar"v"),
4986                                             Apply
4987                                               (Call
4988                                                  ("write'CF",
4989                                                   ATy(qTy,qTy),bVar"v"),
4990                                                qVar"s")),
4991                                          CS(Var("size",CTy"Zsize"),
4992                                             [(Call
4993                                                 ("Z8",CTy"Zsize",AVar bTy),
4994                                               Apply
4995                                                 (Call
4996                                                    ("write'EA",
4997                                                     ATy(qTy,qTy),
4998                                                     TP[Var("product64",
4999                                                            F64),
5000                                                        Call
5001                                                          ("Zea_r",
5002                                                           CTy"Zea",
5003                                                           TP[Const
5004                                                                ("Z16",
5005                                                                 CTy"Zsize"),
5006                                                              LC("RAX",
5007                                                                 CTy"Zreg")])]),
5008                                                  qVar"s")),
5009                                              (AVar(CTy"Zsize"),
5010                                               Apply
5011                                                 (Call
5012                                                    ("write'EA",
5013                                                     ATy(qTy,qTy),
5014                                                     TP[Mop(Cast F64,
5015                                                            Bop(Div,
5016                                                                iVar"product",
5017                                                                Mop(Cast
5018                                                                      iTy,
5019                                                                    Call
5020                                                                      ("value_width",
5021                                                                       nTy,
5022                                                                       Var("size",
5023                                                                           CTy"Zsize"))))),
5024                                                        Call
5025                                                          ("Zea_r",
5026                                                           CTy"Zea",
5027                                                           TP[Var("size",
5028                                                                  CTy"Zsize"),
5029                                                              LC("RDX",
5030                                                                 CTy"Zreg")])]),
5031                                                  Apply
5032                                                    (Call
5033                                                       ("write'EA",
5034                                                        ATy(qTy,qTy),
5035                                                        TP[Var("product64",
5036                                                               F64),
5037                                                           Var("ea_eax",
5038                                                               CTy"Zea")]),
5039                                                     qVar"s")))]))))))))))))
5040;
5041val dfn'Zimul2_def = Def
5042  ("dfn'Zimul2",
5043   TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg"),Var("rm",CTy"Zrm")],
5044   Close
5045     (qVar"state",
5046      Let(Var("ea_dst",CTy"Zea"),
5047          Call
5048            ("Zea_r",CTy"Zea",
5049             TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg")]),
5050          Let(TP[Var("v",F64),qVar"s"],
5051              Apply
5052                (Call
5053                   ("SignExtension64",ATy(qTy,PTy(F64,qTy)),
5054                    TP[Apply
5055                         (Call("EA",ATy(qTy,F64),Var("ea_dst",CTy"Zea")),
5056                          qVar"state"),Var("size",CTy"Zsize")]),
5057                 qVar"state"),
5058              Let(TP[Var("v0",F64),qVar"s"],
5059                  Apply
5060                    (Call
5061                       ("SignExtension64",ATy(qTy,PTy(F64,qTy)),
5062                        TP[Apply
5063                             (Call
5064                                ("EA",ATy(qTy,F64),
5065                                 Apply
5066                                   (Call
5067                                      ("ea_Zrm",ATy(qTy,CTy"Zea"),
5068                                       TP[Var("size",CTy"Zsize"),
5069                                          Var("rm",CTy"Zrm")]),qVar"s")),
5070                              qVar"s"),Var("size",CTy"Zsize")]),qVar"s"),
5071                  Let(iVar"product",
5072                      Bop(Mul,Mop(Cast iTy,Var("v",F64)),
5073                          Mop(Cast iTy,Var("v0",F64))),
5074                      Let(Var("product64",F64),
5075                          Mop(Cast F64,iVar"product"),
5076                          Let(qVar"s",
5077                              Apply
5078                                (Const("erase_eflags",ATy(qTy,qTy)),
5079                                 qVar"s"),
5080                              Let(TP[bVar"v",qVar"s"],
5081                                  ITE(EQ(Var("size",CTy"Zsize"),
5082                                         Const("Z64",CTy"Zsize")),
5083                                      TP[EQ(Mop(Cast iTy,
5084                                                Var("product64",F64)),
5085                                            iVar"product"),qVar"s"],
5086                                      Let(TP[Var("v",F64),qVar"s"],
5087                                          Apply
5088                                            (Call
5089                                               ("SignExtension64",
5090                                                ATy(qTy,PTy(F64,qTy)),
5091                                                TP[Var("product64",F64),
5092                                                   Var("size",CTy"Zsize")]),
5093                                             qVar"s"),
5094                                          TP[EQ(Var("v",F64),
5095                                                Var("product64",F64)),
5096                                             qVar"s"])),
5097                                  Let(bVar"v",Mop(Not,bVar"v"),
5098                                      Apply
5099                                        (Call
5100                                           ("write'EA",ATy(qTy,qTy),
5101                                            TP[Var("product64",F64),
5102                                               Var("ea_dst",CTy"Zea")]),
5103                                         Apply
5104                                           (Call
5105                                              ("write'OF",ATy(qTy,qTy),
5106                                               bVar"v"),
5107                                            Apply
5108                                              (Call
5109                                                 ("write'CF",ATy(qTy,qTy),
5110                                                  bVar"v"),qVar"s")))))))))))))
5111;
5112val dfn'Zimul3_def = Def
5113  ("dfn'Zimul3",
5114   TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg"),Var("rm",CTy"Zrm"),
5115      Var("imm",F64)],
5116   Close
5117     (qVar"state",
5118      Let(TP[Var("v",F64),qVar"s"],
5119          Apply
5120            (Call
5121               ("SignExtension64",ATy(qTy,PTy(F64,qTy)),
5122                TP[Apply
5123                     (Call
5124                        ("EA",ATy(qTy,F64),
5125                         Apply
5126                           (Call
5127                              ("ea_Zrm",ATy(qTy,CTy"Zea"),
5128                               TP[Var("size",CTy"Zsize"),
5129                                  Var("rm",CTy"Zrm")]),qVar"state")),
5130                      qVar"state"),Var("size",CTy"Zsize")]),qVar"state"),
5131          Let(iVar"product",
5132              Bop(Mul,Mop(Cast iTy,Var("v",F64)),
5133                  Mop(Cast iTy,Var("imm",F64))),
5134              Let(Var("product64",F64),Mop(Cast F64,iVar"product"),
5135                  Let(qVar"s",
5136                      Apply(Const("erase_eflags",ATy(qTy,qTy)),qVar"s"),
5137                      Let(TP[bVar"v",qVar"s"],
5138                          ITE(EQ(Var("size",CTy"Zsize"),
5139                                 Const("Z64",CTy"Zsize")),
5140                              TP[EQ(Mop(Cast iTy,Var("product64",F64)),
5141                                    iVar"product"),qVar"s"],
5142                              Let(TP[Var("v",F64),qVar"s"],
5143                                  Apply
5144                                    (Call
5145                                       ("SignExtension64",
5146                                        ATy(qTy,PTy(F64,qTy)),
5147                                        TP[Var("product64",F64),
5148                                           Var("size",CTy"Zsize")]),
5149                                     qVar"s"),
5150                                  TP[EQ(Var("v",F64),Var("product64",F64)),
5151                                     qVar"s"])),
5152                          Let(bVar"v",Mop(Not,bVar"v"),
5153                              Apply
5154                                (Call
5155                                   ("write'EA",ATy(qTy,qTy),
5156                                    TP[Var("product64",F64),
5157                                       Call
5158                                         ("Zea_r",CTy"Zea",
5159                                          TP[Var("size",CTy"Zsize"),
5160                                             Var("r",CTy"Zreg")])]),
5161                                 Apply
5162                                   (Call("write'OF",ATy(qTy,qTy),bVar"v"),
5163                                    Apply
5164                                      (Call
5165                                         ("write'CF",ATy(qTy,qTy),bVar"v"),
5166                                       qVar"s")))))))))))
5167;
5168val dfn'Znop_def = Def ("dfn'Znop",nVar"n",LU)
5169;
5170val dfn'Zpop_def = Def
5171  ("dfn'Zpop",Var("rm",CTy"Zrm"),
5172   Close
5173     (qVar"state",
5174      Apply(Call("x64_pop",ATy(qTy,qTy),Var("rm",CTy"Zrm")),qVar"state")))
5175;
5176val dfn'Zpush_def = Def
5177  ("dfn'Zpush",Var("imm_rm",CTy"Zimm_rm"),
5178   Close
5179     (qVar"state",
5180      Apply
5181        (Call("x64_push",ATy(qTy,qTy),Var("imm_rm",CTy"Zimm_rm")),
5182         qVar"state")))
5183;
5184val dfn'Zret_def = Def
5185  ("dfn'Zret",Var("imm",F64),
5186   Close
5187     (qVar"state",
5188      Apply
5189        (Call("x64_drop",ATy(qTy,qTy),Var("imm",F64)),
5190         Apply(Const("x64_pop_rip",ATy(qTy,qTy)),qVar"state"))))
5191;
5192val dfn'Zset_def = Def
5193  ("dfn'Zset",
5194   TP[Var("cond",CTy"Zcond"),bVar"have_rex",Var("rm",CTy"Zrm")],
5195   Close
5196     (qVar"state",
5197      Let(TP[bVar"v0",qVar"s"],
5198          Apply
5199            (Call
5200               ("read_cond",ATy(qTy,PTy(bTy,qTy)),Var("cond",CTy"Zcond")),
5201             qVar"state"),
5202          Apply
5203            (Call
5204               ("write'EA",ATy(qTy,qTy),
5205                TP[Mop(Cast F64,bVar"v0"),
5206                   Apply
5207                     (Call
5208                        ("ea_Zrm",ATy(qTy,CTy"Zea"),
5209                         TP[Call("Z8",CTy"Zsize",bVar"have_rex"),
5210                            Var("rm",CTy"Zrm")]),qVar"state")]),qVar"s"))))
5211;
5212val dfn'Zxadd_def = Def
5213  ("dfn'Zxadd",
5214   TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("r",CTy"Zreg")],
5215   Close
5216     (qVar"state",
5217      Let(Var("ea_src",CTy"Zea"),
5218          Call
5219            ("Zea_r",CTy"Zea",
5220             TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg")]),
5221          Let(Var("v",CTy"Zea"),
5222              Apply
5223                (Call
5224                   ("ea_Zrm",ATy(qTy,CTy"Zea"),
5225                    TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")]),
5226                 qVar"state"),
5227              Let(Var("v1",F64),
5228                  Apply
5229                    (Call("EA",ATy(qTy,F64),Var("v",CTy"Zea")),qVar"state"),
5230                  Apply
5231                    (Call
5232                       ("write_binop",ATy(qTy,qTy),
5233                        TP[Var("size",CTy"Zsize"),
5234                           LC("Zadd",CTy"Zbinop_name"),
5235                           Apply
5236                             (Call
5237                                ("EA",ATy(qTy,F64),Var("ea_src",CTy"Zea")),
5238                              qVar"state"),Var("v1",F64),Var("v",CTy"Zea")]),
5239                     Apply
5240                       (Call
5241                          ("write'EA",ATy(qTy,qTy),
5242                           TP[Var("v1",F64),Var("ea_src",CTy"Zea")]),
5243                        qVar"state")))))))
5244;
5245val dfn'Zxchg_def = Def
5246  ("dfn'Zxchg",
5247   TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("r",CTy"Zreg")],
5248   Close
5249     (qVar"state",
5250      Let(Var("ea_src",CTy"Zea"),
5251          Call
5252            ("Zea_r",CTy"Zea",
5253             TP[Var("size",CTy"Zsize"),Var("r",CTy"Zreg")]),
5254          Let(Var("v",CTy"Zea"),
5255              Apply
5256                (Call
5257                   ("ea_Zrm",ATy(qTy,CTy"Zea"),
5258                    TP[Var("size",CTy"Zsize"),Var("rm",CTy"Zrm")]),
5259                 qVar"state"),
5260              Apply
5261                (Call
5262                   ("write'EA",ATy(qTy,qTy),
5263                    TP[Apply
5264                         (Call("EA",ATy(qTy,F64),Var("ea_src",CTy"Zea")),
5265                          qVar"state"),Var("v",CTy"Zea")]),
5266                 Apply
5267                   (Call
5268                      ("write'EA",ATy(qTy,qTy),
5269                       TP[Apply
5270                            (Call("EA",ATy(qTy,F64),Var("v",CTy"Zea")),
5271                             qVar"state"),Var("ea_src",CTy"Zea")]),
5272                    qVar"state"))))))
5273;
5274val dfn'Zcmc_def = Def
5275  ("dfn'Zcmc",qVar"state",
5276   Let(TP[bVar"v",qVar"s"],
5277       Apply(Const("CF",ATy(qTy,PTy(bTy,qTy))),qVar"state"),
5278       Apply(Call("write'CF",ATy(qTy,qTy),Mop(Not,bVar"v")),qVar"s")))
5279;
5280val dfn'Zclc_def = Def
5281  ("dfn'Zclc",qVar"state",
5282   Apply(Call("write'CF",ATy(qTy,qTy),LF),qVar"state"))
5283;
5284val dfn'Zstc_def = Def
5285  ("dfn'Zstc",qVar"state",
5286   Apply(Call("write'CF",ATy(qTy,qTy),LT),qVar"state"))
5287;
5288val Run_def = Def
5289  ("Run",Var("v0",CTy"instruction"),
5290   Close
5291     (qVar"state",
5292      CS(Var("v0",CTy"instruction"),
5293         [(Const("Zclc",CTy"instruction"),
5294           Apply(Const("dfn'Zclc",ATy(qTy,qTy)),qVar"state")),
5295          (Const("Zcmc",CTy"instruction"),
5296           Apply(Const("dfn'Zcmc",ATy(qTy,qTy)),qVar"state")),
5297          (Const("Zleave",CTy"instruction"),
5298           Apply(Const("dfn'Zleave",ATy(qTy,qTy)),qVar"state")),
5299          (Const("Zstc",CTy"instruction"),
5300           Apply(Const("dfn'Zstc",ATy(qTy,qTy)),qVar"state")),
5301          (Call
5302             ("Zbinop",CTy"instruction",
5303              Var("v47",
5304                  PTy(CTy"Zbinop_name",PTy(CTy"Zsize",CTy"Zdest_src")))),
5305           Apply
5306             (Call
5307                ("dfn'Zbinop",ATy(qTy,qTy),
5308                 Var("v47",
5309                     PTy(CTy"Zbinop_name",PTy(CTy"Zsize",CTy"Zdest_src")))),
5310              qVar"state")),
5311          (Call
5312             ("Zbit_test",CTy"instruction",
5313              Var("v48",
5314                  PTy(CTy"Zbit_test_name",PTy(CTy"Zsize",CTy"Zdest_src")))),
5315           Apply
5316             (Call
5317                ("dfn'Zbit_test",ATy(qTy,qTy),
5318                 Var("v48",
5319                     PTy(CTy"Zbit_test_name",
5320                         PTy(CTy"Zsize",CTy"Zdest_src")))),qVar"state")),
5321          (Call("Zcall",CTy"instruction",Var("v49",CTy"Zimm_rm")),
5322           Apply
5323             (Call("dfn'Zcall",ATy(qTy,qTy),Var("v49",CTy"Zimm_rm")),
5324              qVar"state")),
5325          (Call
5326             ("Zcmpxchg",CTy"instruction",
5327              Var("v50",PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg")))),
5328           Apply
5329             (Call
5330                ("dfn'Zcmpxchg",ATy(qTy,qTy),
5331                 Var("v50",PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg")))),
5332              qVar"state")),
5333          (Call
5334             ("Zdiv",CTy"instruction",Var("v51",PTy(CTy"Zsize",CTy"Zrm"))),
5335           Apply
5336             (Call
5337                ("dfn'Zdiv",ATy(qTy,qTy),
5338                 Var("v51",PTy(CTy"Zsize",CTy"Zrm"))),qVar"state")),
5339          (Call
5340             ("Zidiv",CTy"instruction",Var("v52",PTy(CTy"Zsize",CTy"Zrm"))),
5341           Apply
5342             (Call
5343                ("dfn'Zidiv",ATy(qTy,qTy),
5344                 Var("v52",PTy(CTy"Zsize",CTy"Zrm"))),qVar"state")),
5345          (Call
5346             ("Zimul",CTy"instruction",Var("v53",PTy(CTy"Zsize",CTy"Zrm"))),
5347           Apply
5348             (Call
5349                ("dfn'Zimul",ATy(qTy,qTy),
5350                 Var("v53",PTy(CTy"Zsize",CTy"Zrm"))),qVar"state")),
5351          (Call
5352             ("Zimul2",CTy"instruction",
5353              Var("v54",PTy(CTy"Zsize",PTy(CTy"Zreg",CTy"Zrm")))),
5354           Apply
5355             (Call
5356                ("dfn'Zimul2",ATy(qTy,qTy),
5357                 Var("v54",PTy(CTy"Zsize",PTy(CTy"Zreg",CTy"Zrm")))),
5358              qVar"state")),
5359          (Call
5360             ("Zimul3",CTy"instruction",
5361              Var("v55",PTy(CTy"Zsize",PTy(CTy"Zreg",PTy(CTy"Zrm",F64))))),
5362           Apply
5363             (Call
5364                ("dfn'Zimul3",ATy(qTy,qTy),
5365                 Var("v55",
5366                     PTy(CTy"Zsize",PTy(CTy"Zreg",PTy(CTy"Zrm",F64))))),
5367              qVar"state")),
5368          (Call("Zjcc",CTy"instruction",Var("v56",PTy(CTy"Zcond",F64))),
5369           Apply
5370             (Call("dfn'Zjcc",ATy(qTy,qTy),Var("v56",PTy(CTy"Zcond",F64))),
5371              qVar"state")),
5372          (Call("Zjmp",CTy"instruction",Var("v57",CTy"Zrm")),
5373           Apply
5374             (Call("dfn'Zjmp",ATy(qTy,qTy),Var("v57",CTy"Zrm")),
5375              qVar"state")),
5376          (Call
5377             ("Zlea",CTy"instruction",
5378              Var("v58",PTy(CTy"Zsize",CTy"Zdest_src"))),
5379           Apply
5380             (Call
5381                ("dfn'Zlea",ATy(qTy,qTy),
5382                 Var("v58",PTy(CTy"Zsize",CTy"Zdest_src"))),qVar"state")),
5383          (Call("Zloop",CTy"instruction",Var("v59",PTy(CTy"Zcond",F64))),
5384           Apply
5385             (Call
5386                ("dfn'Zloop",ATy(qTy,qTy),Var("v59",PTy(CTy"Zcond",F64))),
5387              qVar"state")),
5388          (Call
5389             ("Zmonop",CTy"instruction",
5390              Var("v60",PTy(CTy"Zmonop_name",PTy(CTy"Zsize",CTy"Zrm")))),
5391           Apply
5392             (Call
5393                ("dfn'Zmonop",ATy(qTy,qTy),
5394                 Var("v60",PTy(CTy"Zmonop_name",PTy(CTy"Zsize",CTy"Zrm")))),
5395              qVar"state")),
5396          (Call
5397             ("Zmov",CTy"instruction",
5398              Var("v61",PTy(CTy"Zcond",PTy(CTy"Zsize",CTy"Zdest_src")))),
5399           Apply
5400             (Call
5401                ("dfn'Zmov",ATy(qTy,qTy),
5402                 Var("v61",PTy(CTy"Zcond",PTy(CTy"Zsize",CTy"Zdest_src")))),
5403              qVar"state")),
5404          (Call
5405             ("Zmovsx",CTy"instruction",
5406              Var("v62",PTy(CTy"Zsize",PTy(CTy"Zdest_src",CTy"Zsize")))),
5407           Apply
5408             (Call
5409                ("dfn'Zmovsx",ATy(qTy,qTy),
5410                 Var("v62",PTy(CTy"Zsize",PTy(CTy"Zdest_src",CTy"Zsize")))),
5411              qVar"state")),
5412          (Call
5413             ("Zmovzx",CTy"instruction",
5414              Var("v63",PTy(CTy"Zsize",PTy(CTy"Zdest_src",CTy"Zsize")))),
5415           Apply
5416             (Call
5417                ("dfn'Zmovzx",ATy(qTy,qTy),
5418                 Var("v63",PTy(CTy"Zsize",PTy(CTy"Zdest_src",CTy"Zsize")))),
5419              qVar"state")),
5420          (Call
5421             ("Zmul",CTy"instruction",Var("v64",PTy(CTy"Zsize",CTy"Zrm"))),
5422           Apply
5423             (Call
5424                ("dfn'Zmul",ATy(qTy,qTy),
5425                 Var("v64",PTy(CTy"Zsize",CTy"Zrm"))),qVar"state")),
5426          (Call("Znop",CTy"instruction",nVar"v65"),qVar"state"),
5427          (Call("Zpop",CTy"instruction",Var("v66",CTy"Zrm")),
5428           Apply
5429             (Call("dfn'Zpop",ATy(qTy,qTy),Var("v66",CTy"Zrm")),
5430              qVar"state")),
5431          (Call("Zpush",CTy"instruction",Var("v67",CTy"Zimm_rm")),
5432           Apply
5433             (Call("dfn'Zpush",ATy(qTy,qTy),Var("v67",CTy"Zimm_rm")),
5434              qVar"state")),
5435          (Call("Zret",CTy"instruction",Var("v68",F64)),
5436           Apply(Call("dfn'Zret",ATy(qTy,qTy),Var("v68",F64)),qVar"state")),
5437          (Call
5438             ("Zset",CTy"instruction",
5439              Var("v69",PTy(CTy"Zcond",PTy(bTy,CTy"Zrm")))),
5440           Apply
5441             (Call
5442                ("dfn'Zset",ATy(qTy,qTy),
5443                 Var("v69",PTy(CTy"Zcond",PTy(bTy,CTy"Zrm")))),qVar"state")),
5444          (Call
5445             ("Zxadd",CTy"instruction",
5446              Var("v70",PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg")))),
5447           Apply
5448             (Call
5449                ("dfn'Zxadd",ATy(qTy,qTy),
5450                 Var("v70",PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg")))),
5451              qVar"state")),
5452          (Call
5453             ("Zxchg",CTy"instruction",
5454              Var("v71",PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg")))),
5455           Apply
5456             (Call
5457                ("dfn'Zxchg",ATy(qTy,qTy),
5458                 Var("v71",PTy(CTy"Zsize",PTy(CTy"Zrm",CTy"Zreg")))),
5459              qVar"state")),
5460          (Call("SSE",CTy"instruction",Var("v1",CTy"SSE")),
5461           CS(Var("v1",CTy"SSE"),
5462              [(Call
5463                  ("CMPPD",CTy"SSE",
5464                   Var("v2",PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem")))),
5465                Apply
5466                  (Call
5467                     ("dfn'CMPPD",ATy(qTy,qTy),
5468                      Var("v2",
5469                          PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem")))),
5470                   qVar"state")),
5471               (Call
5472                  ("CMPPS",CTy"SSE",
5473                   Var("v3",PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem")))),
5474                Apply
5475                  (Call
5476                     ("dfn'CMPPS",ATy(qTy,qTy),
5477                      Var("v3",
5478                          PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem")))),
5479                   qVar"state")),
5480               (Call
5481                  ("CMPSD",CTy"SSE",
5482                   Var("v4",PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem")))),
5483                Apply
5484                  (Call
5485                     ("dfn'CMPSD",ATy(qTy,qTy),
5486                      Var("v4",
5487                          PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem")))),
5488                   qVar"state")),
5489               (Call
5490                  ("CMPSS",CTy"SSE",
5491                   Var("v5",PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem")))),
5492                Apply
5493                  (Call
5494                     ("dfn'CMPSS",ATy(qTy,qTy),
5495                      Var("v5",
5496                          PTy(CTy"sse_compare",PTy(FTy 3,CTy"xmm_mem")))),
5497                   qVar"state")),
5498               (Call("COMISD",CTy"SSE",Var("v6",PTy(FTy 3,CTy"xmm_mem"))),
5499                Apply
5500                  (Call
5501                     ("dfn'COMISD",ATy(qTy,qTy),
5502                      Var("v6",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5503               (Call("COMISS",CTy"SSE",Var("v7",PTy(FTy 3,CTy"xmm_mem"))),
5504                Apply
5505                  (Call
5506                     ("dfn'COMISS",ATy(qTy,qTy),
5507                      Var("v7",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5508               (Call
5509                  ("CVTDQ2PD",CTy"SSE",Var("v8",PTy(FTy 3,CTy"xmm_mem"))),
5510                Apply
5511                  (Call
5512                     ("dfn'CVTDQ2PD",ATy(qTy,qTy),
5513                      Var("v8",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5514               (Call
5515                  ("CVTDQ2PS",CTy"SSE",Var("v9",PTy(FTy 3,CTy"xmm_mem"))),
5516                Apply
5517                  (Call
5518                     ("dfn'CVTDQ2PS",ATy(qTy,qTy),
5519                      Var("v9",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5520               (Call
5521                  ("CVTPD2DQ",CTy"SSE",
5522                   Var("v10",PTy(bTy,PTy(FTy 3,CTy"xmm_mem")))),
5523                Apply
5524                  (Call
5525                     ("dfn'CVTPD2DQ",ATy(qTy,qTy),
5526                      Var("v10",PTy(bTy,PTy(FTy 3,CTy"xmm_mem")))),
5527                   qVar"state")),
5528               (Call
5529                  ("CVTPD2PS",CTy"SSE",Var("v11",PTy(FTy 3,CTy"xmm_mem"))),
5530                Apply
5531                  (Call
5532                     ("dfn'CVTPD2PS",ATy(qTy,qTy),
5533                      Var("v11",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5534               (Call
5535                  ("CVTPS2DQ",CTy"SSE",
5536                   Var("v12",PTy(bTy,PTy(FTy 3,CTy"xmm_mem")))),
5537                Apply
5538                  (Call
5539                     ("dfn'CVTPS2DQ",ATy(qTy,qTy),
5540                      Var("v12",PTy(bTy,PTy(FTy 3,CTy"xmm_mem")))),
5541                   qVar"state")),
5542               (Call
5543                  ("CVTPS2PD",CTy"SSE",Var("v13",PTy(FTy 3,CTy"xmm_mem"))),
5544                Apply
5545                  (Call
5546                     ("dfn'CVTPS2PD",ATy(qTy,qTy),
5547                      Var("v13",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5548               (Call
5549                  ("CVTSD2SI",CTy"SSE",
5550                   Var("v14",PTy(bTy,PTy(bTy,PTy(CTy"Zreg",CTy"xmm_mem"))))),
5551                Apply
5552                  (Call
5553                     ("dfn'CVTSD2SI",ATy(qTy,qTy),
5554                      Var("v14",
5555                          PTy(bTy,PTy(bTy,PTy(CTy"Zreg",CTy"xmm_mem"))))),
5556                   qVar"state")),
5557               (Call
5558                  ("CVTSD2SS",CTy"SSE",Var("v15",PTy(FTy 3,CTy"xmm_mem"))),
5559                Apply
5560                  (Call
5561                     ("dfn'CVTSD2SS",ATy(qTy,qTy),
5562                      Var("v15",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5563               (Call
5564                  ("CVTSI2SD",CTy"SSE",
5565                   Var("v16",PTy(bTy,PTy(FTy 3,CTy"Zrm")))),
5566                Apply
5567                  (Call
5568                     ("dfn'CVTSI2SD",ATy(qTy,qTy),
5569                      Var("v16",PTy(bTy,PTy(FTy 3,CTy"Zrm")))),qVar"state")),
5570               (Call
5571                  ("CVTSI2SS",CTy"SSE",
5572                   Var("v17",PTy(bTy,PTy(FTy 3,CTy"Zrm")))),
5573                Apply
5574                  (Call
5575                     ("dfn'CVTSI2SS",ATy(qTy,qTy),
5576                      Var("v17",PTy(bTy,PTy(FTy 3,CTy"Zrm")))),qVar"state")),
5577               (Call
5578                  ("CVTSS2SD",CTy"SSE",Var("v18",PTy(FTy 3,CTy"xmm_mem"))),
5579                Apply
5580                  (Call
5581                     ("dfn'CVTSS2SD",ATy(qTy,qTy),
5582                      Var("v18",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5583               (Call
5584                  ("CVTSS2SI",CTy"SSE",
5585                   Var("v19",PTy(bTy,PTy(bTy,PTy(CTy"Zreg",CTy"xmm_mem"))))),
5586                Apply
5587                  (Call
5588                     ("dfn'CVTSS2SI",ATy(qTy,qTy),
5589                      Var("v19",
5590                          PTy(bTy,PTy(bTy,PTy(CTy"Zreg",CTy"xmm_mem"))))),
5591                   qVar"state")),
5592               (Call
5593                  ("MOVAP_D_S",CTy"SSE",
5594                   Var("v20",PTy(bTy,PTy(CTy"xmm_mem",CTy"xmm_mem")))),
5595                Apply
5596                  (Call
5597                     ("dfn'MOVAP_D_S",ATy(qTy,qTy),
5598                      Var("v20",PTy(bTy,PTy(CTy"xmm_mem",CTy"xmm_mem")))),
5599                   qVar"state")),
5600               (Call
5601                  ("MOVQ",CTy"SSE",
5602                   Var("v21",PTy(CTy"xmm_mem",CTy"xmm_mem"))),
5603                Apply
5604                  (Call
5605                     ("dfn'MOVQ",ATy(qTy,qTy),
5606                      Var("v21",PTy(CTy"xmm_mem",CTy"xmm_mem"))),
5607                   qVar"state")),
5608               (Call
5609                  ("MOVSD",CTy"SSE",
5610                   Var("v22",PTy(CTy"xmm_mem",CTy"xmm_mem"))),
5611                Apply
5612                  (Call
5613                     ("dfn'MOVSD",ATy(qTy,qTy),
5614                      Var("v22",PTy(CTy"xmm_mem",CTy"xmm_mem"))),
5615                   qVar"state")),
5616               (Call
5617                  ("MOVSS",CTy"SSE",
5618                   Var("v23",PTy(CTy"xmm_mem",CTy"xmm_mem"))),
5619                Apply
5620                  (Call
5621                     ("dfn'MOVSS",ATy(qTy,qTy),
5622                      Var("v23",PTy(CTy"xmm_mem",CTy"xmm_mem"))),
5623                   qVar"state")),
5624               (Call
5625                  ("MOVUP_D_S",CTy"SSE",
5626                   Var("v24",PTy(bTy,PTy(CTy"xmm_mem",CTy"xmm_mem")))),
5627                Apply
5628                  (Call
5629                     ("dfn'MOVUP_D_S",ATy(qTy,qTy),
5630                      Var("v24",PTy(bTy,PTy(CTy"xmm_mem",CTy"xmm_mem")))),
5631                   qVar"state")),
5632               (Call
5633                  ("MOV_D_Q",CTy"SSE",
5634                   Var("v25",PTy(bTy,PTy(bTy,PTy(FTy 3,CTy"Zrm"))))),
5635                Apply
5636                  (Call
5637                     ("dfn'MOV_D_Q",ATy(qTy,qTy),
5638                      Var("v25",PTy(bTy,PTy(bTy,PTy(FTy 3,CTy"Zrm"))))),
5639                   qVar"state")),
5640               (Call
5641                  ("PCMPEQQ",CTy"SSE",Var("v26",PTy(FTy 3,CTy"xmm_mem"))),
5642                Apply
5643                  (Call
5644                     ("dfn'PCMPEQQ",ATy(qTy,qTy),
5645                      Var("v26",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5646               (Call("PSLLDQ",CTy"SSE",Var("v27",PTy(FTy 3,F8))),
5647                Apply
5648                  (Call
5649                     ("dfn'PSLLDQ",ATy(qTy,qTy),Var("v27",PTy(FTy 3,F8))),
5650                   qVar"state")),
5651               (Call("PSLLD_imm",CTy"SSE",Var("v28",PTy(FTy 3,F8))),
5652                Apply
5653                  (Call
5654                     ("dfn'PSLLD_imm",ATy(qTy,qTy),
5655                      Var("v28",PTy(FTy 3,F8))),qVar"state")),
5656               (Call("PSLLQ_imm",CTy"SSE",Var("v29",PTy(FTy 3,F8))),
5657                Apply
5658                  (Call
5659                     ("dfn'PSLLQ_imm",ATy(qTy,qTy),
5660                      Var("v29",PTy(FTy 3,F8))),qVar"state")),
5661               (Call("PSLLW_imm",CTy"SSE",Var("v30",PTy(FTy 3,F8))),
5662                Apply
5663                  (Call
5664                     ("dfn'PSLLW_imm",ATy(qTy,qTy),
5665                      Var("v30",PTy(FTy 3,F8))),qVar"state")),
5666               (Call("PSRAD_imm",CTy"SSE",Var("v31",PTy(FTy 3,F8))),
5667                Apply
5668                  (Call
5669                     ("dfn'PSRAD_imm",ATy(qTy,qTy),
5670                      Var("v31",PTy(FTy 3,F8))),qVar"state")),
5671               (Call("PSRAW_imm",CTy"SSE",Var("v32",PTy(FTy 3,F8))),
5672                Apply
5673                  (Call
5674                     ("dfn'PSRAW_imm",ATy(qTy,qTy),
5675                      Var("v32",PTy(FTy 3,F8))),qVar"state")),
5676               (Call("PSRLDQ",CTy"SSE",Var("v33",PTy(FTy 3,F8))),
5677                Apply
5678                  (Call
5679                     ("dfn'PSRLDQ",ATy(qTy,qTy),Var("v33",PTy(FTy 3,F8))),
5680                   qVar"state")),
5681               (Call("PSRLD_imm",CTy"SSE",Var("v34",PTy(FTy 3,F8))),
5682                Apply
5683                  (Call
5684                     ("dfn'PSRLD_imm",ATy(qTy,qTy),
5685                      Var("v34",PTy(FTy 3,F8))),qVar"state")),
5686               (Call("PSRLQ_imm",CTy"SSE",Var("v35",PTy(FTy 3,F8))),
5687                Apply
5688                  (Call
5689                     ("dfn'PSRLQ_imm",ATy(qTy,qTy),
5690                      Var("v35",PTy(FTy 3,F8))),qVar"state")),
5691               (Call("PSRLW_imm",CTy"SSE",Var("v36",PTy(FTy 3,F8))),
5692                Apply
5693                  (Call
5694                     ("dfn'PSRLW_imm",ATy(qTy,qTy),
5695                      Var("v36",PTy(FTy 3,F8))),qVar"state")),
5696               (Call("SQRTPD",CTy"SSE",Var("v37",PTy(FTy 3,CTy"xmm_mem"))),
5697                Apply
5698                  (Call
5699                     ("dfn'SQRTPD",ATy(qTy,qTy),
5700                      Var("v37",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5701               (Call("SQRTPS",CTy"SSE",Var("v38",PTy(FTy 3,CTy"xmm_mem"))),
5702                Apply
5703                  (Call
5704                     ("dfn'SQRTPS",ATy(qTy,qTy),
5705                      Var("v38",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5706               (Call("SQRTSD",CTy"SSE",Var("v39",PTy(FTy 3,CTy"xmm_mem"))),
5707                Apply
5708                  (Call
5709                     ("dfn'SQRTSD",ATy(qTy,qTy),
5710                      Var("v39",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5711               (Call("SQRTSS",CTy"SSE",Var("v40",PTy(FTy 3,CTy"xmm_mem"))),
5712                Apply
5713                  (Call
5714                     ("dfn'SQRTSS",ATy(qTy,qTy),
5715                      Var("v40",PTy(FTy 3,CTy"xmm_mem"))),qVar"state")),
5716               (Call
5717                  ("bin_PD",CTy"SSE",
5718                   Var("v41",PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem")))),
5719                Apply
5720                  (Call
5721                     ("dfn'bin_PD",ATy(qTy,qTy),
5722                      Var("v41",
5723                          PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem")))),
5724                   qVar"state")),
5725               (Call
5726                  ("bin_PS",CTy"SSE",
5727                   Var("v42",PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem")))),
5728                Apply
5729                  (Call
5730                     ("dfn'bin_PS",ATy(qTy,qTy),
5731                      Var("v42",
5732                          PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem")))),
5733                   qVar"state")),
5734               (Call
5735                  ("bin_SD",CTy"SSE",
5736                   Var("v43",PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem")))),
5737                Apply
5738                  (Call
5739                     ("dfn'bin_SD",ATy(qTy,qTy),
5740                      Var("v43",
5741                          PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem")))),
5742                   qVar"state")),
5743               (Call
5744                  ("bin_SS",CTy"SSE",
5745                   Var("v44",PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem")))),
5746                Apply
5747                  (Call
5748                     ("dfn'bin_SS",ATy(qTy,qTy),
5749                      Var("v44",
5750                          PTy(CTy"sse_binop",PTy(FTy 3,CTy"xmm_mem")))),
5751                   qVar"state")),
5752               (Call
5753                  ("logic_PD",CTy"SSE",
5754                   Var("v45",PTy(CTy"sse_logic",PTy(FTy 3,CTy"xmm_mem")))),
5755                Apply
5756                  (Call
5757                     ("dfn'logic_PD",ATy(qTy,qTy),
5758                      Var("v45",
5759                          PTy(CTy"sse_logic",PTy(FTy 3,CTy"xmm_mem")))),
5760                   qVar"state")),
5761               (Call
5762                  ("logic_PS",CTy"SSE",
5763                   Var("v46",PTy(CTy"sse_logic",PTy(FTy 3,CTy"xmm_mem")))),
5764                Apply
5765                  (Call
5766                     ("dfn'logic_PS",ATy(qTy,qTy),
5767                      Var("v46",
5768                          PTy(CTy"sse_logic",PTy(FTy 3,CTy"xmm_mem")))),
5769                   qVar"state"))]))])))
5770;
5771val oimmediate8_def = Def
5772  ("oimmediate8",Var("strm",OTy(LTy F8)),
5773   CS(Var("strm",OTy(LTy F8)),
5774      [(Mop(Some,LLC([Var("b",F8)],Var("t",LTy F8))),
5775        TP[Mop(SE F64,Var("b",F8)),Mop(Some,Var("t",LTy F8))]),
5776       (AVar(OTy(LTy F8)),TP[LX F64,LO(LTy F8)])]))
5777;
5778val immediate8_def = Def
5779  ("immediate8",Var("strm",LTy F8),
5780   Call("oimmediate8",PTy(F64,OTy(LTy F8)),Mop(Some,Var("strm",LTy F8))))
5781;
5782val immediate16_def = Def
5783  ("immediate16",Var("strm",LTy F8),
5784   CS(Var("strm",LTy F8),
5785      [(LLC([Var("b1",F8),Var("b2",F8)],Var("t",LTy F8)),
5786        TP[Mop(SE F64,CC[Var("b2",F8),Var("b1",F8)]),
5787           Mop(Some,Var("t",LTy F8))]),
5788       (AVar(LTy F8),TP[LX F64,LO(LTy F8)])]))
5789;
5790val immediate32_def = Def
5791  ("immediate32",Var("strm",LTy F8),
5792   CS(Var("strm",LTy F8),
5793      [(LLC([Var("b1",F8),Var("b2",F8),Var("b3",F8),Var("b4",F8)],
5794            Var("t",LTy F8)),
5795        TP[Mop(SE F64,
5796               CC[Var("b4",F8),Var("b3",F8),Var("b2",F8),Var("b1",F8)]),
5797           Mop(Some,Var("t",LTy F8))]),
5798       (AVar(LTy F8),TP[LX F64,LO(LTy F8)])]))
5799;
5800val immediate64_def = Def
5801  ("immediate64",Var("strm",LTy F8),
5802   CS(Var("strm",LTy F8),
5803      [(LLC([Var("b1",F8),Var("b2",F8),Var("b3",F8),Var("b4",F8),
5804             Var("b5",F8),Var("b6",F8),Var("b7",F8),Var("b8",F8)],
5805            Var("t",LTy F8)),
5806        TP[CC[Var("b8",F8),Var("b7",F8),Var("b6",F8),Var("b5",F8),
5807              Var("b4",F8),Var("b3",F8),Var("b2",F8),Var("b1",F8)],
5808           Mop(Some,Var("t",LTy F8))]),
5809       (AVar(LTy F8),TP[LX F64,LO(LTy F8)])]))
5810;
5811val immediate_def = Def
5812  ("immediate",TP[Var("size",CTy"Zsize"),Var("strm",LTy F8)],
5813   CS(Var("size",CTy"Zsize"),
5814      [(Call("Z8",CTy"Zsize",AVar bTy),
5815        Call("immediate8",PTy(F64,OTy(LTy F8)),Var("strm",LTy F8))),
5816       (Const("Z16",CTy"Zsize"),
5817        Call("immediate16",PTy(F64,OTy(LTy F8)),Var("strm",LTy F8))),
5818       (AVar(CTy"Zsize"),
5819        Call("immediate32",PTy(F64,OTy(LTy F8)),Var("strm",LTy F8)))]))
5820;
5821val oimmediate_def = Def
5822  ("oimmediate",TP[Var("size",CTy"Zsize"),Var("strm",OTy(LTy F8))],
5823   CS(Var("strm",OTy(LTy F8)),
5824      [(Mop(Some,Var("s",LTy F8)),
5825        Call
5826          ("immediate",PTy(F64,OTy(LTy F8)),
5827           TP[Var("size",CTy"Zsize"),Var("s",LTy F8)])),
5828       (LO(LTy F8),TP[LX F64,LO(LTy F8)])]))
5829;
5830val full_immediate_def = Def
5831  ("full_immediate",TP[Var("size",CTy"Zsize"),Var("strm",LTy F8)],
5832   ITE(EQ(Var("size",CTy"Zsize"),Const("Z64",CTy"Zsize")),
5833       Call("immediate64",PTy(F64,OTy(LTy F8)),Var("strm",LTy F8)),
5834       Call
5835         ("immediate",PTy(F64,OTy(LTy F8)),
5836          TP[Var("size",CTy"Zsize"),Var("strm",LTy F8)])))
5837;
5838val rec'REX_def = Def
5839  ("rec'REX",Var("x",F4),
5840   Rec(CTy"REX",
5841       [Bop(Bit,Var("x",F4),LN 0),Bop(Bit,Var("x",F4),LN 2),
5842        Bop(Bit,Var("x",F4),LN 3),Bop(Bit,Var("x",F4),LN 1)]))
5843;
5844val reg'REX_def = Def
5845  ("reg'REX",Var("x",CTy"REX"),
5846   CS(Var("x",CTy"REX"),
5847      [(Rec(CTy"REX",[bVar"B",bVar"R",bVar"W",bVar"X"]),
5848        CC[Mop(Cast F1,bVar"W"),Mop(Cast F1,bVar"R"),Mop(Cast F1,bVar"X"),
5849           Mop(Cast F1,bVar"B")])]))
5850;
5851val write'rec'REX_def = Def
5852  ("write'rec'REX",TP[AVar F4,Var("x",CTy"REX")],
5853   Call("reg'REX",F4,Var("x",CTy"REX")))
5854;
5855val write'reg'REX_def = Def
5856  ("write'reg'REX",TP[AVar(CTy"REX"),Var("x",F4)],
5857   Call("rec'REX",CTy"REX",Var("x",F4)))
5858;
5859val RexReg_def = Def
5860  ("RexReg",TP[bVar"b",Var("r",FTy 3)],
5861   Mop(Cast(CTy"Zreg"),CC[Mop(Cast F1,bVar"b"),Var("r",FTy 3)]))
5862;
5863val readDisplacement_def = Def
5864  ("readDisplacement",TP[Var("Mod",FTy 2),Var("strm",LTy F8)],
5865   ITB([(EQ(Var("Mod",FTy 2),LW(1,2)),
5866         Call("immediate8",PTy(F64,OTy(LTy F8)),Var("strm",LTy F8))),
5867        (EQ(Var("Mod",FTy 2),LW(2,2)),
5868         Call("immediate32",PTy(F64,OTy(LTy F8)),Var("strm",LTy F8)))],
5869       TP[LW(0,64),Mop(Some,Var("strm",LTy F8))]))
5870;
5871val readSibDisplacement_def = Def
5872  ("readSibDisplacement",TP[Var("Mod",FTy 2),Var("strm",LTy F8)],
5873   ITE(EQ(Var("Mod",FTy 2),LW(1,2)),
5874       Call("immediate8",PTy(F64,OTy(LTy F8)),Var("strm",LTy F8)),
5875       Call("immediate32",PTy(F64,OTy(LTy F8)),Var("strm",LTy F8))))
5876;
5877val readSIB_def = Def
5878  ("readSIB",TP[Var("REX",CTy"REX"),Var("Mod",FTy 2),Var("strm",LTy F8)],
5879   CS(Var("strm",LTy F8),
5880      [(LLC([Var("v#0",F8)],Var("v#1",LTy F8)),
5881        CS(TP[BL(8,Var("v#0",F8)),Var("v#1",LTy F8)],
5882           [(TP[TP[bVar"SS'1",bVar"SS'0",bVar"Index'2",bVar"Index'1",
5883                   bVar"Index'0",bVar"Base'2",bVar"Base'1",bVar"Base'0"],
5884                Var("strm1",LTy F8)],
5885             Let(Var("base",CTy"Zreg"),
5886                 Call
5887                   ("RexReg",CTy"Zreg",
5888                    TP[Dest("B",bTy,Var("REX",CTy"REX")),
5889                       Mop(Cast(FTy 3),
5890                           LL[bVar"Base'2",bVar"Base'1",bVar"Base'0"])]),
5891                 Let(Var("index",CTy"Zreg"),
5892                     Call
5893                       ("RexReg",CTy"Zreg",
5894                        TP[Dest("X",bTy,Var("REX",CTy"REX")),
5895                           Mop(Cast(FTy 3),
5896                               LL[bVar"Index'2",bVar"Index'1",
5897                                  bVar"Index'0"])]),
5898                     Let(Var("scaled_index",OTy(PTy(FTy 2,CTy"Zreg"))),
5899                         ITE(EQ(Var("index",CTy"Zreg"),LC("RSP",CTy"Zreg")),
5900                             LO(PTy(FTy 2,CTy"Zreg")),
5901                             Mop(Some,
5902                                 TP[Mop(Cast(FTy 2),
5903                                        LL[bVar"SS'1",bVar"SS'0"]),
5904                                    Var("index",CTy"Zreg")])),
5905                         ITE(EQ(Var("base",CTy"Zreg"),LC("RBP",CTy"Zreg")),
5906                             Let(TP[Var("displacement",F64),
5907                                    Var("strm2",OTy(LTy F8))],
5908                                 Call
5909                                   ("readSibDisplacement",
5910                                    PTy(F64,OTy(LTy F8)),
5911                                    TP[Var("Mod",FTy 2),
5912                                       Var("strm1",LTy F8)]),
5913                                 TP[Call
5914                                      ("Zm",CTy"Zrm",
5915                                       TP[Var("scaled_index",
5916                                              OTy(PTy(FTy 2,CTy"Zreg"))),
5917                                          ITE(EQ(Var("Mod",FTy 2),LW(0,2)),
5918                                              Const("ZnoBase",CTy"Zbase"),
5919                                              Call
5920                                                ("ZregBase",CTy"Zbase",
5921                                                 Var("base",CTy"Zreg"))),
5922                                          Var("displacement",F64)]),
5923                                    Var("strm2",OTy(LTy F8))]),
5924                             Let(TP[Var("displacement",F64),
5925                                    Var("strm2",OTy(LTy F8))],
5926                                 Call
5927                                   ("readDisplacement",
5928                                    PTy(F64,OTy(LTy F8)),
5929                                    TP[Var("Mod",FTy 2),
5930                                       Var("strm1",LTy F8)]),
5931                                 TP[Call
5932                                      ("Zm",CTy"Zrm",
5933                                       TP[Var("scaled_index",
5934                                              OTy(PTy(FTy 2,CTy"Zreg"))),
5935                                          Call
5936                                            ("ZregBase",CTy"Zbase",
5937                                             Var("base",CTy"Zreg")),
5938                                          Var("displacement",F64)]),
5939                                    Var("strm2",OTy(LTy F8))]))))))])),
5940       (AVar(LTy F8),TP[LX(CTy"Zrm"),LO(LTy F8)])]))
5941;
5942val readModRM_def = Def
5943  ("readModRM",TP[Var("REX",CTy"REX"),Var("strm",LTy F8)],
5944   CS(Var("strm",LTy F8),
5945      [(LLC([Var("v#0",F8)],Var("v#1",LTy F8)),
5946        CS(TP[BL(8,Var("v#0",F8)),Var("v#1",LTy F8)],
5947           [(TP[TP[LF,LF,bVar"RegOpc'2",bVar"RegOpc'1",bVar"RegOpc'0",LT,
5948                   LF,LT],Var("strm1",LTy F8)],
5949             Let(TP[Var("displacement",F64),Var("strm2",OTy(LTy F8))],
5950                 Call
5951                   ("immediate32",PTy(F64,OTy(LTy F8)),Var("strm1",LTy F8)),
5952                 TP[Call
5953                      ("RexReg",CTy"Zreg",
5954                       TP[Dest("R",bTy,Var("REX",CTy"REX")),
5955                          Mop(Cast(FTy 3),
5956                              LL[bVar"RegOpc'2",bVar"RegOpc'1",
5957                                 bVar"RegOpc'0"])]),
5958                    Call
5959                      ("Zm",CTy"Zrm",
5960                       TP[LO(PTy(FTy 2,CTy"Zreg")),
5961                          Const("ZripBase",CTy"Zbase"),
5962                          Var("displacement",F64)]),
5963                    Var("strm2",OTy(LTy F8))])),
5964            (TP[TP[LT,LT,bVar"REG'2",bVar"REG'1",bVar"REG'0",bVar"RM'2",
5965                   bVar"RM'1",bVar"RM'0"],Var("strm1",LTy F8)],
5966             TP[Call
5967                  ("RexReg",CTy"Zreg",
5968                   TP[Dest("R",bTy,Var("REX",CTy"REX")),
5969                      Mop(Cast(FTy 3),
5970                          LL[bVar"REG'2",bVar"REG'1",bVar"REG'0"])]),
5971                Call
5972                  ("Zr",CTy"Zrm",
5973                   Call
5974                     ("RexReg",CTy"Zreg",
5975                      TP[Dest("B",bTy,Var("REX",CTy"REX")),
5976                         Mop(Cast(FTy 3),
5977                             LL[bVar"RM'2",bVar"RM'1",bVar"RM'0"])])),
5978                Mop(Some,Var("strm1",LTy F8))]),
5979            (TP[TP[bVar"Mod'1",bVar"Mod'0",bVar"RegOpc'2",bVar"RegOpc'1",
5980                   bVar"RegOpc'0",LT,LF,LF],Var("strm1",LTy F8)],
5981             Let(TP[Var("sib",CTy"Zrm"),Var("strm2",OTy(LTy F8))],
5982                 Call
5983                   ("readSIB",PTy(CTy"Zrm",OTy(LTy F8)),
5984                    TP[Var("REX",CTy"REX"),
5985                       Mop(Cast(FTy 2),LL[bVar"Mod'1",bVar"Mod'0"]),
5986                       Var("strm1",LTy F8)]),
5987                 TP[Call
5988                      ("RexReg",CTy"Zreg",
5989                       TP[Dest("R",bTy,Var("REX",CTy"REX")),
5990                          Mop(Cast(FTy 3),
5991                              LL[bVar"RegOpc'2",bVar"RegOpc'1",
5992                                 bVar"RegOpc'0"])]),Var("sib",CTy"Zrm"),
5993                    Var("strm2",OTy(LTy F8))])),
5994            (TP[TP[bVar"Mod'1",bVar"Mod'0",bVar"RegOpc'2",bVar"RegOpc'1",
5995                   bVar"RegOpc'0",bVar"RM'2",bVar"RM'1",bVar"RM'0"],
5996                Var("strm1",LTy F8)],
5997             Let(TP[Var("displacement",F64),Var("strm2",OTy(LTy F8))],
5998                 Call
5999                   ("readDisplacement",PTy(F64,OTy(LTy F8)),
6000                    TP[Mop(Cast(FTy 2),LL[bVar"Mod'1",bVar"Mod'0"]),
6001                       Var("strm1",LTy F8)]),
6002                 TP[Call
6003                      ("RexReg",CTy"Zreg",
6004                       TP[Dest("R",bTy,Var("REX",CTy"REX")),
6005                          Mop(Cast(FTy 3),
6006                              LL[bVar"RegOpc'2",bVar"RegOpc'1",
6007                                 bVar"RegOpc'0"])]),
6008                    Call
6009                      ("Zm",CTy"Zrm",
6010                       TP[LO(PTy(FTy 2,CTy"Zreg")),
6011                          Call
6012                            ("ZregBase",CTy"Zbase",
6013                             Call
6014                               ("RexReg",CTy"Zreg",
6015                                TP[Dest("B",bTy,Var("REX",CTy"REX")),
6016                                   Mop(Cast(FTy 3),
6017                                       LL[bVar"RM'2",bVar"RM'1",bVar"RM'0"])])),
6018                          Var("displacement",F64)]),
6019                    Var("strm2",OTy(LTy F8))]))])),
6020       (AVar(LTy F8),TP[LX(CTy"Zreg"),LX(CTy"Zrm"),LO(LTy F8)])]))
6021;
6022val readOpcodeModRM_def = Def
6023  ("readOpcodeModRM",TP[Var("REX",CTy"REX"),Var("strm",LTy F8)],
6024   Let(TP[Var("opcode",CTy"Zreg"),Var("rm",CTy"Zrm"),
6025          Var("strm1",OTy(LTy F8))],
6026       Call
6027         ("readModRM",PTy(CTy"Zreg",PTy(CTy"Zrm",OTy(LTy F8))),
6028          TP[Var("REX",CTy"REX"),Var("strm",LTy F8)]),
6029       TP[Mop(Cast(FTy 3),
6030              Bop(Mod,Mop(Cast nTy,Var("opcode",CTy"Zreg")),LN 8)),
6031          Var("rm",CTy"Zrm"),Var("strm1",OTy(LTy F8))]))
6032;
6033val prefixGroup_def = Def
6034  ("prefixGroup",Var("b",F8),
6035   CS(Var("b",F8),
6036      [(LW(240,8),LN 1),(LW(242,8),LN 1),(LW(243,8),LN 1),(LW(38,8),LN 2),
6037       (LW(46,8),LN 2),(LW(54,8),LN 2),(LW(62,8),LN 2),(LW(100,8),LN 2),
6038       (LW(101,8),LN 2),(LW(102,8),LN 3),(LW(103,8),LN 4),
6039       (AVar F8,ITE(EQ(EX(Var("b",F8),LN 7,LN 4,F4),LW(4,4)),LN 5,LN 0))]))
6040;
6041val readPrefix_def = Def
6042  ("readPrefix",TP[Var("s",STy nTy),Var("p",LTy F8),Var("strm",LTy F8)],
6043   CS(Var("strm",LTy F8),
6044      [(LLC([Var("h",F8)],Var("strm1",LTy F8)),
6045        Let(nVar"group",Call("prefixGroup",nTy,Var("h",F8)),
6046            ITB([(EQ(nVar"group",LN 0),
6047                  Mop(Some,
6048                      TP[Var("p",LTy F8),LF,
6049                         Call("rec'REX",CTy"REX",LW(0,4)),
6050                         Var("strm",LTy F8)])),
6051                 (EQ(nVar"group",LN 5),
6052                  Mop(Some,
6053                      TP[Var("p",LTy F8),LT,
6054                         Call
6055                           ("rec'REX",CTy"REX",
6056                            EX(Var("h",F8),LN 3,LN 0,F4)),
6057                         Var("strm1",LTy F8)])),
6058                 (Bop(In,nVar"group",Var("s",STy nTy)),
6059                  LO(PTy(LTy F8,PTy(bTy,PTy(CTy"REX",LTy F8)))))],
6060                Call
6061                  ("readPrefix",
6062                   OTy(PTy(LTy F8,PTy(bTy,PTy(CTy"REX",LTy F8)))),
6063                   TP[Bop(Insert,nVar"group",Var("s",STy nTy)),
6064                      LLC([Var("h",F8)],Var("p",LTy F8)),
6065                      Var("strm1",LTy F8)])))),
6066       (LNL F8,
6067        Mop(Some,TP[Var("p",LTy F8),LF,LX(CTy"REX"),Var("strm",LTy F8)]))]))
6068;
6069val readPrefixes_def = Def
6070  ("readPrefixes",Var("strm",LTy F8),
6071   Call
6072     ("readPrefix",OTy(PTy(LTy F8,PTy(bTy,PTy(CTy"REX",LTy F8)))),
6073      TP[LE nTy,LNL F8,Var("strm",LTy F8)]))
6074;
6075val OpSize_def = Def
6076  ("OpSize",TP[bVar"have_rex",bVar"w",Var("v",F1),bVar"override"],
6077   ITB([(EQ(Var("v",F1),LW(0,1)),Call("Z8",CTy"Zsize",bVar"have_rex")),
6078        (bVar"w",Const("Z64",CTy"Zsize")),
6079        (bVar"override",Const("Z16",CTy"Zsize"))],Const("Z32",CTy"Zsize")))
6080;
6081val isZm_def = Def
6082  ("isZm",Var("rm",CTy"Zrm"),
6083   CS(Var("rm",CTy"Zrm"),
6084      [(Call
6085          ("Zm",CTy"Zrm",
6086           AVar(PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),LT),
6087       (AVar(CTy"Zrm"),LF)]))
6088;
6089val x64_decode_def = Def
6090  ("x64_decode",Var("strm",LTy F8),
6091   CS(Call
6092        ("readPrefixes",OTy(PTy(LTy F8,PTy(bTy,PTy(CTy"REX",LTy F8)))),
6093         Var("strm",LTy F8)),
6094      [(LO(PTy(LTy F8,PTy(bTy,PTy(CTy"REX",LTy F8)))),
6095        Call("Zdec_fail",CTy"Zinst",LS"Bad prefix")),
6096       (Mop(Some,
6097            TP[Var("p",LTy F8),bVar"have_rex",Var("REX",CTy"REX"),
6098               Var("strm1",LTy F8)]),
6099        Let(Var("prefixes",STy F8),Mop(SofL,Var("p",LTy F8)),
6100            Let(bVar"op_size_override",
6101                Bop(In,LW(102,8),Var("prefixes",STy F8)),
6102                ITE(Bop(In,LW(103,8),Var("prefixes",STy F8)),
6103                    Call
6104                      ("Zdec_fail",CTy"Zinst",
6105                       LS"address override prefix not supported"),
6106                    CS(Var("strm1",LTy F8),
6107                       [(LLC([Var("v#0",F8)],Var("v#1",LTy F8)),
6108                         CS(TP[BL(8,Var("v#0",F8)),Var("v#1",LTy F8)],
6109                            [(TP[TP[LF,LF,bVar"opc'2",bVar"opc'1",
6110                                    bVar"opc'0",LF,bVar"x'0",bVar"v'0"],
6111                                 Var("strm2",LTy F8)],
6112                              Let(TP[Var("reg",CTy"Zreg"),
6113                                     Var("rm",CTy"Zrm"),
6114                                     Var("strm3",OTy(LTy F8))],
6115                                  Call
6116                                    ("readModRM",
6117                                     PTy(CTy"Zreg",
6118                                         PTy(CTy"Zrm",OTy(LTy F8))),
6119                                     TP[Var("REX",CTy"REX"),
6120                                        Var("strm2",LTy F8)]),
6121                                  Call
6122                                    ("Zfull_inst",CTy"Zinst",
6123                                     TP[Var("p",LTy F8),
6124                                        Call
6125                                          ("Zbinop",CTy"instruction",
6126                                           TP[Mop(Cast(CTy"Zbinop_name"),
6127                                                  Mop(Cast(FTy 3),
6128                                                      LL[bVar"opc'2",
6129                                                         bVar"opc'1",
6130                                                         bVar"opc'0"])),
6131                                              Call
6132                                                ("OpSize",CTy"Zsize",
6133                                                 TP[bVar"have_rex",
6134                                                    Dest
6135                                                      ("W",bTy,
6136                                                       Var("REX",CTy"REX")),
6137                                                    Mop(Cast F1,
6138                                                        LL[bVar"v'0"]),
6139                                                    bVar"op_size_override"]),
6140                                              ITE(EQ(Mop(Cast F1,
6141                                                         LL[bVar"x'0"]),
6142                                                     LW(0,1)),
6143                                                  Call
6144                                                    ("Zrm_r",
6145                                                     CTy"Zdest_src",
6146                                                     TP[Var("rm",CTy"Zrm"),
6147                                                        Var("reg",
6148                                                            CTy"Zreg")]),
6149                                                  Call
6150                                                    ("Zr_rm",
6151                                                     CTy"Zdest_src",
6152                                                     TP[Var("reg",
6153                                                            CTy"Zreg"),
6154                                                        Var("rm",CTy"Zrm")]))]),
6155                                        Var("strm3",OTy(LTy F8))]))),
6156                             (TP[TP[LF,LF,bVar"opc'2",bVar"opc'1",
6157                                    bVar"opc'0",LT,LF,bVar"v'0"],
6158                                 Var("strm2",LTy F8)],
6159                              Let(Var("size",CTy"Zsize"),
6160                                  Call
6161                                    ("OpSize",CTy"Zsize",
6162                                     TP[bVar"have_rex",
6163                                        Dest("W",bTy,Var("REX",CTy"REX")),
6164                                        Mop(Cast F1,LL[bVar"v'0"]),
6165                                        bVar"op_size_override"]),
6166                                  Let(TP[Var("imm",F64),
6167                                         Var("strm3",OTy(LTy F8))],
6168                                      Call
6169                                        ("immediate",PTy(F64,OTy(LTy F8)),
6170                                         TP[Var("size",CTy"Zsize"),
6171                                            Var("strm2",LTy F8)]),
6172                                      Call
6173                                        ("Zfull_inst",CTy"Zinst",
6174                                         TP[Var("p",LTy F8),
6175                                            Call
6176                                              ("Zbinop",CTy"instruction",
6177                                               TP[Mop(Cast
6178                                                        (CTy"Zbinop_name"),
6179                                                      Mop(Cast(FTy 3),
6180                                                          LL[bVar"opc'2",
6181                                                             bVar"opc'1",
6182                                                             bVar"opc'0"])),
6183                                                  Var("size",CTy"Zsize"),
6184                                                  Call
6185                                                    ("Zrm_i",
6186                                                     CTy"Zdest_src",
6187                                                     TP[Call
6188                                                          ("Zr",CTy"Zrm",
6189                                                           LC("RAX",
6190                                                              CTy"Zreg")),
6191                                                        Var("imm",F64)])]),
6192                                            Var("strm3",OTy(LTy F8))])))),
6193                             (TP[TP[LF,LT,LF,LT,bVar"b'0",bVar"r'2",
6194                                    bVar"r'1",bVar"r'0"],
6195                                 Var("strm2",LTy F8)],
6196                              Let(Var("reg",CTy"Zrm"),
6197                                  Call
6198                                    ("Zr",CTy"Zrm",
6199                                     Mop(Cast(CTy"Zreg"),
6200                                         CC[Mop(Cast F1,
6201                                                Dest
6202                                                  ("B",bTy,
6203                                                   Var("REX",CTy"REX"))),
6204                                            Mop(Cast(FTy 3),
6205                                                LL[bVar"r'2",bVar"r'1",
6206                                                   bVar"r'0"])])),
6207                                  Call
6208                                    ("Zfull_inst",CTy"Zinst",
6209                                     TP[Var("p",LTy F8),
6210                                        ITE(EQ(Mop(Cast F1,LL[bVar"b'0"]),
6211                                               LW(0,1)),
6212                                            Call
6213                                              ("Zpush",CTy"instruction",
6214                                               Call
6215                                                 ("Zrm",CTy"Zimm_rm",
6216                                                  Var("reg",CTy"Zrm"))),
6217                                            Call
6218                                              ("Zpop",CTy"instruction",
6219                                               Var("reg",CTy"Zrm"))),
6220                                        Mop(Some,Var("strm2",LTy F8))]))),
6221                             (TP[TP[LF,LT,LT,LF,LF,LF,LT,LT],
6222                                 Var("strm2",LTy F8)],
6223                              Let(TP[Var("reg",CTy"Zreg"),
6224                                     Var("rm",CTy"Zrm"),
6225                                     Var("strm3",OTy(LTy F8))],
6226                                  Call
6227                                    ("readModRM",
6228                                     PTy(CTy"Zreg",
6229                                         PTy(CTy"Zrm",OTy(LTy F8))),
6230                                     TP[Var("REX",CTy"REX"),
6231                                        Var("strm2",LTy F8)]),
6232                                  Call
6233                                    ("Zfull_inst",CTy"Zinst",
6234                                     TP[Var("p",LTy F8),
6235                                        Call
6236                                          ("Zmovsx",CTy"instruction",
6237                                           TP[Const("Z32",CTy"Zsize"),
6238                                              Call
6239                                                ("Zr_rm",CTy"Zdest_src",
6240                                                 TP[Var("reg",CTy"Zreg"),
6241                                                    Var("rm",CTy"Zrm")]),
6242                                              Const("Z64",CTy"Zsize")]),
6243                                        Var("strm3",OTy(LTy F8))]))),
6244                             (TP[TP[LF,LT,LT,LF,LT,LF,bVar"b'0",LF],
6245                                 Var("strm2",LTy F8)],
6246                              Let(TP[Var("imm",F64),
6247                                     Var("strm3",OTy(LTy F8))],
6248                                  ITE(EQ(Mop(Cast F1,LL[bVar"b'0"]),
6249                                         LW(1,1)),
6250                                      Call
6251                                        ("immediate8",
6252                                         PTy(F64,OTy(LTy F8)),
6253                                         Var("strm2",LTy F8)),
6254                                      Call
6255                                        ("immediate32",
6256                                         PTy(F64,OTy(LTy F8)),
6257                                         Var("strm2",LTy F8))),
6258                                  Call
6259                                    ("Zfull_inst",CTy"Zinst",
6260                                     TP[Var("p",LTy F8),
6261                                        Call
6262                                          ("Zpush",CTy"instruction",
6263                                           Call
6264                                             ("Zimm",CTy"Zimm_rm",
6265                                              Var("imm",F64))),
6266                                        Var("strm3",OTy(LTy F8))]))),
6267                             (TP[TP[LF,LT,LT,LF,LT,LF,bVar"b'0",LT],
6268                                 Var("strm2",LTy F8)],
6269                              Let(TP[Var("reg",CTy"Zreg"),
6270                                     Var("rm",CTy"Zrm"),
6271                                     Var("strm3",OTy(LTy F8))],
6272                                  Call
6273                                    ("readModRM",
6274                                     PTy(CTy"Zreg",
6275                                         PTy(CTy"Zrm",OTy(LTy F8))),
6276                                     TP[Var("REX",CTy"REX"),
6277                                        Var("strm2",LTy F8)]),
6278                                  CS(Var("strm3",OTy(LTy F8)),
6279                                     [(LO(LTy F8),
6280                                       Call
6281                                         ("Zdec_fail",CTy"Zinst",
6282                                          LS"not enough bytes")),
6283                                      (Mop(Some,Var("s",LTy F8)),
6284                                       Let(TP[Var("imm",F64),
6285                                              Var("strm4",OTy(LTy F8))],
6286                                           ITE(EQ(Mop(Cast F1,
6287                                                      LL[bVar"b'0"]),
6288                                                  LW(1,1)),
6289                                               Call
6290                                                 ("immediate8",
6291                                                  PTy(F64,OTy(LTy F8)),
6292                                                  Var("s",LTy F8)),
6293                                               Call
6294                                                 ("immediate32",
6295                                                  PTy(F64,OTy(LTy F8)),
6296                                                  Var("s",LTy F8))),
6297                                           Call
6298                                             ("Zfull_inst",CTy"Zinst",
6299                                              TP[Var("p",LTy F8),
6300                                                 Call
6301                                                   ("Zimul3",
6302                                                    CTy"instruction",
6303                                                    TP[Call
6304                                                         ("OpSize",
6305                                                          CTy"Zsize",
6306                                                          TP[bVar"have_rex",
6307                                                             Dest
6308                                                               ("W",bTy,
6309                                                                Var("REX",
6310                                                                    CTy"REX")),
6311                                                             LW(1,1),
6312                                                             bVar"op_size_override"]),
6313                                                       Var("reg",CTy"Zreg"),
6314                                                       Var("rm",CTy"Zrm"),
6315                                                       Var("imm",F64)]),
6316                                                 Var("strm4",OTy(LTy F8))])))]))),
6317                             (TP[TP[LF,LT,LT,LT,bVar"c'3",bVar"c'2",
6318                                    bVar"c'1",bVar"c'0"],
6319                                 Var("strm2",LTy F8)],
6320                              Let(TP[Var("imm",F64),
6321                                     Var("strm3",OTy(LTy F8))],
6322                                  Call
6323                                    ("immediate8",PTy(F64,OTy(LTy F8)),
6324                                     Var("strm2",LTy F8)),
6325                                  Call
6326                                    ("Zfull_inst",CTy"Zinst",
6327                                     TP[Var("p",LTy F8),
6328                                        Call
6329                                          ("Zjcc",CTy"instruction",
6330                                           TP[Mop(Cast(CTy"Zcond"),
6331                                                  Mop(Cast F4,
6332                                                      LL[bVar"c'3",
6333                                                         bVar"c'2",
6334                                                         bVar"c'1",
6335                                                         bVar"c'0"])),
6336                                              Var("imm",F64)]),
6337                                        Var("strm3",OTy(LTy F8))]))),
6338                             (TP[TP[LT,LF,LF,LF,LF,LF,LF,bVar"v'0"],
6339                                 Var("strm2",LTy F8)],
6340                              Let(Var("size",CTy"Zsize"),
6341                                  Call
6342                                    ("OpSize",CTy"Zsize",
6343                                     TP[bVar"have_rex",
6344                                        Dest("W",bTy,Var("REX",CTy"REX")),
6345                                        Mop(Cast F1,LL[bVar"v'0"]),
6346                                        bVar"op_size_override"]),
6347                                  Let(TP[Var("opcode",FTy 3),
6348                                         Var("rm",CTy"Zrm"),
6349                                         Var("strm3",OTy(LTy F8))],
6350                                      Call
6351                                        ("readOpcodeModRM",
6352                                         PTy(FTy 3,
6353                                             PTy(CTy"Zrm",OTy(LTy F8))),
6354                                         TP[Var("REX",CTy"REX"),
6355                                            Var("strm2",LTy F8)]),
6356                                      Let(TP[Var("imm",F64),
6357                                             Var("strm4",OTy(LTy F8))],
6358                                          Call
6359                                            ("oimmediate",
6360                                             PTy(F64,OTy(LTy F8)),
6361                                             TP[Var("size",CTy"Zsize"),
6362                                                Var("strm3",OTy(LTy F8))]),
6363                                          Call
6364                                            ("Zfull_inst",CTy"Zinst",
6365                                             TP[Var("p",LTy F8),
6366                                                Call
6367                                                  ("Zbinop",
6368                                                   CTy"instruction",
6369                                                   TP[Mop(Cast
6370                                                            (CTy"Zbinop_name"),
6371                                                          Var("opcode",
6372                                                              FTy 3)),
6373                                                      Var("size",
6374                                                          CTy"Zsize"),
6375                                                      Call
6376                                                        ("Zrm_i",
6377                                                         CTy"Zdest_src",
6378                                                         TP[Var("rm",
6379                                                                CTy"Zrm"),
6380                                                            Var("imm",F64)])]),
6381                                                Var("strm4",OTy(LTy F8))]))))),
6382                             (TP[TP[LT,LF,LF,LF,LF,LF,LT,LT],
6383                                 Var("strm2",LTy F8)],
6384                              Let(TP[Var("opcode",FTy 3),
6385                                     Var("rm",CTy"Zrm"),
6386                                     Var("strm3",OTy(LTy F8))],
6387                                  Call
6388                                    ("readOpcodeModRM",
6389                                     PTy(FTy 3,PTy(CTy"Zrm",OTy(LTy F8))),
6390                                     TP[Var("REX",CTy"REX"),
6391                                        Var("strm2",LTy F8)]),
6392                                  Let(TP[Var("imm",F64),
6393                                         Var("strm4",OTy(LTy F8))],
6394                                      Call
6395                                        ("oimmediate8",
6396                                         PTy(F64,OTy(LTy F8)),
6397                                         Var("strm3",OTy(LTy F8))),
6398                                      Call
6399                                        ("Zfull_inst",CTy"Zinst",
6400                                         TP[Var("p",LTy F8),
6401                                            Call
6402                                              ("Zbinop",CTy"instruction",
6403                                               TP[Mop(Cast
6404                                                        (CTy"Zbinop_name"),
6405                                                      Var("opcode",FTy 3)),
6406                                                  Call
6407                                                    ("OpSize",CTy"Zsize",
6408                                                     TP[LF,
6409                                                        Dest
6410                                                          ("W",bTy,
6411                                                           Var("REX",
6412                                                               CTy"REX")),
6413                                                        LW(1,1),
6414                                                        bVar"op_size_override"]),
6415                                                  Call
6416                                                    ("Zrm_i",
6417                                                     CTy"Zdest_src",
6418                                                     TP[Var("rm",CTy"Zrm"),
6419                                                        Var("imm",F64)])]),
6420                                            Var("strm4",OTy(LTy F8))])))),
6421                             (TP[TP[LT,LF,LF,LF,LF,LT,LF,bVar"v'0"],
6422                                 Var("strm2",LTy F8)],
6423                              Let(TP[Var("reg",CTy"Zreg"),
6424                                     Var("rm",CTy"Zrm"),
6425                                     Var("strm3",OTy(LTy F8))],
6426                                  Call
6427                                    ("readModRM",
6428                                     PTy(CTy"Zreg",
6429                                         PTy(CTy"Zrm",OTy(LTy F8))),
6430                                     TP[Var("REX",CTy"REX"),
6431                                        Var("strm2",LTy F8)]),
6432                                  Call
6433                                    ("Zfull_inst",CTy"Zinst",
6434                                     TP[Var("p",LTy F8),
6435                                        Call
6436                                          ("Zbinop",CTy"instruction",
6437                                           TP[LC("Ztest",CTy"Zbinop_name"),
6438                                              Call
6439                                                ("OpSize",CTy"Zsize",
6440                                                 TP[bVar"have_rex",
6441                                                    Dest
6442                                                      ("W",bTy,
6443                                                       Var("REX",CTy"REX")),
6444                                                    Mop(Cast F1,
6445                                                        LL[bVar"v'0"]),
6446                                                    bVar"op_size_override"]),
6447                                              Call
6448                                                ("Zrm_r",CTy"Zdest_src",
6449                                                 TP[Var("rm",CTy"Zrm"),
6450                                                    Var("reg",CTy"Zreg")])]),
6451                                        Var("strm3",OTy(LTy F8))]))),
6452                             (TP[TP[LT,LF,LF,LF,LF,LT,LT,bVar"v'0"],
6453                                 Var("strm2",LTy F8)],
6454                              Let(TP[Var("reg",CTy"Zreg"),
6455                                     Var("rm",CTy"Zrm"),
6456                                     Var("strm3",OTy(LTy F8))],
6457                                  Call
6458                                    ("readModRM",
6459                                     PTy(CTy"Zreg",
6460                                         PTy(CTy"Zrm",OTy(LTy F8))),
6461                                     TP[Var("REX",CTy"REX"),
6462                                        Var("strm2",LTy F8)]),
6463                                  Call
6464                                    ("Zfull_inst",CTy"Zinst",
6465                                     TP[Var("p",LTy F8),
6466                                        Call
6467                                          ("Zxchg",CTy"instruction",
6468                                           TP[Call
6469                                                ("OpSize",CTy"Zsize",
6470                                                 TP[bVar"have_rex",
6471                                                    Dest
6472                                                      ("W",bTy,
6473                                                       Var("REX",CTy"REX")),
6474                                                    Mop(Cast F1,
6475                                                        LL[bVar"v'0"]),
6476                                                    bVar"op_size_override"]),
6477                                              Var("rm",CTy"Zrm"),
6478                                              Var("reg",CTy"Zreg")]),
6479                                        Var("strm3",OTy(LTy F8))]))),
6480                             (TP[TP[LT,LF,LF,LF,LT,LF,bVar"x'0",bVar"v'0"],
6481                                 Var("strm2",LTy F8)],
6482                              Let(TP[Var("reg",CTy"Zreg"),
6483                                     Var("rm",CTy"Zrm"),
6484                                     Var("strm3",OTy(LTy F8))],
6485                                  Call
6486                                    ("readModRM",
6487                                     PTy(CTy"Zreg",
6488                                         PTy(CTy"Zrm",OTy(LTy F8))),
6489                                     TP[Var("REX",CTy"REX"),
6490                                        Var("strm2",LTy F8)]),
6491                                  Call
6492                                    ("Zfull_inst",CTy"Zinst",
6493                                     TP[Var("p",LTy F8),
6494                                        Call
6495                                          ("Zmov",CTy"instruction",
6496                                           TP[LC("Z_ALWAYS",CTy"Zcond"),
6497                                              Call
6498                                                ("OpSize",CTy"Zsize",
6499                                                 TP[bVar"have_rex",
6500                                                    Dest
6501                                                      ("W",bTy,
6502                                                       Var("REX",CTy"REX")),
6503                                                    Mop(Cast F1,
6504                                                        LL[bVar"v'0"]),
6505                                                    bVar"op_size_override"]),
6506                                              ITE(EQ(Mop(Cast F1,
6507                                                         LL[bVar"x'0"]),
6508                                                     LW(0,1)),
6509                                                  Call
6510                                                    ("Zrm_r",
6511                                                     CTy"Zdest_src",
6512                                                     TP[Var("rm",CTy"Zrm"),
6513                                                        Var("reg",
6514                                                            CTy"Zreg")]),
6515                                                  Call
6516                                                    ("Zr_rm",
6517                                                     CTy"Zdest_src",
6518                                                     TP[Var("reg",
6519                                                            CTy"Zreg"),
6520                                                        Var("rm",CTy"Zrm")]))]),
6521                                        Var("strm3",OTy(LTy F8))]))),
6522                             (TP[TP[LT,LF,LF,LF,LT,LT,LF,LT],
6523                                 Var("strm2",LTy F8)],
6524                              Let(TP[Var("reg",CTy"Zreg"),
6525                                     Var("rm",CTy"Zrm"),
6526                                     Var("strm3",OTy(LTy F8))],
6527                                  Call
6528                                    ("readModRM",
6529                                     PTy(CTy"Zreg",
6530                                         PTy(CTy"Zrm",OTy(LTy F8))),
6531                                     TP[Var("REX",CTy"REX"),
6532                                        Var("strm2",LTy F8)]),
6533                                  ITE(Call("isZm",bTy,Var("rm",CTy"Zrm")),
6534                                      Call
6535                                        ("Zfull_inst",CTy"Zinst",
6536                                         TP[Var("p",LTy F8),
6537                                            Call
6538                                              ("Zlea",CTy"instruction",
6539                                               TP[Call
6540                                                    ("OpSize",CTy"Zsize",
6541                                                     TP[LT,
6542                                                        Dest
6543                                                          ("W",bTy,
6544                                                           Var("REX",
6545                                                               CTy"REX")),
6546                                                        LW(1,1),
6547                                                        bVar"op_size_override"]),
6548                                                  Call
6549                                                    ("Zr_rm",
6550                                                     CTy"Zdest_src",
6551                                                     TP[Var("reg",
6552                                                            CTy"Zreg"),
6553                                                        Var("rm",CTy"Zrm")])]),
6554                                            Var("strm3",OTy(LTy F8))]),
6555                                      Call
6556                                        ("Zdec_fail",CTy"Zinst",
6557                                         LS"LEA with register argument")))),
6558                             (TP[TP[LT,LF,LF,LF,LT,LT,LT,LT],
6559                                 Var("strm2",LTy F8)],
6560                              Let(TP[Var("opcode",FTy 3),
6561                                     Var("rm",CTy"Zrm"),
6562                                     Var("strm3",OTy(LTy F8))],
6563                                  Call
6564                                    ("readOpcodeModRM",
6565                                     PTy(FTy 3,PTy(CTy"Zrm",OTy(LTy F8))),
6566                                     TP[Var("REX",CTy"REX"),
6567                                        Var("strm2",LTy F8)]),
6568                                  ITE(EQ(Var("opcode",FTy 3),LW(0,3)),
6569                                      Call
6570                                        ("Zfull_inst",CTy"Zinst",
6571                                         TP[Var("p",LTy F8),
6572                                            Call
6573                                              ("Zpop",CTy"instruction",
6574                                               Var("rm",CTy"Zrm")),
6575                                            Var("strm3",OTy(LTy F8))]),
6576                                      Call
6577                                        ("Zdec_fail",CTy"Zinst",
6578                                         LS"Unsupported opcode: Group 1a")))),
6579                             (TP[TP[LT,LF,LF,LT,LF,bVar"r'2",bVar"r'1",
6580                                    bVar"r'0"],Var("strm2",LTy F8)],
6581                              Let(Var("reg",CTy"Zreg"),
6582                                  Call
6583                                    ("RexReg",CTy"Zreg",
6584                                     TP[Dest("B",bTy,Var("REX",CTy"REX")),
6585                                        Mop(Cast(FTy 3),
6586                                            LL[bVar"r'2",bVar"r'1",
6587                                               bVar"r'0"])]),
6588                                  ITE(EQ(Var("reg",CTy"Zreg"),
6589                                         LC("RAX",CTy"Zreg")),
6590                                      Call
6591                                        ("Zfull_inst",CTy"Zinst",
6592                                         TP[Var("p",LTy F8),
6593                                            Call
6594                                              ("Znop",CTy"instruction",
6595                                               Mop(Length,
6596                                                   Var("strm",LTy F8))),
6597                                            Mop(Some,Var("strm2",LTy F8))]),
6598                                      Call
6599                                        ("Zfull_inst",CTy"Zinst",
6600                                         TP[Var("p",LTy F8),
6601                                            Call
6602                                              ("Zxchg",CTy"instruction",
6603                                               TP[Call
6604                                                    ("OpSize",CTy"Zsize",
6605                                                     TP[LT,
6606                                                        Dest
6607                                                          ("W",bTy,
6608                                                           Var("REX",
6609                                                               CTy"REX")),
6610                                                        LW(1,1),
6611                                                        bVar"op_size_override"]),
6612                                                  Call
6613                                                    ("Zr",CTy"Zrm",
6614                                                     LC("RAX",CTy"Zreg")),
6615                                                  Var("reg",CTy"Zreg")]),
6616                                            Mop(Some,Var("strm2",LTy F8))])))),
6617                             (TP[TP[LT,LF,LT,LF,LT,LF,LF,bVar"v'0"],
6618                                 Var("strm2",LTy F8)],
6619                              Let(Var("size",CTy"Zsize"),
6620                                  Call
6621                                    ("OpSize",CTy"Zsize",
6622                                     TP[LT,
6623                                        Dest("W",bTy,Var("REX",CTy"REX")),
6624                                        Mop(Cast F1,LL[bVar"v'0"]),
6625                                        bVar"op_size_override"]),
6626                                  Let(TP[Var("imm",F64),
6627                                         Var("strm3",OTy(LTy F8))],
6628                                      Call
6629                                        ("immediate",PTy(F64,OTy(LTy F8)),
6630                                         TP[Var("size",CTy"Zsize"),
6631                                            Var("strm2",LTy F8)]),
6632                                      Call
6633                                        ("Zfull_inst",CTy"Zinst",
6634                                         TP[Var("p",LTy F8),
6635                                            Call
6636                                              ("Zbinop",CTy"instruction",
6637                                               TP[LC("Ztest",
6638                                                     CTy"Zbinop_name"),
6639                                                  Var("size",CTy"Zsize"),
6640                                                  Call
6641                                                    ("Zrm_i",
6642                                                     CTy"Zdest_src",
6643                                                     TP[Call
6644                                                          ("Zr",CTy"Zrm",
6645                                                           LC("RAX",
6646                                                              CTy"Zreg")),
6647                                                        Var("imm",F64)])]),
6648                                            Var("strm3",OTy(LTy F8))])))),
6649                             (TP[TP[LT,LF,LT,LT,bVar"v'0",bVar"r'2",
6650                                    bVar"r'1",bVar"r'0"],
6651                                 Var("strm2",LTy F8)],
6652                              Let(Var("size",CTy"Zsize"),
6653                                  Call
6654                                    ("OpSize",CTy"Zsize",
6655                                     TP[bVar"have_rex",
6656                                        Dest("W",bTy,Var("REX",CTy"REX")),
6657                                        Mop(Cast F1,LL[bVar"v'0"]),
6658                                        bVar"op_size_override"]),
6659                                  Let(TP[Var("imm",F64),
6660                                         Var("strm3",OTy(LTy F8))],
6661                                      Call
6662                                        ("full_immediate",
6663                                         PTy(F64,OTy(LTy F8)),
6664                                         TP[Var("size",CTy"Zsize"),
6665                                            Var("strm2",LTy F8)]),
6666                                      Call
6667                                        ("Zfull_inst",CTy"Zinst",
6668                                         TP[Var("p",LTy F8),
6669                                            Call
6670                                              ("Zmov",CTy"instruction",
6671                                               TP[LC("Z_ALWAYS",CTy"Zcond"),
6672                                                  Var("size",CTy"Zsize"),
6673                                                  Call
6674                                                    ("Zrm_i",
6675                                                     CTy"Zdest_src",
6676                                                     TP[Call
6677                                                          ("Zr",CTy"Zrm",
6678                                                           Call
6679                                                             ("RexReg",
6680                                                              CTy"Zreg",
6681                                                              TP[Dest
6682                                                                   ("B",
6683                                                                    bTy,
6684                                                                    Var("REX",
6685                                                                        CTy"REX")),
6686                                                                 Mop(Cast
6687                                                                       (FTy 3),
6688                                                                     LL[bVar"r'2",
6689                                                                        bVar"r'1",
6690                                                                        bVar"r'0"])])),
6691                                                        Var("imm",F64)])]),
6692                                            Var("strm3",OTy(LTy F8))])))),
6693                             (TP[TP[LT,LT,LF,LF,LF,LF,LF,bVar"v'0"],
6694                                 Var("strm2",LTy F8)],
6695                              Let(TP[Var("opcode",FTy 3),
6696                                     Var("rm",CTy"Zrm"),
6697                                     Var("strm3",OTy(LTy F8))],
6698                                  Call
6699                                    ("readOpcodeModRM",
6700                                     PTy(FTy 3,PTy(CTy"Zrm",OTy(LTy F8))),
6701                                     TP[Var("REX",CTy"REX"),
6702                                        Var("strm2",LTy F8)]),
6703                                  Let(TP[Var("imm",F64),
6704                                         Var("strm4",OTy(LTy F8))],
6705                                      Call
6706                                        ("oimmediate8",
6707                                         PTy(F64,OTy(LTy F8)),
6708                                         Var("strm3",OTy(LTy F8))),
6709                                      ITE(EQ(Var("opcode",FTy 3),LW(6,3)),
6710                                          Call
6711                                            ("Zdec_fail",CTy"Zinst",
6712                                             LS
6713                                              "Unsupported opcode: Shift Group 2"),
6714                                          Call
6715                                            ("Zfull_inst",CTy"Zinst",
6716                                             TP[Var("p",LTy F8),
6717                                                Call
6718                                                  ("Zbinop",
6719                                                   CTy"instruction",
6720                                                   TP[Mop(Cast
6721                                                            (CTy"Zbinop_name"),
6722                                                          Bop(Add,
6723                                                              Mop(Cast nTy,
6724                                                                  Var("opcode",
6725                                                                      FTy 3)),
6726                                                              LN 8)),
6727                                                      Call
6728                                                        ("OpSize",
6729                                                         CTy"Zsize",
6730                                                         TP[bVar"have_rex",
6731                                                            Dest
6732                                                              ("W",bTy,
6733                                                               Var("REX",
6734                                                                   CTy"REX")),
6735                                                            Mop(Cast F1,
6736                                                                LL[bVar"v'0"]),
6737                                                            bVar"op_size_override"]),
6738                                                      Call
6739                                                        ("Zrm_i",
6740                                                         CTy"Zdest_src",
6741                                                         TP[Var("rm",
6742                                                                CTy"Zrm"),
6743                                                            Var("imm",F64)])]),
6744                                                Var("strm4",OTy(LTy F8))]))))),
6745                             (TP[TP[LT,LT,LF,LF,LF,LF,LT,bVar"v'0"],
6746                                 Var("strm2",LTy F8)],
6747                              ITE(EQ(Mop(Cast F1,LL[bVar"v'0"]),LW(0,1)),
6748                                  Let(TP[Var("imm",F64),
6749                                         Var("strm3",OTy(LTy F8))],
6750                                      Call
6751                                        ("immediate16",
6752                                         PTy(F64,OTy(LTy F8)),
6753                                         Var("strm2",LTy F8)),
6754                                      Call
6755                                        ("Zfull_inst",CTy"Zinst",
6756                                         TP[Var("p",LTy F8),
6757                                            Call
6758                                              ("Zret",CTy"instruction",
6759                                               Var("imm",F64)),
6760                                            Var("strm3",OTy(LTy F8))])),
6761                                  Call
6762                                    ("Zfull_inst",CTy"Zinst",
6763                                     TP[Var("p",LTy F8),
6764                                        Call
6765                                          ("Zret",CTy"instruction",
6766                                           LW(0,64)),
6767                                        Mop(Some,Var("strm2",LTy F8))]))),
6768                             (TP[TP[LT,LT,LF,LF,LF,LT,LT,bVar"v'0"],
6769                                 Var("strm2",LTy F8)],
6770                              Let(Var("size",CTy"Zsize"),
6771                                  Call
6772                                    ("OpSize",CTy"Zsize",
6773                                     TP[bVar"have_rex",
6774                                        Dest("W",bTy,Var("REX",CTy"REX")),
6775                                        Mop(Cast F1,LL[bVar"v'0"]),
6776                                        bVar"op_size_override"]),
6777                                  Let(TP[Var("opcode",FTy 3),
6778                                         Var("rm",CTy"Zrm"),
6779                                         Var("strm3",OTy(LTy F8))],
6780                                      Call
6781                                        ("readOpcodeModRM",
6782                                         PTy(FTy 3,
6783                                             PTy(CTy"Zrm",OTy(LTy F8))),
6784                                         TP[Var("REX",CTy"REX"),
6785                                            Var("strm2",LTy F8)]),
6786                                      Let(TP[Var("imm",F64),
6787                                             Var("strm4",OTy(LTy F8))],
6788                                          Call
6789                                            ("oimmediate",
6790                                             PTy(F64,OTy(LTy F8)),
6791                                             TP[Var("size",CTy"Zsize"),
6792                                                Var("strm3",OTy(LTy F8))]),
6793                                          ITE(EQ(Var("opcode",FTy 3),
6794                                                 LW(0,3)),
6795                                              Call
6796                                                ("Zfull_inst",CTy"Zinst",
6797                                                 TP[Var("p",LTy F8),
6798                                                    Call
6799                                                      ("Zmov",
6800                                                       CTy"instruction",
6801                                                       TP[LC("Z_ALWAYS",
6802                                                             CTy"Zcond"),
6803                                                          Var("size",
6804                                                              CTy"Zsize"),
6805                                                          Call
6806                                                            ("Zrm_i",
6807                                                             CTy"Zdest_src",
6808                                                             TP[Var("rm",
6809                                                                    CTy"Zrm"),
6810                                                                Var("imm",
6811                                                                    F64)])]),
6812                                                    Var("strm4",
6813                                                        OTy(LTy F8))]),
6814                                              Call
6815                                                ("Zdec_fail",CTy"Zinst",
6816                                                 LS
6817                                                  "Unsupported opcode: Group 11")))))),
6818                             (TP[TP[LT,LT,LF,LF,LT,LF,LF,LT],
6819                                 Var("strm2",LTy F8)],
6820                              Call
6821                                ("Zfull_inst",CTy"Zinst",
6822                                 TP[Var("p",LTy F8),
6823                                    Const("Zleave",CTy"instruction"),
6824                                    Mop(Some,Var("strm2",LTy F8))])),
6825                             (TP[TP[LT,LT,LF,LT,LF,LF,bVar"b'0",bVar"v'0"],
6826                                 Var("strm2",LTy F8)],
6827                              Let(TP[Var("opcode",FTy 3),
6828                                     Var("rm",CTy"Zrm"),
6829                                     Var("strm3",OTy(LTy F8))],
6830                                  Call
6831                                    ("readOpcodeModRM",
6832                                     PTy(FTy 3,PTy(CTy"Zrm",OTy(LTy F8))),
6833                                     TP[Var("REX",CTy"REX"),
6834                                        Var("strm2",LTy F8)]),
6835                                  ITE(EQ(Var("opcode",FTy 3),LW(6,3)),
6836                                      Call
6837                                        ("Zdec_fail",CTy"Zinst",
6838                                         LS
6839                                          "Unsupported opcode: Shift Group 2"),
6840                                      Call
6841                                        ("Zfull_inst",CTy"Zinst",
6842                                         TP[Var("p",LTy F8),
6843                                            Call
6844                                              ("Zbinop",CTy"instruction",
6845                                               TP[Mop(Cast
6846                                                        (CTy"Zbinop_name"),
6847                                                      Bop(Add,
6848                                                          Mop(Cast nTy,
6849                                                              Var("opcode",
6850                                                                  FTy 3)),
6851                                                          LN 8)),
6852                                                  Call
6853                                                    ("OpSize",CTy"Zsize",
6854                                                     TP[bVar"have_rex",
6855                                                        Dest
6856                                                          ("W",bTy,
6857                                                           Var("REX",
6858                                                               CTy"REX")),
6859                                                        Mop(Cast F1,
6860                                                            LL[bVar"v'0"]),
6861                                                        bVar"op_size_override"]),
6862                                                  ITE(EQ(Mop(Cast F1,
6863                                                             LL[bVar"b'0"]),
6864                                                         LW(0,1)),
6865                                                      Call
6866                                                        ("Zrm_i",
6867                                                         CTy"Zdest_src",
6868                                                         TP[Var("rm",
6869                                                                CTy"Zrm"),
6870                                                            LW(1,64)]),
6871                                                      Call
6872                                                        ("Zrm_r",
6873                                                         CTy"Zdest_src",
6874                                                         TP[Var("rm",
6875                                                                CTy"Zrm"),
6876                                                            LC("RCX",
6877                                                               CTy"Zreg")]))]),
6878                                            Var("strm3",OTy(LTy F8))])))),
6879                             (TP[TP[LT,LT,LT,LF,LF,LF,LF,bVar"b'0"],
6880                                 Var("strm2",LTy F8)],
6881                              Let(TP[Var("imm",F64),
6882                                     Var("strm3",OTy(LTy F8))],
6883                                  Call
6884                                    ("immediate8",PTy(F64,OTy(LTy F8)),
6885                                     Var("strm2",LTy F8)),
6886                                  Call
6887                                    ("Zfull_inst",CTy"Zinst",
6888                                     TP[Var("p",LTy F8),
6889                                        Call
6890                                          ("Zloop",CTy"instruction",
6891                                           TP[ITE(EQ(Mop(Cast F1,
6892                                                         LL[bVar"b'0"]),
6893                                                     LW(0,1)),
6894                                                  LC("Z_NE",CTy"Zcond"),
6895                                                  LC("Z_E",CTy"Zcond")),
6896                                              Var("imm",F64)]),
6897                                        Var("strm3",OTy(LTy F8))]))),
6898                             (TP[TP[LT,LT,LT,LF,LF,LF,LT,LF],
6899                                 Var("strm2",LTy F8)],
6900                              Let(TP[Var("imm",F64),
6901                                     Var("strm3",OTy(LTy F8))],
6902                                  Call
6903                                    ("immediate8",PTy(F64,OTy(LTy F8)),
6904                                     Var("strm2",LTy F8)),
6905                                  Call
6906                                    ("Zfull_inst",CTy"Zinst",
6907                                     TP[Var("p",LTy F8),
6908                                        Call
6909                                          ("Zloop",CTy"instruction",
6910                                           TP[LC("Z_ALWAYS",CTy"Zcond"),
6911                                              Var("imm",F64)]),
6912                                        Var("strm3",OTy(LTy F8))]))),
6913                             (TP[TP[LT,LT,LT,LF,LT,LF,LF,LF],
6914                                 Var("strm2",LTy F8)],
6915                              Let(TP[Var("imm",F64),
6916                                     Var("strm3",OTy(LTy F8))],
6917                                  Call
6918                                    ("immediate32",PTy(F64,OTy(LTy F8)),
6919                                     Var("strm2",LTy F8)),
6920                                  Call
6921                                    ("Zfull_inst",CTy"Zinst",
6922                                     TP[Var("p",LTy F8),
6923                                        Call
6924                                          ("Zcall",CTy"instruction",
6925                                           Call
6926                                             ("Zimm",CTy"Zimm_rm",
6927                                              Var("imm",F64))),
6928                                        Var("strm3",OTy(LTy F8))]))),
6929                             (TP[TP[LT,LT,LT,LF,LT,LF,bVar"b'0",LT],
6930                                 Var("strm2",LTy F8)],
6931                              Let(TP[Var("imm",F64),
6932                                     Var("strm3",OTy(LTy F8))],
6933                                  ITE(EQ(Mop(Cast F1,LL[bVar"b'0"]),
6934                                         LW(0,1)),
6935                                      Call
6936                                        ("immediate32",
6937                                         PTy(F64,OTy(LTy F8)),
6938                                         Var("strm2",LTy F8)),
6939                                      Call
6940                                        ("immediate8",
6941                                         PTy(F64,OTy(LTy F8)),
6942                                         Var("strm2",LTy F8))),
6943                                  Call
6944                                    ("Zfull_inst",CTy"Zinst",
6945                                     TP[Var("p",LTy F8),
6946                                        Call
6947                                          ("Zjcc",CTy"instruction",
6948                                           TP[LC("Z_ALWAYS",CTy"Zcond"),
6949                                              Var("imm",F64)]),
6950                                        Var("strm3",OTy(LTy F8))]))),
6951                             (TP[TP[LT,LT,LT,LT,LF,LT,LF,LT],
6952                                 Var("strm2",LTy F8)],
6953                              Call
6954                                ("Zfull_inst",CTy"Zinst",
6955                                 TP[Var("p",LTy F8),
6956                                    Const("Zcmc",CTy"instruction"),
6957                                    Mop(Some,Var("strm2",LTy F8))])),
6958                             (TP[TP[LT,LT,LT,LT,LF,LT,LT,bVar"v'0"],
6959                                 Var("strm2",LTy F8)],
6960                              Let(Var("size",CTy"Zsize"),
6961                                  Call
6962                                    ("OpSize",CTy"Zsize",
6963                                     TP[bVar"have_rex",
6964                                        Dest("W",bTy,Var("REX",CTy"REX")),
6965                                        Mop(Cast F1,LL[bVar"v'0"]),
6966                                        bVar"op_size_override"]),
6967                                  Let(TP[Var("opcode",FTy 3),
6968                                         Var("rm",CTy"Zrm"),
6969                                         Var("strm3",OTy(LTy F8))],
6970                                      Call
6971                                        ("readOpcodeModRM",
6972                                         PTy(FTy 3,
6973                                             PTy(CTy"Zrm",OTy(LTy F8))),
6974                                         TP[Var("REX",CTy"REX"),
6975                                            Var("strm2",LTy F8)]),
6976                                      CS(Var("opcode",FTy 3),
6977                                         [(LW(0,3),
6978                                           Let(TP[Var("imm",F64),
6979                                                  Var("strm4",OTy(LTy F8))],
6980                                               Call
6981                                                 ("oimmediate",
6982                                                  PTy(F64,OTy(LTy F8)),
6983                                                  TP[Var("size",CTy"Zsize"),
6984                                                     Var("strm3",
6985                                                         OTy(LTy F8))]),
6986                                               Call
6987                                                 ("Zfull_inst",CTy"Zinst",
6988                                                  TP[Var("p",LTy F8),
6989                                                     Call
6990                                                       ("Zbinop",
6991                                                        CTy"instruction",
6992                                                        TP[LC("Ztest",
6993                                                              CTy"Zbinop_name"),
6994                                                           Var("size",
6995                                                               CTy"Zsize"),
6996                                                           Call
6997                                                             ("Zrm_i",
6998                                                              CTy"Zdest_src",
6999                                                              TP[Var("rm",
7000                                                                     CTy"Zrm"),
7001                                                                 Var("imm",
7002                                                                     F64)])]),
7003                                                     Var("strm4",
7004                                                         OTy(LTy F8))]))),
7005                                          (LW(2,3),
7006                                           Call
7007                                             ("Zfull_inst",CTy"Zinst",
7008                                              TP[Var("p",LTy F8),
7009                                                 Call
7010                                                   ("Zmonop",
7011                                                    CTy"instruction",
7012                                                    TP[LC("Znot",
7013                                                          CTy"Zmonop_name"),
7014                                                       Var("size",
7015                                                           CTy"Zsize"),
7016                                                       Var("rm",CTy"Zrm")]),
7017                                                 Var("strm3",OTy(LTy F8))])),
7018                                          (LW(3,3),
7019                                           Call
7020                                             ("Zfull_inst",CTy"Zinst",
7021                                              TP[Var("p",LTy F8),
7022                                                 Call
7023                                                   ("Zmonop",
7024                                                    CTy"instruction",
7025                                                    TP[LC("Zneg",
7026                                                          CTy"Zmonop_name"),
7027                                                       Var("size",
7028                                                           CTy"Zsize"),
7029                                                       Var("rm",CTy"Zrm")]),
7030                                                 Var("strm3",OTy(LTy F8))])),
7031                                          (LW(4,3),
7032                                           Call
7033                                             ("Zfull_inst",CTy"Zinst",
7034                                              TP[Var("p",LTy F8),
7035                                                 Call
7036                                                   ("Zmul",
7037                                                    CTy"instruction",
7038                                                    TP[Var("size",
7039                                                           CTy"Zsize"),
7040                                                       Var("rm",CTy"Zrm")]),
7041                                                 Var("strm3",OTy(LTy F8))])),
7042                                          (LW(5,3),
7043                                           Call
7044                                             ("Zfull_inst",CTy"Zinst",
7045                                              TP[Var("p",LTy F8),
7046                                                 Call
7047                                                   ("Zimul",
7048                                                    CTy"instruction",
7049                                                    TP[Var("size",
7050                                                           CTy"Zsize"),
7051                                                       Var("rm",CTy"Zrm")]),
7052                                                 Var("strm3",OTy(LTy F8))])),
7053                                          (LW(6,3),
7054                                           Call
7055                                             ("Zfull_inst",CTy"Zinst",
7056                                              TP[Var("p",LTy F8),
7057                                                 Call
7058                                                   ("Zdiv",
7059                                                    CTy"instruction",
7060                                                    TP[Var("size",
7061                                                           CTy"Zsize"),
7062                                                       Var("rm",CTy"Zrm")]),
7063                                                 Var("strm3",OTy(LTy F8))])),
7064                                          (LW(7,3),
7065                                           Call
7066                                             ("Zfull_inst",CTy"Zinst",
7067                                              TP[Var("p",LTy F8),
7068                                                 Call
7069                                                   ("Zidiv",
7070                                                    CTy"instruction",
7071                                                    TP[Var("size",
7072                                                           CTy"Zsize"),
7073                                                       Var("rm",CTy"Zrm")]),
7074                                                 Var("strm3",OTy(LTy F8))])),
7075                                          (AVar(FTy 3),
7076                                           Call
7077                                             ("Zdec_fail",CTy"Zinst",
7078                                              LS
7079                                               "Unsupported opcode: Unary Group 3"))])))),
7080                             (TP[TP[LT,LT,LT,LT,LT,LF,LF,LF],
7081                                 Var("strm2",LTy F8)],
7082                              Call
7083                                ("Zfull_inst",CTy"Zinst",
7084                                 TP[Var("p",LTy F8),
7085                                    Const("Zclc",CTy"instruction"),
7086                                    Mop(Some,Var("strm2",LTy F8))])),
7087                             (TP[TP[LT,LT,LT,LT,LT,LF,LF,LT],
7088                                 Var("strm2",LTy F8)],
7089                              Call
7090                                ("Zfull_inst",CTy"Zinst",
7091                                 TP[Var("p",LTy F8),
7092                                    Const("Zstc",CTy"instruction"),
7093                                    Mop(Some,Var("strm2",LTy F8))])),
7094                             (TP[TP[LT,LT,LT,LT,LT,LT,LT,LF],
7095                                 Var("strm2",LTy F8)],
7096                              Let(TP[Var("opcode",FTy 3),
7097                                     Var("rm",CTy"Zrm"),
7098                                     Var("strm3",OTy(LTy F8))],
7099                                  Call
7100                                    ("readOpcodeModRM",
7101                                     PTy(FTy 3,PTy(CTy"Zrm",OTy(LTy F8))),
7102                                     TP[Var("REX",CTy"REX"),
7103                                        Var("strm2",LTy F8)]),
7104                                  ITB([(EQ(Var("opcode",FTy 3),LW(0,3)),
7105                                        Call
7106                                          ("Zfull_inst",CTy"Zinst",
7107                                           TP[Var("p",LTy F8),
7108                                              Call
7109                                                ("Zmonop",
7110                                                 CTy"instruction",
7111                                                 TP[LC("Zinc",
7112                                                       CTy"Zmonop_name"),
7113                                                    Call
7114                                                      ("Z8",CTy"Zsize",
7115                                                       bVar"have_rex"),
7116                                                    Var("rm",CTy"Zrm")]),
7117                                              Var("strm3",OTy(LTy F8))])),
7118                                       (EQ(Var("opcode",FTy 3),LW(1,3)),
7119                                        Call
7120                                          ("Zfull_inst",CTy"Zinst",
7121                                           TP[Var("p",LTy F8),
7122                                              Call
7123                                                ("Zmonop",
7124                                                 CTy"instruction",
7125                                                 TP[LC("Zdec",
7126                                                       CTy"Zmonop_name"),
7127                                                    Call
7128                                                      ("Z8",CTy"Zsize",
7129                                                       bVar"have_rex"),
7130                                                    Var("rm",CTy"Zrm")]),
7131                                              Var("strm3",OTy(LTy F8))]))],
7132                                      Call
7133                                        ("Zdec_fail",CTy"Zinst",
7134                                         LS
7135                                          "Unsupported opcode: INC/DEC Group 4")))),
7136                             (TP[TP[LT,LT,LT,LT,LT,LT,LT,LT],
7137                                 Var("strm2",LTy F8)],
7138                              Let(Var("size",CTy"Zsize"),
7139                                  Call
7140                                    ("OpSize",CTy"Zsize",
7141                                     TP[bVar"have_rex",
7142                                        Dest("W",bTy,Var("REX",CTy"REX")),
7143                                        LW(1,1),bVar"op_size_override"]),
7144                                  Let(TP[Var("opcode",FTy 3),
7145                                         Var("rm",CTy"Zrm"),
7146                                         Var("strm3",OTy(LTy F8))],
7147                                      Call
7148                                        ("readOpcodeModRM",
7149                                         PTy(FTy 3,
7150                                             PTy(CTy"Zrm",OTy(LTy F8))),
7151                                         TP[Var("REX",CTy"REX"),
7152                                            Var("strm2",LTy F8)]),
7153                                      CS(Var("opcode",FTy 3),
7154                                         [(LW(0,3),
7155                                           Call
7156                                             ("Zfull_inst",CTy"Zinst",
7157                                              TP[Var("p",LTy F8),
7158                                                 Call
7159                                                   ("Zmonop",
7160                                                    CTy"instruction",
7161                                                    TP[LC("Zinc",
7162                                                          CTy"Zmonop_name"),
7163                                                       Var("size",
7164                                                           CTy"Zsize"),
7165                                                       Var("rm",CTy"Zrm")]),
7166                                                 Var("strm3",OTy(LTy F8))])),
7167                                          (LW(1,3),
7168                                           Call
7169                                             ("Zfull_inst",CTy"Zinst",
7170                                              TP[Var("p",LTy F8),
7171                                                 Call
7172                                                   ("Zmonop",
7173                                                    CTy"instruction",
7174                                                    TP[LC("Zdec",
7175                                                          CTy"Zmonop_name"),
7176                                                       Var("size",
7177                                                           CTy"Zsize"),
7178                                                       Var("rm",CTy"Zrm")]),
7179                                                 Var("strm3",OTy(LTy F8))])),
7180                                          (LW(2,3),
7181                                           Call
7182                                             ("Zfull_inst",CTy"Zinst",
7183                                              TP[Var("p",LTy F8),
7184                                                 Call
7185                                                   ("Zcall",
7186                                                    CTy"instruction",
7187                                                    Call
7188                                                      ("Zrm",CTy"Zimm_rm",
7189                                                       Var("rm",CTy"Zrm"))),
7190                                                 Var("strm3",OTy(LTy F8))])),
7191                                          (LW(4,3),
7192                                           Call
7193                                             ("Zfull_inst",CTy"Zinst",
7194                                              TP[Var("p",LTy F8),
7195                                                 Call
7196                                                   ("Zjmp",
7197                                                    CTy"instruction",
7198                                                    Var("rm",CTy"Zrm")),
7199                                                 Var("strm3",OTy(LTy F8))])),
7200                                          (LW(6,3),
7201                                           Call
7202                                             ("Zfull_inst",CTy"Zinst",
7203                                              TP[Var("p",LTy F8),
7204                                                 Call
7205                                                   ("Zpush",
7206                                                    CTy"instruction",
7207                                                    Call
7208                                                      ("Zrm",CTy"Zimm_rm",
7209                                                       Var("rm",CTy"Zrm"))),
7210                                                 Var("strm3",OTy(LTy F8))])),
7211                                          (AVar(FTy 3),
7212                                           Call
7213                                             ("Zdec_fail",CTy"Zinst",
7214                                              LS
7215                                               "Unsupported opcode: INC/DEC Group 5"))])))),
7216                             (TP[TP[LF,LF,LF,LF,LT,LT,LT,LT],
7217                                 LLC([LW(56,8),Var("opc",F8)],
7218                                     Var("strm2",LTy F8))],
7219                              CS(Var("opc",F8),
7220                                 [(LW(41,8),
7221                                   ITE(EQ(Var("p",LTy F8),LL[LW(102,8)]),
7222                                       Let(TP[Var("reg",FTy 3),
7223                                              Var("rm",CTy"Zrm"),
7224                                              Var("strm3",OTy(LTy F8))],
7225                                           Call
7226                                             ("readOpcodeModRM",
7227                                              PTy(FTy 3,
7228                                                  PTy(CTy"Zrm",OTy(LTy F8))),
7229                                              TP[Var("REX",CTy"REX"),
7230                                                 Var("strm2",LTy F8)]),
7231                                           Call
7232                                             ("Zfull_inst",CTy"Zinst",
7233                                              TP[Var("p",LTy F8),
7234                                                 Call
7235                                                   ("SSE",
7236                                                    CTy"instruction",
7237                                                    Call
7238                                                      ("PCMPEQQ",CTy"SSE",
7239                                                       TP[Var("reg",FTy 3),
7240                                                          Call
7241                                                            ("rm_to_xmm_mem",
7242                                                             CTy"xmm_mem",
7243                                                             Var("rm",
7244                                                                 CTy"Zrm"))])),
7245                                                 Var("strm3",OTy(LTy F8))])),
7246                                       Call
7247                                         ("Zdec_fail",CTy"Zinst",
7248                                          CC[LS
7249                                              "Unsupported opcode: 0F 38 ",
7250                                             Mop(Cast sTy,Var("opc",F8))]))),
7251                                  (AVar F8,
7252                                   Call
7253                                     ("Zdec_fail",CTy"Zinst",
7254                                      CC[LS"Unsupported opcode: 0F 38 ",
7255                                         Mop(Cast sTy,Var("opc",F8))]))])),
7256                             (TP[TP[LF,LF,LF,LF,LT,LT,LT,LT],
7257                                 LLC([LW(58,8),Var("opc",F8)],AVar(LTy F8))],
7258                              Call
7259                                ("Zdec_fail",CTy"Zinst",
7260                                 CC[LS"Unsupported opcode: 0F 3A ",
7261                                    Mop(Cast sTy,Var("opc",F8))])),
7262                             (TP[TP[LF,LF,LF,LF,LT,LT,LT,LT],
7263                                 LLC([Var("opc",F8)],Var("strm2",LTy F8))],
7264                              Let(TP[bVar"b'7",bVar"b'6",bVar"b'5",
7265                                     bVar"b'4",bVar"b'3",bVar"b'2",
7266                                     bVar"b'1",bVar"b'0"],
7267                                  BL(8,Var("opc",F8)),
7268                                  ITB([(bVar"b'5",
7269                                        ITB([(bVar"b'7",
7270                                              ITB([(Bop(And,
7271                                                        Mop(Not,bVar"b'6"),
7272                                                        Bop(And,
7273                                                            Mop(Not,
7274                                                                bVar"b'2"),
7275                                                            Bop(And,
7276                                                                bVar"b'1",
7277                                                                bVar"b'0"))),
7278                                                    Let(TP[Var("reg",
7279                                                               CTy"Zreg"),
7280                                                           Var("rm",
7281                                                               CTy"Zrm"),
7282                                                           Var("strm3",
7283                                                               OTy(LTy F8))],
7284                                                        Call
7285                                                          ("readModRM",
7286                                                           PTy(CTy"Zreg",
7287                                                               PTy(CTy"Zrm",
7288                                                                   OTy(LTy F8))),
7289                                                           TP[Var("REX",
7290                                                                  CTy"REX"),
7291                                                              Var("strm2",
7292                                                                  LTy F8)]),
7293                                                        Call
7294                                                          ("Zfull_inst",
7295                                                           CTy"Zinst",
7296                                                           TP[Var("p",
7297                                                                  LTy F8),
7298                                                              Call
7299                                                                ("Zbit_test",
7300                                                                 CTy"instruction",
7301                                                                 TP[Mop(Cast
7302                                                                          (CTy"Zbit_test_name"),
7303                                                                        Mop(Cast
7304                                                                              (FTy 2),
7305                                                                            LL[bVar"b'4",
7306                                                                               bVar"b'3"])),
7307                                                                    Call
7308                                                                      ("OpSize",
7309                                                                       CTy"Zsize",
7310                                                                       TP[bVar"have_rex",
7311                                                                          Dest
7312                                                                            ("W",
7313                                                                             bTy,
7314                                                                             Var("REX",
7315                                                                                 CTy"REX")),
7316                                                                          LW(1,
7317                                                                             1),
7318                                                                          bVar"op_size_override"]),
7319                                                                    Call
7320                                                                      ("Zrm_r",
7321                                                                       CTy"Zdest_src",
7322                                                                       TP[Var("rm",
7323                                                                              CTy"Zrm"),
7324                                                                          Var("reg",
7325                                                                              CTy"Zreg")])]),
7326                                                              Var("strm3",
7327                                                                  OTy(LTy F8))]))),
7328                                                   (Bop(And,
7329                                                        Mop(Not,bVar"b'6"),
7330                                                        Bop(And,bVar"b'4",
7331                                                            Bop(And,
7332                                                                bVar"b'3",
7333                                                                Bop(And,
7334                                                                    Mop(Not,
7335                                                                        bVar"b'2"),
7336                                                                    Bop(And,
7337                                                                        bVar"b'1",
7338                                                                        Mop(Not,
7339                                                                            bVar"b'0")))))),
7340                                                    Let(TP[Var("opcode",
7341                                                               FTy 3),
7342                                                           Var("rm",
7343                                                               CTy"Zrm"),
7344                                                           Var("strm3",
7345                                                               OTy(LTy F8))],
7346                                                        Call
7347                                                          ("readOpcodeModRM",
7348                                                           PTy(FTy 3,
7349                                                               PTy(CTy"Zrm",
7350                                                                   OTy(LTy F8))),
7351                                                           TP[Var("REX",
7352                                                                  CTy"REX"),
7353                                                              Var("strm2",
7354                                                                  LTy F8)]),
7355                                                        Let(TP[Var("imm",
7356                                                                   F64),
7357                                                               Var("strm4",
7358                                                                   OTy(LTy F8))],
7359                                                            Call
7360                                                              ("oimmediate8",
7361                                                               PTy(F64,
7362                                                                   OTy(LTy F8)),
7363                                                               Var("strm3",
7364                                                                   OTy(LTy F8))),
7365                                                            CS(BL(3,
7366                                                                  Var("opcode",
7367                                                                      FTy 3)),
7368                                                               [(TP[LT,
7369                                                                    bVar"x'1",
7370                                                                    bVar"x'0"],
7371                                                                 Call
7372                                                                   ("Zfull_inst",
7373                                                                    CTy"Zinst",
7374                                                                    TP[Var("p",
7375                                                                           LTy F8),
7376                                                                       Call
7377                                                                         ("Zbit_test",
7378                                                                          CTy"instruction",
7379                                                                          TP[Mop(Cast
7380                                                                                   (CTy"Zbit_test_name"),
7381                                                                                 Mop(Cast
7382                                                                                       (FTy 2),
7383                                                                                     LL[bVar"x'1",
7384                                                                                        bVar"x'0"])),
7385                                                                             Call
7386                                                                               ("OpSize",
7387                                                                                CTy"Zsize",
7388                                                                                TP[bVar"have_rex",
7389                                                                                   Dest
7390                                                                                     ("W",
7391                                                                                      bTy,
7392                                                                                      Var("REX",
7393                                                                                          CTy"REX")),
7394                                                                                   LW(1,
7395                                                                                      1),
7396                                                                                   bVar"op_size_override"]),
7397                                                                             Call
7398                                                                               ("Zrm_i",
7399                                                                                CTy"Zdest_src",
7400                                                                                TP[Var("rm",
7401                                                                                       CTy"Zrm"),
7402                                                                                   Var("imm",
7403                                                                                       F64)])]),
7404                                                                       Var("strm4",
7405                                                                           OTy(LTy F8))])),
7406                                                                (TP[AVar
7407                                                                      bTy,
7408                                                                    AVar
7409                                                                      bTy,
7410                                                                    AVar
7411                                                                      bTy],
7412                                                                 Call
7413                                                                   ("Zdec_fail",
7414                                                                    CTy"Zinst",
7415                                                                    LS
7416                                                                     "Unsupported opcode: Group 8"))])))),
7417                                                   (Bop(And,
7418                                                        Mop(Not,bVar"b'6"),
7419                                                        Bop(And,
7420                                                            Mop(Not,
7421                                                                bVar"b'4"),
7422                                                            Bop(And,
7423                                                                bVar"b'3",
7424                                                                Bop(And,
7425                                                                    bVar"b'2",
7426                                                                    Bop(And,
7427                                                                        bVar"b'1",
7428                                                                        bVar"b'0"))))),
7429                                                    Let(TP[Var("reg",
7430                                                               CTy"Zreg"),
7431                                                           Var("rm",
7432                                                               CTy"Zrm"),
7433                                                           Var("strm3",
7434                                                               OTy(LTy F8))],
7435                                                        Call
7436                                                          ("readModRM",
7437                                                           PTy(CTy"Zreg",
7438                                                               PTy(CTy"Zrm",
7439                                                                   OTy(LTy F8))),
7440                                                           TP[Var("REX",
7441                                                                  CTy"REX"),
7442                                                              Var("strm2",
7443                                                                  LTy F8)]),
7444                                                        Call
7445                                                          ("Zfull_inst",
7446                                                           CTy"Zinst",
7447                                                           TP[Var("p",
7448                                                                  LTy F8),
7449                                                              Call
7450                                                                ("Zimul2",
7451                                                                 CTy"instruction",
7452                                                                 TP[Call
7453                                                                      ("OpSize",
7454                                                                       CTy"Zsize",
7455                                                                       TP[bVar"have_rex",
7456                                                                          Dest
7457                                                                            ("W",
7458                                                                             bTy,
7459                                                                             Var("REX",
7460                                                                                 CTy"REX")),
7461                                                                          LW(1,
7462                                                                             1),
7463                                                                          bVar"op_size_override"]),
7464                                                                    Var("reg",
7465                                                                        CTy"Zreg"),
7466                                                                    Var("rm",
7467                                                                        CTy"Zrm")]),
7468                                                              Var("strm3",
7469                                                                  OTy(LTy F8))]))),
7470                                                   (Bop(And,
7471                                                        Mop(Not,bVar"b'6"),
7472                                                        Bop(And,bVar"b'4",
7473                                                            Bop(And,
7474                                                                Mop(Not,
7475                                                                    bVar"b'3"),
7476                                                                Bop(And,
7477                                                                    Mop(Not,
7478                                                                        bVar"b'2"),
7479                                                                    Mop(Not,
7480                                                                        bVar"b'1"))))),
7481                                                    Let(TP[Var("reg",
7482                                                               CTy"Zreg"),
7483                                                           Var("rm",
7484                                                               CTy"Zrm"),
7485                                                           Var("strm3",
7486                                                               OTy(LTy F8))],
7487                                                        Call
7488                                                          ("readModRM",
7489                                                           PTy(CTy"Zreg",
7490                                                               PTy(CTy"Zrm",
7491                                                                   OTy(LTy F8))),
7492                                                           TP[Var("REX",
7493                                                                  CTy"REX"),
7494                                                              Var("strm2",
7495                                                                  LTy F8)]),
7496                                                        Call
7497                                                          ("Zfull_inst",
7498                                                           CTy"Zinst",
7499                                                           TP[Var("p",
7500                                                                  LTy F8),
7501                                                              Call
7502                                                                ("Zcmpxchg",
7503                                                                 CTy"instruction",
7504                                                                 TP[Call
7505                                                                      ("OpSize",
7506                                                                       CTy"Zsize",
7507                                                                       TP[bVar"have_rex",
7508                                                                          Dest
7509                                                                            ("W",
7510                                                                             bTy,
7511                                                                             Var("REX",
7512                                                                                 CTy"REX")),
7513                                                                          Mop(Cast
7514                                                                                F1,
7515                                                                              LL[bVar"b'0"]),
7516                                                                          bVar"op_size_override"]),
7517                                                                    Var("rm",
7518                                                                        CTy"Zrm"),
7519                                                                    Var("reg",
7520                                                                        CTy"Zreg")]),
7521                                                              Var("strm3",
7522                                                                  OTy(LTy F8))]))),
7523                                                   (Bop(And,
7524                                                        Mop(Not,bVar"b'6"),
7525                                                        Bop(And,bVar"b'4",
7526                                                            Bop(And,
7527                                                                bVar"b'2",
7528                                                                bVar"b'1"))),
7529                                                    Let(TP[Var("reg",
7530                                                               CTy"Zreg"),
7531                                                           Var("rm",
7532                                                               CTy"Zrm"),
7533                                                           Var("strm3",
7534                                                               OTy(LTy F8))],
7535                                                        Call
7536                                                          ("readModRM",
7537                                                           PTy(CTy"Zreg",
7538                                                               PTy(CTy"Zrm",
7539                                                                   OTy(LTy F8))),
7540                                                           TP[Var("REX",
7541                                                                  CTy"REX"),
7542                                                              Var("strm2",
7543                                                                  LTy F8)]),
7544                                                        Let(TP[Var("arg0",
7545                                                                   CTy"Zsize"),
7546                                                               Var("arg1",
7547                                                                   CTy"Zdest_src"),
7548                                                               Var("arg2",
7549                                                                   CTy"Zsize")],
7550                                                            TP[ITE(EQ(Mop(Cast
7551                                                                            F1,
7552                                                                          LL[bVar"b'0"]),
7553                                                                      LW(1,
7554                                                                         1)),
7555                                                                   Const
7556                                                                     ("Z16",
7557                                                                      CTy"Zsize"),
7558                                                                   Call
7559                                                                     ("Z8",
7560                                                                      CTy"Zsize",
7561                                                                      bVar"have_rex")),
7562                                                               Call
7563                                                                 ("Zr_rm",
7564                                                                  CTy"Zdest_src",
7565                                                                  TP[Var("reg",
7566                                                                         CTy"Zreg"),
7567                                                                     Var("rm",
7568                                                                         CTy"Zrm")]),
7569                                                               Call
7570                                                                 ("OpSize",
7571                                                                  CTy"Zsize",
7572                                                                  TP[bVar"have_rex",
7573                                                                     Dest
7574                                                                       ("W",
7575                                                                        bTy,
7576                                                                        Var("REX",
7577                                                                            CTy"REX")),
7578                                                                     LW(1,
7579                                                                        1),
7580                                                                     bVar"op_size_override"])],
7581                                                            Call
7582                                                              ("Zfull_inst",
7583                                                               CTy"Zinst",
7584                                                               TP[Var("p",
7585                                                                      LTy F8),
7586                                                                  ITE(EQ(Mop(Cast
7587                                                                               F1,
7588                                                                             LL[bVar"b'3"]),
7589                                                                         LW(1,
7590                                                                            1)),
7591                                                                      Call
7592                                                                        ("Zmovsx",
7593                                                                         CTy"instruction",
7594                                                                         TP[Var("arg0",
7595                                                                                CTy"Zsize"),
7596                                                                            Var("arg1",
7597                                                                                CTy"Zdest_src"),
7598                                                                            Var("arg2",
7599                                                                                CTy"Zsize")]),
7600                                                                      Call
7601                                                                        ("Zmovzx",
7602                                                                         CTy"instruction",
7603                                                                         TP[Var("arg0",
7604                                                                                CTy"Zsize"),
7605                                                                            Var("arg1",
7606                                                                                CTy"Zdest_src"),
7607                                                                            Var("arg2",
7608                                                                                CTy"Zsize")])),
7609                                                                  Var("strm3",
7610                                                                      OTy(LTy F8))])))),
7611                                                   (Bop(And,bVar"b'6",
7612                                                        Bop(And,
7613                                                            Mop(Not,
7614                                                                bVar"b'4"),
7615                                                            Bop(And,
7616                                                                Mop(Not,
7617                                                                    bVar"b'3"),
7618                                                                Bop(And,
7619                                                                    bVar"b'2",
7620                                                                    Bop(And,
7621                                                                        bVar"b'1",
7622                                                                        Mop(Not,
7623                                                                            bVar"b'0")))))),
7624                                                    Let(TP[Var("reg",FTy 3),
7625                                                           Var("rm",
7626                                                               CTy"Zrm"),
7627                                                           Var("strm3",
7628                                                               OTy(LTy F8))],
7629                                                        Call
7630                                                          ("readOpcodeModRM",
7631                                                           PTy(FTy 3,
7632                                                               PTy(CTy"Zrm",
7633                                                                   OTy(LTy F8))),
7634                                                           TP[Var("REX",
7635                                                                  CTy"REX"),
7636                                                              Var("strm2",
7637                                                                  LTy F8)]),
7638                                                        Let(Var("a1",
7639                                                                CTy"xmm_mem"),
7640                                                            Call
7641                                                              ("rm_to_xmm_mem",
7642                                                               CTy"xmm_mem",
7643                                                               Var("rm",
7644                                                                   CTy"Zrm")),
7645                                                            CS(Var("p",
7646                                                                   LTy F8),
7647                                                               [(LL[LW(102,
7648                                                                       8)],
7649                                                                 Call
7650                                                                   ("Zfull_inst",
7651                                                                    CTy"Zinst",
7652                                                                    TP[Var("p",
7653                                                                           LTy F8),
7654                                                                       Call
7655                                                                         ("SSE",
7656                                                                          CTy"instruction",
7657                                                                          Call
7658                                                                            ("CVTPD2DQ",
7659                                                                             CTy"SSE",
7660                                                                             TP[LT,
7661                                                                                Var("reg",
7662                                                                                    FTy 3),
7663                                                                                Var("a1",
7664                                                                                    CTy"xmm_mem")])),
7665                                                                       Var("strm3",
7666                                                                           OTy(LTy F8))])),
7667                                                                (LL[LW(243,
7668                                                                       8)],
7669                                                                 Call
7670                                                                   ("Zfull_inst",
7671                                                                    CTy"Zinst",
7672                                                                    TP[Var("p",
7673                                                                           LTy F8),
7674                                                                       Call
7675                                                                         ("SSE",
7676                                                                          CTy"instruction",
7677                                                                          Call
7678                                                                            ("CVTDQ2PD",
7679                                                                             CTy"SSE",
7680                                                                             TP[Var("reg",
7681                                                                                    FTy 3),
7682                                                                                Var("a1",
7683                                                                                    CTy"xmm_mem")])),
7684                                                                       Var("strm3",
7685                                                                           OTy(LTy F8))])),
7686                                                                (LL[LW(242,
7687                                                                       8)],
7688                                                                 Call
7689                                                                   ("Zfull_inst",
7690                                                                    CTy"Zinst",
7691                                                                    TP[Var("p",
7692                                                                           LTy F8),
7693                                                                       Call
7694                                                                         ("SSE",
7695                                                                          CTy"instruction",
7696                                                                          Call
7697                                                                            ("CVTPD2DQ",
7698                                                                             CTy"SSE",
7699                                                                             TP[LF,
7700                                                                                Var("reg",
7701                                                                                    FTy 3),
7702                                                                                Var("a1",
7703                                                                                    CTy"xmm_mem")])),
7704                                                                       Var("strm3",
7705                                                                           OTy(LTy F8))])),
7706                                                                (AVar
7707                                                                   (LTy F8),
7708                                                                 Call
7709                                                                   ("Zdec_fail",
7710                                                                    CTy"Zinst",
7711                                                                    CC[LS
7712                                                                        "Unsupported opcode: ",
7713                                                                       Mop(Cast
7714                                                                             sTy,
7715                                                                           Var("opc",
7716                                                                               F8))]))]))))],
7717                                                  Call
7718                                                    ("Zdec_fail",
7719                                                     CTy"Zinst",
7720                                                     CC[LS
7721                                                         "Unsupported opcode: 0F ",
7722                                                        Mop(Cast sTy,
7723                                                            Var("opc",F8))]))),
7724                                             (bVar"b'1",
7725                                              ITB([(Bop(And,
7726                                                        Mop(Not,bVar"b'6"),
7727                                                        Bop(And,
7728                                                            Mop(Not,
7729                                                                bVar"b'4"),
7730                                                            Bop(And,
7731                                                                bVar"b'3",
7732                                                                Bop(And,
7733                                                                    Mop(Not,
7734                                                                        bVar"b'2"),
7735                                                                    Mop(Not,
7736                                                                        bVar"b'0"))))),
7737                                                    Let(TP[Var("reg",FTy 3),
7738                                                           Var("rm",
7739                                                               CTy"Zrm"),
7740                                                           Var("strm3",
7741                                                               OTy(LTy F8))],
7742                                                        Call
7743                                                          ("readOpcodeModRM",
7744                                                           PTy(FTy 3,
7745                                                               PTy(CTy"Zrm",
7746                                                                   OTy(LTy F8))),
7747                                                           TP[Var("REX",
7748                                                                  CTy"REX"),
7749                                                              Var("strm2",
7750                                                                  LTy F8)]),
7751                                                        Let(bVar"a0",
7752                                                            Dest
7753                                                              ("W",bTy,
7754                                                               Var("REX",
7755                                                                   CTy"REX")),
7756                                                            CS(Var("p",
7757                                                                   LTy F8),
7758                                                               [(LL[LW(243,
7759                                                                       8)],
7760                                                                 Call
7761                                                                   ("Zfull_inst",
7762                                                                    CTy"Zinst",
7763                                                                    TP[Var("p",
7764                                                                           LTy F8),
7765                                                                       Call
7766                                                                         ("SSE",
7767                                                                          CTy"instruction",
7768                                                                          Call
7769                                                                            ("CVTSI2SS",
7770                                                                             CTy"SSE",
7771                                                                             TP[bVar"a0",
7772                                                                                Var("reg",
7773                                                                                    FTy 3),
7774                                                                                Var("rm",
7775                                                                                    CTy"Zrm")])),
7776                                                                       Var("strm3",
7777                                                                           OTy(LTy F8))])),
7778                                                                (LL[LW(242,
7779                                                                       8)],
7780                                                                 Call
7781                                                                   ("Zfull_inst",
7782                                                                    CTy"Zinst",
7783                                                                    TP[Var("p",
7784                                                                           LTy F8),
7785                                                                       Call
7786                                                                         ("SSE",
7787                                                                          CTy"instruction",
7788                                                                          Call
7789                                                                            ("CVTSI2SD",
7790                                                                             CTy"SSE",
7791                                                                             TP[bVar"a0",
7792                                                                                Var("reg",
7793                                                                                    FTy 3),
7794                                                                                Var("rm",
7795                                                                                    CTy"Zrm")])),
7796                                                                       Var("strm3",
7797                                                                           OTy(LTy F8))])),
7798                                                                (AVar
7799                                                                   (LTy F8),
7800                                                                 Call
7801                                                                   ("Zdec_fail",
7802                                                                    CTy"Zinst",
7803                                                                    CC[LS
7804                                                                        "Unsupported opcode: 0F ",
7805                                                                       Mop(Cast
7806                                                                             sTy,
7807                                                                           Var("opc",
7808                                                                               F8))]))])))),
7809                                                   (Bop(And,
7810                                                        Mop(Not,bVar"b'6"),
7811                                                        Bop(And,
7812                                                            Mop(Not,
7813                                                                bVar"b'4"),
7814                                                            Bop(And,
7815                                                                bVar"b'3",
7816                                                                Bop(And,
7817                                                                    bVar"b'2",
7818                                                                    bVar"b'0")))),
7819                                                    Let(TP[Var("reg",FTy 3),
7820                                                           Var("rm",
7821                                                               CTy"Zrm"),
7822                                                           Var("strm3",
7823                                                               OTy(LTy F8))],
7824                                                        Call
7825                                                          ("readOpcodeModRM",
7826                                                           PTy(FTy 3,
7827                                                               PTy(CTy"Zrm",
7828                                                                   OTy(LTy F8))),
7829                                                           TP[Var("REX",
7830                                                                  CTy"REX"),
7831                                                              Var("strm2",
7832                                                                  LTy F8)]),
7833                                                        Let(Var("a1",
7834                                                                CTy"xmm_mem"),
7835                                                            Call
7836                                                              ("rm_to_xmm_mem",
7837                                                               CTy"xmm_mem",
7838                                                               Var("rm",
7839                                                                   CTy"Zrm")),
7840                                                            CS(Var("p",
7841                                                                   LTy F8),
7842                                                               [(LL[LW(102,
7843                                                                       8)],
7844                                                                 Call
7845                                                                   ("Zfull_inst",
7846                                                                    CTy"Zinst",
7847                                                                    TP[Var("p",
7848                                                                           LTy F8),
7849                                                                       Call
7850                                                                         ("SSE",
7851                                                                          CTy"instruction",
7852                                                                          Call
7853                                                                            ("COMISD",
7854                                                                             CTy"SSE",
7855                                                                             TP[Var("reg",
7856                                                                                    FTy 3),
7857                                                                                Var("a1",
7858                                                                                    CTy"xmm_mem")])),
7859                                                                       Var("strm3",
7860                                                                           OTy(LTy F8))])),
7861                                                                (AVar
7862                                                                   (LTy F8),
7863                                                                 Call
7864                                                                   ("Zfull_inst",
7865                                                                    CTy"Zinst",
7866                                                                    TP[Var("p",
7867                                                                           LTy F8),
7868                                                                       Call
7869                                                                         ("SSE",
7870                                                                          CTy"instruction",
7871                                                                          Call
7872                                                                            ("COMISS",
7873                                                                             CTy"SSE",
7874                                                                             TP[Var("reg",
7875                                                                                    FTy 3),
7876                                                                                Var("a1",
7877                                                                                    CTy"xmm_mem")])),
7878                                                                       Var("strm3",
7879                                                                           OTy(LTy F8))]))])))),
7880                                                   (Bop(And,bVar"b'6",
7881                                                        Bop(And,bVar"b'4",
7882                                                            Bop(And,
7883                                                                Mop(Not,
7884                                                                    bVar"b'3"),
7885                                                                Bop(And,
7886                                                                    Mop(Not,
7887                                                                        bVar"b'2"),
7888                                                                    Mop(Not,
7889                                                                        bVar"b'0"))))),
7890                                                    ITE(EQ(Var("p",LTy F8),
7891                                                           LL[LW(102,8)]),
7892                                                        Let(TP[Var("opcode",
7893                                                                   FTy 3),
7894                                                               Var("rm",
7895                                                                   CTy"Zrm"),
7896                                                               Var("strm3",
7897                                                                   OTy(LTy F8))],
7898                                                            Call
7899                                                              ("readOpcodeModRM",
7900                                                               PTy(FTy 3,
7901                                                                   PTy(CTy"Zrm",
7902                                                                       OTy(LTy F8))),
7903                                                               TP[Var("REX",
7904                                                                      CTy"REX"),
7905                                                                  Var("strm2",
7906                                                                      LTy F8)]),
7907                                                            Let(TP[Var("imm",
7908                                                                       F64),
7909                                                                   Var("strm4",
7910                                                                       OTy(LTy F8))],
7911                                                                Call
7912                                                                  ("oimmediate8",
7913                                                                   PTy(F64,
7914                                                                       OTy(LTy F8)),
7915                                                                   Var("strm3",
7916                                                                       OTy(LTy F8))),
7917                                                                CS(TP[Var("opcode",
7918                                                                          FTy 3),
7919                                                                      Var("rm",
7920                                                                          CTy"Zrm")],
7921                                                                   [(TP[LW(2,
7922                                                                           3),
7923                                                                        Call
7924                                                                          ("Zr",
7925                                                                           CTy"Zrm",
7926                                                                           Var("r",
7927                                                                               CTy"Zreg"))],
7928                                                                     Call
7929                                                                       ("Zfull_inst",
7930                                                                        CTy"Zinst",
7931                                                                        TP[Var("p",
7932                                                                               LTy F8),
7933                                                                           Call
7934                                                                             ("SSE",
7935                                                                              CTy"instruction",
7936                                                                              Call
7937                                                                                ("PSRLD_imm",
7938                                                                                 CTy"SSE",
7939                                                                                 TP[Mop(Cast
7940                                                                                          (FTy 3),
7941                                                                                        Var("r",
7942                                                                                            CTy"Zreg")),
7943                                                                                    Mop(Cast
7944                                                                                          F8,
7945                                                                                        Var("imm",
7946                                                                                            F64))])),
7947                                                                           Var("strm4",
7948                                                                               OTy(LTy F8))])),
7949                                                                    (TP[LW(4,
7950                                                                           3),
7951                                                                        Call
7952                                                                          ("Zr",
7953                                                                           CTy"Zrm",
7954                                                                           Var("r",
7955                                                                               CTy"Zreg"))],
7956                                                                     Call
7957                                                                       ("Zfull_inst",
7958                                                                        CTy"Zinst",
7959                                                                        TP[Var("p",
7960                                                                               LTy F8),
7961                                                                           Call
7962                                                                             ("SSE",
7963                                                                              CTy"instruction",
7964                                                                              Call
7965                                                                                ("PSRAD_imm",
7966                                                                                 CTy"SSE",
7967                                                                                 TP[Mop(Cast
7968                                                                                          (FTy 3),
7969                                                                                        Var("r",
7970                                                                                            CTy"Zreg")),
7971                                                                                    Mop(Cast
7972                                                                                          F8,
7973                                                                                        Var("imm",
7974                                                                                            F64))])),
7975                                                                           Var("strm4",
7976                                                                               OTy(LTy F8))])),
7977                                                                    (TP[LW(6,
7978                                                                           3),
7979                                                                        Call
7980                                                                          ("Zr",
7981                                                                           CTy"Zrm",
7982                                                                           Var("r",
7983                                                                               CTy"Zreg"))],
7984                                                                     Call
7985                                                                       ("Zfull_inst",
7986                                                                        CTy"Zinst",
7987                                                                        TP[Var("p",
7988                                                                               LTy F8),
7989                                                                           Call
7990                                                                             ("SSE",
7991                                                                              CTy"instruction",
7992                                                                              Call
7993                                                                                ("PSLLD_imm",
7994                                                                                 CTy"SSE",
7995                                                                                 TP[Mop(Cast
7996                                                                                          (FTy 3),
7997                                                                                        Var("r",
7998                                                                                            CTy"Zreg")),
7999                                                                                    Mop(Cast
8000                                                                                          F8,
8001                                                                                        Var("imm",
8002                                                                                            F64))])),
8003                                                                           Var("strm4",
8004                                                                               OTy(LTy F8))])),
8005                                                                    (AVar
8006                                                                       (PTy(FTy 3,
8007                                                                            CTy"Zrm")),
8008                                                                     Call
8009                                                                       ("Zdec_fail",
8010                                                                        CTy"Zinst",
8011                                                                        LS
8012                                                                         "Unsupported group 13 opcode: 0F 72"))]))),
8013                                                        Call
8014                                                          ("Zdec_fail",
8015                                                           CTy"Zinst",
8016                                                           LS
8017                                                            "Unsupported group 13 opcode: 0F 71"))),
8018                                                   (Bop(And,bVar"b'6",
8019                                                        Bop(And,bVar"b'4",
8020                                                            Bop(And,
8021                                                                Mop(Not,
8022                                                                    bVar"b'3"),
8023                                                                Bop(And,
8024                                                                    Mop(Not,
8025                                                                        bVar"b'2"),
8026                                                                    bVar"b'0")))),
8027                                                    ITE(EQ(Var("p",LTy F8),
8028                                                           LL[LW(102,8)]),
8029                                                        Let(TP[Var("opcode",
8030                                                                   FTy 3),
8031                                                               Var("rm",
8032                                                                   CTy"Zrm"),
8033                                                               Var("strm3",
8034                                                                   OTy(LTy F8))],
8035                                                            Call
8036                                                              ("readOpcodeModRM",
8037                                                               PTy(FTy 3,
8038                                                                   PTy(CTy"Zrm",
8039                                                                       OTy(LTy F8))),
8040                                                               TP[Var("REX",
8041                                                                      CTy"REX"),
8042                                                                  Var("strm2",
8043                                                                      LTy F8)]),
8044                                                            Let(TP[Var("imm",
8045                                                                       F64),
8046                                                                   Var("strm4",
8047                                                                       OTy(LTy F8))],
8048                                                                Call
8049                                                                  ("oimmediate8",
8050                                                                   PTy(F64,
8051                                                                       OTy(LTy F8)),
8052                                                                   Var("strm3",
8053                                                                       OTy(LTy F8))),
8054                                                                CS(TP[Var("opcode",
8055                                                                          FTy 3),
8056                                                                      Var("rm",
8057                                                                          CTy"Zrm")],
8058                                                                   [(TP[LW(2,
8059                                                                           3),
8060                                                                        Call
8061                                                                          ("Zr",
8062                                                                           CTy"Zrm",
8063                                                                           Var("r",
8064                                                                               CTy"Zreg"))],
8065                                                                     Call
8066                                                                       ("Zfull_inst",
8067                                                                        CTy"Zinst",
8068                                                                        TP[Var("p",
8069                                                                               LTy F8),
8070                                                                           Call
8071                                                                             ("SSE",
8072                                                                              CTy"instruction",
8073                                                                              Call
8074                                                                                ("PSRLQ_imm",
8075                                                                                 CTy"SSE",
8076                                                                                 TP[Mop(Cast
8077                                                                                          (FTy 3),
8078                                                                                        Var("r",
8079                                                                                            CTy"Zreg")),
8080                                                                                    Mop(Cast
8081                                                                                          F8,
8082                                                                                        Var("imm",
8083                                                                                            F64))])),
8084                                                                           Var("strm4",
8085                                                                               OTy(LTy F8))])),
8086                                                                    (TP[LW(3,
8087                                                                           3),
8088                                                                        Call
8089                                                                          ("Zr",
8090                                                                           CTy"Zrm",
8091                                                                           Var("r",
8092                                                                               CTy"Zreg"))],
8093                                                                     Call
8094                                                                       ("Zfull_inst",
8095                                                                        CTy"Zinst",
8096                                                                        TP[Var("p",
8097                                                                               LTy F8),
8098                                                                           Call
8099                                                                             ("SSE",
8100                                                                              CTy"instruction",
8101                                                                              Call
8102                                                                                ("PSRLDQ",
8103                                                                                 CTy"SSE",
8104                                                                                 TP[Mop(Cast
8105                                                                                          (FTy 3),
8106                                                                                        Var("r",
8107                                                                                            CTy"Zreg")),
8108                                                                                    Mop(Cast
8109                                                                                          F8,
8110                                                                                        Var("imm",
8111                                                                                            F64))])),
8112                                                                           Var("strm4",
8113                                                                               OTy(LTy F8))])),
8114                                                                    (TP[LW(6,
8115                                                                           3),
8116                                                                        Call
8117                                                                          ("Zr",
8118                                                                           CTy"Zrm",
8119                                                                           Var("r",
8120                                                                               CTy"Zreg"))],
8121                                                                     Call
8122                                                                       ("Zfull_inst",
8123                                                                        CTy"Zinst",
8124                                                                        TP[Var("p",
8125                                                                               LTy F8),
8126                                                                           Call
8127                                                                             ("SSE",
8128                                                                              CTy"instruction",
8129                                                                              Call
8130                                                                                ("PSLLQ_imm",
8131                                                                                 CTy"SSE",
8132                                                                                 TP[Mop(Cast
8133                                                                                          (FTy 3),
8134                                                                                        Var("r",
8135                                                                                            CTy"Zreg")),
8136                                                                                    Mop(Cast
8137                                                                                          F8,
8138                                                                                        Var("imm",
8139                                                                                            F64))])),
8140                                                                           Var("strm4",
8141                                                                               OTy(LTy F8))])),
8142                                                                    (TP[LW(7,
8143                                                                           3),
8144                                                                        Call
8145                                                                          ("Zr",
8146                                                                           CTy"Zrm",
8147                                                                           Var("r",
8148                                                                               CTy"Zreg"))],
8149                                                                     Call
8150                                                                       ("Zfull_inst",
8151                                                                        CTy"Zinst",
8152                                                                        TP[Var("p",
8153                                                                               LTy F8),
8154                                                                           Call
8155                                                                             ("SSE",
8156                                                                              CTy"instruction",
8157                                                                              Call
8158                                                                                ("PSLLDQ",
8159                                                                                 CTy"SSE",
8160                                                                                 TP[Mop(Cast
8161                                                                                          (FTy 3),
8162                                                                                        Var("r",
8163                                                                                            CTy"Zreg")),
8164                                                                                    Mop(Cast
8165                                                                                          F8,
8166                                                                                        Var("imm",
8167                                                                                            F64))])),
8168                                                                           Var("strm4",
8169                                                                               OTy(LTy F8))])),
8170                                                                    (AVar
8171                                                                       (PTy(FTy 3,
8172                                                                            CTy"Zrm")),
8173                                                                     Call
8174                                                                       ("Zdec_fail",
8175                                                                        CTy"Zinst",
8176                                                                        LS
8177                                                                         "Unsupported group 14 opcode: 0F 73"))]))),
8178                                                        Call
8179                                                          ("Zdec_fail",
8180                                                           CTy"Zinst",
8181                                                           LS
8182                                                            "Unsupported group 14 opcode: 0F 71"))),
8183                                                   (Bop(And,bVar"b'6",
8184                                                        Bop(And,bVar"b'3",
8185                                                            Bop(And,
8186                                                                bVar"b'2",
8187                                                                Mop(Not,
8188                                                                    bVar"b'0")))),
8189                                                    Let(Var("b",F1),
8190                                                        Mop(Cast F1,
8191                                                            LL[bVar"b'4"]),
8192                                                        Let(TP[Var("reg",
8193                                                                   FTy 3),
8194                                                               Var("rm",
8195                                                                   CTy"Zrm"),
8196                                                               Var("strm3",
8197                                                                   OTy(LTy F8))],
8198                                                            Call
8199                                                              ("readOpcodeModRM",
8200                                                               PTy(FTy 3,
8201                                                                   PTy(CTy"Zrm",
8202                                                                       OTy(LTy F8))),
8203                                                               TP[Var("REX",
8204                                                                      CTy"REX"),
8205                                                                  Var("strm2",
8206                                                                      LTy F8)]),
8207                                                            CS(Var("p",
8208                                                                   LTy F8),
8209                                                               [(LL[LW(102,
8210                                                                       8)],
8211                                                                 Call
8212                                                                   ("Zfull_inst",
8213                                                                    CTy"Zinst",
8214                                                                    TP[Var("p",
8215                                                                           LTy F8),
8216                                                                       Call
8217                                                                         ("SSE",
8218                                                                          CTy"instruction",
8219                                                                          Call
8220                                                                            ("MOV_D_Q",
8221                                                                             CTy"SSE",
8222                                                                             TP[Mop(Not,
8223                                                                                    Mop(Cast
8224                                                                                          bTy,
8225                                                                                        Var("b",
8226                                                                                            F1))),
8227                                                                                Dest
8228                                                                                  ("W",
8229                                                                                   bTy,
8230                                                                                   Var("REX",
8231                                                                                       CTy"REX")),
8232                                                                                Var("reg",
8233                                                                                    FTy 3),
8234                                                                                Var("rm",
8235                                                                                    CTy"Zrm")])),
8236                                                                       Var("strm3",
8237                                                                           OTy(LTy F8))])),
8238                                                                (LL[LW(243,
8239                                                                       8)],
8240                                                                 ITE(EQ(Var("b",
8241                                                                            F1),
8242                                                                        LW(1,
8243                                                                           1)),
8244                                                                     Call
8245                                                                       ("Zfull_inst",
8246                                                                        CTy"Zinst",
8247                                                                        TP[Var("p",
8248                                                                               LTy F8),
8249                                                                           Call
8250                                                                             ("SSE",
8251                                                                              CTy"instruction",
8252                                                                              Call
8253                                                                                ("MOVQ",
8254                                                                                 CTy"SSE",
8255                                                                                 TP[Call
8256                                                                                      ("xmm_reg",
8257                                                                                       CTy"xmm_mem",
8258                                                                                       Var("reg",
8259                                                                                           FTy 3)),
8260                                                                                    Call
8261                                                                                      ("rm_to_xmm_mem",
8262                                                                                       CTy"xmm_mem",
8263                                                                                       Var("rm",
8264                                                                                           CTy"Zrm"))])),
8265                                                                           Var("strm3",
8266                                                                               OTy(LTy F8))]),
8267                                                                     Call
8268                                                                       ("Zdec_fail",
8269                                                                        CTy"Zinst",
8270                                                                        CC[LS
8271                                                                            "Unsupported opcode: 0F ",
8272                                                                           Mop(Cast
8273                                                                                 sTy,
8274                                                                               Var("opc",
8275                                                                                   F8))]))),
8276                                                                (AVar
8277                                                                   (LTy F8),
8278                                                                 Call
8279                                                                   ("Zdec_fail",
8280                                                                    CTy"Zinst",
8281                                                                    CC[LS
8282                                                                        "Unsupported opcode: 0F ",
8283                                                                       Mop(Cast
8284                                                                             sTy,
8285                                                                           Var("opc",
8286                                                                               F8))]))]))))],
8287                                                  Call
8288                                                    ("Zdec_fail",
8289                                                     CTy"Zinst",
8290                                                     CC[LS
8291                                                         "Unsupported opcode: 0F ",
8292                                                        Mop(Cast sTy,
8293                                                            Var("opc",F8))]))),
8294                                             (Bop(And,Mop(Not,bVar"b'6"),
8295                                                  Bop(And,
8296                                                      Mop(Not,bVar"b'4"),
8297                                                      Bop(And,bVar"b'3",
8298                                                          Bop(And,
8299                                                              Mop(Not,
8300                                                                  bVar"b'2"),
8301                                                              Mop(Not,
8302                                                                  bVar"b'0"))))),
8303                                              Let(TP[Var("reg",FTy 3),
8304                                                     Var("rm",CTy"Zrm"),
8305                                                     Var("strm3",
8306                                                         OTy(LTy F8))],
8307                                                  Call
8308                                                    ("readOpcodeModRM",
8309                                                     PTy(FTy 3,
8310                                                         PTy(CTy"Zrm",
8311                                                             OTy(LTy F8))),
8312                                                     TP[Var("REX",CTy"REX"),
8313                                                        Var("strm2",LTy F8)]),
8314                                                  Call
8315                                                    ("Zfull_inst",
8316                                                     CTy"Zinst",
8317                                                     TP[Var("p",LTy F8),
8318                                                        Call
8319                                                          ("SSE",
8320                                                           CTy"instruction",
8321                                                           Call
8322                                                             ("MOVAP_D_S",
8323                                                              CTy"SSE",
8324                                                              TP[EQ(Var("p",
8325                                                                        LTy F8),
8326                                                                    LL[LW(102,
8327                                                                          8)]),
8328                                                                 Call
8329                                                                   ("xmm_reg",
8330                                                                    CTy"xmm_mem",
8331                                                                    Var("reg",
8332                                                                        FTy 3)),
8333                                                                 Call
8334                                                                   ("rm_to_xmm_mem",
8335                                                                    CTy"xmm_mem",
8336                                                                    Var("rm",
8337                                                                        CTy"Zrm"))])),
8338                                                        Var("strm3",
8339                                                            OTy(LTy F8))]))),
8340                                             (Bop(And,Mop(Not,bVar"b'6"),
8341                                                  Bop(And,
8342                                                      Mop(Not,bVar"b'4"),
8343                                                      Bop(And,bVar"b'3",
8344                                                          Bop(And,
8345                                                              Mop(Not,
8346                                                                  bVar"b'2"),
8347                                                              bVar"b'0")))),
8348                                              Let(TP[Var("reg",FTy 3),
8349                                                     Var("rm",CTy"Zrm"),
8350                                                     Var("strm3",
8351                                                         OTy(LTy F8))],
8352                                                  Call
8353                                                    ("readOpcodeModRM",
8354                                                     PTy(FTy 3,
8355                                                         PTy(CTy"Zrm",
8356                                                             OTy(LTy F8))),
8357                                                     TP[Var("REX",CTy"REX"),
8358                                                        Var("strm2",LTy F8)]),
8359                                                  Call
8360                                                    ("Zfull_inst",
8361                                                     CTy"Zinst",
8362                                                     TP[Var("p",LTy F8),
8363                                                        Call
8364                                                          ("SSE",
8365                                                           CTy"instruction",
8366                                                           Call
8367                                                             ("MOVAP_D_S",
8368                                                              CTy"SSE",
8369                                                              TP[EQ(Var("p",
8370                                                                        LTy F8),
8371                                                                    LL[LW(102,
8372                                                                          8)]),
8373                                                                 Call
8374                                                                   ("rm_to_xmm_mem",
8375                                                                    CTy"xmm_mem",
8376                                                                    Var("rm",
8377                                                                        CTy"Zrm")),
8378                                                                 Call
8379                                                                   ("xmm_reg",
8380                                                                    CTy"xmm_mem",
8381                                                                    Var("reg",
8382                                                                        FTy 3))])),
8383                                                        Var("strm3",
8384                                                            OTy(LTy F8))]))),
8385                                             (Bop(And,Mop(Not,bVar"b'6"),
8386                                                  Bop(And,
8387                                                      Mop(Not,bVar"b'4"),
8388                                                      Bop(And,bVar"b'3",
8389                                                          bVar"b'2"))),
8390                                              Let(TP[Var("reg",CTy"Zreg"),
8391                                                     Var("rm",CTy"Zrm"),
8392                                                     Var("strm3",
8393                                                         OTy(LTy F8))],
8394                                                  Call
8395                                                    ("readModRM",
8396                                                     PTy(CTy"Zreg",
8397                                                         PTy(CTy"Zrm",
8398                                                             OTy(LTy F8))),
8399                                                     TP[Var("REX",CTy"REX"),
8400                                                        Var("strm2",LTy F8)]),
8401                                                  Let(TP[bVar"a0",
8402                                                         bVar"a1",
8403                                                         Var("a3",
8404                                                             CTy"xmm_mem")],
8405                                                      TP[Mop(Not,
8406                                                             Mop(Cast bTy,
8407                                                                 Mop(Cast
8408                                                                       F1,
8409                                                                     LL[bVar"b'0"]))),
8410                                                         Dest
8411                                                           ("W",bTy,
8412                                                            Var("REX",
8413                                                                CTy"REX")),
8414                                                         Call
8415                                                           ("rm_to_xmm_mem",
8416                                                            CTy"xmm_mem",
8417                                                            Var("rm",
8418                                                                CTy"Zrm"))],
8419                                                      CS(Var("p",LTy F8),
8420                                                         [(LL[LW(243,8)],
8421                                                           Call
8422                                                             ("Zfull_inst",
8423                                                              CTy"Zinst",
8424                                                              TP[Var("p",
8425                                                                     LTy F8),
8426                                                                 Call
8427                                                                   ("SSE",
8428                                                                    CTy"instruction",
8429                                                                    Call
8430                                                                      ("CVTSS2SI",
8431                                                                       CTy"SSE",
8432                                                                       TP[bVar"a0",
8433                                                                          bVar"a1",
8434                                                                          Var("reg",
8435                                                                              CTy"Zreg"),
8436                                                                          Var("a3",
8437                                                                              CTy"xmm_mem")])),
8438                                                                 Var("strm3",
8439                                                                     OTy(LTy F8))])),
8440                                                          (LL[LW(242,8)],
8441                                                           Call
8442                                                             ("Zfull_inst",
8443                                                              CTy"Zinst",
8444                                                              TP[Var("p",
8445                                                                     LTy F8),
8446                                                                 Call
8447                                                                   ("SSE",
8448                                                                    CTy"instruction",
8449                                                                    Call
8450                                                                      ("CVTSD2SI",
8451                                                                       CTy"SSE",
8452                                                                       TP[bVar"a0",
8453                                                                          bVar"a1",
8454                                                                          Var("reg",
8455                                                                              CTy"Zreg"),
8456                                                                          Var("a3",
8457                                                                              CTy"xmm_mem")])),
8458                                                                 Var("strm3",
8459                                                                     OTy(LTy F8))])),
8460                                                          (AVar(LTy F8),
8461                                                           Call
8462                                                             ("Zdec_fail",
8463                                                              CTy"Zinst",
8464                                                              CC[LS
8465                                                                  "Unsupported opcode: 0F ",
8466                                                                 Mop(Cast
8467                                                                       sTy,
8468                                                                     Var("opc",
8469                                                                         F8))]))])))),
8470                                             (Bop(And,bVar"b'6",
8471                                                  Bop(And,bVar"b'4",
8472                                                      Bop(And,
8473                                                          Mop(Not,
8474                                                              bVar"b'3"),
8475                                                          Bop(And,
8476                                                              Mop(Not,
8477                                                                  bVar"b'2"),
8478                                                              bVar"b'0")))),
8479                                              ITE(EQ(Var("p",LTy F8),
8480                                                     LL[LW(102,8)]),
8481                                                  Let(TP[Var("opcode",
8482                                                             FTy 3),
8483                                                         Var("rm",CTy"Zrm"),
8484                                                         Var("strm3",
8485                                                             OTy(LTy F8))],
8486                                                      Call
8487                                                        ("readOpcodeModRM",
8488                                                         PTy(FTy 3,
8489                                                             PTy(CTy"Zrm",
8490                                                                 OTy(LTy F8))),
8491                                                         TP[Var("REX",
8492                                                                CTy"REX"),
8493                                                            Var("strm2",
8494                                                                LTy F8)]),
8495                                                      Let(TP[Var("imm",F64),
8496                                                             Var("strm4",
8497                                                                 OTy(LTy F8))],
8498                                                          Call
8499                                                            ("oimmediate8",
8500                                                             PTy(F64,
8501                                                                 OTy(LTy F8)),
8502                                                             Var("strm3",
8503                                                                 OTy(LTy F8))),
8504                                                          CS(TP[Var("opcode",
8505                                                                    FTy 3),
8506                                                                Var("rm",
8507                                                                    CTy"Zrm")],
8508                                                             [(TP[LW(2,3),
8509                                                                  Call
8510                                                                    ("Zr",
8511                                                                     CTy"Zrm",
8512                                                                     Var("r",
8513                                                                         CTy"Zreg"))],
8514                                                               Call
8515                                                                 ("Zfull_inst",
8516                                                                  CTy"Zinst",
8517                                                                  TP[Var("p",
8518                                                                         LTy F8),
8519                                                                     Call
8520                                                                       ("SSE",
8521                                                                        CTy"instruction",
8522                                                                        Call
8523                                                                          ("PSRLW_imm",
8524                                                                           CTy"SSE",
8525                                                                           TP[Mop(Cast
8526                                                                                    (FTy 3),
8527                                                                                  Var("r",
8528                                                                                      CTy"Zreg")),
8529                                                                              Mop(Cast
8530                                                                                    F8,
8531                                                                                  Var("imm",
8532                                                                                      F64))])),
8533                                                                     Var("strm4",
8534                                                                         OTy(LTy F8))])),
8535                                                              (TP[LW(4,3),
8536                                                                  Call
8537                                                                    ("Zr",
8538                                                                     CTy"Zrm",
8539                                                                     Var("r",
8540                                                                         CTy"Zreg"))],
8541                                                               Call
8542                                                                 ("Zfull_inst",
8543                                                                  CTy"Zinst",
8544                                                                  TP[Var("p",
8545                                                                         LTy F8),
8546                                                                     Call
8547                                                                       ("SSE",
8548                                                                        CTy"instruction",
8549                                                                        Call
8550                                                                          ("PSRAW_imm",
8551                                                                           CTy"SSE",
8552                                                                           TP[Mop(Cast
8553                                                                                    (FTy 3),
8554                                                                                  Var("r",
8555                                                                                      CTy"Zreg")),
8556                                                                              Mop(Cast
8557                                                                                    F8,
8558                                                                                  Var("imm",
8559                                                                                      F64))])),
8560                                                                     Var("strm4",
8561                                                                         OTy(LTy F8))])),
8562                                                              (TP[LW(6,3),
8563                                                                  Call
8564                                                                    ("Zr",
8565                                                                     CTy"Zrm",
8566                                                                     Var("r",
8567                                                                         CTy"Zreg"))],
8568                                                               Call
8569                                                                 ("Zfull_inst",
8570                                                                  CTy"Zinst",
8571                                                                  TP[Var("p",
8572                                                                         LTy F8),
8573                                                                     Call
8574                                                                       ("SSE",
8575                                                                        CTy"instruction",
8576                                                                        Call
8577                                                                          ("PSLLW_imm",
8578                                                                           CTy"SSE",
8579                                                                           TP[Mop(Cast
8580                                                                                    (FTy 3),
8581                                                                                  Var("r",
8582                                                                                      CTy"Zreg")),
8583                                                                              Mop(Cast
8584                                                                                    F8,
8585                                                                                  Var("imm",
8586                                                                                      F64))])),
8587                                                                     Var("strm4",
8588                                                                         OTy(LTy F8))])),
8589                                                              (AVar
8590                                                                 (PTy(FTy 3,
8591                                                                      CTy"Zrm")),
8592                                                               Call
8593                                                                 ("Zdec_fail",
8594                                                                  CTy"Zinst",
8595                                                                  LS
8596                                                                   "Unsupported group 12 opcode: 0F 71"))]))),
8597                                                  Call
8598                                                    ("Zdec_fail",
8599                                                     CTy"Zinst",
8600                                                     LS
8601                                                      "Unsupported group 12 opcode: 0F 71")))],
8602                                            Call
8603                                              ("Zdec_fail",CTy"Zinst",
8604                                               CC[LS
8605                                                   "Unsupported opcode: 0F ",
8606                                                  Mop(Cast sTy,
8607                                                      Var("opc",F8))]))),
8608                                       (bVar"b'7",
8609                                        ITB([(Bop(And,bVar"b'6",
8610                                                  Bop(And,bVar"b'4",
8611                                                      Bop(And,
8612                                                          Mop(Not,
8613                                                              bVar"b'3"),
8614                                                          Bop(And,
8615                                                              bVar"b'2",
8616                                                              Bop(And,
8617                                                                  bVar"b'1",
8618                                                                  Mop(Not,
8619                                                                      bVar"b'0")))))),
8620                                              Let(TP[Var("reg",FTy 3),
8621                                                     Var("rm",CTy"Zrm"),
8622                                                     Var("strm3",
8623                                                         OTy(LTy F8))],
8624                                                  Call
8625                                                    ("readOpcodeModRM",
8626                                                     PTy(FTy 3,
8627                                                         PTy(CTy"Zrm",
8628                                                             OTy(LTy F8))),
8629                                                     TP[Var("REX",CTy"REX"),
8630                                                        Var("strm2",LTy F8)]),
8631                                                  CS(Var("p",LTy F8),
8632                                                     [(LL[LW(102,8)],
8633                                                       Call
8634                                                         ("Zfull_inst",
8635                                                          CTy"Zinst",
8636                                                          TP[Var("p",
8637                                                                 LTy F8),
8638                                                             Call
8639                                                               ("SSE",
8640                                                                CTy"instruction",
8641                                                                Call
8642                                                                  ("MOVQ",
8643                                                                   CTy"SSE",
8644                                                                   TP[Call
8645                                                                        ("rm_to_xmm_mem",
8646                                                                         CTy"xmm_mem",
8647                                                                         Var("rm",
8648                                                                             CTy"Zrm")),
8649                                                                      Call
8650                                                                        ("xmm_reg",
8651                                                                         CTy"xmm_mem",
8652                                                                         Var("reg",
8653                                                                             FTy 3))])),
8654                                                             Var("strm3",
8655                                                                 OTy(LTy F8))])),
8656                                                      (AVar(LTy F8),
8657                                                       Call
8658                                                         ("Zdec_fail",
8659                                                          CTy"Zinst",
8660                                                          CC[LS
8661                                                              "Unsupported opcode: 0F ",
8662                                                             Mop(Cast sTy,
8663                                                                 Var("opc",
8664                                                                     F8))]))]))),
8665                                             (Bop(And,Mop(Not,bVar"b'6"),
8666                                                  Mop(Not,bVar"b'4")),
8667                                              Let(TP[Var("imm",F64),
8668                                                     Var("strm3",
8669                                                         OTy(LTy F8))],
8670                                                  Call
8671                                                    ("immediate32",
8672                                                     PTy(F64,OTy(LTy F8)),
8673                                                     Var("strm2",LTy F8)),
8674                                                  Call
8675                                                    ("Zfull_inst",
8676                                                     CTy"Zinst",
8677                                                     TP[Var("p",LTy F8),
8678                                                        Call
8679                                                          ("Zjcc",
8680                                                           CTy"instruction",
8681                                                           TP[Mop(Cast
8682                                                                    (CTy"Zcond"),
8683                                                                  Mop(Cast
8684                                                                        F4,
8685                                                                      LL[bVar"b'3",
8686                                                                         bVar"b'2",
8687                                                                         bVar"b'1",
8688                                                                         bVar"b'0"])),
8689                                                              Var("imm",
8690                                                                  F64)]),
8691                                                        Var("strm3",
8692                                                            OTy(LTy F8))]))),
8693                                             (Bop(And,Mop(Not,bVar"b'6"),
8694                                                  bVar"b'4"),
8695                                              Let(TP[AVar(CTy"Zreg"),
8696                                                     Var("rm",CTy"Zrm"),
8697                                                     Var("strm3",
8698                                                         OTy(LTy F8))],
8699                                                  Call
8700                                                    ("readModRM",
8701                                                     PTy(CTy"Zreg",
8702                                                         PTy(CTy"Zrm",
8703                                                             OTy(LTy F8))),
8704                                                     TP[Var("REX",CTy"REX"),
8705                                                        Var("strm2",LTy F8)]),
8706                                                  Call
8707                                                    ("Zfull_inst",
8708                                                     CTy"Zinst",
8709                                                     TP[Var("p",LTy F8),
8710                                                        Call
8711                                                          ("Zset",
8712                                                           CTy"instruction",
8713                                                           TP[Mop(Cast
8714                                                                    (CTy"Zcond"),
8715                                                                  Mop(Cast
8716                                                                        F4,
8717                                                                      LL[bVar"b'3",
8718                                                                         bVar"b'2",
8719                                                                         bVar"b'1",
8720                                                                         bVar"b'0"])),
8721                                                              bVar"have_rex",
8722                                                              Var("rm",
8723                                                                  CTy"Zrm")]),
8724                                                        Var("strm3",
8725                                                            OTy(LTy F8))]))),
8726                                             (Bop(And,bVar"b'6",
8727                                                  Bop(And,
8728                                                      Mop(Not,bVar"b'4"),
8729                                                      Bop(And,
8730                                                          Mop(Not,
8731                                                              bVar"b'3"),
8732                                                          Bop(And,
8733                                                              Mop(Not,
8734                                                                  bVar"b'2"),
8735                                                              Mop(Not,
8736                                                                  bVar"b'1"))))),
8737                                              Let(TP[Var("reg",CTy"Zreg"),
8738                                                     Var("rm",CTy"Zrm"),
8739                                                     Var("strm3",
8740                                                         OTy(LTy F8))],
8741                                                  Call
8742                                                    ("readModRM",
8743                                                     PTy(CTy"Zreg",
8744                                                         PTy(CTy"Zrm",
8745                                                             OTy(LTy F8))),
8746                                                     TP[Var("REX",CTy"REX"),
8747                                                        Var("strm2",LTy F8)]),
8748                                                  Call
8749                                                    ("Zfull_inst",
8750                                                     CTy"Zinst",
8751                                                     TP[Var("p",LTy F8),
8752                                                        Call
8753                                                          ("Zxadd",
8754                                                           CTy"instruction",
8755                                                           TP[Call
8756                                                                ("OpSize",
8757                                                                 CTy"Zsize",
8758                                                                 TP[bVar"have_rex",
8759                                                                    Dest
8760                                                                      ("W",
8761                                                                       bTy,
8762                                                                       Var("REX",
8763                                                                           CTy"REX")),
8764                                                                    Mop(Cast
8765                                                                          F1,
8766                                                                        LL[bVar"b'0"]),
8767                                                                    bVar"op_size_override"]),
8768                                                              Var("rm",
8769                                                                  CTy"Zrm"),
8770                                                              Var("reg",
8771                                                                  CTy"Zreg")]),
8772                                                        Var("strm3",
8773                                                            OTy(LTy F8))]))),
8774                                             (Bop(And,bVar"b'6",
8775                                                  Bop(And,
8776                                                      Mop(Not,bVar"b'4"),
8777                                                      Bop(And,
8778                                                          Mop(Not,
8779                                                              bVar"b'3"),
8780                                                          Bop(And,
8781                                                              Mop(Not,
8782                                                                  bVar"b'2"),
8783                                                              Bop(And,
8784                                                                  bVar"b'1",
8785                                                                  Mop(Not,
8786                                                                      bVar"b'0")))))),
8787                                              Let(TP[Var("reg",FTy 3),
8788                                                     Var("rm",CTy"Zrm"),
8789                                                     Var("strm3",
8790                                                         OTy(LTy F8))],
8791                                                  Call
8792                                                    ("readOpcodeModRM",
8793                                                     PTy(FTy 3,
8794                                                         PTy(CTy"Zrm",
8795                                                             OTy(LTy F8))),
8796                                                     TP[Var("REX",CTy"REX"),
8797                                                        Var("strm2",LTy F8)]),
8798                                                  Let(TP[Var("imm",F64),
8799                                                         Var("strm4",
8800                                                             OTy(LTy F8))],
8801                                                      Call
8802                                                        ("oimmediate8",
8803                                                         PTy(F64,
8804                                                             OTy(LTy F8)),
8805                                                         Var("strm3",
8806                                                             OTy(LTy F8))),
8807                                                      Let(TP[Var("a0",
8808                                                                 CTy"sse_compare"),
8809                                                             Var("a2",
8810                                                                 CTy"xmm_mem")],
8811                                                          TP[Mop(Cast
8812                                                                   (CTy"sse_compare"),
8813                                                                 Var("imm",
8814                                                                     F64)),
8815                                                             Call
8816                                                               ("rm_to_xmm_mem",
8817                                                                CTy"xmm_mem",
8818                                                                Var("rm",
8819                                                                    CTy"Zrm"))],
8820                                                          CS(Var("p",
8821                                                                 LTy F8),
8822                                                             [(LL[LW(102,8)],
8823                                                               Call
8824                                                                 ("Zfull_inst",
8825                                                                  CTy"Zinst",
8826                                                                  TP[Var("p",
8827                                                                         LTy F8),
8828                                                                     Call
8829                                                                       ("SSE",
8830                                                                        CTy"instruction",
8831                                                                        Call
8832                                                                          ("CMPPD",
8833                                                                           CTy"SSE",
8834                                                                           TP[Var("a0",
8835                                                                                  CTy"sse_compare"),
8836                                                                              Var("reg",
8837                                                                                  FTy 3),
8838                                                                              Var("a2",
8839                                                                                  CTy"xmm_mem")])),
8840                                                                     Var("strm4",
8841                                                                         OTy(LTy F8))])),
8842                                                              (LL[LW(243,8)],
8843                                                               Call
8844                                                                 ("Zfull_inst",
8845                                                                  CTy"Zinst",
8846                                                                  TP[Var("p",
8847                                                                         LTy F8),
8848                                                                     Call
8849                                                                       ("SSE",
8850                                                                        CTy"instruction",
8851                                                                        Call
8852                                                                          ("CMPSS",
8853                                                                           CTy"SSE",
8854                                                                           TP[Var("a0",
8855                                                                                  CTy"sse_compare"),
8856                                                                              Var("reg",
8857                                                                                  FTy 3),
8858                                                                              Var("a2",
8859                                                                                  CTy"xmm_mem")])),
8860                                                                     Var("strm4",
8861                                                                         OTy(LTy F8))])),
8862                                                              (LL[LW(242,8)],
8863                                                               Call
8864                                                                 ("Zfull_inst",
8865                                                                  CTy"Zinst",
8866                                                                  TP[Var("p",
8867                                                                         LTy F8),
8868                                                                     Call
8869                                                                       ("SSE",
8870                                                                        CTy"instruction",
8871                                                                        Call
8872                                                                          ("CMPSD",
8873                                                                           CTy"SSE",
8874                                                                           TP[Var("a0",
8875                                                                                  CTy"sse_compare"),
8876                                                                              Var("reg",
8877                                                                                  FTy 3),
8878                                                                              Var("a2",
8879                                                                                  CTy"xmm_mem")])),
8880                                                                     Var("strm4",
8881                                                                         OTy(LTy F8))])),
8882                                                              (AVar
8883                                                                 (LTy F8),
8884                                                               Call
8885                                                                 ("Zfull_inst",
8886                                                                  CTy"Zinst",
8887                                                                  TP[Var("p",
8888                                                                         LTy F8),
8889                                                                     Call
8890                                                                       ("SSE",
8891                                                                        CTy"instruction",
8892                                                                        Call
8893                                                                          ("CMPPS",
8894                                                                           CTy"SSE",
8895                                                                           TP[Var("a0",
8896                                                                                  CTy"sse_compare"),
8897                                                                              Var("reg",
8898                                                                                  FTy 3),
8899                                                                              Var("a2",
8900                                                                                  CTy"xmm_mem")])),
8901                                                                     Var("strm4",
8902                                                                         OTy(LTy F8))]))])))))],
8903                                            Call
8904                                              ("Zdec_fail",CTy"Zinst",
8905                                               CC[LS
8906                                                   "Unsupported opcode: 0F ",
8907                                                  Mop(Cast sTy,
8908                                                      Var("opc",F8))]))),
8909                                       (Bop(And,Mop(Not,bVar"b'6"),
8910                                            Bop(And,bVar"b'4",
8911                                                Bop(And,
8912                                                    Mop(Not,bVar"b'3"),
8913                                                    Bop(And,
8914                                                        Mop(Not,bVar"b'2"),
8915                                                        Bop(And,
8916                                                            Mop(Not,
8917                                                                bVar"b'1"),
8918                                                            Mop(Not,
8919                                                                bVar"b'0")))))),
8920                                        Let(TP[Var("reg",FTy 3),
8921                                               Var("rm",CTy"Zrm"),
8922                                               Var("strm3",OTy(LTy F8))],
8923                                            Call
8924                                              ("readOpcodeModRM",
8925                                               PTy(FTy 3,
8926                                                   PTy(CTy"Zrm",
8927                                                       OTy(LTy F8))),
8928                                               TP[Var("REX",CTy"REX"),
8929                                                  Var("strm2",LTy F8)]),
8930                                            Let(TP[Var("a0",CTy"xmm_mem"),
8931                                                   Var("a1",CTy"xmm_mem")],
8932                                                TP[Call
8933                                                     ("xmm_reg",
8934                                                      CTy"xmm_mem",
8935                                                      Var("reg",FTy 3)),
8936                                                   Call
8937                                                     ("rm_to_xmm_mem",
8938                                                      CTy"xmm_mem",
8939                                                      Var("rm",CTy"Zrm"))],
8940                                                CS(Var("p",LTy F8),
8941                                                   [(LL[LW(102,8)],
8942                                                     Call
8943                                                       ("Zfull_inst",
8944                                                        CTy"Zinst",
8945                                                        TP[Var("p",LTy F8),
8946                                                           Call
8947                                                             ("SSE",
8948                                                              CTy"instruction",
8949                                                              Call
8950                                                                ("MOVUP_D_S",
8951                                                                 CTy"SSE",
8952                                                                 TP[LT,
8953                                                                    Var("a0",
8954                                                                        CTy"xmm_mem"),
8955                                                                    Var("a1",
8956                                                                        CTy"xmm_mem")])),
8957                                                           Var("strm3",
8958                                                               OTy(LTy F8))])),
8959                                                    (LL[LW(242,8)],
8960                                                     Call
8961                                                       ("Zfull_inst",
8962                                                        CTy"Zinst",
8963                                                        TP[Var("p",LTy F8),
8964                                                           Call
8965                                                             ("SSE",
8966                                                              CTy"instruction",
8967                                                              Call
8968                                                                ("MOVSD",
8969                                                                 CTy"SSE",
8970                                                                 TP[Var("a0",
8971                                                                        CTy"xmm_mem"),
8972                                                                    Var("a1",
8973                                                                        CTy"xmm_mem")])),
8974                                                           Var("strm3",
8975                                                               OTy(LTy F8))])),
8976                                                    (LL[LW(243,8)],
8977                                                     Call
8978                                                       ("Zfull_inst",
8979                                                        CTy"Zinst",
8980                                                        TP[Var("p",LTy F8),
8981                                                           Call
8982                                                             ("SSE",
8983                                                              CTy"instruction",
8984                                                              Call
8985                                                                ("MOVSS",
8986                                                                 CTy"SSE",
8987                                                                 TP[Var("a0",
8988                                                                        CTy"xmm_mem"),
8989                                                                    Var("a1",
8990                                                                        CTy"xmm_mem")])),
8991                                                           Var("strm3",
8992                                                               OTy(LTy F8))])),
8993                                                    (AVar(LTy F8),
8994                                                     Call
8995                                                       ("Zfull_inst",
8996                                                        CTy"Zinst",
8997                                                        TP[Var("p",LTy F8),
8998                                                           Call
8999                                                             ("SSE",
9000                                                              CTy"instruction",
9001                                                              Call
9002                                                                ("MOVUP_D_S",
9003                                                                 CTy"SSE",
9004                                                                 TP[LF,
9005                                                                    Var("a0",
9006                                                                        CTy"xmm_mem"),
9007                                                                    Var("a1",
9008                                                                        CTy"xmm_mem")])),
9009                                                           Var("strm3",
9010                                                               OTy(LTy F8))]))])))),
9011                                       (Bop(And,Mop(Not,bVar"b'6"),
9012                                            Bop(And,bVar"b'4",
9013                                                Bop(And,
9014                                                    Mop(Not,bVar"b'3"),
9015                                                    Bop(And,
9016                                                        Mop(Not,bVar"b'2"),
9017                                                        Bop(And,
9018                                                            Mop(Not,
9019                                                                bVar"b'1"),
9020                                                            bVar"b'0"))))),
9021                                        Let(TP[Var("reg",FTy 3),
9022                                               Var("rm",CTy"Zrm"),
9023                                               Var("strm3",OTy(LTy F8))],
9024                                            Call
9025                                              ("readOpcodeModRM",
9026                                               PTy(FTy 3,
9027                                                   PTy(CTy"Zrm",
9028                                                       OTy(LTy F8))),
9029                                               TP[Var("REX",CTy"REX"),
9030                                                  Var("strm2",LTy F8)]),
9031                                            Let(TP[Var("a0",CTy"xmm_mem"),
9032                                                   Var("a1",CTy"xmm_mem")],
9033                                                TP[Call
9034                                                     ("rm_to_xmm_mem",
9035                                                      CTy"xmm_mem",
9036                                                      Var("rm",CTy"Zrm")),
9037                                                   Call
9038                                                     ("xmm_reg",
9039                                                      CTy"xmm_mem",
9040                                                      Var("reg",FTy 3))],
9041                                                CS(Var("p",LTy F8),
9042                                                   [(LL[LW(102,8)],
9043                                                     Call
9044                                                       ("Zfull_inst",
9045                                                        CTy"Zinst",
9046                                                        TP[Var("p",LTy F8),
9047                                                           Call
9048                                                             ("SSE",
9049                                                              CTy"instruction",
9050                                                              Call
9051                                                                ("MOVUP_D_S",
9052                                                                 CTy"SSE",
9053                                                                 TP[LT,
9054                                                                    Var("a0",
9055                                                                        CTy"xmm_mem"),
9056                                                                    Var("a1",
9057                                                                        CTy"xmm_mem")])),
9058                                                           Var("strm3",
9059                                                               OTy(LTy F8))])),
9060                                                    (LL[LW(242,8)],
9061                                                     Call
9062                                                       ("Zfull_inst",
9063                                                        CTy"Zinst",
9064                                                        TP[Var("p",LTy F8),
9065                                                           Call
9066                                                             ("SSE",
9067                                                              CTy"instruction",
9068                                                              Call
9069                                                                ("MOVSD",
9070                                                                 CTy"SSE",
9071                                                                 TP[Var("a0",
9072                                                                        CTy"xmm_mem"),
9073                                                                    Var("a1",
9074                                                                        CTy"xmm_mem")])),
9075                                                           Var("strm3",
9076                                                               OTy(LTy F8))])),
9077                                                    (LL[LW(243,8)],
9078                                                     Call
9079                                                       ("Zfull_inst",
9080                                                        CTy"Zinst",
9081                                                        TP[Var("p",LTy F8),
9082                                                           Call
9083                                                             ("SSE",
9084                                                              CTy"instruction",
9085                                                              Call
9086                                                                ("MOVSS",
9087                                                                 CTy"SSE",
9088                                                                 TP[Var("a0",
9089                                                                        CTy"xmm_mem"),
9090                                                                    Var("a1",
9091                                                                        CTy"xmm_mem")])),
9092                                                           Var("strm3",
9093                                                               OTy(LTy F8))])),
9094                                                    (AVar(LTy F8),
9095                                                     Call
9096                                                       ("Zfull_inst",
9097                                                        CTy"Zinst",
9098                                                        TP[Var("p",LTy F8),
9099                                                           Call
9100                                                             ("SSE",
9101                                                              CTy"instruction",
9102                                                              Call
9103                                                                ("MOVUP_D_S",
9104                                                                 CTy"SSE",
9105                                                                 TP[LF,
9106                                                                    Var("a0",
9107                                                                        CTy"xmm_mem"),
9108                                                                    Var("a1",
9109                                                                        CTy"xmm_mem")])),
9110                                                           Var("strm3",
9111                                                               OTy(LTy F8))]))])))),
9112                                       (Bop(And,Mop(Not,bVar"b'6"),
9113                                            Bop(And,bVar"b'4",
9114                                                Bop(And,bVar"b'3",
9115                                                    Bop(And,bVar"b'2",
9116                                                        Bop(And,bVar"b'1",
9117                                                            bVar"b'0"))))),
9118                                        Let(TP[AVar(FTy 3),AVar(CTy"Zrm"),
9119                                               Var("strm3",OTy(LTy F8))],
9120                                            Call
9121                                              ("readOpcodeModRM",
9122                                               PTy(FTy 3,
9123                                                   PTy(CTy"Zrm",
9124                                                       OTy(LTy F8))),
9125                                               TP[Var("REX",CTy"REX"),
9126                                                  Var("strm2",LTy F8)]),
9127                                            Call
9128                                              ("Zfull_inst",CTy"Zinst",
9129                                               TP[Var("p",LTy F8),
9130                                                  Call
9131                                                    ("Znop",
9132                                                     CTy"instruction",
9133                                                     Mop(Length,
9134                                                         Var("strm",LTy F8))),
9135                                                  Var("strm3",OTy(LTy F8))]))),
9136                                       (Bop(And,bVar"b'6",
9137                                            Mop(Not,bVar"b'4")),
9138                                        Let(TP[Var("reg",CTy"Zreg"),
9139                                               Var("rm",CTy"Zrm"),
9140                                               Var("strm3",OTy(LTy F8))],
9141                                            Call
9142                                              ("readModRM",
9143                                               PTy(CTy"Zreg",
9144                                                   PTy(CTy"Zrm",
9145                                                       OTy(LTy F8))),
9146                                               TP[Var("REX",CTy"REX"),
9147                                                  Var("strm2",LTy F8)]),
9148                                            Call
9149                                              ("Zfull_inst",CTy"Zinst",
9150                                               TP[Var("p",LTy F8),
9151                                                  Call
9152                                                    ("Zmov",
9153                                                     CTy"instruction",
9154                                                     TP[Mop(Cast
9155                                                              (CTy"Zcond"),
9156                                                            Mop(Cast F4,
9157                                                                LL[bVar"b'3",
9158                                                                   bVar"b'2",
9159                                                                   bVar"b'1",
9160                                                                   bVar"b'0"])),
9161                                                        Call
9162                                                          ("OpSize",
9163                                                           CTy"Zsize",
9164                                                           TP[LT,
9165                                                              Dest
9166                                                                ("W",bTy,
9167                                                                 Var("REX",
9168                                                                     CTy"REX")),
9169                                                              LW(1,1),
9170                                                              bVar"op_size_override"]),
9171                                                        Call
9172                                                          ("Zr_rm",
9173                                                           CTy"Zdest_src",
9174                                                           TP[Var("reg",
9175                                                                  CTy"Zreg"),
9176                                                              Var("rm",
9177                                                                  CTy"Zrm")])]),
9178                                                  Var("strm3",OTy(LTy F8))]))),
9179                                       (Bop(And,bVar"b'6",
9180                                            Bop(And,bVar"b'4",
9181                                                Bop(And,
9182                                                    Mop(Not,bVar"b'3"),
9183                                                    Bop(And,
9184                                                        Mop(Not,bVar"b'2"),
9185                                                        Bop(And,
9186                                                            Mop(Not,
9187                                                                bVar"b'1"),
9188                                                            bVar"b'0"))))),
9189                                        Let(TP[Var("reg",FTy 3),
9190                                               Var("rm",CTy"Zrm"),
9191                                               Var("strm3",OTy(LTy F8))],
9192                                            Call
9193                                              ("readOpcodeModRM",
9194                                               PTy(FTy 3,
9195                                                   PTy(CTy"Zrm",
9196                                                       OTy(LTy F8))),
9197                                               TP[Var("REX",CTy"REX"),
9198                                                  Var("strm2",LTy F8)]),
9199                                            Let(Var("a1",CTy"xmm_mem"),
9200                                                Call
9201                                                  ("rm_to_xmm_mem",
9202                                                   CTy"xmm_mem",
9203                                                   Var("rm",CTy"Zrm")),
9204                                                CS(Var("p",LTy F8),
9205                                                   [(LL[LW(102,8)],
9206                                                     Call
9207                                                       ("Zfull_inst",
9208                                                        CTy"Zinst",
9209                                                        TP[Var("p",LTy F8),
9210                                                           Call
9211                                                             ("SSE",
9212                                                              CTy"instruction",
9213                                                              Call
9214                                                                ("SQRTPD",
9215                                                                 CTy"SSE",
9216                                                                 TP[Var("reg",
9217                                                                        FTy 3),
9218                                                                    Var("a1",
9219                                                                        CTy"xmm_mem")])),
9220                                                           Var("strm3",
9221                                                               OTy(LTy F8))])),
9222                                                    (LL[LW(243,8)],
9223                                                     Call
9224                                                       ("Zfull_inst",
9225                                                        CTy"Zinst",
9226                                                        TP[Var("p",LTy F8),
9227                                                           Call
9228                                                             ("SSE",
9229                                                              CTy"instruction",
9230                                                              Call
9231                                                                ("SQRTSS",
9232                                                                 CTy"SSE",
9233                                                                 TP[Var("reg",
9234                                                                        FTy 3),
9235                                                                    Var("a1",
9236                                                                        CTy"xmm_mem")])),
9237                                                           Var("strm3",
9238                                                               OTy(LTy F8))])),
9239                                                    (LL[LW(242,8)],
9240                                                     Call
9241                                                       ("Zfull_inst",
9242                                                        CTy"Zinst",
9243                                                        TP[Var("p",LTy F8),
9244                                                           Call
9245                                                             ("SSE",
9246                                                              CTy"instruction",
9247                                                              Call
9248                                                                ("SQRTSD",
9249                                                                 CTy"SSE",
9250                                                                 TP[Var("reg",
9251                                                                        FTy 3),
9252                                                                    Var("a1",
9253                                                                        CTy"xmm_mem")])),
9254                                                           Var("strm3",
9255                                                               OTy(LTy F8))])),
9256                                                    (AVar(LTy F8),
9257                                                     Call
9258                                                       ("Zfull_inst",
9259                                                        CTy"Zinst",
9260                                                        TP[Var("p",LTy F8),
9261                                                           Call
9262                                                             ("SSE",
9263                                                              CTy"instruction",
9264                                                              Call
9265                                                                ("SQRTPS",
9266                                                                 CTy"SSE",
9267                                                                 TP[Var("reg",
9268                                                                        FTy 3),
9269                                                                    Var("a1",
9270                                                                        CTy"xmm_mem")])),
9271                                                           Var("strm3",
9272                                                               OTy(LTy F8))]))])))),
9273                                       (Bop(And,bVar"b'6",
9274                                            Bop(And,bVar"b'4",
9275                                                Bop(And,
9276                                                    Mop(Not,bVar"b'3"),
9277                                                    bVar"b'2"))),
9278                                        Let(TP[Var("reg",FTy 3),
9279                                               Var("rm",CTy"Zrm"),
9280                                               Var("strm3",OTy(LTy F8))],
9281                                            Call
9282                                              ("readOpcodeModRM",
9283                                               PTy(FTy 3,
9284                                                   PTy(CTy"Zrm",
9285                                                       OTy(LTy F8))),
9286                                               TP[Var("REX",CTy"REX"),
9287                                                  Var("strm2",LTy F8)]),
9288                                            Let(TP[Var("a0",CTy"sse_logic"),
9289                                                   Var("a2",CTy"xmm_mem")],
9290                                                TP[Mop(Cast
9291                                                         (CTy"sse_logic"),
9292                                                       Mop(Cast(FTy 2),
9293                                                           LL[bVar"b'1",
9294                                                              bVar"b'0"])),
9295                                                   Call
9296                                                     ("rm_to_xmm_mem",
9297                                                      CTy"xmm_mem",
9298                                                      Var("rm",CTy"Zrm"))],
9299                                                CS(Var("p",LTy F8),
9300                                                   [(LL[LW(102,8)],
9301                                                     Call
9302                                                       ("Zfull_inst",
9303                                                        CTy"Zinst",
9304                                                        TP[Var("p",LTy F8),
9305                                                           Call
9306                                                             ("SSE",
9307                                                              CTy"instruction",
9308                                                              Call
9309                                                                ("logic_PD",
9310                                                                 CTy"SSE",
9311                                                                 TP[Var("a0",
9312                                                                        CTy"sse_logic"),
9313                                                                    Var("reg",
9314                                                                        FTy 3),
9315                                                                    Var("a2",
9316                                                                        CTy"xmm_mem")])),
9317                                                           Var("strm3",
9318                                                               OTy(LTy F8))])),
9319                                                    (AVar(LTy F8),
9320                                                     Call
9321                                                       ("Zfull_inst",
9322                                                        CTy"Zinst",
9323                                                        TP[Var("p",LTy F8),
9324                                                           Call
9325                                                             ("SSE",
9326                                                              CTy"instruction",
9327                                                              Call
9328                                                                ("logic_PS",
9329                                                                 CTy"SSE",
9330                                                                 TP[Var("a0",
9331                                                                        CTy"sse_logic"),
9332                                                                    Var("reg",
9333                                                                        FTy 3),
9334                                                                    Var("a2",
9335                                                                        CTy"xmm_mem")])),
9336                                                           Var("strm3",
9337                                                               OTy(LTy F8))]))])))),
9338                                       (Bop(And,bVar"b'6",
9339                                            Bop(And,bVar"b'4",bVar"b'3")),
9340                                        Let(TP[Var("reg",FTy 3),
9341                                               Var("rm",CTy"Zrm"),
9342                                               Var("strm3",OTy(LTy F8))],
9343                                            Call
9344                                              ("readOpcodeModRM",
9345                                               PTy(FTy 3,
9346                                                   PTy(CTy"Zrm",
9347                                                       OTy(LTy F8))),
9348                                               TP[Var("REX",CTy"REX"),
9349                                                  Var("strm2",LTy F8)]),
9350                                            Let(Var("a1",CTy"xmm_mem"),
9351                                                Call
9352                                                  ("rm_to_xmm_mem",
9353                                                   CTy"xmm_mem",
9354                                                   Var("rm",CTy"Zrm")),
9355                                                CS(TP[Mop(Cast(FTy 3),
9356                                                          LL[bVar"b'2",
9357                                                             bVar"b'1",
9358                                                             bVar"b'0"]),
9359                                                      Var("p",LTy F8)],
9360                                                   [(TP[LW(0,3),
9361                                                        LL[LW(102,8)]],
9362                                                     Call
9363                                                       ("Zfull_inst",
9364                                                        CTy"Zinst",
9365                                                        TP[Var("p",LTy F8),
9366                                                           Call
9367                                                             ("SSE",
9368                                                              CTy"instruction",
9369                                                              Call
9370                                                                ("bin_PD",
9371                                                                 CTy"SSE",
9372                                                                 TP[LC("sse_add",
9373                                                                       CTy"sse_binop"),
9374                                                                    Var("reg",
9375                                                                        FTy 3),
9376                                                                    Var("a1",
9377                                                                        CTy"xmm_mem")])),
9378                                                           Var("strm3",
9379                                                               OTy(LTy F8))])),
9380                                                    (TP[LW(0,3),
9381                                                        LL[LW(243,8)]],
9382                                                     Call
9383                                                       ("Zfull_inst",
9384                                                        CTy"Zinst",
9385                                                        TP[Var("p",LTy F8),
9386                                                           Call
9387                                                             ("SSE",
9388                                                              CTy"instruction",
9389                                                              Call
9390                                                                ("bin_SS",
9391                                                                 CTy"SSE",
9392                                                                 TP[LC("sse_add",
9393                                                                       CTy"sse_binop"),
9394                                                                    Var("reg",
9395                                                                        FTy 3),
9396                                                                    Var("a1",
9397                                                                        CTy"xmm_mem")])),
9398                                                           Var("strm3",
9399                                                               OTy(LTy F8))])),
9400                                                    (TP[LW(0,3),
9401                                                        LL[LW(242,8)]],
9402                                                     Call
9403                                                       ("Zfull_inst",
9404                                                        CTy"Zinst",
9405                                                        TP[Var("p",LTy F8),
9406                                                           Call
9407                                                             ("SSE",
9408                                                              CTy"instruction",
9409                                                              Call
9410                                                                ("bin_SD",
9411                                                                 CTy"SSE",
9412                                                                 TP[LC("sse_add",
9413                                                                       CTy"sse_binop"),
9414                                                                    Var("reg",
9415                                                                        FTy 3),
9416                                                                    Var("a1",
9417                                                                        CTy"xmm_mem")])),
9418                                                           Var("strm3",
9419                                                               OTy(LTy F8))])),
9420                                                    (TP[LW(0,3),
9421                                                        AVar(LTy F8)],
9422                                                     Call
9423                                                       ("Zfull_inst",
9424                                                        CTy"Zinst",
9425                                                        TP[Var("p",LTy F8),
9426                                                           Call
9427                                                             ("SSE",
9428                                                              CTy"instruction",
9429                                                              Call
9430                                                                ("bin_PS",
9431                                                                 CTy"SSE",
9432                                                                 TP[LC("sse_add",
9433                                                                       CTy"sse_binop"),
9434                                                                    Var("reg",
9435                                                                        FTy 3),
9436                                                                    Var("a1",
9437                                                                        CTy"xmm_mem")])),
9438                                                           Var("strm3",
9439                                                               OTy(LTy F8))])),
9440                                                    (TP[LW(1,3),
9441                                                        LL[LW(102,8)]],
9442                                                     Call
9443                                                       ("Zfull_inst",
9444                                                        CTy"Zinst",
9445                                                        TP[Var("p",LTy F8),
9446                                                           Call
9447                                                             ("SSE",
9448                                                              CTy"instruction",
9449                                                              Call
9450                                                                ("bin_PD",
9451                                                                 CTy"SSE",
9452                                                                 TP[LC("sse_mul",
9453                                                                       CTy"sse_binop"),
9454                                                                    Var("reg",
9455                                                                        FTy 3),
9456                                                                    Var("a1",
9457                                                                        CTy"xmm_mem")])),
9458                                                           Var("strm3",
9459                                                               OTy(LTy F8))])),
9460                                                    (TP[LW(1,3),
9461                                                        LL[LW(243,8)]],
9462                                                     Call
9463                                                       ("Zfull_inst",
9464                                                        CTy"Zinst",
9465                                                        TP[Var("p",LTy F8),
9466                                                           Call
9467                                                             ("SSE",
9468                                                              CTy"instruction",
9469                                                              Call
9470                                                                ("bin_SS",
9471                                                                 CTy"SSE",
9472                                                                 TP[LC("sse_mul",
9473                                                                       CTy"sse_binop"),
9474                                                                    Var("reg",
9475                                                                        FTy 3),
9476                                                                    Var("a1",
9477                                                                        CTy"xmm_mem")])),
9478                                                           Var("strm3",
9479                                                               OTy(LTy F8))])),
9480                                                    (TP[LW(1,3),
9481                                                        LL[LW(242,8)]],
9482                                                     Call
9483                                                       ("Zfull_inst",
9484                                                        CTy"Zinst",
9485                                                        TP[Var("p",LTy F8),
9486                                                           Call
9487                                                             ("SSE",
9488                                                              CTy"instruction",
9489                                                              Call
9490                                                                ("bin_SD",
9491                                                                 CTy"SSE",
9492                                                                 TP[LC("sse_mul",
9493                                                                       CTy"sse_binop"),
9494                                                                    Var("reg",
9495                                                                        FTy 3),
9496                                                                    Var("a1",
9497                                                                        CTy"xmm_mem")])),
9498                                                           Var("strm3",
9499                                                               OTy(LTy F8))])),
9500                                                    (TP[LW(1,3),
9501                                                        AVar(LTy F8)],
9502                                                     Call
9503                                                       ("Zfull_inst",
9504                                                        CTy"Zinst",
9505                                                        TP[Var("p",LTy F8),
9506                                                           Call
9507                                                             ("SSE",
9508                                                              CTy"instruction",
9509                                                              Call
9510                                                                ("bin_PS",
9511                                                                 CTy"SSE",
9512                                                                 TP[LC("sse_mul",
9513                                                                       CTy"sse_binop"),
9514                                                                    Var("reg",
9515                                                                        FTy 3),
9516                                                                    Var("a1",
9517                                                                        CTy"xmm_mem")])),
9518                                                           Var("strm3",
9519                                                               OTy(LTy F8))])),
9520                                                    (TP[LW(2,3),
9521                                                        LL[LW(102,8)]],
9522                                                     Call
9523                                                       ("Zfull_inst",
9524                                                        CTy"Zinst",
9525                                                        TP[Var("p",LTy F8),
9526                                                           Call
9527                                                             ("SSE",
9528                                                              CTy"instruction",
9529                                                              Call
9530                                                                ("CVTPD2PS",
9531                                                                 CTy"SSE",
9532                                                                 TP[Var("reg",
9533                                                                        FTy 3),
9534                                                                    Var("a1",
9535                                                                        CTy"xmm_mem")])),
9536                                                           Var("strm3",
9537                                                               OTy(LTy F8))])),
9538                                                    (TP[LW(2,3),
9539                                                        LL[LW(243,8)]],
9540                                                     Call
9541                                                       ("Zfull_inst",
9542                                                        CTy"Zinst",
9543                                                        TP[Var("p",LTy F8),
9544                                                           Call
9545                                                             ("SSE",
9546                                                              CTy"instruction",
9547                                                              Call
9548                                                                ("CVTSS2SD",
9549                                                                 CTy"SSE",
9550                                                                 TP[Var("reg",
9551                                                                        FTy 3),
9552                                                                    Var("a1",
9553                                                                        CTy"xmm_mem")])),
9554                                                           Var("strm3",
9555                                                               OTy(LTy F8))])),
9556                                                    (TP[LW(2,3),
9557                                                        LL[LW(242,8)]],
9558                                                     Call
9559                                                       ("Zfull_inst",
9560                                                        CTy"Zinst",
9561                                                        TP[Var("p",LTy F8),
9562                                                           Call
9563                                                             ("SSE",
9564                                                              CTy"instruction",
9565                                                              Call
9566                                                                ("CVTSD2SS",
9567                                                                 CTy"SSE",
9568                                                                 TP[Var("reg",
9569                                                                        FTy 3),
9570                                                                    Var("a1",
9571                                                                        CTy"xmm_mem")])),
9572                                                           Var("strm3",
9573                                                               OTy(LTy F8))])),
9574                                                    (TP[LW(2,3),
9575                                                        AVar(LTy F8)],
9576                                                     Call
9577                                                       ("Zfull_inst",
9578                                                        CTy"Zinst",
9579                                                        TP[Var("p",LTy F8),
9580                                                           Call
9581                                                             ("SSE",
9582                                                              CTy"instruction",
9583                                                              Call
9584                                                                ("CVTPS2PD",
9585                                                                 CTy"SSE",
9586                                                                 TP[Var("reg",
9587                                                                        FTy 3),
9588                                                                    Var("a1",
9589                                                                        CTy"xmm_mem")])),
9590                                                           Var("strm3",
9591                                                               OTy(LTy F8))])),
9592                                                    (TP[LW(3,3),
9593                                                        LL[LW(102,8)]],
9594                                                     Call
9595                                                       ("Zfull_inst",
9596                                                        CTy"Zinst",
9597                                                        TP[Var("p",LTy F8),
9598                                                           Call
9599                                                             ("SSE",
9600                                                              CTy"instruction",
9601                                                              Call
9602                                                                ("CVTPS2DQ",
9603                                                                 CTy"SSE",
9604                                                                 TP[LF,
9605                                                                    Var("reg",
9606                                                                        FTy 3),
9607                                                                    Var("a1",
9608                                                                        CTy"xmm_mem")])),
9609                                                           Var("strm3",
9610                                                               OTy(LTy F8))])),
9611                                                    (TP[LW(3,3),
9612                                                        LL[LW(243,8)]],
9613                                                     Call
9614                                                       ("Zfull_inst",
9615                                                        CTy"Zinst",
9616                                                        TP[Var("p",LTy F8),
9617                                                           Call
9618                                                             ("SSE",
9619                                                              CTy"instruction",
9620                                                              Call
9621                                                                ("CVTPS2DQ",
9622                                                                 CTy"SSE",
9623                                                                 TP[LT,
9624                                                                    Var("reg",
9625                                                                        FTy 3),
9626                                                                    Var("a1",
9627                                                                        CTy"xmm_mem")])),
9628                                                           Var("strm3",
9629                                                               OTy(LTy F8))])),
9630                                                    (TP[LW(3,3),
9631                                                        LL[LW(242,8)]],
9632                                                     Call
9633                                                       ("Zdec_fail",
9634                                                        CTy"Zinst",
9635                                                        CC[LS
9636                                                            "Unsupported opcode: 0F ",
9637                                                           Mop(Cast sTy,
9638                                                               Var("opc",
9639                                                                   F8))])),
9640                                                    (TP[LW(3,3),
9641                                                        AVar(LTy F8)],
9642                                                     Call
9643                                                       ("Zfull_inst",
9644                                                        CTy"Zinst",
9645                                                        TP[Var("p",LTy F8),
9646                                                           Call
9647                                                             ("SSE",
9648                                                              CTy"instruction",
9649                                                              Call
9650                                                                ("CVTDQ2PS",
9651                                                                 CTy"SSE",
9652                                                                 TP[Var("reg",
9653                                                                        FTy 3),
9654                                                                    Var("a1",
9655                                                                        CTy"xmm_mem")])),
9656                                                           Var("strm3",
9657                                                               OTy(LTy F8))])),
9658                                                    (TP[LW(4,3),
9659                                                        LL[LW(102,8)]],
9660                                                     Call
9661                                                       ("Zfull_inst",
9662                                                        CTy"Zinst",
9663                                                        TP[Var("p",LTy F8),
9664                                                           Call
9665                                                             ("SSE",
9666                                                              CTy"instruction",
9667                                                              Call
9668                                                                ("bin_PD",
9669                                                                 CTy"SSE",
9670                                                                 TP[LC("sse_sub",
9671                                                                       CTy"sse_binop"),
9672                                                                    Var("reg",
9673                                                                        FTy 3),
9674                                                                    Var("a1",
9675                                                                        CTy"xmm_mem")])),
9676                                                           Var("strm3",
9677                                                               OTy(LTy F8))])),
9678                                                    (TP[LW(4,3),
9679                                                        LL[LW(243,8)]],
9680                                                     Call
9681                                                       ("Zfull_inst",
9682                                                        CTy"Zinst",
9683                                                        TP[Var("p",LTy F8),
9684                                                           Call
9685                                                             ("SSE",
9686                                                              CTy"instruction",
9687                                                              Call
9688                                                                ("bin_SS",
9689                                                                 CTy"SSE",
9690                                                                 TP[LC("sse_sub",
9691                                                                       CTy"sse_binop"),
9692                                                                    Var("reg",
9693                                                                        FTy 3),
9694                                                                    Var("a1",
9695                                                                        CTy"xmm_mem")])),
9696                                                           Var("strm3",
9697                                                               OTy(LTy F8))])),
9698                                                    (TP[LW(4,3),
9699                                                        LL[LW(242,8)]],
9700                                                     Call
9701                                                       ("Zfull_inst",
9702                                                        CTy"Zinst",
9703                                                        TP[Var("p",LTy F8),
9704                                                           Call
9705                                                             ("SSE",
9706                                                              CTy"instruction",
9707                                                              Call
9708                                                                ("bin_SD",
9709                                                                 CTy"SSE",
9710                                                                 TP[LC("sse_sub",
9711                                                                       CTy"sse_binop"),
9712                                                                    Var("reg",
9713                                                                        FTy 3),
9714                                                                    Var("a1",
9715                                                                        CTy"xmm_mem")])),
9716                                                           Var("strm3",
9717                                                               OTy(LTy F8))])),
9718                                                    (TP[LW(4,3),
9719                                                        AVar(LTy F8)],
9720                                                     Call
9721                                                       ("Zfull_inst",
9722                                                        CTy"Zinst",
9723                                                        TP[Var("p",LTy F8),
9724                                                           Call
9725                                                             ("SSE",
9726                                                              CTy"instruction",
9727                                                              Call
9728                                                                ("bin_PS",
9729                                                                 CTy"SSE",
9730                                                                 TP[LC("sse_sub",
9731                                                                       CTy"sse_binop"),
9732                                                                    Var("reg",
9733                                                                        FTy 3),
9734                                                                    Var("a1",
9735                                                                        CTy"xmm_mem")])),
9736                                                           Var("strm3",
9737                                                               OTy(LTy F8))])),
9738                                                    (TP[LW(5,3),
9739                                                        LL[LW(102,8)]],
9740                                                     Call
9741                                                       ("Zfull_inst",
9742                                                        CTy"Zinst",
9743                                                        TP[Var("p",LTy F8),
9744                                                           Call
9745                                                             ("SSE",
9746                                                              CTy"instruction",
9747                                                              Call
9748                                                                ("bin_PD",
9749                                                                 CTy"SSE",
9750                                                                 TP[LC("sse_min",
9751                                                                       CTy"sse_binop"),
9752                                                                    Var("reg",
9753                                                                        FTy 3),
9754                                                                    Var("a1",
9755                                                                        CTy"xmm_mem")])),
9756                                                           Var("strm3",
9757                                                               OTy(LTy F8))])),
9758                                                    (TP[LW(5,3),
9759                                                        LL[LW(243,8)]],
9760                                                     Call
9761                                                       ("Zfull_inst",
9762                                                        CTy"Zinst",
9763                                                        TP[Var("p",LTy F8),
9764                                                           Call
9765                                                             ("SSE",
9766                                                              CTy"instruction",
9767                                                              Call
9768                                                                ("bin_SS",
9769                                                                 CTy"SSE",
9770                                                                 TP[LC("sse_min",
9771                                                                       CTy"sse_binop"),
9772                                                                    Var("reg",
9773                                                                        FTy 3),
9774                                                                    Var("a1",
9775                                                                        CTy"xmm_mem")])),
9776                                                           Var("strm3",
9777                                                               OTy(LTy F8))])),
9778                                                    (TP[LW(5,3),
9779                                                        LL[LW(242,8)]],
9780                                                     Call
9781                                                       ("Zfull_inst",
9782                                                        CTy"Zinst",
9783                                                        TP[Var("p",LTy F8),
9784                                                           Call
9785                                                             ("SSE",
9786                                                              CTy"instruction",
9787                                                              Call
9788                                                                ("bin_SD",
9789                                                                 CTy"SSE",
9790                                                                 TP[LC("sse_min",
9791                                                                       CTy"sse_binop"),
9792                                                                    Var("reg",
9793                                                                        FTy 3),
9794                                                                    Var("a1",
9795                                                                        CTy"xmm_mem")])),
9796                                                           Var("strm3",
9797                                                               OTy(LTy F8))])),
9798                                                    (TP[LW(5,3),
9799                                                        AVar(LTy F8)],
9800                                                     Call
9801                                                       ("Zfull_inst",
9802                                                        CTy"Zinst",
9803                                                        TP[Var("p",LTy F8),
9804                                                           Call
9805                                                             ("SSE",
9806                                                              CTy"instruction",
9807                                                              Call
9808                                                                ("bin_PS",
9809                                                                 CTy"SSE",
9810                                                                 TP[LC("sse_min",
9811                                                                       CTy"sse_binop"),
9812                                                                    Var("reg",
9813                                                                        FTy 3),
9814                                                                    Var("a1",
9815                                                                        CTy"xmm_mem")])),
9816                                                           Var("strm3",
9817                                                               OTy(LTy F8))])),
9818                                                    (TP[LW(6,3),
9819                                                        LL[LW(102,8)]],
9820                                                     Call
9821                                                       ("Zfull_inst",
9822                                                        CTy"Zinst",
9823                                                        TP[Var("p",LTy F8),
9824                                                           Call
9825                                                             ("SSE",
9826                                                              CTy"instruction",
9827                                                              Call
9828                                                                ("bin_PD",
9829                                                                 CTy"SSE",
9830                                                                 TP[LC("sse_div",
9831                                                                       CTy"sse_binop"),
9832                                                                    Var("reg",
9833                                                                        FTy 3),
9834                                                                    Var("a1",
9835                                                                        CTy"xmm_mem")])),
9836                                                           Var("strm3",
9837                                                               OTy(LTy F8))])),
9838                                                    (TP[LW(6,3),
9839                                                        LL[LW(243,8)]],
9840                                                     Call
9841                                                       ("Zfull_inst",
9842                                                        CTy"Zinst",
9843                                                        TP[Var("p",LTy F8),
9844                                                           Call
9845                                                             ("SSE",
9846                                                              CTy"instruction",
9847                                                              Call
9848                                                                ("bin_SS",
9849                                                                 CTy"SSE",
9850                                                                 TP[LC("sse_div",
9851                                                                       CTy"sse_binop"),
9852                                                                    Var("reg",
9853                                                                        FTy 3),
9854                                                                    Var("a1",
9855                                                                        CTy"xmm_mem")])),
9856                                                           Var("strm3",
9857                                                               OTy(LTy F8))])),
9858                                                    (TP[LW(6,3),
9859                                                        LL[LW(242,8)]],
9860                                                     Call
9861                                                       ("Zfull_inst",
9862                                                        CTy"Zinst",
9863                                                        TP[Var("p",LTy F8),
9864                                                           Call
9865                                                             ("SSE",
9866                                                              CTy"instruction",
9867                                                              Call
9868                                                                ("bin_SD",
9869                                                                 CTy"SSE",
9870                                                                 TP[LC("sse_div",
9871                                                                       CTy"sse_binop"),
9872                                                                    Var("reg",
9873                                                                        FTy 3),
9874                                                                    Var("a1",
9875                                                                        CTy"xmm_mem")])),
9876                                                           Var("strm3",
9877                                                               OTy(LTy F8))])),
9878                                                    (TP[LW(6,3),
9879                                                        AVar(LTy F8)],
9880                                                     Call
9881                                                       ("Zfull_inst",
9882                                                        CTy"Zinst",
9883                                                        TP[Var("p",LTy F8),
9884                                                           Call
9885                                                             ("SSE",
9886                                                              CTy"instruction",
9887                                                              Call
9888                                                                ("bin_PS",
9889                                                                 CTy"SSE",
9890                                                                 TP[LC("sse_div",
9891                                                                       CTy"sse_binop"),
9892                                                                    Var("reg",
9893                                                                        FTy 3),
9894                                                                    Var("a1",
9895                                                                        CTy"xmm_mem")])),
9896                                                           Var("strm3",
9897                                                               OTy(LTy F8))])),
9898                                                    (TP[LW(7,3),
9899                                                        LL[LW(102,8)]],
9900                                                     Call
9901                                                       ("Zfull_inst",
9902                                                        CTy"Zinst",
9903                                                        TP[Var("p",LTy F8),
9904                                                           Call
9905                                                             ("SSE",
9906                                                              CTy"instruction",
9907                                                              Call
9908                                                                ("bin_PD",
9909                                                                 CTy"SSE",
9910                                                                 TP[LC("sse_max",
9911                                                                       CTy"sse_binop"),
9912                                                                    Var("reg",
9913                                                                        FTy 3),
9914                                                                    Var("a1",
9915                                                                        CTy"xmm_mem")])),
9916                                                           Var("strm3",
9917                                                               OTy(LTy F8))])),
9918                                                    (TP[LW(7,3),
9919                                                        LL[LW(243,8)]],
9920                                                     Call
9921                                                       ("Zfull_inst",
9922                                                        CTy"Zinst",
9923                                                        TP[Var("p",LTy F8),
9924                                                           Call
9925                                                             ("SSE",
9926                                                              CTy"instruction",
9927                                                              Call
9928                                                                ("bin_SS",
9929                                                                 CTy"SSE",
9930                                                                 TP[LC("sse_max",
9931                                                                       CTy"sse_binop"),
9932                                                                    Var("reg",
9933                                                                        FTy 3),
9934                                                                    Var("a1",
9935                                                                        CTy"xmm_mem")])),
9936                                                           Var("strm3",
9937                                                               OTy(LTy F8))])),
9938                                                    (TP[LW(7,3),
9939                                                        LL[LW(242,8)]],
9940                                                     Call
9941                                                       ("Zfull_inst",
9942                                                        CTy"Zinst",
9943                                                        TP[Var("p",LTy F8),
9944                                                           Call
9945                                                             ("SSE",
9946                                                              CTy"instruction",
9947                                                              Call
9948                                                                ("bin_SD",
9949                                                                 CTy"SSE",
9950                                                                 TP[LC("sse_max",
9951                                                                       CTy"sse_binop"),
9952                                                                    Var("reg",
9953                                                                        FTy 3),
9954                                                                    Var("a1",
9955                                                                        CTy"xmm_mem")])),
9956                                                           Var("strm3",
9957                                                               OTy(LTy F8))])),
9958                                                    (TP[LW(7,3),
9959                                                        AVar(LTy F8)],
9960                                                     Call
9961                                                       ("Zfull_inst",
9962                                                        CTy"Zinst",
9963                                                        TP[Var("p",LTy F8),
9964                                                           Call
9965                                                             ("SSE",
9966                                                              CTy"instruction",
9967                                                              Call
9968                                                                ("bin_PS",
9969                                                                 CTy"SSE",
9970                                                                 TP[LC("sse_max",
9971                                                                       CTy"sse_binop"),
9972                                                                    Var("reg",
9973                                                                        FTy 3),
9974                                                                    Var("a1",
9975                                                                        CTy"xmm_mem")])),
9976                                                           Var("strm3",
9977                                                               OTy(LTy F8))]))]))))],
9978                                      Call
9979                                        ("Zdec_fail",CTy"Zinst",
9980                                         CC[LS"Unsupported opcode: 0F ",
9981                                            Mop(Cast sTy,Var("opc",F8))])))),
9982                             (TP[TP[bVar"opc'7",bVar"opc'6",bVar"opc'5",
9983                                    bVar"opc'4",bVar"opc'3",bVar"opc'2",
9984                                    bVar"opc'1",bVar"opc'0"],AVar(LTy F8)],
9985                              Call
9986                                ("Zdec_fail",CTy"Zinst",
9987                                 CC[LS"Unsupported opcode: ",
9988                                    Mop(Cast sTy,
9989                                        Mop(Cast F8,
9990                                            LL[bVar"opc'7",bVar"opc'6",
9991                                               bVar"opc'5",bVar"opc'4",
9992                                               bVar"opc'3",bVar"opc'2",
9993                                               bVar"opc'1",bVar"opc'0"]))]))])),
9994                        (LNL F8,Call("Zdec_fail",CTy"Zinst",LS"No opcode"))])))))]))
9995;
9996val x64_fetch_def = Def
9997  ("x64_fetch",qVar"state",
9998   Mop(Fst,
9999       Mop(Snd,
10000           Apply
10001             (For(TP[LN 19,LN 0,
10002                     Close
10003                       (nVar"i",
10004                        Close
10005                          (Var("state",PTy(LTy F8,qTy)),
10006                           TP[LU,
10007                              LLC([Apply
10008                                     (Dest
10009                                        ("MEM",ATy(F64,F8),
10010                                         Mop(Snd,
10011                                             Var("state",PTy(LTy F8,qTy)))),
10012                                      Bop(Add,
10013                                          Dest
10014                                            ("RIP",F64,
10015                                             Mop(Snd,
10016                                                 Var("state",
10017                                                     PTy(LTy F8,qTy)))),
10018                                          Mop(Cast F64,nVar"i")))],
10019                                  Mop(Fst,Var("state",PTy(LTy F8,qTy)))),
10020                              Mop(Snd,Var("state",PTy(LTy F8,qTy)))]))]),
10021              TP[LNL F8,qVar"state"]))))
10022;
10023val x64_next_def = Def
10024  ("x64_next",qVar"state",
10025   CS(Call
10026        ("x64_decode",CTy"Zinst",
10027         Apply(Const("x64_fetch",ATy(qTy,LTy F8)),qVar"state")),
10028      [(Call
10029          ("Zfull_inst",CTy"Zinst",
10030           TP[AVar(LTy F8),Var("i",CTy"instruction"),
10031              Mop(Some,Var("strm1",LTy F8))]),
10032        Apply
10033          (Call("Run",ATy(qTy,qTy),Var("i",CTy"instruction")),
10034           Rupd
10035             ("RIP",
10036              TP[qVar"state",
10037                 Bop(Add,Dest("RIP",F64,qVar"state"),
10038                     Mop(Cast F64,
10039                         Bop(Sub,LN 20,Mop(Length,Var("strm1",LTy F8)))))]))),
10040       (Call
10041          ("Zfull_inst",CTy"Zinst",
10042           TP[AVar(LTy F8),AVar(CTy"instruction"),LO(LTy F8)]),
10043        Mop(Snd,
10044            Apply
10045              (Call
10046                 ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
10047                  Call("FAILURE",CTy"exception",LS"not enough bytes")),
10048               qVar"state"))),
10049       (Call("Zdec_fail",CTy"Zinst",sVar"s0"),
10050        Mop(Snd,
10051            Apply
10052              (Call
10053                 ("raise'exception",ATy(qTy,PTy(uTy,qTy)),
10054                  Call("FAILURE",CTy"exception",sVar"s0")),qVar"state")))]))
10055;
10056val e_imm8_def = Def
10057  ("e_imm8",Var("imm",F64),
10058   ITE(Bop(And,Bop(Le,LW(18446744073709551488,64),Var("imm",F64)),
10059           Bop(Le,Var("imm",F64),LW(127,64))),
10060       LL[EX(Var("imm",F64),LN 7,LN 0,F8)],LNL F8))
10061;
10062val e_imm16_def = Def
10063  ("e_imm16",Var("imm",F64),
10064   ITE(Bop(And,Bop(Le,LW(18446744073709518848,64),Var("imm",F64)),
10065           Bop(Le,Var("imm",F64),LW(32767,64))),
10066       LL[EX(Var("imm",F64),LN 7,LN 0,F8),EX(Var("imm",F64),LN 15,LN 8,F8)],
10067       LNL F8))
10068;
10069val e_imm32_def = Def
10070  ("e_imm32",Var("imm",F64),
10071   ITE(Bop(And,Bop(Le,LW(18446744071562067968,64),Var("imm",F64)),
10072           Bop(Le,Var("imm",F64),LW(2147483647,64))),
10073       LL[EX(Var("imm",F64),LN 7,LN 0,F8),
10074          EX(Var("imm",F64),LN 15,LN 8,F8),
10075          EX(Var("imm",F64),LN 23,LN 16,F8),
10076          EX(Var("imm",F64),LN 31,LN 24,F8)],LNL F8))
10077;
10078val e_imm64_def = Def
10079  ("e_imm64",Var("imm",F64),
10080   LL[EX(Var("imm",F64),LN 7,LN 0,F8),EX(Var("imm",F64),LN 15,LN 8,F8),
10081      EX(Var("imm",F64),LN 23,LN 16,F8),EX(Var("imm",F64),LN 31,LN 24,F8),
10082      EX(Var("imm",F64),LN 39,LN 32,F8),EX(Var("imm",F64),LN 47,LN 40,F8),
10083      EX(Var("imm",F64),LN 55,LN 48,F8),EX(Var("imm",F64),LN 63,LN 56,F8)])
10084;
10085val e_imm_def = Def
10086  ("e_imm",Var("imm",F64),
10087   CS(Call("e_imm8",LTy F8,Var("imm",F64)),
10088      [(LNL F8,
10089        CS(Call("e_imm16",LTy F8,Var("imm",F64)),
10090           [(LNL F8,
10091             CS(Call("e_imm32",LTy F8,Var("imm",F64)),
10092                [(LNL F8,Call("e_imm64",LTy F8,Var("imm",F64))),
10093                 (Var("l",LTy F8),Var("l",LTy F8))])),
10094            (Var("l",LTy F8),Var("l",LTy F8))])),
10095       (Var("l",LTy F8),Var("l",LTy F8))]))
10096;
10097val e_imm_8_32_def = Def
10098  ("e_imm_8_32",Var("imm",F64),
10099   CS(Call("e_imm8",LTy F8,Var("imm",F64)),
10100      [(LNL F8,
10101        CS(Call("e_imm32",LTy F8,Var("imm",F64)),
10102           [(LNL F8,TP[LN 8,LNL F8]),
10103            (Var("l",LTy F8),TP[LN 4,Var("l",LTy F8)])])),
10104       (Var("l",LTy F8),TP[LN 1,Var("l",LTy F8)])]))
10105;
10106val e_ModRM_def = Def
10107  ("e_ModRM",TP[Var("r",F4),Var("rm",CTy"Zrm")],
10108   CS(Var("rm",CTy"Zrm"),
10109      [(Call
10110          ("Zm",CTy"Zrm",
10111           TP[LO(PTy(FTy 2,CTy"Zreg")),Const("ZripBase",CTy"Zbase"),
10112              Var("displacement",F64)]),
10113        Mop(Some,
10114            TP[CC[LW(0,1),EX(Var("r",F4),LN 3,LN 3,F1),LW(0,2)],
10115               LLC([CC[LW(0,2),EX(Var("r",F4),LN 2,LN 0,FTy 3),LW(5,3)]],
10116                   Call("e_imm32",LTy F8,Var("displacement",F64)))])),
10117       (Call("Zr",CTy"Zrm",Var("rm",CTy"Zreg")),
10118        Let(Var("rm",F4),Mop(Cast F4,Var("rm",CTy"Zreg")),
10119            Mop(Some,
10120                TP[CC[LW(0,1),EX(Var("r",F4),LN 3,LN 3,F1),LW(0,1),
10121                      EX(Var("rm",F4),LN 3,LN 3,F1)],
10122                   LL[CC[LW(3,2),EX(Var("r",F4),LN 2,LN 0,FTy 3),
10123                         EX(Var("rm",F4),LN 2,LN 0,FTy 3)]]]))),
10124       (Call
10125          ("Zm",CTy"Zrm",
10126           TP[LO(PTy(FTy 2,CTy"Zreg")),Const("ZnoBase",CTy"Zbase"),
10127              Var("imm",F64)]),
10128        CS(Call("e_imm32",LTy F8,Var("imm",F64)),
10129           [(LNL F8,LO(PTy(F4,LTy F8))),
10130            (Var("l",LTy F8),
10131             Mop(Some,
10132                 TP[CC[LW(0,1),EX(Var("r",F4),LN 3,LN 3,F1),LW(0,2)],
10133                    CC[LL[CC[LW(0,2),EX(Var("r",F4),LN 2,LN 0,FTy 3),
10134                             LW(4,3)],LW(37,8)],Var("l",LTy F8)]]))])),
10135       (Call
10136          ("Zm",CTy"Zrm",
10137           TP[Mop(Some,TP[Var("ss",FTy 2),Var("index",CTy"Zreg")]),
10138              Const("ZnoBase",CTy"Zbase"),Var("imm",F64)]),
10139        Let(Var("i",F4),Mop(Cast F4,Var("index",CTy"Zreg")),
10140            CS(Call("e_imm32",LTy F8,Var("imm",F64)),
10141               [(LNL F8,LO(PTy(F4,LTy F8))),
10142                (Var("l",LTy F8),
10143                 Mop(Some,
10144                     TP[CC[LW(0,1),EX(Var("r",F4),LN 3,LN 3,F1),
10145                           EX(Var("i",F4),LN 3,LN 3,F1),LW(0,1)],
10146                        CC[LL[CC[LW(0,2),EX(Var("r",F4),LN 2,LN 0,FTy 3),
10147                                 LW(4,3)],
10148                              CC[Var("ss",FTy 2),
10149                                 EX(Var("i",F4),LN 2,LN 0,FTy 3),LW(5,3)]],
10150                           Var("l",LTy F8)]]))]))),
10151       (Call
10152          ("Zm",CTy"Zrm",
10153           TP[Mop(Some,TP[Var("ss",FTy 2),Var("index",CTy"Zreg")]),
10154              Call("ZregBase",CTy"Zbase",Var("base",CTy"Zreg")),
10155              Var("imm",F64)]),
10156        Let(Var("b",F4),Mop(Cast F4,Var("base",CTy"Zreg")),
10157            Let(Var("i",F4),Mop(Cast F4,Var("index",CTy"Zreg")),
10158                Let(Var("b20",FTy 3),EX(Var("b",F4),LN 2,LN 0,FTy 3),
10159                    Let(TP[nVar"s",Var("l",LTy F8)],
10160                        ITE(Bop(And,EQ(Var("imm",F64),LW(0,64)),
10161                                Mop(Not,EQ(Var("b20",FTy 3),LW(5,3)))),
10162                            TP[LN 0,LNL F8],
10163                            Call
10164                              ("e_imm_8_32",PTy(nTy,LTy F8),Var("imm",F64))),
10165                        ITE(Bop(In,nVar"s",SL[LN 0,LN 1,LN 4]),
10166                            Mop(Some,
10167                                TP[CC[LW(0,1),
10168                                      EX(Var("r",F4),LN 3,LN 3,F1),
10169                                      EX(Var("i",F4),LN 3,LN 3,F1),
10170                                      EX(Var("b",F4),LN 3,LN 3,F1)],
10171                                   CC[LL[CC[CS(nVar"s",
10172                                               [(LN 0,LW(0,2)),
10173                                                (LN 1,LW(1,2)),
10174                                                (AVar nTy,LW(2,2))]),
10175                                            EX(Var("r",F4),LN 2,LN 0,FTy 3),
10176                                            LW(4,3)],
10177                                         CC[Var("ss",FTy 2),
10178                                            EX(Var("i",F4),LN 2,LN 0,FTy 3),
10179                                            Var("b20",FTy 3)]],
10180                                      Var("l",LTy F8)]]),
10181                            LO(PTy(F4,LTy F8)))))))),
10182       (Call
10183          ("Zm",CTy"Zrm",
10184           TP[LO(PTy(FTy 2,CTy"Zreg")),
10185              Call("ZregBase",CTy"Zbase",Var("base",CTy"Zreg")),
10186              Var("imm",F64)]),
10187        Let(Var("base",F4),Mop(Cast F4,Var("base",CTy"Zreg")),
10188            Let(Var("base20",FTy 3),EX(Var("base",F4),LN 2,LN 0,FTy 3),
10189                Let(TP[nVar"s",Var("l",LTy F8)],
10190                    ITE(Bop(And,EQ(Var("imm",F64),LW(0,64)),
10191                            Mop(Not,EQ(Var("base20",FTy 3),LW(5,3)))),
10192                        TP[LN 0,LNL F8],
10193                        Call("e_imm_8_32",PTy(nTy,LTy F8),Var("imm",F64))),
10194                    ITE(Bop(In,nVar"s",SL[LN 0,LN 1,LN 4]),
10195                        Mop(Some,
10196                            TP[CC[LW(0,1),EX(Var("r",F4),LN 3,LN 3,F1),
10197                                  LW(0,1),EX(Var("base",F4),LN 3,LN 3,F1)],
10198                               CC[LLC([CC[CS(nVar"s",
10199                                             [(LN 0,LW(0,2)),
10200                                              (LN 1,LW(1,2)),
10201                                              (AVar nTy,LW(2,2))]),
10202                                          EX(Var("r",F4),LN 2,LN 0,FTy 3),
10203                                          Var("base20",FTy 3)]],
10204                                      ITE(EQ(Var("base20",FTy 3),LW(4,3)),
10205                                          LL[CC[LW(4,5),
10206                                                Var("base20",FTy 3)]],
10207                                          LNL F8)),Var("l",LTy F8)]]),
10208                        LO(PTy(F4,LTy F8))))))),
10209       (AVar(CTy"Zrm"),LO(PTy(F4,LTy F8)))]))
10210;
10211val rex_prefix_def = Def
10212  ("rex_prefix",Var("rex",F4),
10213   ITE(EQ(Var("rex",F4),LW(0,4)),LNL F8,LL[CC[LW(4,4),Var("rex",F4)]]))
10214;
10215val e_opsize_def = Def
10216  ("e_opsize",TP[Var("sz",CTy"Zsize"),Var("rex",F4)],
10217   CS(Var("sz",CTy"Zsize"),
10218      [(Call("Z8",CTy"Zsize",bVar"have_rex"),
10219        Let(Var("p",LTy F8),Call("rex_prefix",LTy F8,Var("rex",F4)),
10220            TP[ITE(Bop(And,bVar"have_rex",EQ(Var("p",LTy F8),LNL F8)),
10221                   LL[LW(64,8)],Var("p",LTy F8)),LW(0,8)])),
10222       (Const("Z16",CTy"Zsize"),
10223        TP[CC[LL[LW(102,8)],
10224              Call("rex_prefix",LTy F8,Bop(BAnd,Var("rex",F4),LW(7,4)))],
10225           LW(1,8)]),
10226       (Const("Z32",CTy"Zsize"),
10227        TP[Call("rex_prefix",LTy F8,Bop(BAnd,Var("rex",F4),LW(7,4))),
10228           LW(1,8)]),
10229       (Const("Z64",CTy"Zsize"),
10230        TP[Call("rex_prefix",LTy F8,Bop(BOr,Var("rex",F4),LW(8,4))),
10231           LW(1,8)])]))
10232;
10233val e_opsize_imm_def = Def
10234  ("e_opsize_imm",
10235   TP[Var("sz",CTy"Zsize"),Var("rex",F4),Var("imm",F64),bVar"normal"],
10236   Let(TP[Var("prefixes",LTy F8),Var("v",F8)],
10237       Call
10238         ("e_opsize",PTy(LTy F8,F8),TP[Var("sz",CTy"Zsize"),Var("rex",F4)]),
10239       CS(ITE(Bop(And,EQ(Var("sz",CTy"Zsize"),Const("Z64",CTy"Zsize")),
10240                  bVar"normal"),Const("Z32",CTy"Zsize"),
10241              Var("sz",CTy"Zsize")),
10242          [(Call("Z8",CTy"Zsize",AVar bTy),
10243            CS(Call("e_imm8",LTy F8,Var("imm",F64)),
10244               [(LNL F8,LO(PTy(LTy F8,PTy(F8,LTy F8)))),
10245                (Var("l",LTy F8),
10246                 ITE(EQ(Var("v",F8),LW(0,8)),
10247                     Mop(Some,
10248                         TP[Var("prefixes",LTy F8),Var("v",F8),
10249                            Var("l",LTy F8)]),
10250                     LO(PTy(LTy F8,PTy(F8,LTy F8)))))])),
10251           (Const("Z16",CTy"Zsize"),
10252            CS(Call("e_imm16",LTy F8,Var("imm",F64)),
10253               [(LNL F8,LO(PTy(LTy F8,PTy(F8,LTy F8)))),
10254                (Var("l",LTy F8),
10255                 ITE(EQ(Var("v",F8),LW(1,8)),
10256                     Mop(Some,
10257                         TP[Var("prefixes",LTy F8),Var("v",F8),
10258                            Var("l",LTy F8)]),
10259                     LO(PTy(LTy F8,PTy(F8,LTy F8)))))])),
10260           (Const("Z32",CTy"Zsize"),
10261            CS(Call("e_imm32",LTy F8,Var("imm",F64)),
10262               [(LNL F8,LO(PTy(LTy F8,PTy(F8,LTy F8)))),
10263                (Var("l",LTy F8),
10264                 ITE(EQ(Var("v",F8),LW(1,8)),
10265                     Mop(Some,
10266                         TP[Var("prefixes",LTy F8),Var("v",F8),
10267                            Var("l",LTy F8)]),
10268                     LO(PTy(LTy F8,PTy(F8,LTy F8)))))])),
10269           (Const("Z64",CTy"Zsize"),
10270            ITE(EQ(Var("v",F8),LW(1,8)),
10271                Mop(Some,
10272                    TP[Var("prefixes",LTy F8),Var("v",F8),
10273                       Call("e_imm64",LTy F8,Var("imm",F64))]),
10274                LO(PTy(LTy F8,PTy(F8,LTy F8)))))])))
10275;
10276val e_opc_def = Def
10277  ("e_opc",TP[Var("opc1",F8),Var("opc2",FTy 3),Var("rm",CTy"Zrm")],
10278   CS(Call
10279        ("e_ModRM",OTy(PTy(F4,LTy F8)),
10280         TP[Mop(Cast F4,Var("opc2",FTy 3)),Var("rm",CTy"Zrm")]),
10281      [(LO(PTy(F4,LTy F8)),LNL F8),
10282       (Mop(Some,TP[Var("rex",F4),Var("strm",LTy F8)]),
10283        CC[Call("rex_prefix",LTy F8,Var("rex",F4)),
10284           LLC([Var("opc1",F8)],Var("strm",LTy F8))])]))
10285;
10286val e_gen_rm_reg_def = Def
10287  ("e_gen_rm_reg",
10288   TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("r",F4),Var("p",LTy F8),
10289      Var("opc",F8),Var("mo",OTy F8)],
10290   CS(Call
10291        ("e_ModRM",OTy(PTy(F4,LTy F8)),TP[Var("r",F4),Var("rm",CTy"Zrm")]),
10292      [(LO(PTy(F4,LTy F8)),LNL F8),
10293       (Mop(Some,TP[Var("rex",F4),Var("strm",LTy F8)]),
10294        Let(TP[Var("prefixes",LTy F8),Var("v",F8)],
10295            Call
10296              ("e_opsize",PTy(LTy F8,F8),
10297               TP[Var("sz",CTy"Zsize"),Var("rex",F4)]),
10298            CC[Var("prefixes",LTy F8),Var("p",LTy F8),
10299               LL[Bop(BOr,Var("opc",F8),
10300                      CS(Var("mo",OTy F8),
10301                         [(Mop(Some,Var("x",F8)),Var("x",F8)),
10302                          (LO F8,Var("v",F8))]))],Var("strm",LTy F8)]))]))
10303;
10304val e_rm_imm_def = Def
10305  ("e_rm_imm",
10306   TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("imm",F64),
10307      Var("opc1",F4),Var("opc2",F8)],
10308   CS(Call
10309        ("e_ModRM",OTy(PTy(F4,LTy F8)),
10310         TP[Var("opc1",F4),Var("rm",CTy"Zrm")]),
10311      [(LO(PTy(F4,LTy F8)),LNL F8),
10312       (Mop(Some,TP[Var("rex",F4),Var("strm",LTy F8)]),
10313        CS(Call
10314             ("e_opsize_imm",OTy(PTy(LTy F8,PTy(F8,LTy F8))),
10315              TP[Var("sz",CTy"Zsize"),Var("rex",F4),Var("imm",F64),LT]),
10316           [(Mop(Some,
10317                 TP[Var("prefixes",LTy F8),Var("v",F8),Var("l",LTy F8)]),
10318             CC[Var("prefixes",LTy F8),
10319                LL[Bop(BOr,Var("opc2",F8),Var("v",F8))],
10320                Var("strm",LTy F8),Var("l",LTy F8)]),
10321            (LO(PTy(LTy F8,PTy(F8,LTy F8))),LNL F8)]))]))
10322;
10323val e_rm_imm8_def = Def
10324  ("e_rm_imm8",
10325   TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("imm",F64),
10326      Var("opc1",F4),Var("opc2",F8)],
10327   CS(Call
10328        ("e_ModRM",OTy(PTy(F4,LTy F8)),
10329         TP[Var("opc1",F4),Var("rm",CTy"Zrm")]),
10330      [(LO(PTy(F4,LTy F8)),LNL F8),
10331       (Mop(Some,TP[Var("rex",F4),Var("strm",LTy F8)]),
10332        Let(TP[Var("prefixes",LTy F8),Var("v",F8)],
10333            Call
10334              ("e_opsize",PTy(LTy F8,F8),
10335               TP[Var("sz",CTy"Zsize"),Var("rex",F4)]),
10336            CS(Call("e_imm8",LTy F8,Var("imm",F64)),
10337               [(LNL F8,LNL F8),
10338                (Var("l",LTy F8),
10339                 CC[Var("prefixes",LTy F8),
10340                    LL[Bop(BOr,Var("opc2",F8),Var("v",F8))],
10341                    Var("strm",LTy F8),Var("l",LTy F8)])])))]))
10342;
10343val e_rm_imm8b_def = Def
10344  ("e_rm_imm8b",
10345   TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("imm",F64),
10346      Var("opc1",F4),Var("opc2",LTy F8)],
10347   CS(Call
10348        ("e_ModRM",OTy(PTy(F4,LTy F8)),
10349         TP[Var("opc1",F4),Var("rm",CTy"Zrm")]),
10350      [(Mop(Some,TP[Var("rex",F4),LLC([Var("s",F8)],Var("t",LTy F8))]),
10351        CS(Call("e_imm8",LTy F8,Var("imm",F64)),
10352           [(LNL F8,LNL F8),
10353            (Var("l",LTy F8),
10354             CC[Mop(Fst,
10355                    Call
10356                      ("e_opsize",PTy(LTy F8,F8),
10357                       TP[Var("sz",CTy"Zsize"),Var("rex",F4)])),
10358                Var("opc2",LTy F8),LL[Bop(BOr,Var("s",F8),LW(32,8))],
10359                Var("t",LTy F8),Var("l",LTy F8)])])),
10360       (AVar(OTy(PTy(F4,LTy F8))),LNL F8)]))
10361;
10362val e_rax_imm_def = Def
10363  ("e_rax_imm",TP[Var("sz",CTy"Zsize"),Var("imm",F64),Var("opc",F8)],
10364   CS(Call
10365        ("e_opsize_imm",OTy(PTy(LTy F8,PTy(F8,LTy F8))),
10366         TP[Var("sz",CTy"Zsize"),LW(0,4),Var("imm",F64),LT]),
10367      [(Mop(Some,TP[Var("prefixes",LTy F8),Var("v",F8),Var("l",LTy F8)]),
10368        CC[Var("prefixes",LTy F8),LL[Bop(BOr,Var("opc",F8),Var("v",F8))],
10369           Var("l",LTy F8)]),(LO(PTy(LTy F8,PTy(F8,LTy F8))),LNL F8)]))
10370;
10371val e_jcc_rel32_def = Def
10372  ("e_jcc_rel32",Var("i",CTy"instruction"),
10373   CS(Var("i",CTy"instruction"),
10374      [(Call
10375          ("Zjcc",CTy"instruction",
10376           TP[Var("cond",CTy"Zcond"),Var("imm",F64)]),
10377        CS(TP[Call("e_imm32",LTy F8,Var("imm",F64)),Var("cond",CTy"Zcond")],
10378           [(TP[LNL F8,AVar(CTy"Zcond")],LNL F8),
10379            (TP[Var("l",LTy F8),LC("Z_ALWAYS",CTy"Zcond")],
10380             LLC([LW(233,8)],Var("l",LTy F8))),
10381            (TP[Var("l",LTy F8),AVar(CTy"Zcond")],
10382             CC[LL[LW(15,8),
10383                   CC[LW(8,4),Mop(Cast F4,Var("cond",CTy"Zcond"))]],
10384                Var("l",LTy F8)])])),(AVar(CTy"instruction"),LNL F8)]))
10385;
10386val not_byte_def = Def
10387  ("not_byte",Var("sz",CTy"Zsize"),
10388   CS(Var("sz",CTy"Zsize"),
10389      [(Call("Z8",CTy"Zsize",AVar bTy),LF),(AVar(CTy"Zsize"),LT)]))
10390;
10391val is_rax_def = Def
10392  ("is_rax",Var("rm",CTy"Zrm"),
10393   CS(Var("rm",CTy"Zrm"),
10394      [(Call("Zr",CTy"Zrm",LC("RAX",CTy"Zreg")),LT),(AVar(CTy"Zrm"),LF)]))
10395;
10396val xmm_mem_to_rm_def = Def
10397  ("xmm_mem_to_rm",Var("x",CTy"xmm_mem"),
10398   CS(Var("x",CTy"xmm_mem"),
10399      [(Call("xmm_reg",CTy"xmm_mem",Var("r",FTy 3)),
10400        Call("Zr",CTy"Zrm",Mop(Cast(CTy"Zreg"),Var("r",FTy 3)))),
10401       (Call
10402          ("xmm_mem",CTy"xmm_mem",
10403           Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
10404        Call
10405          ("Zm",CTy"Zrm",
10406           Var("m",PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))))]))
10407;
10408val encode_sse_binop_def = Def
10409  ("encode_sse_binop",Var("bop",CTy"sse_binop"),
10410   CS(Var("bop",CTy"sse_binop"),
10411      [(LC("sse_add",CTy"sse_binop"),LW(0,3)),
10412       (LC("sse_mul",CTy"sse_binop"),LW(1,3)),
10413       (LC("sse_sub",CTy"sse_binop"),LW(4,3)),
10414       (LC("sse_min",CTy"sse_binop"),LW(5,3)),
10415       (LC("sse_div",CTy"sse_binop"),LW(6,3)),
10416       (LC("sse_max",CTy"sse_binop"),LW(7,3))]))
10417;
10418val encode_sse_def = Def
10419  ("encode_sse",Var("i",CTy"SSE"),
10420   CS(Var("i",CTy"SSE"),
10421      [(Call
10422          ("bin_PD",CTy"SSE",
10423           TP[Var("bop",CTy"sse_binop"),Var("dst",FTy 3),
10424              Var("src",CTy"xmm_mem")]),
10425        LLC([LW(102,8)],
10426            Call
10427              ("e_gen_rm_reg",LTy F8,
10428               TP[Const("Z32",CTy"Zsize"),
10429                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10430                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],
10431                  CC[LW(5,4),LW(1,1),
10432                     Call
10433                       ("encode_sse_binop",FTy 3,Var("bop",CTy"sse_binop"))],
10434                  Mop(Some,LW(0,8))]))),
10435       (Call
10436          ("bin_PS",CTy"SSE",
10437           TP[Var("bop",CTy"sse_binop"),Var("dst",FTy 3),
10438              Var("src",CTy"xmm_mem")]),
10439        Call
10440          ("e_gen_rm_reg",LTy F8,
10441           TP[Const("Z32",CTy"Zsize"),
10442              Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10443              Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],
10444              CC[LW(5,4),LW(1,1),
10445                 Call("encode_sse_binop",FTy 3,Var("bop",CTy"sse_binop"))],
10446              Mop(Some,LW(0,8))])),
10447       (Call
10448          ("bin_SD",CTy"SSE",
10449           TP[Var("bop",CTy"sse_binop"),Var("dst",FTy 3),
10450              Var("src",CTy"xmm_mem")]),
10451        LLC([LW(242,8)],
10452            Call
10453              ("e_gen_rm_reg",LTy F8,
10454               TP[Const("Z32",CTy"Zsize"),
10455                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10456                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],
10457                  CC[LW(5,4),LW(1,1),
10458                     Call
10459                       ("encode_sse_binop",FTy 3,Var("bop",CTy"sse_binop"))],
10460                  Mop(Some,LW(0,8))]))),
10461       (Call
10462          ("bin_SS",CTy"SSE",
10463           TP[Var("bop",CTy"sse_binop"),Var("dst",FTy 3),
10464              Var("src",CTy"xmm_mem")]),
10465        LLC([LW(243,8)],
10466            Call
10467              ("e_gen_rm_reg",LTy F8,
10468               TP[Const("Z32",CTy"Zsize"),
10469                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10470                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],
10471                  CC[LW(5,4),LW(1,1),
10472                     Call
10473                       ("encode_sse_binop",FTy 3,Var("bop",CTy"sse_binop"))],
10474                  Mop(Some,LW(0,8))]))),
10475       (Call
10476          ("logic_PD",CTy"SSE",
10477           TP[Var("bop",CTy"sse_logic"),Var("dst",FTy 3),
10478              Var("src",CTy"xmm_mem")]),
10479        LLC([LW(102,8)],
10480            Call
10481              ("e_gen_rm_reg",LTy F8,
10482               TP[Const("Z32",CTy"Zsize"),
10483                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10484                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],
10485                  CC[LW(5,4),LW(1,2),
10486                     Mop(Cast(FTy 2),Var("bop",CTy"sse_logic"))],
10487                  Mop(Some,LW(0,8))]))),
10488       (Call
10489          ("logic_PS",CTy"SSE",
10490           TP[Var("bop",CTy"sse_logic"),Var("dst",FTy 3),
10491              Var("src",CTy"xmm_mem")]),
10492        Call
10493          ("e_gen_rm_reg",LTy F8,
10494           TP[Const("Z32",CTy"Zsize"),
10495              Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10496              Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],
10497              CC[LW(5,4),LW(1,2),
10498                 Mop(Cast(FTy 2),Var("bop",CTy"sse_logic"))],
10499              Mop(Some,LW(0,8))])),
10500       (Call
10501          ("CMPPD",CTy"SSE",
10502           TP[Var("bop",CTy"sse_compare"),Var("dst",FTy 3),
10503              Var("src",CTy"xmm_mem")]),
10504        CC[LLC([LW(102,8)],
10505               Call
10506                 ("e_gen_rm_reg",LTy F8,
10507                  TP[Const("Z32",CTy"Zsize"),
10508                     Call
10509                       ("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10510                     Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(194,8),
10511                     Mop(Some,LW(0,8))])),
10512           LL[Mop(Cast F8,Var("bop",CTy"sse_compare"))]]),
10513       (Call
10514          ("CMPPS",CTy"SSE",
10515           TP[Var("bop",CTy"sse_compare"),Var("dst",FTy 3),
10516              Var("src",CTy"xmm_mem")]),
10517        CC[Call
10518             ("e_gen_rm_reg",LTy F8,
10519              TP[Const("Z32",CTy"Zsize"),
10520                 Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10521                 Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(194,8),
10522                 Mop(Some,LW(0,8))]),
10523           LL[Mop(Cast F8,Var("bop",CTy"sse_compare"))]]),
10524       (Call
10525          ("CMPSD",CTy"SSE",
10526           TP[Var("bop",CTy"sse_compare"),Var("dst",FTy 3),
10527              Var("src",CTy"xmm_mem")]),
10528        CC[LLC([LW(242,8)],
10529               Call
10530                 ("e_gen_rm_reg",LTy F8,
10531                  TP[Const("Z32",CTy"Zsize"),
10532                     Call
10533                       ("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10534                     Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(194,8),
10535                     Mop(Some,LW(0,8))])),
10536           LL[Mop(Cast F8,Var("bop",CTy"sse_compare"))]]),
10537       (Call
10538          ("CMPSS",CTy"SSE",
10539           TP[Var("bop",CTy"sse_compare"),Var("dst",FTy 3),
10540              Var("src",CTy"xmm_mem")]),
10541        CC[LLC([LW(243,8)],
10542               Call
10543                 ("e_gen_rm_reg",LTy F8,
10544                  TP[Const("Z32",CTy"Zsize"),
10545                     Call
10546                       ("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10547                     Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(194,8),
10548                     Mop(Some,LW(0,8))])),
10549           LL[Mop(Cast F8,Var("bop",CTy"sse_compare"))]]),
10550       (Call
10551          ("COMISD",CTy"SSE",
10552           TP[Var("src1",FTy 3),Var("src2",CTy"xmm_mem")]),
10553        LLC([LW(102,8)],
10554            Call
10555              ("e_gen_rm_reg",LTy F8,
10556               TP[Const("Z32",CTy"Zsize"),
10557                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src2",CTy"xmm_mem")),
10558                  Mop(Cast F4,Var("src1",FTy 3)),LL[LW(15,8)],LW(47,8),
10559                  Mop(Some,LW(0,8))]))),
10560       (Call
10561          ("COMISS",CTy"SSE",
10562           TP[Var("src1",FTy 3),Var("src2",CTy"xmm_mem")]),
10563        Call
10564          ("e_gen_rm_reg",LTy F8,
10565           TP[Const("Z32",CTy"Zsize"),
10566              Call("xmm_mem_to_rm",CTy"Zrm",Var("src2",CTy"xmm_mem")),
10567              Mop(Cast F4,Var("src1",FTy 3)),LL[LW(15,8)],LW(47,8),LO F8])),
10568       (Call
10569          ("CVTDQ2PD",CTy"SSE",
10570           TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10571        LLC([LW(243,8)],
10572            Call
10573              ("e_gen_rm_reg",LTy F8,
10574               TP[Const("Z32",CTy"Zsize"),
10575                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10576                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(230,8),
10577                  Mop(Some,LW(0,8))]))),
10578       (Call
10579          ("CVTDQ2PS",CTy"SSE",
10580           TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10581        Call
10582          ("e_gen_rm_reg",LTy F8,
10583           TP[Const("Z32",CTy"Zsize"),
10584              Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10585              Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(91,8),
10586              Mop(Some,LW(0,8))])),
10587       (Call
10588          ("CVTPD2DQ",CTy"SSE",
10589           TP[bVar"truncate",Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10590        LLC([ITE(bVar"truncate",LW(102,8),LW(242,8))],
10591            Call
10592              ("e_gen_rm_reg",LTy F8,
10593               TP[Const("Z32",CTy"Zsize"),
10594                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10595                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(230,8),
10596                  Mop(Some,LW(0,8))]))),
10597       (Call
10598          ("CVTPD2PS",CTy"SSE",
10599           TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10600        LLC([LW(102,8)],
10601            Call
10602              ("e_gen_rm_reg",LTy F8,
10603               TP[Const("Z32",CTy"Zsize"),
10604                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10605                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(90,8),
10606                  Mop(Some,LW(0,8))]))),
10607       (Call
10608          ("CVTPS2DQ",CTy"SSE",
10609           TP[bVar"truncate",Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10610        LLC([ITE(bVar"truncate",LW(243,8),LW(102,8))],
10611            Call
10612              ("e_gen_rm_reg",LTy F8,
10613               TP[Const("Z32",CTy"Zsize"),
10614                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10615                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(91,8),
10616                  Mop(Some,LW(0,8))]))),
10617       (Call
10618          ("CVTPS2PD",CTy"SSE",
10619           TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10620        Call
10621          ("e_gen_rm_reg",LTy F8,
10622           TP[Const("Z32",CTy"Zsize"),
10623              Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10624              Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(90,8),
10625              Mop(Some,LW(0,8))])),
10626       (Call
10627          ("CVTSD2SI",CTy"SSE",
10628           TP[bVar"truncate",bVar"quad",Var("dst",CTy"Zreg"),
10629              Var("src",CTy"xmm_mem")]),
10630        LLC([LW(242,8)],
10631            Call
10632              ("e_gen_rm_reg",LTy F8,
10633               TP[ITE(bVar"quad",Const("Z64",CTy"Zsize"),
10634                      Const("Z32",CTy"Zsize")),
10635                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10636                  Mop(Cast F4,Var("dst",CTy"Zreg")),LL[LW(15,8)],LW(44,8),
10637                  Mop(Some,Mop(Cast F8,Mop(Not,bVar"truncate")))]))),
10638       (Call
10639          ("CVTSD2SS",CTy"SSE",
10640           TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10641        LLC([LW(242,8)],
10642            Call
10643              ("e_gen_rm_reg",LTy F8,
10644               TP[Const("Z32",CTy"Zsize"),
10645                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10646                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(90,8),
10647                  Mop(Some,LW(0,8))]))),
10648       (Call
10649          ("CVTSI2SD",CTy"SSE",
10650           TP[bVar"quad",Var("reg",FTy 3),Var("src",CTy"Zrm")]),
10651        LLC([LW(242,8)],
10652            Call
10653              ("e_gen_rm_reg",LTy F8,
10654               TP[ITE(bVar"quad",Const("Z64",CTy"Zsize"),
10655                      Const("Z32",CTy"Zsize")),Var("src",CTy"Zrm"),
10656                  Mop(Cast F4,Var("reg",FTy 3)),LL[LW(15,8)],LW(42,8),
10657                  Mop(Some,LW(0,8))]))),
10658       (Call
10659          ("CVTSI2SS",CTy"SSE",
10660           TP[bVar"quad",Var("reg",FTy 3),Var("src",CTy"Zrm")]),
10661        LLC([LW(243,8)],
10662            Call
10663              ("e_gen_rm_reg",LTy F8,
10664               TP[ITE(bVar"quad",Const("Z64",CTy"Zsize"),
10665                      Const("Z32",CTy"Zsize")),Var("src",CTy"Zrm"),
10666                  Mop(Cast F4,Var("reg",FTy 3)),LL[LW(15,8)],LW(42,8),
10667                  Mop(Some,LW(0,8))]))),
10668       (Call
10669          ("CVTSS2SD",CTy"SSE",
10670           TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10671        LLC([LW(243,8)],
10672            Call
10673              ("e_gen_rm_reg",LTy F8,
10674               TP[Const("Z32",CTy"Zsize"),
10675                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10676                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(90,8),
10677                  Mop(Some,LW(0,8))]))),
10678       (Call
10679          ("CVTSS2SI",CTy"SSE",
10680           TP[bVar"truncate",bVar"quad",Var("dst",CTy"Zreg"),
10681              Var("src",CTy"xmm_mem")]),
10682        LLC([LW(243,8)],
10683            Call
10684              ("e_gen_rm_reg",LTy F8,
10685               TP[ITE(bVar"quad",Const("Z64",CTy"Zsize"),
10686                      Const("Z32",CTy"Zsize")),
10687                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10688                  Mop(Cast F4,Var("dst",CTy"Zreg")),LL[LW(15,8)],LW(44,8),
10689                  Mop(Some,Mop(Cast F8,Mop(Not,bVar"truncate")))]))),
10690       (Call
10691          ("MOVAP_D_S",CTy"SSE",
10692           TP[bVar"double",Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
10693              Var("src",CTy"xmm_mem")]),
10694        CC[ITE(bVar"double",LL[LW(102,8)],LNL F8),
10695           Call
10696             ("e_gen_rm_reg",LTy F8,
10697              TP[Const("Z32",CTy"Zsize"),
10698                 Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10699                 Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(40,8),
10700                 Mop(Some,LW(0,8))])]),
10701       (Call
10702          ("MOVAP_D_S",CTy"SSE",
10703           TP[bVar"double",Var("dst",CTy"xmm_mem"),
10704              Call("xmm_reg",CTy"xmm_mem",Var("src",FTy 3))]),
10705        CC[ITE(bVar"double",LL[LW(102,8)],LNL F8),
10706           Call
10707             ("e_gen_rm_reg",LTy F8,
10708              TP[Const("Z32",CTy"Zsize"),
10709                 Call("xmm_mem_to_rm",CTy"Zrm",Var("dst",CTy"xmm_mem")),
10710                 Mop(Cast F4,Var("src",FTy 3)),LL[LW(15,8)],LW(41,8),
10711                 Mop(Some,LW(0,8))])]),
10712       (Call
10713          ("MOVAP_D_S",CTy"SSE",
10714           AVar(PTy(bTy,PTy(CTy"xmm_mem",CTy"xmm_mem")))),LNL F8),
10715       (Call
10716          ("MOVUP_D_S",CTy"SSE",
10717           TP[bVar"double",Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
10718              Var("src",CTy"xmm_mem")]),
10719        CC[ITE(bVar"double",LL[LW(102,8)],LNL F8),
10720           Call
10721             ("e_gen_rm_reg",LTy F8,
10722              TP[Const("Z32",CTy"Zsize"),
10723                 Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10724                 Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(16,8),
10725                 Mop(Some,LW(0,8))])]),
10726       (Call
10727          ("MOVUP_D_S",CTy"SSE",
10728           TP[bVar"double",Var("dst",CTy"xmm_mem"),
10729              Call("xmm_reg",CTy"xmm_mem",Var("src",FTy 3))]),
10730        CC[ITE(bVar"double",LL[LW(102,8)],LNL F8),
10731           Call
10732             ("e_gen_rm_reg",LTy F8,
10733              TP[Const("Z32",CTy"Zsize"),
10734                 Call("xmm_mem_to_rm",CTy"Zrm",Var("dst",CTy"xmm_mem")),
10735                 Mop(Cast F4,Var("src",FTy 3)),LL[LW(15,8)],LW(17,8),
10736                 Mop(Some,LW(0,8))])]),
10737       (Call
10738          ("MOVUP_D_S",CTy"SSE",
10739           AVar(PTy(bTy,PTy(CTy"xmm_mem",CTy"xmm_mem")))),LNL F8),
10740       (Call
10741          ("MOVSD",CTy"SSE",
10742           TP[Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
10743              Var("src",CTy"xmm_mem")]),
10744        LLC([LW(242,8)],
10745            Call
10746              ("e_gen_rm_reg",LTy F8,
10747               TP[Const("Z32",CTy"Zsize"),
10748                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10749                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(16,8),
10750                  Mop(Some,LW(0,8))]))),
10751       (Call
10752          ("MOVSD",CTy"SSE",
10753           TP[Var("dst",CTy"xmm_mem"),
10754              Call("xmm_reg",CTy"xmm_mem",Var("src",FTy 3))]),
10755        LLC([LW(242,8)],
10756            Call
10757              ("e_gen_rm_reg",LTy F8,
10758               TP[Const("Z32",CTy"Zsize"),
10759                  Call("xmm_mem_to_rm",CTy"Zrm",Var("dst",CTy"xmm_mem")),
10760                  Mop(Cast F4,Var("src",FTy 3)),LL[LW(15,8)],LW(17,8),
10761                  Mop(Some,LW(0,8))]))),
10762       (Call("MOVSD",CTy"SSE",AVar(PTy(CTy"xmm_mem",CTy"xmm_mem"))),LNL F8),
10763       (Call
10764          ("MOVSS",CTy"SSE",
10765           TP[Call("xmm_reg",CTy"xmm_mem",Var("dst",FTy 3)),
10766              Var("src",CTy"xmm_mem")]),
10767        LLC([LW(243,8)],
10768            Call
10769              ("e_gen_rm_reg",LTy F8,
10770               TP[Const("Z32",CTy"Zsize"),
10771                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10772                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(16,8),
10773                  Mop(Some,LW(0,8))]))),
10774       (Call
10775          ("MOVSS",CTy"SSE",
10776           TP[Var("dst",CTy"xmm_mem"),
10777              Call("xmm_reg",CTy"xmm_mem",Var("src",FTy 3))]),
10778        LLC([LW(243,8)],
10779            Call
10780              ("e_gen_rm_reg",LTy F8,
10781               TP[Const("Z32",CTy"Zsize"),
10782                  Call("xmm_mem_to_rm",CTy"Zrm",Var("dst",CTy"xmm_mem")),
10783                  Mop(Cast F4,Var("src",FTy 3)),LL[LW(15,8)],LW(17,8),
10784                  Mop(Some,LW(0,8))]))),
10785       (Call("MOVSS",CTy"SSE",AVar(PTy(CTy"xmm_mem",CTy"xmm_mem"))),LNL F8),
10786       (Call
10787          ("MOV_D_Q",CTy"SSE",
10788           TP[bVar"to_xmm",bVar"quad",Var("xmm",FTy 3),Var("rm",CTy"Zrm")]),
10789        LLC([LW(102,8)],
10790            Call
10791              ("e_gen_rm_reg",LTy F8,
10792               TP[ITE(bVar"quad",Const("Z64",CTy"Zsize"),
10793                      Const("Z32",CTy"Zsize")),Var("rm",CTy"Zrm"),
10794                  Mop(Cast F4,Var("xmm",FTy 3)),LL[LW(15,8)],
10795                  CC[LW(3,3),Mop(Cast F1,Mop(Not,bVar"to_xmm")),LW(14,4)],
10796                  Mop(Some,LW(0,8))]))),
10797       (Call
10798          ("MOVQ",CTy"SSE",
10799           TP[Call
10800                ("xmm_mem",CTy"xmm_mem",
10801                 Var("m",
10802                     PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
10803              Call("xmm_reg",CTy"xmm_mem",Var("src",FTy 3))]),
10804        LLC([LW(102,8)],
10805            Call
10806              ("e_gen_rm_reg",LTy F8,
10807               TP[Call("Z8",CTy"Zsize",LF),
10808                  Call
10809                    ("Zm",CTy"Zrm",
10810                     Var("m",
10811                         PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
10812                  Mop(Cast F4,Var("src",FTy 3)),LL[LW(15,8)],LW(214,8),
10813                  LO F8]))),
10814       (Call
10815          ("MOVQ",CTy"SSE",
10816           TP[Call("xmm_reg",CTy"xmm_mem",Var("r",FTy 3)),
10817              Var("src",CTy"xmm_mem")]),
10818        LLC([LW(243,8)],
10819            Call
10820              ("e_gen_rm_reg",LTy F8,
10821               TP[Call("Z8",CTy"Zsize",LF),
10822                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10823                  Mop(Cast F4,Var("r",FTy 3)),LL[LW(15,8)],LW(126,8),LO F8]))),
10824       (Call("MOVQ",CTy"SSE",AVar(PTy(CTy"xmm_mem",CTy"xmm_mem"))),LNL F8),
10825       (Call
10826          ("PCMPEQQ",CTy"SSE",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10827        LLC([LW(102,8)],
10828            Call
10829              ("e_gen_rm_reg",LTy F8,
10830               TP[Const("Z32",CTy"Zsize"),
10831                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10832                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8),LW(56,8)],
10833                  LW(41,8),Mop(Some,LW(0,8))]))),
10834       (Call("PSRLW_imm",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10835        CC[LLC([LW(102,8)],
10836               Call
10837                 ("e_gen_rm_reg",LTy F8,
10838                  TP[Const("Z32",CTy"Zsize"),
10839                     Call
10840                       ("Zr",CTy"Zrm",
10841                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(2,4),
10842                     LL[LW(15,8)],LW(113,8),Mop(Some,LW(0,8))])),
10843           LL[Var("imm",F8)]]),
10844       (Call("PSRAW_imm",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10845        CC[LLC([LW(102,8)],
10846               Call
10847                 ("e_gen_rm_reg",LTy F8,
10848                  TP[Const("Z32",CTy"Zsize"),
10849                     Call
10850                       ("Zr",CTy"Zrm",
10851                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(4,4),
10852                     LL[LW(15,8)],LW(113,8),Mop(Some,LW(0,8))])),
10853           LL[Var("imm",F8)]]),
10854       (Call("PSLLW_imm",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10855        CC[LLC([LW(102,8)],
10856               Call
10857                 ("e_gen_rm_reg",LTy F8,
10858                  TP[Const("Z32",CTy"Zsize"),
10859                     Call
10860                       ("Zr",CTy"Zrm",
10861                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(6,4),
10862                     LL[LW(15,8)],LW(113,8),Mop(Some,LW(0,8))])),
10863           LL[Var("imm",F8)]]),
10864       (Call("PSRLD_imm",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10865        CC[LLC([LW(102,8)],
10866               Call
10867                 ("e_gen_rm_reg",LTy F8,
10868                  TP[Const("Z32",CTy"Zsize"),
10869                     Call
10870                       ("Zr",CTy"Zrm",
10871                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(2,4),
10872                     LL[LW(15,8)],LW(114,8),Mop(Some,LW(0,8))])),
10873           LL[Var("imm",F8)]]),
10874       (Call("PSRAD_imm",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10875        CC[LLC([LW(102,8)],
10876               Call
10877                 ("e_gen_rm_reg",LTy F8,
10878                  TP[Const("Z32",CTy"Zsize"),
10879                     Call
10880                       ("Zr",CTy"Zrm",
10881                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(4,4),
10882                     LL[LW(15,8)],LW(114,8),Mop(Some,LW(0,8))])),
10883           LL[Var("imm",F8)]]),
10884       (Call("PSLLD_imm",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10885        CC[LLC([LW(102,8)],
10886               Call
10887                 ("e_gen_rm_reg",LTy F8,
10888                  TP[Const("Z32",CTy"Zsize"),
10889                     Call
10890                       ("Zr",CTy"Zrm",
10891                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(6,4),
10892                     LL[LW(15,8)],LW(114,8),Mop(Some,LW(0,8))])),
10893           LL[Var("imm",F8)]]),
10894       (Call("PSRLQ_imm",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10895        CC[LLC([LW(102,8)],
10896               Call
10897                 ("e_gen_rm_reg",LTy F8,
10898                  TP[Const("Z32",CTy"Zsize"),
10899                     Call
10900                       ("Zr",CTy"Zrm",
10901                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(2,4),
10902                     LL[LW(15,8)],LW(115,8),Mop(Some,LW(0,8))])),
10903           LL[Var("imm",F8)]]),
10904       (Call("PSRLDQ",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10905        CC[LLC([LW(102,8)],
10906               Call
10907                 ("e_gen_rm_reg",LTy F8,
10908                  TP[Const("Z32",CTy"Zsize"),
10909                     Call
10910                       ("Zr",CTy"Zrm",
10911                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(3,4),
10912                     LL[LW(15,8)],LW(115,8),Mop(Some,LW(0,8))])),
10913           LL[Var("imm",F8)]]),
10914       (Call("PSLLQ_imm",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10915        CC[LLC([LW(102,8)],
10916               Call
10917                 ("e_gen_rm_reg",LTy F8,
10918                  TP[Const("Z32",CTy"Zsize"),
10919                     Call
10920                       ("Zr",CTy"Zrm",
10921                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(6,4),
10922                     LL[LW(15,8)],LW(115,8),Mop(Some,LW(0,8))])),
10923           LL[Var("imm",F8)]]),
10924       (Call("PSLLDQ",CTy"SSE",TP[Var("dst",FTy 3),Var("imm",F8)]),
10925        CC[LLC([LW(102,8)],
10926               Call
10927                 ("e_gen_rm_reg",LTy F8,
10928                  TP[Const("Z32",CTy"Zsize"),
10929                     Call
10930                       ("Zr",CTy"Zrm",
10931                        Mop(Cast(CTy"Zreg"),Var("dst",FTy 3))),LW(7,4),
10932                     LL[LW(15,8)],LW(115,8),Mop(Some,LW(0,8))])),
10933           LL[Var("imm",F8)]]),
10934       (Call
10935          ("SQRTPD",CTy"SSE",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10936        LLC([LW(102,8)],
10937            Call
10938              ("e_gen_rm_reg",LTy F8,
10939               TP[Const("Z32",CTy"Zsize"),
10940                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10941                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(81,8),
10942                  Mop(Some,LW(0,8))]))),
10943       (Call
10944          ("SQRTSD",CTy"SSE",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10945        LLC([LW(242,8)],
10946            Call
10947              ("e_gen_rm_reg",LTy F8,
10948               TP[Const("Z32",CTy"Zsize"),
10949                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10950                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(81,8),
10951                  Mop(Some,LW(0,8))]))),
10952       (Call
10953          ("SQRTPS",CTy"SSE",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10954        Call
10955          ("e_gen_rm_reg",LTy F8,
10956           TP[Const("Z32",CTy"Zsize"),
10957              Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10958              Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(81,8),
10959              Mop(Some,LW(0,8))])),
10960       (Call
10961          ("SQRTSS",CTy"SSE",TP[Var("dst",FTy 3),Var("src",CTy"xmm_mem")]),
10962        LLC([LW(243,8)],
10963            Call
10964              ("e_gen_rm_reg",LTy F8,
10965               TP[Const("Z32",CTy"Zsize"),
10966                  Call("xmm_mem_to_rm",CTy"Zrm",Var("src",CTy"xmm_mem")),
10967                  Mop(Cast F4,Var("dst",FTy 3)),LL[LW(15,8)],LW(81,8),
10968                  Mop(Some,LW(0,8))])))]))
10969;
10970val encode_def = Def
10971  ("encode",Var("i",CTy"instruction"),
10972   CS(Var("i",CTy"instruction"),
10973      [(Call("SSE",CTy"instruction",Var("j",CTy"SSE")),
10974        Call("encode_sse",LTy F8,Var("j",CTy"SSE"))),
10975       (Call
10976          ("Zbinop",CTy"instruction",
10977           TP[Var("bop",CTy"Zbinop_name"),Var("sz",CTy"Zsize"),
10978              Call
10979                ("Zrm_i",CTy"Zdest_src",
10980                 TP[Var("rm",CTy"Zrm"),Var("imm",F64)])]),
10981        ITE(EQ(Var("bop",CTy"Zbinop_name"),LC("Ztest",CTy"Zbinop_name")),
10982            ITE(Call("is_rax",bTy,Var("rm",CTy"Zrm")),
10983                Call
10984                  ("e_rax_imm",LTy F8,
10985                   TP[Var("sz",CTy"Zsize"),Var("imm",F64),LW(168,8)]),
10986                Call
10987                  ("e_rm_imm",LTy F8,
10988                   TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
10989                      Var("imm",F64),LW(0,4),LW(246,8)])),
10990            Let(Var("opc",F4),Mop(Cast F4,Var("bop",CTy"Zbinop_name")),
10991                ITB([(Bop(Bit,Var("opc",F4),LN 3),
10992                      ITE(EQ(Var("imm",F64),LW(1,64)),
10993                          Call
10994                            ("e_gen_rm_reg",LTy F8,
10995                             TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
10996                                Bop(BAnd,Var("opc",F4),LW(7,4)),LNL F8,
10997                                LW(208,8),LO F8]),
10998                          Call
10999                            ("e_rm_imm8",LTy F8,
11000                             TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11001                                Var("imm",F64),
11002                                Bop(BAnd,Var("opc",F4),LW(7,4)),LW(192,8)]))),
11003                     (Bop(And,Call("not_byte",bTy,Var("sz",CTy"Zsize")),
11004                          Mop(Not,
11005                              EQ(Call("e_imm8",LTy F8,Var("imm",F64)),
11006                                 LNL F8))),
11007                      Call
11008                        ("e_rm_imm8",LTy F8,
11009                         TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11010                            Var("imm",F64),Var("opc",F4),LW(131,8)])),
11011                     (Call("is_rax",bTy,Var("rm",CTy"Zrm")),
11012                      Call
11013                        ("e_rax_imm",LTy F8,
11014                         TP[Var("sz",CTy"Zsize"),Var("imm",F64),
11015                            CC[LW(0,2),EX(Var("opc",F4),LN 2,LN 0,FTy 3),
11016                               LW(4,3)]]))],
11017                    Call
11018                      ("e_rm_imm",LTy F8,
11019                       TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11020                          Var("imm",F64),Var("opc",F4),LW(128,8)]))))),
11021       (Call
11022          ("Zbinop",CTy"instruction",
11023           TP[Var("bop",CTy"Zbinop_name"),Var("sz",CTy"Zsize"),
11024              Call
11025                ("Zrm_r",CTy"Zdest_src",
11026                 TP[Var("rm",CTy"Zrm"),Var("r",CTy"Zreg")])]),
11027        ITE(EQ(Var("bop",CTy"Zbinop_name"),LC("Ztest",CTy"Zbinop_name")),
11028            Call
11029              ("e_gen_rm_reg",LTy F8,
11030               TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11031                  Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,LW(132,8),LO F8]),
11032            Let(Var("opc",F4),Mop(Cast F4,Var("bop",CTy"Zbinop_name")),
11033                ITE(Bop(Bit,Var("opc",F4),LN 3),
11034                    ITE(EQ(Var("r",CTy"Zreg"),LC("RCX",CTy"Zreg")),
11035                        Call
11036                          ("e_gen_rm_reg",LTy F8,
11037                           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11038                              Bop(BAnd,Var("opc",F4),LW(7,4)),LNL F8,
11039                              LW(210,8),LO F8]),LNL F8),
11040                    Call
11041                      ("e_gen_rm_reg",LTy F8,
11042                       TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11043                          Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,
11044                          CC[LW(0,2),EX(Var("opc",F4),LN 2,LN 0,FTy 3),
11045                             LW(0,3)],LO F8]))))),
11046       (Call
11047          ("Zbinop",CTy"instruction",
11048           TP[Var("bop",CTy"Zbinop_name"),Var("sz",CTy"Zsize"),
11049              Call
11050                ("Zr_rm",CTy"Zdest_src",
11051                 TP[Var("r",CTy"Zreg"),Var("rm",CTy"Zrm")])]),
11052        Let(Var("opc",F4),Mop(Cast F4,Var("bop",CTy"Zbinop_name")),
11053            ITE(Bop(Bit,Var("opc",F4),LN 3),LNL F8,
11054                Call
11055                  ("e_gen_rm_reg",LTy F8,
11056                   TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11057                      Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,
11058                      CC[LW(0,2),EX(Var("opc",F4),LN 2,LN 0,FTy 3),LW(2,3)],
11059                      LO F8])))),
11060       (Call
11061          ("Zbit_test",CTy"instruction",
11062           TP[Var("bt",CTy"Zbit_test_name"),Var("sz",CTy"Zsize"),
11063              Call
11064                ("Zrm_r",CTy"Zdest_src",
11065                 TP[Var("rm",CTy"Zrm"),Var("r",CTy"Zreg")])]),
11066        Call
11067          ("e_gen_rm_reg",LTy F8,
11068           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11069              Mop(Cast F4,Var("r",CTy"Zreg")),LL[LW(15,8)],
11070              CC[LW(5,3),Mop(Cast(FTy 2),Var("bt",CTy"Zbit_test_name")),
11071                 LW(3,3)],LO F8])),
11072       (Call
11073          ("Zbit_test",CTy"instruction",
11074           TP[Var("bt",CTy"Zbit_test_name"),Var("sz",CTy"Zsize"),
11075              Call
11076                ("Zrm_i",CTy"Zdest_src",
11077                 TP[Var("rm",CTy"Zrm"),Var("i",F64)])]),
11078        Call
11079          ("e_rm_imm8b",LTy F8,
11080           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("i",F64),
11081              Mop(Cast F4,Var("bt",CTy"Zbit_test_name")),
11082              LL[LW(15,8),LW(186,8)]])),
11083       (Call
11084          ("Zbit_test",CTy"instruction",
11085           AVar(PTy(CTy"Zbit_test_name",PTy(CTy"Zsize",CTy"Zdest_src")))),
11086        LNL F8),
11087       (Call
11088          ("Zcall",CTy"instruction",
11089           Call("Zrm",CTy"Zimm_rm",Var("rm",CTy"Zrm"))),
11090        Call("e_opc",LTy F8,TP[LW(255,8),LW(2,3),Var("rm",CTy"Zrm")])),
11091       (Call
11092          ("Zcall",CTy"instruction",
11093           Call("Zimm",CTy"Zimm_rm",Var("imm",F64))),
11094        CS(Call("e_imm32",LTy F8,Var("imm",F64)),
11095           [(LNL F8,LNL F8),
11096            (Var("l",LTy F8),LLC([LW(232,8)],Var("l",LTy F8)))])),
11097       (Const("Zcmc",CTy"instruction"),LL[LW(245,8)]),
11098       (Const("Zclc",CTy"instruction"),LL[LW(248,8)]),
11099       (Const("Zstc",CTy"instruction"),LL[LW(249,8)]),
11100       (Call
11101          ("Zcmpxchg",CTy"instruction",
11102           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("r",CTy"Zreg")]),
11103        Call
11104          ("e_gen_rm_reg",LTy F8,
11105           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11106              Mop(Cast F4,Var("r",CTy"Zreg")),LL[LW(15,8)],LW(176,8),LO F8])),
11107       (Call
11108          ("Zdiv",CTy"instruction",
11109           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm")]),
11110        Call
11111          ("e_gen_rm_reg",LTy F8,
11112           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),LW(6,4),LNL F8,
11113              LW(246,8),LO F8])),
11114       (Call
11115          ("Zidiv",CTy"instruction",
11116           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm")]),
11117        Call
11118          ("e_gen_rm_reg",LTy F8,
11119           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),LW(7,4),LNL F8,
11120              LW(246,8),LO F8])),
11121       (Call
11122          ("Zjcc",CTy"instruction",
11123           TP[Var("cond",CTy"Zcond"),Var("imm",F64)]),
11124        Let(TP[nVar"s",Var("l",LTy F8)],
11125            Call("e_imm_8_32",PTy(nTy,LTy F8),Var("imm",F64)),
11126            ITB([(EQ(Var("cond",CTy"Zcond"),LC("Z_ALWAYS",CTy"Zcond")),
11127                  ITB([(EQ(nVar"s",LN 1),LLC([LW(235,8)],Var("l",LTy F8))),
11128                       (EQ(nVar"s",LN 4),LLC([LW(233,8)],Var("l",LTy F8)))],
11129                      LNL F8)),
11130                 (EQ(nVar"s",LN 1),
11131                  LLC([CC[LW(7,4),Mop(Cast F4,Var("cond",CTy"Zcond"))]],
11132                      Var("l",LTy F8))),
11133                 (EQ(nVar"s",LN 4),
11134                  CC[LL[LW(15,8),
11135                        CC[LW(8,4),Mop(Cast F4,Var("cond",CTy"Zcond"))]],
11136                     Var("l",LTy F8)])],LNL F8))),
11137       (Call("Zjmp",CTy"instruction",Var("rm",CTy"Zrm")),
11138        Call("e_opc",LTy F8,TP[LW(255,8),LW(4,3),Var("rm",CTy"Zrm")])),
11139       (Call
11140          ("Zlea",CTy"instruction",
11141           TP[Call("Z8",CTy"Zsize",AVar bTy),AVar(CTy"Zdest_src")]),LNL F8),
11142       (Call
11143          ("Zlea",CTy"instruction",
11144           TP[Var("sz",CTy"Zsize"),
11145              Call
11146                ("Zr_rm",CTy"Zdest_src",
11147                 TP[Var("r",CTy"Zreg"),
11148                    Call
11149                      ("Zm",CTy"Zrm",
11150                       Var("m",
11151                           PTy(OTy(PTy(FTy 2,CTy"Zreg")),
11152                               PTy(CTy"Zbase",F64))))])]),
11153        Call
11154          ("e_gen_rm_reg",LTy F8,
11155           TP[Var("sz",CTy"Zsize"),
11156              Call
11157                ("Zm",CTy"Zrm",
11158                 Var("m",
11159                     PTy(OTy(PTy(FTy 2,CTy"Zreg")),PTy(CTy"Zbase",F64)))),
11160              Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,LW(141,8),LO F8])),
11161       (Call("Zlea",CTy"instruction",AVar(PTy(CTy"Zsize",CTy"Zdest_src"))),
11162        LNL F8),(Const("Zleave",CTy"instruction"),LL[LW(201,8)]),
11163       (Call
11164          ("Zloop",CTy"instruction",
11165           TP[Var("cond",CTy"Zcond"),Var("imm",F64)]),
11166        CS(TP[Var("cond",CTy"Zcond"),Call("e_imm8",LTy F8,Var("imm",F64))],
11167           [(TP[AVar(CTy"Zcond"),LNL F8],LNL F8),
11168            (TP[LC("Z_NE",CTy"Zcond"),Var("l",LTy F8)],
11169             LLC([LW(224,8)],Var("l",LTy F8))),
11170            (TP[LC("Z_E",CTy"Zcond"),Var("l",LTy F8)],
11171             LLC([LW(225,8)],Var("l",LTy F8))),
11172            (TP[LC("Z_ALWAYS",CTy"Zcond"),Var("l",LTy F8)],
11173             LLC([LW(226,8)],Var("l",LTy F8))),
11174            (AVar(PTy(CTy"Zcond",LTy F8)),LNL F8)])),
11175       (Call
11176          ("Zmonop",CTy"instruction",
11177           TP[LC("Zinc",CTy"Zmonop_name"),Call("Z8",CTy"Zsize",AVar bTy),
11178              Var("rm",CTy"Zrm")]),
11179        Call("e_opc",LTy F8,TP[LW(254,8),LW(0,3),Var("rm",CTy"Zrm")])),
11180       (Call
11181          ("Zmonop",CTy"instruction",
11182           TP[LC("Zdec",CTy"Zmonop_name"),Call("Z8",CTy"Zsize",AVar bTy),
11183              Var("rm",CTy"Zrm")]),
11184        Call("e_opc",LTy F8,TP[LW(254,8),LW(1,3),Var("rm",CTy"Zrm")])),
11185       (Call
11186          ("Zmonop",CTy"instruction",
11187           TP[LC("Zinc",CTy"Zmonop_name"),Var("sz",CTy"Zsize"),
11188              Var("rm",CTy"Zrm")]),
11189        Call
11190          ("e_gen_rm_reg",LTy F8,
11191           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),LW(0,4),LNL F8,
11192              LW(255,8),LO F8])),
11193       (Call
11194          ("Zmonop",CTy"instruction",
11195           TP[LC("Zdec",CTy"Zmonop_name"),Var("sz",CTy"Zsize"),
11196              Var("rm",CTy"Zrm")]),
11197        Call
11198          ("e_gen_rm_reg",LTy F8,
11199           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),LW(1,4),LNL F8,
11200              LW(255,8),LO F8])),
11201       (Call
11202          ("Zmonop",CTy"instruction",
11203           TP[LC("Znot",CTy"Zmonop_name"),Var("sz",CTy"Zsize"),
11204              Var("rm",CTy"Zrm")]),
11205        Call
11206          ("e_gen_rm_reg",LTy F8,
11207           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),LW(2,4),LNL F8,
11208              LW(246,8),LO F8])),
11209       (Call
11210          ("Zmonop",CTy"instruction",
11211           TP[LC("Zneg",CTy"Zmonop_name"),Var("sz",CTy"Zsize"),
11212              Var("rm",CTy"Zrm")]),
11213        Call
11214          ("e_gen_rm_reg",LTy F8,
11215           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),LW(3,4),LNL F8,
11216              LW(246,8),LO F8])),
11217       (Call
11218          ("Zmov",CTy"instruction",
11219           TP[LC("Z_ALWAYS",CTy"Zcond"),Var("sz",CTy"Zsize"),
11220              Call
11221                ("Zrm_r",CTy"Zdest_src",
11222                 TP[Var("rm",CTy"Zrm"),Var("r",CTy"Zreg")])]),
11223        Call
11224          ("e_gen_rm_reg",LTy F8,
11225           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11226              Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,LW(136,8),LO F8])),
11227       (Call
11228          ("Zmov",CTy"instruction",
11229           TP[LC("Z_ALWAYS",CTy"Zcond"),Var("sz",CTy"Zsize"),
11230              Call
11231                ("Zr_rm",CTy"Zdest_src",
11232                 TP[Var("r",CTy"Zreg"),Var("rm",CTy"Zrm")])]),
11233        Call
11234          ("e_gen_rm_reg",LTy F8,
11235           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11236              Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,LW(138,8),LO F8])),
11237       (Call
11238          ("Zmov",CTy"instruction",
11239           TP[LC("Z_ALWAYS",CTy"Zcond"),Var("sz",CTy"Zsize"),
11240              Call
11241                ("Zrm_i",CTy"Zdest_src",
11242                 TP[Call("Zr",CTy"Zrm",Var("reg",CTy"Zreg")),
11243                    Var("imm",F64)])]),
11244        Let(Var("r",F4),Mop(Cast F4,Var("reg",CTy"Zreg")),
11245            CS(Call
11246                 ("e_opsize_imm",OTy(PTy(LTy F8,PTy(F8,LTy F8))),
11247                  TP[Var("sz",CTy"Zsize"),
11248                     ITE(Bop(Bit,Var("r",F4),LN 3),LW(1,4),LW(0,4)),
11249                     Var("imm",F64),LF]),
11250               [(Mop(Some,
11251                     TP[Var("prefixes",LTy F8),Var("v",F8),Var("l",LTy F8)]),
11252                 CC[Var("prefixes",LTy F8),
11253                    LL[CC[LW(11,4),Mop(Cast F1,Var("v",F8)),
11254                          EX(Var("r",F4),LN 2,LN 0,FTy 3)]],
11255                    Var("l",LTy F8)]),
11256                (LO(PTy(LTy F8,PTy(F8,LTy F8))),LNL F8)]))),
11257       (Call
11258          ("Zmov",CTy"instruction",
11259           TP[LC("Z_ALWAYS",CTy"Zcond"),Var("sz",CTy"Zsize"),
11260              Call
11261                ("Zrm_i",CTy"Zdest_src",
11262                 TP[Var("rm",CTy"Zrm"),Var("imm",F64)])]),
11263        Call
11264          ("e_rm_imm",LTy F8,
11265           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("imm",F64),
11266              LW(0,4),LW(198,8)])),
11267       (Call
11268          ("Zmov",CTy"instruction",
11269           TP[Var("cond",CTy"Zcond"),Call("Z8",CTy"Zsize",AVar bTy),
11270              AVar(CTy"Zdest_src")]),LNL F8),
11271       (Call
11272          ("Zmov",CTy"instruction",
11273           TP[Var("cond",CTy"Zcond"),Var("sz",CTy"Zsize"),
11274              Call
11275                ("Zr_rm",CTy"Zdest_src",
11276                 TP[Var("r",CTy"Zreg"),Var("rm",CTy"Zrm")])]),
11277        Call
11278          ("e_gen_rm_reg",LTy F8,
11279           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11280              Mop(Cast F4,Var("r",CTy"Zreg")),LL[LW(15,8)],LW(64,8),
11281              Mop(Some,Mop(Cast F8,Var("cond",CTy"Zcond")))])),
11282       (Call
11283          ("Zmov",CTy"instruction",
11284           AVar(PTy(CTy"Zcond",PTy(CTy"Zsize",CTy"Zdest_src")))),LNL F8),
11285       (Call
11286          ("Zmovsx",CTy"instruction",
11287           TP[Const("Z32",CTy"Zsize"),
11288              Call
11289                ("Zr_rm",CTy"Zdest_src",
11290                 TP[Var("r",CTy"Zreg"),Var("rm",CTy"Zrm")]),
11291              Const("Z64",CTy"Zsize")]),
11292        Call
11293          ("e_gen_rm_reg",LTy F8,
11294           TP[Const("Z64",CTy"Zsize"),Var("rm",CTy"Zrm"),
11295              Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,LW(99,8),LO F8])),
11296       (Call
11297          ("Zmovsx",CTy"instruction",
11298           TP[Var("sz1",CTy"Zsize"),
11299              Call
11300                ("Zr_rm",CTy"Zdest_src",
11301                 TP[Var("r",CTy"Zreg"),Var("rm",CTy"Zrm")]),
11302              Var("sz2",CTy"Zsize")]),
11303        ITE(Bop(Lt,Call("Zsize_width",nTy,Var("sz1",CTy"Zsize")),
11304                Call("Zsize_width",nTy,Var("sz2",CTy"Zsize"))),
11305            Call
11306              ("e_gen_rm_reg",LTy F8,
11307               TP[Var("sz2",CTy"Zsize"),Var("rm",CTy"Zrm"),
11308                  Mop(Cast F4,Var("r",CTy"Zreg")),LL[LW(15,8)],LW(190,8),
11309                  Mop(Some,
11310                      ITE(EQ(Var("sz1",CTy"Zsize"),Const("Z16",CTy"Zsize")),
11311                          LW(1,8),LW(0,8)))]),LNL F8)),
11312       (Call
11313          ("Zmovsx",CTy"instruction",
11314           AVar(PTy(CTy"Zsize",PTy(CTy"Zdest_src",CTy"Zsize")))),LNL F8),
11315       (Call
11316          ("Zmovzx",CTy"instruction",
11317           TP[Var("sz1",CTy"Zsize"),
11318              Call
11319                ("Zr_rm",CTy"Zdest_src",
11320                 TP[Var("r",CTy"Zreg"),Var("rm",CTy"Zrm")]),
11321              Var("sz2",CTy"Zsize")]),
11322        ITE(Bop(And,
11323                Bop(Lt,Call("Zsize_width",nTy,Var("sz1",CTy"Zsize")),
11324                    Call("Zsize_width",nTy,Var("sz2",CTy"Zsize"))),
11325                Mop(Not,EQ(Var("sz1",CTy"Zsize"),Const("Z32",CTy"Zsize")))),
11326            Call
11327              ("e_gen_rm_reg",LTy F8,
11328               TP[Var("sz2",CTy"Zsize"),Var("rm",CTy"Zrm"),
11329                  Mop(Cast F4,Var("r",CTy"Zreg")),LL[LW(15,8)],LW(182,8),
11330                  Mop(Some,
11331                      ITE(EQ(Var("sz1",CTy"Zsize"),Const("Z16",CTy"Zsize")),
11332                          LW(1,8),LW(0,8)))]),LNL F8)),
11333       (Call
11334          ("Zmovzx",CTy"instruction",
11335           AVar(PTy(CTy"Zsize",PTy(CTy"Zdest_src",CTy"Zsize")))),LNL F8),
11336       (Call
11337          ("Zmul",CTy"instruction",
11338           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm")]),
11339        Call
11340          ("e_gen_rm_reg",LTy F8,
11341           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),LW(4,4),LNL F8,
11342              LW(246,8),LO F8])),
11343       (Call
11344          ("Zimul",CTy"instruction",
11345           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm")]),
11346        Call
11347          ("e_gen_rm_reg",LTy F8,
11348           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),LW(5,4),LNL F8,
11349              LW(246,8),LO F8])),
11350       (Call
11351          ("Zimul2",CTy"instruction",
11352           TP[Call("Z8",CTy"Zsize",AVar bTy),AVar(CTy"Zreg"),
11353              AVar(CTy"Zrm")]),LNL F8),
11354       (Call
11355          ("Zimul2",CTy"instruction",
11356           TP[Var("sz",CTy"Zsize"),Var("r",CTy"Zreg"),Var("rm",CTy"Zrm")]),
11357        Call
11358          ("e_gen_rm_reg",LTy F8,
11359           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11360              Mop(Cast F4,Var("r",CTy"Zreg")),LL[LW(15,8)],LW(175,8),LO F8])),
11361       (Call
11362          ("Zimul3",CTy"instruction",
11363           TP[Call("Z8",CTy"Zsize",AVar bTy),AVar(CTy"Zreg"),
11364              AVar(PTy(CTy"Zrm",F64))]),LNL F8),
11365       (Call
11366          ("Zimul3",CTy"instruction",
11367           TP[Var("sz",CTy"Zsize"),Var("r",CTy"Zreg"),Var("rm",CTy"Zrm"),
11368              Var("imm",F64)]),
11369        Let(TP[nVar"s",Var("l",LTy F8)],
11370            Call("e_imm_8_32",PTy(nTy,LTy F8),Var("imm",F64)),
11371            ITB([(EQ(nVar"s",LN 1),
11372                  CC[Call
11373                       ("e_gen_rm_reg",LTy F8,
11374                        TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11375                           Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,
11376                           LW(107,8),LO F8]),Var("l",LTy F8)]),
11377                 (EQ(nVar"s",LN 4),
11378                  CC[Call
11379                       ("e_gen_rm_reg",LTy F8,
11380                        TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11381                           Mop(Cast F4,Var("r",CTy"Zreg")),LNL F8,
11382                           LW(105,8),LO F8]),Var("l",LTy F8)])],LNL F8))),
11383       (Call("Znop",CTy"instruction",LN 1),LL[LW(144,8)]),
11384       (Call("Znop",CTy"instruction",LN 2),LL[LW(102,8),LW(144,8)]),
11385       (Call("Znop",CTy"instruction",LN 3),LL[LW(15,8),LW(31,8),LW(0,8)]),
11386       (Call("Znop",CTy"instruction",LN 4),
11387        LL[LW(15,8),LW(31,8),LW(64,8),LW(0,8)]),
11388       (Call("Znop",CTy"instruction",LN 5),
11389        LL[LW(15,8),LW(31,8),LW(68,8),LW(0,8),LW(0,8)]),
11390       (Call("Znop",CTy"instruction",LN 6),
11391        LL[LW(102,8),LW(15,8),LW(31,8),LW(68,8),LW(0,8),LW(0,8)]),
11392       (Call("Znop",CTy"instruction",LN 7),
11393        LL[LW(15,8),LW(31,8),LW(128,8),LW(0,8),LW(0,8),LW(0,8),LW(0,8)]),
11394       (Call("Znop",CTy"instruction",LN 8),
11395        LL[LW(15,8),LW(31,8),LW(132,8),LW(0,8),LW(0,8),LW(0,8),LW(0,8),
11396           LW(0,8)]),
11397       (Call("Znop",CTy"instruction",LN 9),
11398        LL[LW(102,8),LW(15,8),LW(31,8),LW(132,8),LW(0,8),LW(0,8),LW(0,8),
11399           LW(0,8),LW(0,8)]),
11400       (Call("Znop",CTy"instruction",AVar nTy),LNL F8),
11401       (Call
11402          ("Zpop",CTy"instruction",
11403           Call("Zr",CTy"Zrm",Var("reg",CTy"Zreg"))),
11404        Let(Var("r",F4),Mop(Cast F4,Var("reg",CTy"Zreg")),
11405            CC[ITE(Bop(Bit,Var("r",F4),LN 3),LL[LW(73,8)],LNL F8),
11406               LL[CC[LW(11,5),EX(Var("r",F4),LN 2,LN 0,FTy 3)]]])),
11407       (Call("Zpop",CTy"instruction",Var("rm",CTy"Zrm")),
11408        Call("e_opc",LTy F8,TP[LW(143,8),LW(0,3),Var("rm",CTy"Zrm")])),
11409       (Call
11410          ("Zpush",CTy"instruction",
11411           Call
11412             ("Zrm",CTy"Zimm_rm",Call("Zr",CTy"Zrm",Var("reg",CTy"Zreg")))),
11413        Let(Var("r",F4),Mop(Cast F4,Var("reg",CTy"Zreg")),
11414            CC[ITE(Bop(Bit,Var("r",F4),LN 3),LL[LW(73,8)],LNL F8),
11415               LL[CC[LW(10,5),EX(Var("r",F4),LN 2,LN 0,FTy 3)]]])),
11416       (Call
11417          ("Zpush",CTy"instruction",
11418           Call("Zrm",CTy"Zimm_rm",Var("rm",CTy"Zrm"))),
11419        Call("e_opc",LTy F8,TP[LW(255,8),LW(6,3),Var("rm",CTy"Zrm")])),
11420       (Call
11421          ("Zpush",CTy"instruction",
11422           Call("Zimm",CTy"Zimm_rm",Var("imm",F64))),
11423        Let(TP[nVar"s",Var("l",LTy F8)],
11424            Call("e_imm_8_32",PTy(nTy,LTy F8),Var("imm",F64)),
11425            ITB([(EQ(nVar"s",LN 1),LLC([LW(106,8)],Var("l",LTy F8))),
11426                 (EQ(nVar"s",LN 4),LLC([LW(104,8)],Var("l",LTy F8)))],
11427                LNL F8))),
11428       (Call("Zret",CTy"instruction",LW(0,64)),LL[LW(195,8)]),
11429       (Call("Zret",CTy"instruction",Var("imm",F64)),
11430        CS(Call("e_imm16",LTy F8,Var("imm",F64)),
11431           [(LNL F8,LNL F8),
11432            (Var("l",LTy F8),LLC([LW(194,8)],Var("l",LTy F8)))])),
11433       (Call
11434          ("Zset",CTy"instruction",
11435           TP[LC("Z_ALWAYS",CTy"Zcond"),bVar"have_rex",Var("rm",CTy"Zrm")]),
11436        LNL F8),
11437       (Call
11438          ("Zset",CTy"instruction",
11439           TP[Var("cond",CTy"Zcond"),bVar"have_rex",Var("rm",CTy"Zrm")]),
11440        Call
11441          ("e_gen_rm_reg",LTy F8,
11442           TP[Call("Z8",CTy"Zsize",bVar"have_rex"),Var("rm",CTy"Zrm"),
11443              LW(0,4),LL[LW(15,8)],
11444              CC[LW(9,4),Mop(Cast F4,Var("cond",CTy"Zcond"))],LO F8])),
11445       (Call
11446          ("Zxadd",CTy"instruction",
11447           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("r",CTy"Zreg")]),
11448        Call
11449          ("e_gen_rm_reg",LTy F8,
11450           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11451              Mop(Cast F4,Var("r",CTy"Zreg")),LL[LW(15,8)],LW(192,8),LO F8])),
11452       (Call
11453          ("Zxchg",CTy"instruction",
11454           TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),Var("reg",CTy"Zreg")]),
11455        ITE(Bop(And,Call("not_byte",bTy,Var("sz",CTy"Zsize")),
11456                Bop(Or,EQ(Var("reg",CTy"Zreg"),LC("RAX",CTy"Zreg")),
11457                    Call("is_rax",bTy,Var("rm",CTy"Zrm")))),
11458            Let(Var("r",F4),Mop(Cast F4,Var("reg",CTy"Zreg")),
11459                Let(TP[Var("prefixes",LTy F8),Var("v",F8)],
11460                    Call
11461                      ("e_opsize",PTy(LTy F8,F8),
11462                       TP[Var("sz",CTy"Zsize"),
11463                          ITE(Bop(Bit,Var("r",F4),LN 3),LW(1,4),LW(0,4))]),
11464                    ITE(EQ(Var("v",F8),LW(1,8)),
11465                        CC[Var("prefixes",LTy F8),
11466                           LL[CC[LW(18,5),EX(Var("r",F4),LN 2,LN 0,FTy 3)]]],
11467                        LNL F8))),
11468            Call
11469              ("e_gen_rm_reg",LTy F8,
11470               TP[Var("sz",CTy"Zsize"),Var("rm",CTy"Zrm"),
11471                  Mop(Cast F4,Var("reg",CTy"Zreg")),LNL F8,LW(134,8),LO F8])))]))
11472
11473val () = Import.finish 0