|
From: <sv...@va...> - 2005-05-09 22:01:45
|
Author: sewardj
Date: 2005-05-09 23:01:37 +0100 (Mon, 09 May 2005)
New Revision: 3647
Added:
trunk/none/tests/amd64/gen_insn_test.pl
trunk/none/tests/amd64/insn_mmx.def
Log:
Versions of Tom's excellent insn-set test programs modified for the
amd64 insn set.
Added: trunk/none/tests/amd64/gen_insn_test.pl
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/none/tests/amd64/gen_insn_test.pl 2005-05-09 01:23:49 UTC (rev =
3646)
+++ trunk/none/tests/amd64/gen_insn_test.pl 2005-05-09 22:01:37 UTC (rev =
3647)
@@ -0,0 +1,984 @@
+#!/usr/bin/perl
+
+use 5.006;
+use strict;
+use warnings;
+
+our %ArgTypes =3D (
+ r8 =3D> "reg8_t",
+ r16 =3D> "reg16_t",
+ r32 =3D> "reg32_t",
+ r64 =3D> "reg64_t",
+ mm =3D> "reg64_t",
+ xmm =3D> "reg128_t",
+ m8 =3D> "reg8_t",
+ m16 =3D> "reg16_t",
+ m32 =3D> "reg32_t",
+ m64 =3D> "reg64_t",
+ m128 =3D> "reg128_t",
+ eflags =3D> "reg32_t",
+ st =3D> "reg64_t",
+ fpucw =3D> "reg16_t",
+ fpusw =3D> "reg16_t"
+ );
+
+our %SubTypeFormats =3D (
+ sb =3D> "%d",
+ ub =3D> "%u",
+ sw =3D> "%d",
+ uw =3D> "%u",
+ sd =3D> "%d",
+ ud =3D> "%u",
+ sq =3D> "%lld",
+ uq =3D> "%llu",
+ ps =3D> "%.16g",
+ pd =3D> "%.16g"
+ );
+
+our %SubTypeSuffixes =3D (
+ sb =3D> "",
+ ub =3D> "U",
+ sw =3D> "",
+ uw =3D> "",
+ sd =3D> "",
+ ud =3D> "",
+ sq =3D> "LL",
+ uq =3D> "ULL",
+ ps =3D> "F",
+ pd =3D> ""
+ );
+
+our %RegNums =3D (
+ al =3D> 0, ax =3D> 0, eax =3D> 0, rax =3D> 0,
+ bl =3D> 1, bx =3D> 1, ebx =3D> 1, rbx =3D> 1,
+ cl =3D> 2, cx =3D> 2, ecx =3D> 2, rcx =3D> 2,
+ dl =3D> 3, dx =3D> 3, edx =3D> 3, rdx =3D> 3,
+ ah =3D> 4,
+ bh =3D> 5,
+ ch =3D> 6,
+ dh =3D> 7,
+ st0 =3D> 0, st1 =3D> 1, st2 =3D> 2, st3 =3D> 3,
+ st4 =3D> 4, st5 =3D> 5, st6 =3D> 6, st7 =3D> 7
+ );
+
+our %RegTypes =3D (
+ al =3D> "r8", ah =3D> "r8", ax =3D> "r16", eax =3D> "r3=
2", rax =3D> "r64",
+ bl =3D> "r8", bh =3D> "r8", bx =3D> "r16", ebx =3D> "r3=
2", rbx =3D> "r64",
+ cl =3D> "r8", ch =3D> "r8", cx =3D> "r16", ecx =3D> "r3=
2", rcx =3D> "r64",
+ dl =3D> "r8", dh =3D> "r8", dx =3D> "r16", edx =3D> "r3=
2", rdx =3D> "r64"
+ );
+
+our @IntRegs =3D (
+ { r8 =3D> "al", r16 =3D> "ax", r32 =3D> "eax", r64 =3D> =
"rax" },
+ { r8 =3D> "bl", r16 =3D> "bx", r32 =3D> "ebx", r64 =3D> =
"rbx" },
+ { r8 =3D> "cl", r16 =3D> "cx", r32 =3D> "ecx", r64 =3D> =
"rcx" },
+ { r8 =3D> "dl", r16 =3D> "dx", r32 =3D> "edx", r64 =3D> =
"rdx" },
+ { r8 =3D> "ah" },
+ { r8 =3D> "bh" },
+ { r8 =3D> "ch" },
+ { r8 =3D> "dh" }
+ );
+
+print <<EOF;
+#include <math.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef union {
+ char sb[1];
+ unsigned char ub[1];
+} reg8_t;
+
+typedef union {
+ char sb[2];
+ unsigned char ub[2];
+ short sw[1];
+ unsigned short uw[1];
+} reg16_t;
+
+typedef union {
+ char sb[4];
+ unsigned char ub[4];
+ short sw[2];
+ unsigned short uw[2];
+ int sd[1];
+ unsigned int ud[1];
+ float ps[1];
+} reg32_t;
+
+typedef union {
+ char sb[8];
+ unsigned char ub[8];
+ short sw[4];
+ unsigned short uw[4];
+ int sd[2];
+ unsigned int ud[2];
+ long long int sq[1];
+ unsigned long long int uq[1];
+ float ps[2];
+ double pd[1];
+} reg64_t __attribute__ ((aligned (8)));
+
+typedef union {
+ char sb[16];
+ unsigned char ub[16];
+ short sw[8];
+ unsigned short uw[8];
+ int sd[4];
+ unsigned int ud[4];
+ long long int sq[2];
+ unsigned long long int uq[2];
+ float ps[4];
+ double pd[2];
+} reg128_t __attribute__ ((aligned (16)));
+
+static sigjmp_buf catchpoint;
+
+static void handle_sigill(int signum)
+{
+ siglongjmp(catchpoint, 1);
+}
+
+__attribute__((unused))
+static int eq_float(float f1, float f2)
+{
+ return f1 =3D=3D f2 || fabsf(f1 - f2) < fabsf(f1) * 1.5 * pow(2,-12);
+}
+
+__attribute__((unused))
+static int eq_double(double d1, double d2)
+{
+ return d1 =3D=3D d2 || fabs(d1 - d2) < fabs(d1) * 1.5 * pow(2,-12);
+}
+
+EOF
+
+my %tests;
+my @tests;
+
+while (<>)
+{
+ next if /^#/;
+
+ my $insn;
+ my $presets;
+ my $args;
+ my $results;
+
+ if (/^(\S+)\s+(?:(\S+(?:\s+\S+)*)\s+:\s+)?((?:\S+\s+)*?)(?:=3D>\s+(\=
S+(?:\s+\S+)*))?$/)
+ {
+ $insn =3D $1;
+ $presets =3D $2 || "";
+ $args =3D $3 || "";
+ $results =3D $4 || "";
+
+# print STDERR "insn: $insn\n";
+# print STDERR "presets: $presets\n";
+# print STDERR "args: $args\n";
+# print STDERR "results: $results\n";
+ }
+ else
+ {
+ die "Can't parse test $_";
+ }
+ =20
+ $tests{$insn}++;
+ =20
+ my $test =3D "${insn}_$tests{$insn}";
+ =20
+ push @tests, $test;
+ =20
+ print qq|static void $test(void)\n|;
+ print qq|\{\n|;
+
+ my @intregs =3D @IntRegs;
+ my @mmregs =3D map { "mm$_" } (6,7,0,1,2,3,4,5);
+ my @xmmregs =3D map { "xmm$_" } (4,5,0,1,2,3,6,7);
+ my @fpregs =3D map { "st$_" } (0 .. 7);
+
+ my @presets;
+ my $presetc =3D 0;
+ my $eflagsmask;
+ my $eflagsset;
+ my $fpucwmask;
+ my $fpucwset;
+ my $fpuswmask;
+ my $fpuswset;
+
+ foreach my $preset (split(/\s+/, $presets))
+ {
+ if ($preset =3D~ /^([abcd][lh]|[abcd]x|e[abcd]x|r[abcd]x)\.(sb|u=
b|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
+ {
+ my $name =3D "preset$presetc";
+ my $type =3D $RegTypes{$1};
+ my $regnum =3D $RegNums{$1};
+ my $register =3D $intregs[$regnum];
+ my $subtype =3D $2;
+ my @values =3D split(/,/, $3);
+ =20
+ die "Register $1 already used" unless defined($register);
+
+ my $preset =3D {
+ name =3D> $name,
+ type =3D> $type,
+ subtype =3D> $subtype,
+ register =3D> $register
+ };
+
+ delete($intregs[$regnum]);
+
+ push @presets, $preset;
+ =20
+ print qq| $ArgTypes{$type} $name =3D \{ .$subtype =3D \{|;
+ =20
+ my $valuec =3D 0;
+ =20
+ foreach my $value (@values)
+ {
+ print qq|,| if $valuec > 0;
+ print qq| $value$SubTypeSuffixes{$subtype}|;
+ $valuec++;
+ }
+ =20
+ print qq| \} \};\n|;
+
+ $presetc++;
+ }
+ elsif ($preset =3D~ /^st([0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
+ {
+ my $name =3D "preset$presetc";
+ my $type =3D "st";
+ my $regnum =3D $1;
+ my $register =3D $fpregs[$regnum];
+ my $subtype =3D $2;
+ my @values =3D split(/,/, $3);
+
+ die "Register st$1 already used" unless defined($register);
+
+ my $preset =3D {
+ name =3D> $name,
+ type =3D> $type,
+ subtype =3D> $subtype,
+ register =3D> $register
+ };
+
+ delete($fpregs[$regnum]);
+
+ push @presets, $preset;
+ =20
+ print qq| $ArgTypes{$type} $name =3D \{ .$subtype =3D \{|;
+ =20
+ my $valuec =3D 0;
+ =20
+ foreach my $value (@values)
+ {
+ print qq|,| if $valuec > 0;
+ print qq| $value$SubTypeSuffixes{$subtype}|;
+ $valuec++;
+ }
+ =20
+ print qq| \} \};\n|;
+
+ $presetc++;
+ }
+ elsif ($preset =3D~ /^(eflags)\[([^\]]+)\]$/)
+ {
+ my $type =3D $1;
+ my @values =3D split(/,/, $2);
+
+ $values[0] =3D oct($values[0]) if $values[0] =3D~ /^0/;
+ $values[1] =3D oct($values[1]) if $values[1] =3D~ /^0/;
+
+ $eflagsmask =3D sprintf "0x%08x", $values[0] ^ 0xffffffff;
+ $eflagsset =3D sprintf "0x%08x", $values[1];
+ }
+ elsif ($preset =3D~ /^(fpucw)\[([^\]]+)\]$/)
+ {
+ my $type =3D $1;
+ my @values =3D split(/,/, $2);
+
+ $values[0] =3D oct($values[0]) if $values[0] =3D~ /^0/;
+ $values[1] =3D oct($values[1]) if $values[1] =3D~ /^0/;
+
+ $fpucwmask =3D sprintf "0x%04x", $values[0] ^ 0xffff;
+ $fpucwset =3D sprintf "0x%04x", $values[1];
+ }
+ elsif ($preset =3D~ /^(fpusw)\[([^\]]+)\]$/)
+ {
+ my $type =3D $1;
+ my @values =3D split(/,/, $2);
+
+ $values[0] =3D oct($values[0]) if $values[0] =3D~ /^0/;
+ $values[1] =3D oct($values[1]) if $values[1] =3D~ /^0/;
+
+ $fpuswmask =3D sprintf "0x%04x", $values[0] ^ 0xffff;
+ $fpuswset =3D sprintf "0x%04x", $values[1];
+ }
+ else
+ {
+ die "Can't parse preset $preset";
+ }
+ }
+
+ my @args;
+ my $argc =3D 0;
+ =20
+ foreach my $arg (split(/\s+/, $args))
+ {
+ my $name =3D "arg$argc";
+
+ if ($arg =3D~ /^([abcd]l|[abcd]x|e[abcd]x|r[abcd]x|r8|r16|r32|r6=
4|mm|xmm|m8|m16|m32|m64|m128)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\=
]$/)
+ {
+ my $type =3D $RegTypes{$1} || $1;
+ my $regnum =3D $RegNums{$1};
+ my $register =3D $intregs[$regnum] if defined($regnum);
+ my $subtype =3D $2;
+ my @values =3D split(/,/, $3);
+ =20
+ die "Register $1 already used" if defined($regnum) && !defin=
ed($register);
+
+ my $arg =3D {
+ name =3D> $name,
+ type =3D> $type,
+ subtype =3D> $subtype
+ };
+
+ if (defined($register))
+ {
+ $arg->{register} =3D $register;
+ delete($intregs[$regnum]);
+ }
+
+ push @args, $arg;
+ =20
+ print qq| $ArgTypes{$type} $name =3D \{ .$subtype =3D \{|;
+ =20
+ my $valuec =3D 0;
+ =20
+ foreach my $value (@values)
+ {
+ print qq|,| if $valuec > 0;
+ print qq| $value$SubTypeSuffixes{$subtype}|;
+ $valuec++;
+ }
+
+ print qq| \} \};\n|;
+ }
+ elsif ($arg =3D~ /^st([0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
+ {
+ my $type =3D "st";
+ my $regnum =3D $1;
+ my $register =3D $fpregs[$regnum] if defined($regnum);
+ my $subtype =3D $2;
+ my @values =3D split(/,/, $3);
+ =20
+ die "Register st$1 already used" if defined($regnum) && !def=
ined($register);
+
+ my $arg =3D {
+ name =3D> $name,
+ type =3D> $type,
+ subtype =3D> $subtype
+ };
+
+ if (defined($register))
+ {
+ $arg->{register} =3D $register;
+ delete($fpregs[$regnum]);
+ }
+
+ push @args, $arg;
+ =20
+ print qq| $ArgTypes{$type} $name =3D \{ .$subtype =3D \{|;
+ =20
+ my $valuec =3D 0;
+ =20
+ foreach my $value (@values)
+ {
+ print qq|,| if $valuec > 0;
+ print qq| $value$SubTypeSuffixes{$subtype}|;
+ $valuec++;
+ }
+
+ print qq| \} \};\n|;
+ }
+ elsif ($arg =3D~ /^(imm8|imm16|imm32)\[([^\]]+)\]$/)
+ {
+ my $type =3D $1;
+ my $value =3D $2;
+ =20
+ my $arg =3D {
+ type =3D> $type,
+ value =3D> $value
+ };
+
+ push @args, $arg;
+ }
+ else
+ {
+ die "Can't parse argument $arg";
+ }
+
+ $argc++;
+ }
+ =20
+ foreach my $arg (@presets, @args)
+ {
+ if ($arg->{type} =3D~ /^(r8|r16|r32|r64|m8|m16|m32)$/)
+ {
+ while (!exists($arg->{register}) || !defined($arg->{register=
}))
+ {
+ $arg->{register} =3D shift @intregs;
+ }
+
+ $arg->{register} =3D $arg->{register}->{$arg->{type}};
+ }
+ elsif ($arg->{type} =3D~ /^(mm|m64)$/)
+ {
+ $arg->{register} =3D shift @mmregs;
+ }
+ elsif ($arg->{type} =3D~ /^(xmm|m128)$/)
+ {
+ $arg->{register} =3D shift @xmmregs;
+ }
+ elsif ($arg->{type} =3D~ /^st$/)
+ {
+ while (!exists($arg->{register}) || !defined($arg->{register=
}))
+ {
+ $arg->{register} =3D shift @fpregs;
+ }
+ }
+ }
+
+ my @results;
+ my $resultc =3D 0;
+ =20
+ foreach my $result (split(/\s+/, $results))
+ {
+ my $name =3D "result$resultc";
+ =20
+ if ($result =3D~ /^(\d+)\.(sb|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]=
]+)\]$/)
+ {
+ my $index =3D $1;
+ my $type =3D $args[$index]->{type};
+ my $subtype =3D $2;
+ my @values =3D split(/,/, $3);
+ =20
+ die "Argument $index not specified" unless exists($args[$ind=
ex]);
+
+ my $result =3D {
+ name =3D> $name,
+ type =3D> $type,
+ subtype =3D> $subtype,
+ arg =3D> $args[$index],
+ register =3D> $args[$index]->{register},
+ values =3D> [ @values ]
+ };
+
+ push @results, $result;
+
+ print qq| $ArgTypes{$type} $name|;
+ print qq| =3D arg$index| if $type =3D~ /^m(8|16|32|64|128)$/=
;
+ print qq|;\n|;
+
+ $args[$index]->{result} =3D $result;
+ }
+ elsif ($result =3D~ /^([abcd][lh]|[abcd]x|e[abcd]x|r[abcd]x)\.(s=
b|ub|sw|uw|sd|ud|sq|uq|ps|pd)\[([^\]]+)\]$/)
+ {
+ my $register =3D $1;
+ my $type =3D $RegTypes{$register};
+ my $subtype =3D $2;
+ my @values =3D split(/,/, $3);
+ =20
+ my $result =3D {
+ name =3D> $name,
+ type =3D> $type,
+ subtype =3D> $subtype,
+ register =3D> $register,
+ values =3D> [ @values ]
+ };
+
+ push @results, $result;
+
+ print qq| $ArgTypes{$type} $name;\n|;
+ }
+ elsif ($result =3D~ /^(st[0-9]+)\.(ps|pd)\[([^\]]+)\]$/)
+ {
+ my $register =3D $1;
+ my $type =3D "st";
+ my $subtype =3D $2;
+ my @values =3D split(/,/, $3);
+ =20
+ my $result =3D {
+ name =3D> $name,
+ type =3D> $type,
+ subtype =3D> $subtype,
+ register =3D> $register,
+ values =3D> [ @values ]
+ };
+
+ push @results, $result;
+
+ print qq| $ArgTypes{$type} $name;\n|;
+ }
+ elsif ($result =3D~ /^eflags\[([^\]]+)\]$/)
+ {
+ my @values =3D split(/,/, $1);
+ =20
+ $values[0] =3D oct($values[0]) if $values[0] =3D~ /^0/;
+ $values[1] =3D oct($values[1]) if $values[1] =3D~ /^0/;
+ =20
+ my $result =3D {
+ name =3D> $name,
+ type =3D> "eflags",
+ subtype =3D> "ud",
+ values =3D> [ map { sprintf "0x%08x", $_ } @values ]
+ };
+
+ push @results, $result;
+ =20
+ print qq| $ArgTypes{eflags} $name;\n|;
+
+ if (!defined($eflagsmask) && !defined($eflagsset))
+ {
+ $eflagsmask =3D sprintf "0x%08x", $values[0] ^ 0xfffffff=
f;
+ $eflagsset =3D sprintf "0x%08x", $values[0] & ~$values[1=
];
+ }
+ }
+ elsif ($result =3D~ /^fpucw\[([^\]]+)\]$/)
+ {
+ my @values =3D split(/,/, $1);
+ =20
+ $values[0] =3D oct($values[0]) if $values[0] =3D~ /^0/;
+ $values[1] =3D oct($values[1]) if $values[1] =3D~ /^0/;
+ =20
+ my $result =3D {
+ name =3D> $name,
+ type =3D> "fpucw",
+ subtype =3D> "ud",
+ values =3D> [ map { sprintf "0x%04x", $_ } @values ]
+ };
+
+ push @results, $result;
+ =20
+ print qq| $ArgTypes{fpucw} $name;\n|;
+
+ if (!defined($fpucwmask) && !defined($fpucwset))
+ {
+ $fpucwmask =3D sprintf "0x%04x", $values[0] ^ 0xffff;
+ $fpucwset =3D sprintf "0x%04x", $values[0] & ~$values[1]=
;
+ }
+ }
+ elsif ($result =3D~ /^fpusw\[([^\]]+)\]$/)
+ {
+ my @values =3D split(/,/, $1);
+ =20
+ $values[0] =3D oct($values[0]) if $values[0] =3D~ /^0/;
+ $values[1] =3D oct($values[1]) if $values[1] =3D~ /^0/;
+ =20
+ my $result =3D {
+ name =3D> $name,
+ type =3D> "fpusw",
+ subtype =3D> "ud",
+ values =3D> [ map { sprintf "0x%04x", $_ } @values ]
+ };
+
+ push @results, $result;
+ =20
+ print qq| $ArgTypes{fpusw} $name;\n|;
+
+ if (!defined($fpuswmask) && !defined($fpuswset))
+ {
+ $fpuswmask =3D sprintf "0x%04x", $values[0] ^ 0xffff;
+ $fpuswset =3D sprintf "0x%04x", $values[0] & ~$values[1]=
;
+ }
+ }
+ else
+ {
+ die "Can't parse result $result";
+ }
+ =20
+ $resultc++;
+ }
+ =20
+ my $argnum =3D 0;
+
+ foreach my $result (@results)
+ {
+ if ($result->{type} =3D~ /^(m(8|16|32|64|128)|st|eflags|fpu[cs]w=
)$/)
+ {
+ $result->{argnum} =3D $argnum++;
+ }
+ }
+ =20
+ foreach my $arg (@presets, @args)
+ {
+ if (defined($arg->{name}))
+ {
+ $arg->{argnum} =3D $argnum++;
+ }
+ }
+ =20
+ foreach my $result (@results)
+ {
+ if ($result->{type} =3D~ /^(r(8|16|32|64)|mm|xmm)$/)
+ {
+ $result->{argnum} =3D $argnum++;
+ }
+ }
+
+ my $stateargnum =3D $argnum++;
+
+ print qq| char state\[108\];\n|;
+ print qq|\n|;
+ print qq| if (sigsetjmp(catchpoint, 1) =3D=3D 0)\n|;
+ print qq| \{\n|;
+ print qq| asm\(\n|;
+# print qq| \"fsave %$stateargnum\\n\"\n|;
+ =20
+ my @fpargs;
+
+ foreach my $arg (@presets, @args)
+ {
+ if ($arg->{type} eq "r8")
+ {
+ print qq| \"movb %$arg->{argnum}, %%$arg->{register}=
\\n\"\n|;
+ }
+ elsif ($arg->{type} eq "r16")
+ {
+ print qq| \"movw %$arg->{argnum}, %%$arg->{register}=
\\n\"\n|;
+ }
+ elsif ($arg->{type} eq "r32")
+ {
+ print qq| \"movl %$arg->{argnum}, %%$arg->{register}=
\\n\"\n|;
+ }
+ elsif ($arg->{type} eq "r64")
+ {
+ print qq| \"movq %$arg->{argnum}, %%$arg->{register}=
\\n\"\n|;
+ }
+ elsif ($arg->{type} eq "mm")
+ {
+ print qq| \"movq %$arg->{argnum}, %%$arg->{register}=
\\n\"\n|;
+ }
+ elsif ($arg->{type} eq "xmm")
+ {
+ print qq| \"movlps 0%$arg->{argnum}, %%$arg->{regist=
er}\\n\"\n|;
+ print qq| \"movhps 8%$arg->{argnum}, %%$arg->{regist=
er}\\n\"\n|;
+ }
+ elsif ($arg->{type} eq "st")
+ {
+ $fpargs[$RegNums{$arg->{register}}] =3D $arg;
+ }
+ }
+ =20
+ foreach my $arg (reverse @fpargs)
+ {
+ if (defined($arg))
+ {
+ if ($arg->{subtype} eq "ps")
+ {
+ print qq| \"flds %$arg->{argnum}\\n\"\n|;
+ }
+ elsif ($arg->{subtype} eq "pd")
+ {
+ print qq| \"fldl %$arg->{argnum}\\n\"\n|;
+ }
+ }
+ else
+ {
+ print qq| \"fldz\\n\"\n|;
+ }
+ }
+
+ if (defined($eflagsmask) || defined($eflagsset))
+ {
+ print qq| \"pushfl\\n\"\n|;
+ print qq| \"andl \$$eflagsmask, (%%esp)\\n\"\n| if defin=
ed($eflagsmask);
+ print qq| \"orl \$$eflagsset, (%%esp)\\n\"\n| if defined=
($eflagsset);
+ print qq| \"popfl\\n\"\n|;
+ }
+
+ if (defined($fpucwmask) || defined($fpucwset))
+ {
+ print qq| \"subl \$2, %%esp\\n\"\n|;
+ print qq| \"fstcw (%%esp)\\n\"\n|;
+ print qq| \"andw \$$fpucwmask, (%%esp)\\n\"\n| if define=
d($fpucwmask);
+ print qq| \"orw \$$fpucwset, (%%esp)\\n\"\n| if defined(=
$fpucwset);
+ print qq| \"fldcw (%%esp)\\n\"\n|;
+ print qq| \"addl \$2, %%esp\\n\"\n|;
+ }
+
+ print qq| \"$insn|;
+ =20
+ my $prefix =3D " ";
+ =20
+ foreach my $arg (@args)
+ {
+ next if $arg->{type} eq "eflags";
+
+ if ($arg->{type} =3D~ /^(r8|r16|r32|r64|mm|xmm)$/)
+ {
+ print qq|$prefix%%$arg->{register}|;
+ }
+ elsif ($arg->{type} =3D~ /^st$/)
+ {
+ my $register =3D $arg->{register};
+
+ $register =3D~ s/st(\d+)/st\($1\)/;
+
+ print qq|$prefix%%$register|;
+ }
+ elsif ($arg->{type} =3D~ /^(m(8|16|32|64|128))$/)
+ {
+ if (exists($arg->{result}))
+ {
+ print qq|$prefix%$arg->{result}->{argnum}|;
+ }
+ else
+ {
+ print qq|$prefix%$arg->{argnum}|;
+ }
+ }
+ elsif ($arg->{type} =3D~ /^imm(8|16|32)$/)
+ {
+ print qq|$prefix\$$arg->{value}|;
+ }
+
+ $prefix =3D ", ";
+ }
+
+ print qq|\\n\"\n|;
+
+ my @fpresults;
+
+ foreach my $result (@results)
+ {
+ if ($result->{type} eq "r8")
+ {
+ print qq| \"movb %%$result->{register}, %$result->{a=
rgnum}\\n\"\n|;
+ }
+ elsif ($result->{type} eq "r16")
+ {
+ print qq| \"movw %%$result->{register}, %$result->{a=
rgnum}\\n\"\n|;
+ }
+ elsif ($result->{type} eq "r32")
+ {
+ print qq| \"movl %%$result->{register}, %$result->{a=
rgnum}\\n\"\n|;
+ }
+ elsif ($result->{type} eq "r64")
+ {
+ print qq| \"movq %%$result->{register}, %$result->{a=
rgnum}\\n\"\n|;
+ }
+ elsif ($result->{type} eq "mm")
+ {
+ print qq| \"movq %%$result->{register}, %$result->{a=
rgnum}\\n\"\n|;
+ }
+ elsif ($result->{type} eq "xmm")
+ {
+ print qq| \"movlps %%$result->{register}, 0%$result-=
>{argnum}\\n\"\n|;
+ print qq| \"movhps %%$result->{register}, 8%$result-=
>{argnum}\\n\"\n|;
+ }
+ elsif ($result->{type} eq "st")
+ {
+ $fpresults[$RegNums{$result->{register}}] =3D $result;
+ }
+ elsif ($result->{type} eq "eflags")
+ {
+ print qq| \"pushfl\\n\"\n|;
+ print qq| \"popl %$result->{argnum}\\n\"\n|;
+ }
+ elsif ($result->{type} eq "fpucw")
+ {
+ print qq| \"fstcw %$result->{argnum}\\n\"\n|;
+ }
+ elsif ($result->{type} eq "fpusw")
+ {
+ print qq| \"fstsw %$result->{argnum}\\n\"\n|;
+ }
+ }
+ =20
+ foreach my $result (@fpresults)
+ {
+ if (defined($result))
+ {
+ if ($result->{subtype} eq "ps")
+ {
+ print qq| \"fstps %$result->{argnum}\\n\"\n|;
+ }
+ elsif ($result->{subtype} eq "pd")
+ {
+ print qq| \"fstpl %$result->{argnum}\\n\"\n|;
+ }
+ }
+ else
+ {
+ print qq| \"fincstp\\n\"\n|;
+ }
+ }
+
+# print qq| \"frstor %$stateargnum\\n\"\n|;
+
+ print qq| :|;
+
+ $prefix =3D " ";
+
+ foreach my $result (@results)
+ {
+ if ($result->{type} =3D~ /^(m(8|16|32|64|128)|st|eflags|fpu[cs]w=
)$/)
+ {
+ print qq|$prefix\"=3Dm\" \($result->{name}\)|;
+ $prefix =3D ", ";
+ }
+ }
+
+ print qq|\n|;
+ =20
+ $prefix =3D " : ";
+ =20
+ foreach my $arg (@presets, @args)
+ {
+ if (defined($arg->{name}))
+ {
+ print qq|$prefix\"m\" \($arg->{name}\)|;
+ $prefix =3D ", ";
+ }
+ }
+ =20
+ foreach my $result (@results)
+ {
+ if ($result->{type} =3D~ /^(r(8|16|32|64)|mm|xmm)$/)
+ {
+ print qq|$prefix\"m\" \($result->{name}\)|;
+ $prefix =3D ", ";
+ }
+ }
+
+ print qq|$prefix\"m\" \(state[0]\)\n|;
+
+ $prefix =3D " : ";
+
+ foreach my $arg (@presets, @args)
+ {
+ if ($arg->{register} && $arg->{type} ne "st")
+ {
+ print qq|$prefix\"$arg->{register}\"|;
+ $prefix =3D ", ";
+ }
+ }
+
+ print qq|\n|;
+ =20
+ print qq| \);\n|; =20
+ print qq|\n|;
+ =20
+ if (@results)
+ {
+ print qq| if \(|;
+ =20
+ $prefix =3D "";
+ =20
+ foreach my $result (@results)
+ {
+ my $type =3D $result->{type};
+ my $subtype =3D $result->{subtype};
+ my $suffix =3D $SubTypeSuffixes{$subtype};
+ my @values =3D @{$result->{values}};
+ =20
+ if ($type eq "eflags")
+ {
+ print qq|${prefix}\($result->{name}.ud[0] & $values[0]UL=
\) =3D=3D $values[1]UL|;
+ }
+ elsif ($type =3D~ /^fpu[cs]w$/)
+ {
+ print qq|${prefix}\($result->{name}.uw[0] & $values[0]\)=
=3D=3D $values[1]|;
+ }
+ else
+ {
+ foreach my $value (0 .. $#values)
+ {
+ if ($subtype eq "ps")
+ {
+ print qq|${prefix}eq_float($result->{name}.$subt=
ype\[$value\], $values[$value]$suffix)|;
+ }
+ elsif ($subtype eq "pd")
+ {
+ print qq|${prefix}eq_double($result->{name}.$sub=
type\[$value\], $values[$value]$suffix)|;
+ }
+ else
+ {
+ print qq|${prefix}$result->{name}.$subtype\[$val=
ue\] =3D=3D $values[$value]$suffix|;
+ }
+ =20
+ $prefix =3D " && ";
+ }
+ }
+ =20
+ $prefix =3D " &&\n ";
+ }
+ =20
+ print qq| \)\n|;
+ print qq| \{\n|;
+ print qq| printf("$test ... ok\\n");\n|;
+ print qq| \}\n|;
+ print qq| else\n|;
+ print qq| \{\n|;
+ print qq| printf("$test ... not ok\\n");\n|;
+ =20
+ foreach my $result (@results)
+ {
+ my $type =3D $result->{type};
+ my $subtype =3D $result->{subtype};
+ my $suffix =3D $SubTypeSuffixes{$subtype};
+ my @values =3D @{$result->{values}};
+ =20
+ if ($type eq "eflags")
+ {
+ print qq| printf(" eflags & 0x%lx =3D 0x%lx (ex=
pected 0x%lx)\\n", $values[0]UL, $result->{name}.ud\[0\] & $values[0]UL, =
$values[1]UL);\n|;
+ }
+ elsif ($type =3D~ /^fpu[cs]w$/)
+ {
+ print qq| printf(" $type & 0x%x =3D 0x%x (expec=
ted 0x%x)\\n", $values[0], $result->{name}.uw\[0\] & $values[0], $values[=
1]);\n|;
+ }
+ else
+ {
+ foreach my $value (0 .. $#values)
+ {
+ print qq| printf(" $result->{name}.$subtype=
\[$value\] =3D $SubTypeFormats{$subtype} (expected $SubTypeFormats{$subty=
pe})\\n", $result->{name}.$subtype\[$value\], $values[$value]$suffix);\n|=
;
+ }
+ }
+ }
+ =20
+ print qq| \}\n|;
+ }
+ else
+ {
+ print qq| printf("$test ... ok\\n");\n|;
+ }
+
+ print qq| \}\n|;
+ print qq| else\n|;
+ print qq| \{\n|;
+ print qq| printf("$test ... failed\\n");\n|;
+ print qq| \}\n|;
+ print qq|\n|;
+ print qq| return;\n|;
+ print qq|\}\n|;
+ print qq|\n|;
+}
+
+print qq|int main(int argc, char **argv)\n|;
+print qq|\{\n|;
+print qq| signal(SIGILL, handle_sigill);\n|;
+print qq|\n|;
+
+foreach my $test (@tests)
+{
+ print qq| $test();\n|;
+}
+
+print qq|\n|;
+print qq| exit(0);\n|;
+print qq|\}\n|;
+
+exit 0;
Added: trunk/none/tests/amd64/insn_mmx.def
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/none/tests/amd64/insn_mmx.def 2005-05-09 01:23:49 UTC (rev 3646=
)
+++ trunk/none/tests/amd64/insn_mmx.def 2005-05-09 22:01:37 UTC (rev 3647=
)
@@ -0,0 +1,123 @@
+#
+# %mm <-> ireg64
+#
+movd mm.sd[1234,5678] r64.sd[1111,2222] =3D> 1.sd[1234,5678]
+movd r64.sd[1234,5678] mm.sd[1111,2222] =3D> 1.sd[1234,5678]
+#
+# %mm <-> ireg32
+#
+movd r32.sd[1234] mm.sd[1111,2222] =3D> 1.sd[1234,0]
+movd mm.sd[1234,2222] r32.sd[1111] =3D> 1.sd[1234]
+#
+# %mm <-> mem32
+#
+movd m32.sd[1234] mm.sd[1111,2222] =3D> 1.sd[1234,0]
+movd mm.sd[1234,2222] m32.sd[1111] =3D> 1.sd[1234]
+#
+# %mm <-> mem64
+#
+movq m64.uq[0x012345678abcdef] mm.uq[0x1212121234343434] =3D> 1.uq[0x012=
345678abcdef]
+movq mm.uq[0x012345678abcdef] m64.uq[0x1212121234343434] =3D> 1.uq[0x012=
345678abcdef]
+#
+# %mm -> %mm
+#
+movq mm.uq[0x012345678abcdef] mm.uq[0x1212121234343434] =3D> 1.uq[0x0123=
45678abcdef]
+#
+#
+#
+packssdw mm.sd[12345,123456] mm.sd[-12345,-123456] =3D> 1.sw[-12345,-327=
68,12345,32767]
+packssdw m64.sd[12345,123456] mm.sd[-12345,-123456] =3D> 1.sw[-12345,-32=
768,12345,32767]
+packsswb mm.sw[123,-123,1234,-1234] mm.sw[21,-21,321,-321] =3D> 1.sb[21,=
-21,127,-128,123,-123,127,-128]
+packsswb m64.sw[123,-123,1234,-1234] mm.sw[21,-21,321,-321] =3D> 1.sb[21=
,-21,127,-128,123,-123,127,-128]
+packuswb mm.sw[123,-123,1234,-1234] mm.sw[21,-21,321,-321] =3D> 1.ub[21,=
0,255,0,123,0,255,0]
+packuswb m64.sw[123,-123,1234,-1234] mm.sw[21,-21,321,-321] =3D> 1.ub[21=
,0,255,0,123,0,255,0]
+paddb mm.sb[12,34,56,78,21,43,65,87] mm.sb[8,7,6,5,4,3,2,1] =3D> 1.sb[20=
,41,62,83,25,46,67,88]
+paddb m64.sb[12,34,56,78,21,43,65,87] mm.sb[8,7,6,5,4,3,2,1] =3D> 1.sb[2=
0,41,62,83,25,46,67,88]
+paddd mm.sd[12345678,87654321] mm.sd[8765,4321] =3D> 1.sd[12354443,87658=
642]
+paddd m64.sd[12345678,87654321] mm.sd[8765,4321] =3D> 1.sd[12354443,8765=
8642]
+paddsb mm.sb[25,-25,50,-50,100,-100,125,-125] mm.sb[40,-40,30,-30,20,-20=
,10,-10] =3D> 1.sb[65,-65,80,-80,120,-120,127,-128]
+paddsb m64.sb[25,-25,50,-50,100,-100,125,-125] mm.sb[40,-40,30,-30,20,-2=
0,10,-10] =3D> 1.sb[65,-65,80,-80,120,-120,127,-128]
+paddsw mm.sw[12345,-12345,32145,-32145] mm.sw[32145,-32145,-12345,12345]=
=3D> 1.sw[32767,-32768,19800,-19800]
+paddsw m64.sw[12345,-12345,32145,-32145] mm.sw[32145,-32145,-12345,12345=
] =3D> 1.sw[32767,-32768,19800,-19800]
+paddusb mm.ub[25,50,75,100,125,150,175,200] mm.ub[10,20,30,40,50,60,70,8=
0] =3D> 1.ub[35,70,105,140,175,210,245,255]
+paddusb m64.ub[25,50,75,100,125,150,175,200] mm.ub[10,20,30,40,50,60,70,=
80] =3D> 1.ub[35,70,105,140,175,210,245,255]
+paddusw mm.uw[22222,33333,44444,55555] mm.uw[6666,7777,8888,9999] =3D> 1=
.uw[28888,41110,53332,65535]
+paddusw m64.uw[22222,33333,44444,55555] mm.uw[6666,7777,8888,9999] =3D> =
1.uw[28888,41110,53332,65535]
+paddw mm.sw[1234,5678,4321,8765] mm.sw[87,65,43,21] =3D> 1.sw[1321,5743,=
4364,8786]
+paddw m64.sw[1234,5678,4321,8765] mm.sw[87,65,43,21] =3D> 1.sw[1321,5743=
,4364,8786]
+pand mm.uq[0xfdb97531eca86420] mm.uq[0x0123456789abcdef] =3D> 1.uq[0x012=
1452188a84420]
+pand m64.uq[0xfdb97531eca86420] mm.uq[0x0123456789abcdef] =3D> 1.uq[0x01=
21452188a84420]
+pandn mm.uq[0xfdb97531eca86420] mm.uq[0x0123456789abcdef] =3D> 1.uq[0xfc=
98301064002000]
+pandn m64.uq[0xfdb97531eca86420] mm.uq[0x0123456789abcdef] =3D> 1.uq[0xf=
c98301064002000]
+pcmpeqb mm.ub[11,22,33,44,55,66,77,88] mm.ub[11,11,33,33,55,55,77,77] =3D=
> 1.ub[0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00]
+pcmpeqb m64.ub[11,22,33,44,55,66,77,88] mm.ub[11,11,33,33,55,55,77,77] =3D=
> 1.ub[0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00]
+pcmpeqd mm.ud[11223344,55667788] mm.ud[11223344,11223344] =3D> 1.ud[0xff=
ffffff,0x00000000]
+pcmpeqd m64.ud[11223344,55667788] mm.ud[11223344,11223344] =3D> 1.ud[0xf=
fffffff,0x00000000]
+pcmpeqw mm.uw[1122,3344,5566,7788] mm.uw[1122,1122,5566,5566] =3D> 1.uw[=
0xffff,0x0000,0xffff,0x0000]
+pcmpeqw m64.uw[1122,3344,5566,7788] mm.uw[1122,1122,5566,5566] =3D> 1.uw=
[0xffff,0x0000,0xffff,0x0000]
+pcmpgtb mm.sb[-77,-55,-33,-11,11,33,55,77] mm.sb[77,55,33,11,-11,-33,-55=
,-77] =3D> 1.ub[0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00]
+pcmpgtb m64.sb[-77,-55,-33,-11,11,33,55,77] mm.sb[77,55,33,11,-11,-33,-5=
5,-77] =3D> 1.ub[0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00]
+pcmpgtd mm.sd[-11111111,11111111] mm.sd[11111111,-11111111] =3D> 1.ud[0x=
ffffffff,0x00000000]
+pcmpgtd m64.sd[-11111111,11111111] mm.sd[11111111,-11111111] =3D> 1.ud[0=
xffffffff,0x00000000]
+pcmpgtw mm.sw[-3333,-1111,1111,3333] mm.sw[3333,1111,-1111,-3333] =3D> 1=
.uw[0xffff,0xffff,0x0000,0x0000]
+pcmpgtw m64.sw[-3333,-1111,1111,3333] mm.sw[3333,1111,-1111,-3333] =3D> =
1.uw[0xffff,0xffff,0x0000,0x0000]
+pmaddwd mm.sw[1234,5678,-4321,-8765] mm.sw[1111,-2222,3333,-4444] =3D> 1=
.sd[-11245542,24549767]
+pmaddwd m64.sw[1234,5678,-4321,-8765] mm.sw[1111,-2222,3333,-4444] =3D> =
1.sd[-11245542,24549767]
+pmulhw mm.sw[1111,2222,-1111,-2222] mm.sw[3333,-4444,3333,-4444] =3D> 1.=
uw[0x0038,0xff69,0xffc7,0x0096]
+pmulhw m64.sw[1111,2222,-1111,-2222] mm.sw[3333,-4444,3333,-4444] =3D> 1=
.uw[0x0038,0xff69,0xffc7,0x0096]
+pmullw mm.sw[1111,2222,-1111,-2222] mm.sw[3333,-4444,3333,-4444] =3D> 1.=
uw[0x80b3,0x5378,0x7f4d,0xac88]
+pmullw m64.sw[1111,2222,-1111,-2222] mm.sw[3333,-4444,3333,-4444] =3D> 1=
.uw[0x80b3,0x5378,0x7f4d,0xac88]
+por mm.uq[0xfdb97531eca86420] mm.uq[0x0123456789abcdef] =3D> 1.uq[0xfdbb=
7577edabedef]
+por m64.uq[0xfdb97531eca86420] mm.uq[0x0123456789abcdef] =3D> 1.uq[0xfdb=
b7577edabedef]
+pslld imm8[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x12345670,0x9abcde=
f0]
+pslld mm.uq[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x12345670,0x9abcd=
ef0]
+pslld m64.uq[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x12345670,0x9abc=
def0]
+psllq imm8[4] mm.uq[0x0123456789abcdef] =3D> 1.uq[0x123456789abcdef0]
+psllq mm.uq[4] mm.uq[0x0123456789abcdef] =3D> 1.uq[0x123456789abcdef0]
+psllq m64.uq[4] mm.uq[0x0123456789abcdef] =3D> 1.uq[0x123456789abcdef0]
+psllw imm8[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x1230,0x5670=
,0x9ab0,0xdef0]
+psllw mm.uq[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x1230,0x567=
0,0x9ab0,0xdef0]
+psllw m64.uq[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x1230,0x56=
70,0x9ab0,0xdef0]
+psrad imm8[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x00123456,0xf89abc=
de]
+psrad mm.uq[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x00123456,0xf89ab=
cde]
+psrad m64.uq[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x00123456,0xf89a=
bcde]
+psraw imm8[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x0012,0x0456=
,0xf89a,0xfcde]
+psraw mm.uq[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x0012,0x045=
6,0xf89a,0xfcde]
+psraw m64.uq[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x0012,0x04=
56,0xf89a,0xfcde]
+psrld imm8[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x00123456,0x089abc=
de]
+psrld mm.uq[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x00123456,0x089ab=
cde]
+psrld m64.uq[4] mm.ud[0x01234567,0x89abcdef] =3D> 1.ud[0x00123456,0x089a=
bcde]
+psrlq imm8[4] mm.uq[0x0123456789abcdef] =3D> 1.uq[0x00123456789abcde]
+psrlq mm.uq[4] mm.uq[0x0123456789abcdef] =3D> 1.uq[0x00123456789abcde]
+psrlq m64.uq[4] mm.uq[0x0123456789abcdef] =3D> 1.uq[0x00123456789abcde]
+psrlw imm8[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x0012,0x0456=
,0x089a,0x0cde]
+psrlw mm.uq[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x0012,0x045=
6,0x089a,0x0cde]
+psrlw m64.uq[4] mm.uw[0x0123,0x4567,0x89ab,0xcdef] =3D> 1.uw[0x0012,0x04=
56,0x089a,0x0cde]
+psubb mm.sb[8,7,6,5,4,3,2,1] mm.sb[12,34,56,78,21,43,65,87] =3D> 1.sb[4,=
27,50,73,17,40,63,86]
+psubb m64.sb[8,7,6,5,4,3,2,1] mm.sb[12,34,56,78,21,43,65,87] =3D> 1.sb[4=
,27,50,73,17,40,63,86]
+psubd mm.sd[8765,4321] mm.sd[12345678,87654321] =3D> 1.sd[12336913,87650=
000]
+psubd m64.sd[8765,4321] mm.sd[12345678,87654321] =3D> 1.sd[12336913,8765=
0000]
+psubsb mm.sb[-50,50,-40,40,-30,30,-20,20] mm.sb[25,-25,50,-50,100,-100,1=
25,-125] =3D> 1.sb[75,-75,90,-90,127,-128,127,-128]
+psubsb m64.sb[-50,50,-40,40,-30,30,-20,20] mm.sb[25,-25,50,-50,100,-100,=
125,-125] =3D> 1.sb[75,-75,90,-90,127,-128,127,-128]
+psubsw mm.sw[-32145,32145,12345,-12345] mm.sw[12345,-12345,32145,-32145]=
=3D> 1.sw[32767,-32768,19800,-19800]
+psubsw m64.sw[-32145,32145,12345,-12345] mm.sw[12345,-12345,32145,-32145=
] =3D> 1.sw[32767,-32768,19800,-19800]
+psubusb mm.ub[11,22,33,44,55,66,77,88] mm.ub[88,77,66,55,44,33,22,11] =3D=
> 1.ub[77,55,33,11,0,0,0,0]
+psubusb m64.ub[11,22,33,44,55,66,77,88] mm.ub[88,77,66,55,44,33,22,11] =3D=
> 1.ub[77,55,33,11,0,0,0,0]
+psubusw mm.uw[1122,3344,5566,7788] mm.uw[8877,6655,4433,2211] =3D> 1.uw[=
7755,3311,0,0]
+psubusw m64.uw[1122,3344,5566,7788] mm.uw[8877,6655,4433,2211] =3D> 1.uw=
[7755,3311,0,0]
+psubw mm.sw[87,65,43,21] mm.sw[1234,5678,4321,8765] =3D> 1.sw[1147,5613,=
4278,8744]
+psubw m64.sw[87,65,43,21] mm.sw[1234,5678,4321,8765] =3D> 1.sw[1147,5613=
,4278,8744]
+punpckhbw mm.ub[12,34,56,78,21,43,65,87] mm.ub[11,22,33,44,55,66,77,88] =
=3D> 1.ub[55,21,66,43,77,65,88,87]
+punpckhbw m64.ub[12,34,56,78,21,43,65,87] mm.ub[11,22,33,44,55,66,77,88]=
=3D> 1.ub[55,21,66,43,77,65,88,87]
+punpckhdq mm.ud[12345678,21436587] mm.ud[11223344,55667788] =3D> 1.ud[55=
667788,21436587]
+punpckhdq m64.ud[12345678,21436587] mm.ud[11223344,55667788] =3D> 1.ud[5=
5667788,21436587]
+punpckhwd mm.uw[1234,5678,2143,6587] mm.uw[1122,3344,5566,7788] =3D> 1.u=
w[5566,2143,7788,6587]
+punpckhwd m64.uw[1234,5678,2143,6587] mm.uw[1122,3344,5566,7788] =3D> 1.=
uw[5566,2143,7788,6587]
+punpcklbw mm.ub[12,34,56,78,21,43,65,87] mm.ub[11,22,33,44,55,66,77,88] =
=3D> 1.ub[11,12,22,34,33,56,44,78]
+punpcklbw m64.ub[12,34,56,78,21,43,65,87] mm.ub[11,22,33,44,55,66,77,88]=
=3D> 1.ub[11,12,22,34,33,56,44,78]
+punpckldq mm.ud[12345678,21436587] mm.ud[11223344,55667788] =3D> 1.ud[11=
223344,12345678]
+punpckldq m64.ud[12345678,21436587] mm.ud[11223344,55667788] =3D> 1.ud[1=
1223344,12345678]
+punpcklwd mm.uw[1234,5678,2143,6587] mm.uw[1122,3344,5566,7788] =3D> 1.u=
w[1122,1234,3344,5678]
+punpcklwd m64.uw[1234,5678,2143,6587] mm.uw[1122,3344,5566,7788] =3D> 1.=
uw[1122,1234,3344,5678]
+pxor mm.uq[0xfdb97531eca86420] mm.uq[0x0123456789abcdef] =3D> 1.uq[0xfc9=
a30566503a9cf]
+pxor m64.uq[0xfdb97531eca86420] mm.uq[0x0123456789abcdef] =3D> 1.uq[0xfc=
9a30566503a9cf]
|