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