summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--notes/encoding_table4
-rw-r--r--notes/grouped_encodings4
-rw-r--r--notes/reordered_encodings4
-rw-r--r--notes/todo300
-rw-r--r--src/display.rs87
-rw-r--r--src/lib.rs712
-rw-r--r--tests/from_brain.rs209
7 files changed, 1139 insertions, 181 deletions
diff --git a/notes/encoding_table b/notes/encoding_table
index 7910c7d..efb02f8 100644
--- a/notes/encoding_table
+++ b/notes/encoding_table
@@ -939,7 +939,7 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
|ICLASS |RegType|MajOp|s5 |Parse| |MinOp|d5 |
|1 0 0 0|0 0 0 0|1 0 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rdd=abs(Rss) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=abs(Rs) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=abs(Rs) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=abs(Rs):sat - XTYPE ALU/slot 2,3
|1 1 0 1|1 0 1 1|0 i i|s s s s s| P P |i d d d d d|i i i|u u u u u| Rd=add(Rs,add(Ru,#s6)) - XTYPE ALU/slot 2,3
|1 1 0 1|1 0 1 1|1 i i|s s s s s| P P |i d d d d d|i i i|u u u u u| Rd=add(Rs,sub(#s6,Ru)) - XTYPE ALU/slot 2,3
@@ -1011,7 +1011,7 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
|1 0 0 0|1 0 0 0|1 1 0|s s s s s| P P |- - - - - -|0 0 1|d d d d d| Rd=round(Rss):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|0 0 -|d d d d d| Rd=cround(Rs,#u5) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5):sat - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 1 -|d d d d d| Rd=round(Rs,#u5):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |i i i i i i|0 1 -|d d d d d| Rdd=cround(Rss,#u6) - XTYPE ALU/slot 2,3
|1 1 0 0|0 1 1 0|1 1 -|s s s s s| P P |- t t t t t|0 0 -|d d d d d| Rd=cround(Rs,Rt) - XTYPE ALU/slot 2,3
diff --git a/notes/grouped_encodings b/notes/grouped_encodings
index 544889f..983aefd 100644
--- a/notes/grouped_encodings
+++ b/notes/grouped_encodings
@@ -933,7 +933,7 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
|ICLASS |RegType|MajOp|s5 |Parse| |MinOp|d5 |
|1 0 0 0|0 0 0 0|1 0 0|s s s s s| P P |- - - - - -|1 1 0|- - - - -| Rdd=abs(Rss) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=abs(Rs) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=abs(Rs) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=abs(Rs):sat - XTYPE ALU/slot 2,3
|1 1 0 1|1 0 1 1|0 i i|s s s s s| P P |i d d d d d|i i i|u u u u u| Rd=add(Rs,add(Ru,#s6)) - XTYPE ALU/slot 2,3
|1 1 0 1|1 0 1 1|1 i i|s s s s s| P P |i d d d d d|i i i|u u u u u| Rd=add(Rs,sub(#s6,Ru)) - XTYPE ALU/slot 2,3
@@ -1005,7 +1005,7 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
|1 0 0 0|1 0 0 0|1 1 0|s s s s s| P P |- - - - - -|0 0 1|d d d d d| Rd=round(Rss):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|0 0 -|d d d d d| Rd=cround(Rs,#u5) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5):sat - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 1 -|d d d d d| Rd=round(Rs,#u5):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |i i i i i i|0 1 -|d d d d d| Rdd=cround(Rss,#u6) - XTYPE ALU/slot 2,3
|1 1 0 0|0 1 1 0|1 1 -|s s s s s| P P |- t t t t t|0 0 -|d d d d d| Rd=cround(Rs,Rt) - XTYPE ALU/slot 2,3
diff --git a/notes/reordered_encodings b/notes/reordered_encodings
index 4378085..4e7b641 100644
--- a/notes/reordered_encodings
+++ b/notes/reordered_encodings
@@ -577,7 +577,7 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
|1 0 0 0|1 1 0 0|1 0 -|s s s s s| P P |- - - - - -|0 0 -|d d d d d| Rd=vsathb(Rs) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 0 -|s s s s s| P P |- - - - - -|0 1 -|d d d d d| Rd=vsathub(Rs) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=abs(Rs) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=abs(Rs) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=abs(Rs):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rd=neg(Rs):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 1 1|d d d d d| Rd=swiz(Rs) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=sath(Rs) - XTYPE PERM/slot 2,3
@@ -589,7 +589,7 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |0 i i i i i|0 1 0|d d d d d| Rd=togglebit(Rs,#u5) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|0 0 -|d d d d d| Rd=cround(Rs,#u5) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5):sat - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 1 -|d d d d d| Rd=round(Rs,#u5):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |i i i i i i|0 1 -|d d d d d| Rdd=cround(Rss,#u6) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 1|0 l l|- - - - -| P P |1 i i i i i|l l l|d d d d d| Rd=mask(#u5,#U5) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 1|0 l l|s s s s s| P P |0 i i i i i|l l l|d d d d d| Rd=extractu(Rs,#u5,#U5) - XTYPE ALU/slot 2,3
diff --git a/notes/todo b/notes/todo
index f357ab4..0445003 100644
--- a/notes/todo
+++ b/notes/todo
@@ -492,127 +492,129 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
-|1 0 0 0|0 1 0 0|0 0 -|s s s s s| P P |- - - - - -|0 0 -|d d d d d| Rdd=vsxtbh(Rs) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 0|0 0 -|s s s s s| P P |- - - - - -|0 1 -|d d d d d| Rdd=vzxtbh(Rs) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 0|0 0 -|s s s s s| P P |- - - - - -|1 0 -|d d d d d| Rdd=vsxthw(Rs) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 0|0 0 -|s s s s s| P P |- - - - - -|1 1 -|d d d d d| Rdd=vzxthw(Rs) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 0|0 1 -|s s s s s| P P |- - - - - -|0 1 -|d d d d d| Rdd=vsplath(Rs) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 0|0 1 -|s s s s s| P P |- - - - - -|1 0 -|d d d d d| Rdd=vsplatb(Rs) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 0|1 - -|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rdd=convert_sf2df(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|0 1 0 0|1 - -|s s s s s| P P |- - - - - -|0 0 1|d d d d d| Rdd=convert_uw2df(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|0 1 0 0|1 - -|s s s s s| P P |- - - - - -|0 1 0|d d d d d| Rdd=convert_w2df(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|0 1 0 0|1 - -|s s s s s| P P |0 - - - - -|0 1 1|d d d d d| Rdd=convert_sf2ud(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|0 1 0 0|1 - -|s s s s s| P P |0 - - - - -|1 0 0|d d d d d| Rdd=convert_sf2d(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|0 1 0 0|1 - -|s s s s s| P P |0 - - - - -|1 0 1|d d d d d| Rdd=convert_sf2ud(Rs):chop - XTYPE FP/slot 2,3
-|1 0 0 0|0 1 0 0|1 - -|s s s s s| P P |0 - - - - -|1 1 0|d d d d d| Rdd=convert_sf2d(Rs):chop - XTYPE FP/slot 2,3
-|1 0 0 0|0 1 0 1|0 0 0|s s s s s| P P |0 i i i i i|- - -|- - - d d| Pd=tstbit(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 1|0 0 1|s s s s s| P P |0 i i i i i|- - -|- - - d d| Pd=!tstbit(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 1|0 1 0|s s s s s| P P |- - - - - -|- - -|- - - d d| Pd=Rs - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 1|1 0 0|s s s s s| P P |i i i i i i|- - -|- - - d d| Pd=bitsclr(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 1|1 0 1|s s s s s| P P |i i i i i i|- - -|- - - d d| Pd=!bitsclr(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 0 1|1 1 1|s s s s s| P P |0 i i i i i|- - -|- - d d d| Pd=sfclass(Rs,#u5) - XTYPE FP/slot 2,3
-|1 0 0 0|0 1 1 0|- - -|- - - - -| P P |- - - - t t|- - -|d d d d d| Rdd=mask(Pt) - XTYPE PERM/slot 2,3
-|1 0 0 0|0 1 1 1|0 0 i|s s s s s| P P |l l l l l l|i i i|x x x x x| Rx=tableidxb(Rs,#u4,#S6):raw - XTYPE ALU/slot 2,3
-|1 0 0 0|0 1 1 1|0 1 i|s s s s s| P P |l l l l l l|i i i|x x x x x| Rx=tableidxh(Rs,#u4,#S6):raw - XTYPE ALU/slot 2,3
-|1 0 0 0|0 1 1 1|1 0 i|s s s s s| P P |l l l l l l|i i i|x x x x x| Rx=tableidxw(Rs,#u4,#S6):raw - XTYPE ALU/slot 2,3
-|1 0 0 0|0 1 1 1|1 1 i|s s s s s| P P |l l l l l l|i i i|x x x x x| Rx=tableidxd(Rs,#u4,#S6):raw - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|0 0 0|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rd=vsathub(Rss) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|0 0 0|s s s s s| P P |- - - - - -|0 0 1|d d d d d| Rd=convert_df2sf(Rss) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 0 0|0 0 0|s s s s s| P P |- - - - - -|0 1 0|d d d d d| Rd=vsatwh(Rss) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|0 0 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=vsatwuh(Rss) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|0 0 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rd=vsathb(Rss) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|0 0 1|s s s s s| P P |- - - - - -|0 0 1|d d d d d| Rd=convert_ud2sf(Rss) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 0|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rd=clb(Rss) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 0|s s s s s| P P |- - - - - -|0 0 1|d d d d d| Rd=convert_d2sf(Rss) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 0|s s s s s| P P |- - - - - -|0 1 0|d d d d d| Rd=cl0(Rss) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=cl1(Rss) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 1|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rd=normamt(Rss) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 1|s s s s s| P P |- - - - - -|0 1 1|d d d d d| Rd=popcount(Rss) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 1|s s s s s| P P |0 - - - - -|0 0 1|d d d d d| Rdd=convert_sf2ud(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 1|s s s s s| P P |0 0 i i i i|1 0 0|d d d d d| Rd=vasrhub(Rss,#u4):raw - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 1|s s s s s| P P |0 0 i i i i|1 0 1|d d d d d| Rd=vasrhub(Rss,#u4):sat - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|0 1 1|s s s s s| P P |i i i i i i|0 1 0|d d d d d| Rd=add(clb(Rss),#s6) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|1 0 0|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rd=vtrunohb(Rss) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|1 0 0|s s s s s| P P |- - - - - -|0 1 0|d d d d d| Rd=vtrunehb(Rss) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=vrndwh(Rss) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|1 0 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rd=vrndwh(Rss):sat - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|1 0 0|s s s s s| P P |0 - - - - -|0 0 1|d d d d d| Rdd=convert_sf2d(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 0 0|1 0 1|s s s s s| P P |0 - - - - -|0 0 1|d d d d d| Rdd=convert_sf2ud(Rs):chop - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 0 0|1 1 0|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rd=sat(Rss) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|1 1 0|s s s s s| P P |- - - - - -|0 0 1|d d d d d| Rd=round(Rss):sat - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|1 1 0|s s s s s| P P |0 i i i i i|0 1 0|d d d d d| Rd=vasrw(Rss,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 0|1 1 0|s s s s s| P P |0 i i i i i|1 0 0|d d d d d| Rdd=bitsplit(Rs,#u5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|1 1 0|s s s s s| P P |0 i i i i i|1 0 1|d d d d d| Rd=clip(Rs,#u5) - XTYPE ALU/slot 2,3 - only on a core with Hexagon audio extensions
-|1 0 0 0|1 0 0 0|1 1 0|s s s s s| P P |0 i i i i i|1 1 0|d d d d d| Rdd=vclip(Rss,#u5) - XTYPE ALU/slot 2,3 - only on a core with Hexagon audio extensions
-|1 0 0 0|1 0 0 0|1 1 1|s s s s s| P P |- - - - - -|0 1 0|d d d d d| Rd=ct0(Rss) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|1 1 1|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=ct1(Rss) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 0 0|1 1 1|s s s s s| P P |0 - - - - -|0 0 1|d d d d d| Rdd=convert_sf2d(Rs):chop - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 0 1|- 0 0|- - - s s| P P |- - - - t t|- - -|d d d d d| Rd=vitpack(Ps,Pt) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 0 1|- 1 -|- - - s s| P P |- - - - - -|- - -|d d d d d| Rd=Ps - XTYPE PERM/slot 2,3
-|1 0 0 0|1 0 1 0|l l l|s s s s s| P P |i i i i i i|l l l|d d d d d| Rdd=extract(Rss,#u6,#U6) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 0 1 1|0 0 1|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rd=convert_uw2sf(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 1 1|0 1 0|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rd=convert_w2sf(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 1 1|0 1 1|s s s s s| P P |0 - - - - -|0 0 0|d d d d d| Rd=convert_sf2uw(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 1 1|0 1 1|s s s s s| P P |0 - - - - -|0 0 1|d d d d d| Rd=convert_sf2uw(Rs):chop - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 1 1|1 0 0|s s s s s| P P |0 - - - - -|0 1 0|d d d d d| Rd=convert_sf2w(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 1 1|1 0 0|s s s s s| P P |0 - - - - -|0 1 1|d d d d d| Rd=convert_sf2w(Rs):chop - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 1 1|1 0 1|s s s s s| P P |- - - - - -|0 0 0|d d d d d| Rd=sffixupr(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|1 0 1 1|1 1 1|s s s s s| P P |- - - - - -|0 e e|d d d d d| Rd,Pe=sfinvsqrta(Rs) - XTYPE FP/slot 2,3
-|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=clb(Rs) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=cl0(Rs) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rd=cl1(Rs) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |- - - - - -|1 1 1|d d d d d| Rd=normamt(Rs) - XTYPE ALU/slot 2,3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |0 i i i i i|0 0 0|d d d d d| Rdd=asr(Rs,#u5) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |0 i i i i i|0 0 1|d d d d d| Rdd=lsr(Rs,#u5) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |0 i i i i i|0 1 0|d d d d d| Rdd=asl(Rs,#u5) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |0 i i i i i|0 1 1|d d d d d| Rdd=rol(Rs,#u5) - XTYPE PERM/slot 2,3
+|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=clb(Rs) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=cl0(Rs) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rd=cl1(Rs) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|0 0 0|s s s s s| P P |- - - - - -|1 1 1|d d d d d| Rd=normamt(Rs) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|0 0 1|s s s s s| P P |i i i i i i|0 0 0|d d d d d| Rd=add(clb(Rs),#s6) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|0 1 0|s s s s s| P P |0 i i i i i|0 0 0|d d d d d| Rd=asr(Rs,#u5):rnd - XTYPE PERM/slot 2,3
+|1 0 0 0|1 1 0 0|0 1 0|s s s s s| P P |0 i i i i i|0 1 0|d d d d d| Rd=asl(Rs,#u5):sat - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|0 1 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=ct0(Rs) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|0 1 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=ct1(Rs) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|0 1 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rd=brev(Rs) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|0 1 0|s s s s s| P P |- - - - - -|1 1 1|d d d d d| Rd=vsplatb(Rs) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 0 0|0 1 0|s s s s s| P P |0 i i i i i|0 0 0|d d d d d| Rd=asr(Rs,#u5):rnd - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 0 0|0 1 0|s s s s s| P P |0 i i i i i|0 1 0|d d d d d| Rd=asl(Rs,#u5):sat - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 0 -|s s s s s| P P |- - - - - -|0 0 -|d d d d d| Rd=vsathb(Rs) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 0 -|s s s s s| P P |- - - - - -|0 1 -|d d d d d| Rd=vsathub(Rs) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=abs(Rs) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=abs(Rs) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=abs(Rs):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rd=neg(Rs):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 0 0|s s s s s| P P |- - - - - -|1 1 1|d d d d d| Rd=swiz(Rs) - XTYPE PERM/slot 2,3
+|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |0 i i i i i|0 0 0|d d d d d| Rd=setbit(Rs,#u5) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |0 i i i i i|0 0 1|d d d d d| Rd=clrbit(Rs,#u5) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |0 i i i i i|0 1 0|d d d d d| Rd=togglebit(Rs,#u5) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |- - - - - -|1 0 0|d d d d d| Rd=sath(Rs) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |- - - - - -|1 0 1|d d d d d| Rd=satuh(Rs) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |- - - - - -|1 1 0|d d d d d| Rd=satub(Rs) - XTYPE PERM/slot 2,3
|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |- - - - - -|1 1 1|d d d d d| Rd=satb(Rs) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |0 i i i i i|0 0 0|d d d d d| Rd=setbit(Rs,#u5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |0 i i i i i|0 0 1|d d d d d| Rd=clrbit(Rs,#u5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 1 0|s s s s s| P P |0 i i i i i|0 1 0|d d d d d| Rd=togglebit(Rs,#u5) - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|0 0 -|d d d d d| Rd=cround(Rs,#u5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5):sat - XTYPE ALU/slot 2,3
|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |i i i i i i|0 1 -|d d d d d| Rdd=cround(Rss,#u6) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 1|0 l l|- - - - -| P P |1 i i i i i|l l l|d d d d d| Rd=mask(#u5,#U5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 0 1|0 l l|s s s s s| P P |0 i i i i i|l l l|d d d d d| Rd=extractu(Rs,#u5,#U5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 0 1|1 l l|s s s s s| P P |0 i i i i i|l l l|d d d d d| Rd=extract(Rs,#u5,#U5) - XTYPE ALU/slot 2,3
-|1 0 0 0|1 1 1 0|0 0 -|s s s s s| P P |0 i i i i i|0 0 0|x x x x x| Rxx-=asr(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 0 -|s s s s s| P P |0 i i i i i|0 0 1|x x x x x| Rxx-=lsr(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 0 -|s s s s s| P P |0 i i i i i|0 1 0|x x x x x| Rxx-=asl(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 0 -|s s s s s| P P |0 i i i i i|0 1 1|x x x x x| Rxx-=rol(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 0 -|s s s s s| P P |0 i i i i i|1 0 0|x x x x x| Rxx+=asr(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 0 -|s s s s s| P P |0 i i i i i|1 0 1|x x x x x| Rxx+=lsr(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 0 -|s s s s s| P P |0 i i i i i|1 1 0|x x x x x| Rxx+=asl(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 0 -|s s s s s| P P |0 i i i i i|1 1 1|x x x x x| Rxx+=rol(Rs,#u6) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 1 -|s s s s s| P P |0 i i i i i|0 0 0|x x x x x| Rx&=asr(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 1 -|s s s s s| P P |0 i i i i i|0 0 1|x x x x x| Rx&=lsr(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 1 -|s s s s s| P P |0 i i i i i|0 1 0|x x x x x| Rx&=asl(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 1 -|s s s s s| P P |0 i i i i i|0 1 1|x x x x x| Rx&=rol(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 1 -|s s s s s| P P |0 i i i i i|1 0 0|x x x x x| Rx|=asr(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 1 -|s s s s s| P P |0 i i i i i|1 0 1|x x x x x| Rx|=lsr(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 1 -|s s s s s| P P |0 i i i i i|1 1 0|x x x x x| Rx|=asl(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|0 1 -|s s s s s| P P |0 i i i i i|1 1 1|x x x x x| Rx|=rol(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|1 0 -|s s s s s| P P |0 i i i i i|0 0 0|x x x x x| Rx^=asr(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|1 0 -|s s s s s| P P |0 i i i i i|0 0 1|x x x x x| Rx^=lsr(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|1 0 -|s s s s s| P P |0 i i i i i|0 1 0|x x x x x| Rx^=asl(Rs,#u5) - XTYPE PERM/slot 2,3
-|1 0 0 0|1 1 1 0|1 0 -|s s s s s| P P |0 i i i i i|0 1 1|x x x x x| Rx^=rol(Rs,#u5) - XTYPE PERM/slot 2,3
+|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 0 -|d d d d d| Rd=round(Rs,#u5) - XTYPE ALU/slot 2,3
+|1 0 0 0|1 1 0 0|1 1 1|s s s s s| P P |0 i i i i i|1 1 -|d d d d d| Rd=round(Rs,#u5):sat - XTYPE ALU/slot 2,3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -919,8 +921,6 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
-|1 1 0 0|0 0 0 0|0 - -|s s s s s| P P |- t t t t t|i i i|d d d d d| Rdd=valignb(Rtt,Rss,#u3) - XTYPE PERM/slot 2,3
-|1 1 0 0|0 0 0 0|1 - -|s s s s s| P P |- t t t t t|i i i|d d d d d| Rdd=vspliceb(Rss,Rtt,#u3) - XTYPE PERM/slot 2,3
|1 1 0 0|0 0 0 1|0 0 -|s s s s s| P P |- t t t t t|0 0 -|d d d d d| Rdd=extractu(Rss,Rtt) - XTYPE ALU/slot 2,3
|1 1 0 0|0 0 0 1|0 0 -|s s s s s| P P |- t t t t t|0 1 -|d d d d d| Rdd=shuffeb(Rss,Rtt) - XTYPE PERM/slot 2,3
|1 1 0 0|0 0 0 1|0 0 -|s s s s s| P P |- t t t t t|1 0 -|d d d d d| Rdd=shuffob(Rtt,Rss) - XTYPE PERM/slot 2,3
@@ -956,8 +956,8 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
|1 1 0 0|0 0 1 1|1 0 -|s s s s s| P P |- i i i i i|0 1 -|d d d d d| Rdd=lsr(Rss,Rt) - XTYPE PERM/slot 2,3
|1 1 0 0|0 0 1 1|1 0 -|s s s s s| P P |- i i i i i|1 0 -|d d d d d| Rdd=asl(Rss,Rt) - XTYPE PERM/slot 2,3
|1 1 0 0|0 0 1 1|1 0 -|s s s s s| P P |- i i i i i|1 1 -|d d d d d| Rdd=lsl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|0 0 1 1|1 1 -|s s s s s| P P |- t t t t t|0 1 -|d d d d d| Rdd=vcnegh(Rss,Rt) - XTYPE ALU/slot 2,3
|1 1 0 0|0 0 1 1|1 1 -|s s s s s| P P |- t t t t t|0 0 -|d d d d d| Rdd=vcrotate(Rss,Rt) - XTYPE COMPLEX/slot 2,3
+|1 1 0 0|0 0 1 1|1 1 -|s s s s s| P P |- t t t t t|0 1 -|d d d d d| Rdd=vcnegh(Rss,Rt) - XTYPE ALU/slot 2,3
|1 1 0 0|0 0 1 1|1 1 -|s s s s s| P P |i t t t t t|1 1 i|d d d d d| Rdd=vrcrotate(Rss,Rt,#u2) - XTYPE COMPLEX/slot 2,3
|1 1 0 0|0 1 0 0|0 0 0|s s s s s| P P |0 t t t t t|i i i|d d d d d| Rd=addasl(Rt,Rs,#u3) - XTYPE PERM/slot 2,3
|1 1 0 0|0 1 0 1|- - -|s s s s s| P P |- t t t t t|0 1 0|d d d d d| Rd=vasrw(Rss,Rt) - XTYPE PERM/slot 2,3
@@ -1000,52 +1000,52 @@ A L I A S A L I A S A L I A S A L I A S A L I A S | Rd=zxtb(Rs)
|1 1 0 0|1 0 0 1|1 1 -|s s s s s| P P |- t t t t t|0 1 -|d d d d d| Rd=extract(Rs,Rtt) - XTYPE ALU/slot 2,3
|1 1 0 0|1 0 1 0|0 - -|s s s s s| P P |0 t t t t t|- - -|x x x x x| Rxx=insert(Rss,Rtt) - XTYPE ALU/slot 2,3
|1 1 0 0|1 0 1 0|1 0 -|s s s s s| P P |0 t t t t t|0 0 0|x x x x x| Rxx^=xor(Rss,Rtt) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 0|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rxx|=asr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 0|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rxx|=lsr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 0|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rxx|=asl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 0|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rxx|=lsl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |0 t t t t t|0 0 1|u u u u u| Rxx=vrmaxh(Rss,Ru) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |0 x x x x x|0 1 0|u u u u u| Rxx=vrmaxw(Rss,Ru) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |0 x x x x x|1 0 1|u u u u u| Rxx=vrminh(Rss,Ru) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |0 x x x x x|1 1 0|u u u u u| Rxx=vrminw(Rss,Ru) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |1 t t t t t|0 0 1|u u u u u| Rxx=vrmaxuh(Rss,Ru) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |1 x x x x x|0 1 0|u u u u u| Rxx=vrmaxuw(Rss,Ru) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |1 x x x x x|1 0 1|u u u u u| Rxx=vrminuh(Rss,Ru) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |1 x x x x x|1 1 0|u u u u u| Rxx=vrminuw(Rss,Ru) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 0 1|s s s s s| P P |1 t t t t t|1 1 1|x x x x x| Rxx+=vrcnegh(Rss,Rt) - XTYPE ALU/slot 2,3
-|1 1 0 0|1 0 1 1|0 1 0|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rxx&=asr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 1 0|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rxx&=lsr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 1 0|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rxx&=asl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 1 0|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rxx&=lsl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 1 1|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rxx^=asr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 1 1|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rxx^=lsr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 1 1|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rxx^=asl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|0 1 1|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rxx^=lsl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|1 0 0|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rxx-=asr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|1 0 0|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rxx-=lsr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|1 0 0|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rxx-=asl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|1 0 0|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rxx-=lsl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|1 0 1|s s s s s| P P |i t t t t t|- - i|x x x x x| Rxx+=vrcrotate(Rss,Rt,#u2) - XTYPE COMPLEX/slot 2,3
-|1 1 0 0|1 0 1 1|1 1 0|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rxx+=asr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|1 1 0|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rxx+=lsr(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|1 1 0|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rxx+=asl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 0 1 1|1 1 0|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rxx+=lsl(Rss,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|0 0 -|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rx|=asr(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|0 0 -|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rx|=lsr(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|0 0 -|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rx|=asl(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|0 0 -|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rx|=lsl(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|0 1 -|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rx&=asr(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|0 1 -|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rx&=lsr(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|0 1 -|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rx&=asl(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|0 1 -|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rx&=lsl(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|1 0 -|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rx-=asr(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|1 0 -|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rx-=lsr(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|1 0 -|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rx-=asl(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|1 0 -|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rx-=lsl(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|1 1 -|s s s s s| P P |- t t t t t|0 0 -|x x x x x| Rx+=asr(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|1 1 -|s s s s s| P P |- t t t t t|0 1 -|x x x x x| Rx+=lsr(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|1 1 -|s s s s s| P P |- t t t t t|1 0 -|x x x x x| Rx+=asl(Rs,Rt) - XTYPE PERM/slot 2,3
-|1 1 0 0|1 1 0 0|1 1 -|s s s s s| P P |- t t t t t|1 1 -|x x x x x| Rx+=lsl(Rs,Rt) - XTYPE PERM/slot 2,3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|1 1 0 1|0 0 0 0|- - -|s s s s s| P P |- t t t t t|- - -|d d d d d| Rd=parity(Rss,Rtt) - XTYPE ALU/slot 2,3
|1 1 0 1|0 0 0 1|- - -|s s s s s| P P |- t t t t t|- u u|d d d d d| Rdd=vmux(Pu,Rss,Rtt) - XTYPE PERM/slot 2,3
|1 1 0 1|0 0 1 0|0 - -|s s s s s| P P |0 t t t t t|0 0 0|- - - d d| Pd=vcmpw.eq(Rss,Rtt) - XTYPE PERM/slot 2,3
diff --git a/src/display.rs b/src/display.rs
index dbf4e44..ecd9a26 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -71,6 +71,15 @@ impl fmt::Display for Instruction {
return write!(f, "{} = or({}, or({}, !{}))", self.dest.as_ref().unwrap(),
self.sources[0], self.sources[1], self.sources[2]);
}
+ Opcode::AddClb => {
+ return write!(f, "{} = add(clb({}), {})", self.dest.as_ref().unwrap(),
+ self.sources[0], self.sources[1]);
+ }
+ Opcode::SfInvsqrta => {
+ return write!(f, "{}, {} = {}({})",
+ self.dest.as_ref().unwrap(), self.alt_dest.as_ref().unwrap(),
+ self.opcode, self.sources[0]);
+ }
_ => {
unreachable!("TODO: should be exhaustive for opcodes with special display rules");
}
@@ -404,6 +413,7 @@ impl fmt::Display for Opcode {
Opcode::Asr => { f.write_str("asr") },
Opcode::Lsr => { f.write_str("lsr") },
Opcode::Asl => { f.write_str("asl") },
+ Opcode::Lsl => { f.write_str("lsl") },
Opcode::Rol => { f.write_str("rol") },
Opcode::Vsathub => { f.write_str("vsathub") },
Opcode::Vsatwuh => { f.write_str("vsatwuh") },
@@ -428,12 +438,8 @@ impl fmt::Display for Opcode {
Opcode::Interleave => { f.write_str("interleave") },
Opcode::Brev => { f.write_str("brev") },
- Opcode::ConvertDf2d => { f.write_str("convert_df2d") },
- Opcode::ConvertDf2ud => { f.write_str("convert_df2ud") },
- Opcode::ConvertUd2df => { f.write_str("convert_ud2df") },
- Opcode::ConvertD2df => { f.write_str("convert_d2df") },
-
Opcode::Extractu => { f.write_str("extractu") },
+ Opcode::Extract => { f.write_str("extract") },
Opcode::Insert => { f.write_str("insert") },
Opcode::TransferRegisterJump => { f.write_str("transferregisterjump") }
@@ -507,8 +513,79 @@ impl fmt::Display for Opcode {
Opcode::OrAndNot => { f.write_str("orandnot") },
Opcode::OrNot => { f.write_str("ornot") },
Opcode::OrOrNot => { f.write_str("orornot") },
+ Opcode::AddClb => { f.write_str("addclb") },
Opcode::Any8 => { f.write_str("any8") },
Opcode::All8 => { f.write_str("all8") },
+ Opcode::Valignb => { f.write_str("valignb") },
+ Opcode::Vspliceb => { f.write_str("vspliceb") },
+ Opcode::Vsxtbh => { f.write_str("vsxtbh") },
+ Opcode::Vzxtbh => { f.write_str("vzxtbh") },
+ Opcode::Vsxthw => { f.write_str("vsxthw") },
+ Opcode::Vzxthw => { f.write_str("vzxthw") },
+ Opcode::Vsplatb => { f.write_str("vsplatb") },
+ Opcode::Vsplath => { f.write_str("vsplath") },
+ Opcode::Vrcrotate => { f.write_str("vrcrotate") },
+ Opcode::Vrmaxh => { f.write_str("vrmaxh") },
+ Opcode::Vrmaxw => { f.write_str("vrmaxw") },
+ Opcode::Vrminh => { f.write_str("vrminh") },
+ Opcode::Vrminw => { f.write_str("vrminw") },
+ Opcode::Vrmaxuh => { f.write_str("vrmaxuh") },
+ Opcode::Vrmaxuw => { f.write_str("vrmaxuw") },
+ Opcode::Vrminuh => { f.write_str("vrminuh") },
+ Opcode::Vrminuw => { f.write_str("vrminuw") },
+ Opcode::Vrcnegh => { f.write_str("vrcnegh") },
+ Opcode::ConvertDf2D => { f.write_str("convert_df2d") },
+ Opcode::ConvertDf2Ud => { f.write_str("convert_df2ud") },
+ Opcode::ConvertUd2Df => { f.write_str("convert_ud2df") },
+ Opcode::ConvertD2Df => { f.write_str("convert_d2df") },
+ Opcode::ConvertD2Sf => { f.write_str("convert_d2sf") },
+ Opcode::ConvertSf2Df => { f.write_str("convert_sf2df") },
+ Opcode::ConvertDf2Sf => { f.write_str("convert_df2sf") },
+ Opcode::ConvertUw2Sf => { f.write_str("convert_uw2sf") },
+ Opcode::ConvertUw2Df => { f.write_str("convert_uw2df") },
+ Opcode::ConvertUd2Sf => { f.write_str("convert_ud2sf") },
+ Opcode::ConvertW2Sf => { f.write_str("convert_w2sf") },
+ Opcode::ConvertW2Df => { f.write_str("convert_w2df") },
+ Opcode::ConvertSf2Uw => { f.write_str("convert_sf2uw") },
+ Opcode::ConvertSf2Ud => { f.write_str("convert_sf2ud") },
+ Opcode::ConvertSf2W => { f.write_str("convert_sf2w") },
+ Opcode::ConvertSf2D => { f.write_str("convert_sf2d") },
+ Opcode::Mask => { f.write_str("mask") },
+ Opcode::Setbit => { f.write_str("setbit") },
+ Opcode::Clrbit => { f.write_str("clrbit") },
+ Opcode::Tstbit => { f.write_str("tstbit") },
+ Opcode::Togglebit => { f.write_str("togglebit") },
+ Opcode::Bitsclr => { f.write_str("bitsclr") },
+ Opcode::Sfclass => { f.write_str("sfclass") },
+ Opcode::Tableidxb => { f.write_str("tableidxb") },
+ Opcode::Tableidxh => { f.write_str("tableidxh") },
+ Opcode::Tableidxw => { f.write_str("tableidxw") },
+ Opcode::Tableidxd => { f.write_str("tableidxd") },
+ Opcode::Vasrhub => { f.write_str("vasrhub") },
+ Opcode::Vrndwh => { f.write_str("vrndwh") },
+ Opcode::Vtrunohb => { f.write_str("vtrunohb") },
+ Opcode::Vtrunehb => { f.write_str("vtrunehb") },
+ Opcode::Normamt => { f.write_str("normamt") },
+ Opcode::Popcount => { f.write_str("popcount") },
+ Opcode::Sat => { f.write_str("sat") },
+ Opcode::Satb => { f.write_str("satb") },
+ Opcode::Sath => { f.write_str("sath") },
+ Opcode::Satub => { f.write_str("satub") },
+ Opcode::Satuh => { f.write_str("satuh") },
+ Opcode::Round => { f.write_str("round") },
+ Opcode::Cround => { f.write_str("cround") },
+ Opcode::Bitsplit => { f.write_str("bitsplit") },
+ Opcode::Clip => { f.write_str("clip") },
+ Opcode::Vclip => { f.write_str("vclip") },
+ Opcode::Clb => { f.write_str("clb") },
+ Opcode::Cl0 => { f.write_str("cl0") },
+ Opcode::Cl1 => { f.write_str("cl1") },
+ Opcode::Ct0 => { f.write_str("ct0") },
+ Opcode::Ct1 => { f.write_str("ct1") },
+ Opcode::Vitpack => { f.write_str("vitpack") },
+ Opcode::SfFixupr => { f.write_str("sffixupr") },
+ Opcode::SfInvsqrta => { f.write_str("sfinvsqrta") },
+ Opcode::Swiz => { f.write_str("swiz") },
}
}
}
diff --git a/src/lib.rs b/src/lib.rs
index 7a255f8..c225ed1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -489,6 +489,8 @@ pub enum Opcode {
Asr,
Lsr,
Asl,
+ /// logical left shift. is this different from arithmetic left shift? who knows?!
+ Lsl,
Rol,
Vsathub,
Vsatwuh,
@@ -513,12 +515,8 @@ pub enum Opcode {
Interleave,
Brev,
- ConvertDf2d,
- ConvertDf2ud,
- ConvertUd2df,
- ConvertD2df,
-
Extractu,
+ Extract,
Insert,
Trap0,
@@ -581,6 +579,78 @@ pub enum Opcode {
Any8,
All8,
+ Valignb,
+ Vspliceb,
+ Vsxtbh,
+ Vzxtbh,
+ Vsxthw,
+ Vzxthw,
+ Vsplath,
+ Vsplatb,
+ Vrcrotate,
+ Vrmaxh,
+ Vrmaxw,
+ Vrminh,
+ Vrminw,
+ Vrmaxuh,
+ Vrmaxuw,
+ Vrminuh,
+ Vrminuw,
+ Vrcnegh,
+
+ ConvertDf2D,
+ ConvertDf2Ud,
+ ConvertSf2W,
+ ConvertSf2D,
+ ConvertSf2Df,
+ ConvertDf2Sf,
+ ConvertSf2Uw,
+ ConvertSf2Ud,
+ ConvertUd2Df,
+ ConvertUd2Sf,
+ ConvertUw2Sf,
+ ConvertUw2Df,
+ ConvertW2Sf,
+ ConvertW2Df,
+ ConvertD2Df,
+ ConvertD2Sf,
+ Mask,
+ Setbit,
+ Clrbit,
+ Togglebit,
+ Tstbit,
+ Bitsclr,
+ Sfclass,
+ Tableidxb,
+ Tableidxh,
+ Tableidxw,
+ Tableidxd,
+
+ Vasrhub,
+ Vrndwh,
+ Vtrunohb,
+ Vtrunehb,
+ Normamt,
+ Popcount,
+ Sat,
+ Sath,
+ Satb,
+ Satuh,
+ Satub,
+ Round,
+ Cround,
+ Bitsplit,
+ Clip,
+ Vclip,
+ Clb,
+ Cl0,
+ Cl1,
+ Ct0,
+ Ct1,
+ Vitpack,
+ SfFixupr,
+ Swiz,
+
AndAnd = 0x8000,
AndOr,
OrAnd,
@@ -591,6 +661,8 @@ pub enum Opcode {
OrAndNot,
OrNot,
OrOrNot,
+ AddClb,
+ SfInvsqrta,
}
impl Opcode {
@@ -2919,8 +2991,8 @@ fn decode_instruction<
debug_assert!(other == 0b111);
static OPS: [Option<Opcode>; 8] = [
- Some(ConvertDf2d), Some(ConvertDf2ud), Some(ConvertUd2df), Some(ConvertD2df),
- None, None, Some(ConvertDf2d), Some(ConvertDf2ud),
+ Some(ConvertDf2D), Some(ConvertDf2Ud), Some(ConvertUd2Df), Some(ConvertD2Df),
+ None, None, Some(ConvertDf2D), Some(ConvertDf2Ud),
];
handler.on_opcode_decoded(decode_opcode!(OPS[op_low as usize]))?;
opcode_check!(inst & 0x2000 == 0);
@@ -2996,6 +3068,534 @@ fn decode_instruction<
handler.on_source_decoded(Operand::imm_u8(iiiiii as u8))?;
handler.on_source_decoded(Operand::imm_u8(llllll as u8))?;
}
+ 0b0100 => {
+ let ddddd = reg_b0(inst);
+ let sssss = reg_b16(inst);
+
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+
+ let opc_lo = (inst >> 5) & 0b111;
+ let opc_hi = (inst >> 21) & 0b111;
+
+ if opc_hi >= 0b100 {
+ // convert...
+ static CONVERT_OPS: [Option<(Opcode, bool)>; 8] = [
+ Some((ConvertSf2Df, false)), Some((ConvertUw2Df, false)),
+ Some((ConvertW2Df, false)), Some((ConvertSf2Ud, true)),
+ Some((ConvertSf2D, true)), Some((ConvertSf2Ud, true)),
+ Some((ConvertSf2D, true)), None,
+ ];
+ let (opc, check_b13_zero) = decode_opcode!(CONVERT_OPS[opc_lo as usize]);
+ opcode_check!(!check_b13_zero || (inst & 0b0010_0000_0000_0000) == 0);
+ handler.on_opcode_decoded(opc)?;
+
+ if opc_lo > 0b100 {
+ handler.chop()?;
+ }
+ } else if opc_hi >= 0b010 {
+ // vsplat
+ if opc_lo == 0b010 || opc_lo == 0b011 {
+ handler.on_opcode_decoded(Opcode::Vsplath)?;
+ } else if opc_lo == 0b100 || opc_lo == 0b101 {
+ handler.on_opcode_decoded(Opcode::Vsplatb)?;
+ } else {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ } else {
+ static EXT_OPS: [Opcode; 4] = [
+ Vsxtbh, Vzxtbh, Vsxthw, Vzxthw
+ ];
+ handler.on_opcode_decoded(EXT_OPS[(opc_lo >> 1) as usize])?;
+ }
+ }
+ 0b0101 => {
+ let opc_hi = (inst >> 21) & 0b111;
+ let i6 = (inst >> 8) & 0b111111;
+ let dd = inst & 0b11;
+ let sssss = reg_b16(inst);
+
+ handler.on_dest_decoded(Operand::pred(dd as u8))?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+
+ match opc_hi {
+ 0b000 => {
+ handler.on_opcode_decoded(Opcode::Tstbit)?;
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ }
+ 0b001 => {
+ handler.on_opcode_decoded(Opcode::Tstbit)?;
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ handler.negate_result()?;
+ }
+ 0b010 => {
+ handler.on_opcode_decoded(Opcode::TransferRegister)?;
+ }
+ 0b100 => {
+ handler.on_opcode_decoded(Opcode::Bitsclr)?;
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ }
+ 0b101 => {
+ handler.on_opcode_decoded(Opcode::Bitsclr)?;
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ handler.negate_result()?;
+ }
+ 0b111 => {
+ handler.on_opcode_decoded(Opcode::Sfclass)?;
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ }
+ _ => {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ }
+ }
+ 0b0110 => {
+ handler.on_opcode_decoded(Opcode::Mask)?;
+ handler.on_dest_decoded(Operand::gprpair(reg_b0(inst))?)?;
+ handler.on_source_decoded(Operand::pred(reg_b8(inst) & 0b11))?;
+ }
+ 0b0111 => {
+ let l6 = (inst >> 8) & 0b111111;
+ let l6 = ((l6 as i8) << 2) >> 2;
+ let i3 = (inst >> 5) & 0b111;
+ let i_hi = (inst >> 21) & 0b1;
+ let i4 = (i_hi << 3) | i3;
+ let opc = (inst >> 22) & 0b11;
+ static TABLEIDX_OPS: [Opcode; 4] = [
+ Opcode::Tableidxb, Opcode::Tableidxh,
+ Opcode::Tableidxw, Opcode::Tableidxd
+ ];
+
+ handler.on_opcode_decoded(TABLEIDX_OPS[opc as usize])?;
+ handler.on_dest_decoded(Operand::gpr(reg_b0(inst)))?;
+ handler.on_source_decoded(Operand::gpr(reg_b16(inst)))?;
+ handler.on_source_decoded(Operand::imm_u8(i4 as u8))?;
+ handler.on_source_decoded(Operand::imm_i8(l6))?;
+ handler.rounded(RoundingMode::Raw)?;
+ }
+ 0b1000 => {
+ // 1000|1000...
+ let ddddd = reg_b0(inst);
+ let sssss = reg_b16(inst);
+ let opc_lo = (inst >> 5) & 0b111;
+ let opc_hi = (inst >> 21) & 0b111;
+ let opc = opc_lo | (opc_hi << 3);
+
+ static OPCODES: [Option<Opcode>; 64] = [
+ // 000
+ Some(Vsathub), Some(ConvertDf2Sf), Some(Vsatwh), None, Some(Vsatwuh), None, Some(Vsathb), None,
+ // 001
+ None, Some(ConvertUd2Sf), None, None, None, None, None, None,
+ // 010
+ Some(Clb), Some(ConvertD2Sf), Some(Cl0), None, Some(Cl1), None, None, None,
+ // 011
+ Some(Normamt), Some(ConvertSf2Ud), Some(AddClb), Some(Popcount), Some(Vasrhub), Some(Vasrhub), None, None,
+ // 100
+ Some(Vtrunohb), Some(ConvertSf2D), Some(Vtrunehb), None, Some(Vrndwh), None, Some(Vrndwh), None,
+ // 101
+ None, Some(ConvertSf2Ud), None, None, None, None, None, None,
+ // 110
+ Some(Sat), Some(Round), Some(Vasrw), None, Some(Bitsplit), Some(Clip), Some(Vclip), None,
+ // 111
+ None, Some(ConvertSf2D), Some(Ct0), None, Some(Ct1), None, None, None,
+ ];
+
+ let op = decode_opcode!(OPCODES[opc as usize]);
+ handler.on_opcode_decoded(op)?;
+
+ let i6 = (inst >> 8) & 0b111111;
+
+ match opc {
+ 0b100110 |
+ 0b110001 => {
+ operand_check!(i6 < 0b100000);
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.saturate()?;
+ }
+ 0b110101 => {
+ operand_check!(i6 < 0b100000);
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ }
+ 0b110110 => {
+ operand_check!(i6 < 0b100000);
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ }
+ 0b110010 => {
+ operand_check!(i6 < 0b100000);
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ let i6 = (i6 as i8) << 3 >> 3;
+ handler.on_source_decoded(Operand::imm_i8(i6))?;
+ }
+ 0b011001 => {
+ operand_check!(i6 < 0b100000);
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ }
+ 0b011010 => {
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.on_source_decoded(Operand::imm_i8((i6 as i8) << 2 >> 2))?;
+ }
+ 0b011100 => {
+ operand_check!(i6 < 0b10000);
+ handler.rounded(RoundingMode::Raw)?;
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ }
+ 0b011101 => {
+ operand_check!(i6 < 0b10000);
+ handler.saturate()?;
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ }
+ 0b110100 => {
+ operand_check!(i6 < 0b10000);
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ }
+ 0b100001 |
+ 0b110110 => {
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ }
+ 0b101001 |
+ 0b111001 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ handler.chop();
+ }
+ _ => {
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ }
+ }
+ }
+ 0b1001 => {
+ // 1000|1001...
+ let opc_hi = (inst >> 21) & 0b111;
+
+ let ddddd = reg_b0(inst);
+ let tt = reg_b8(inst) & 0b11;
+ let ss = reg_b16(inst) & 0b11;
+
+ if opc_hi & 0b011 == 0b000 {
+ // vitpack
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::pred(ss))?;
+ handler.on_source_decoded(Operand::pred(tt))?;
+ handler.on_opcode_decoded(Opcode::Vitpack)?;
+ } else if opc_hi & 0b010 == 0b010 {
+ // mov?
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::pred(ss))?;
+ handler.on_opcode_decoded(Opcode::TransferRegister)?;
+ } else {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ }
+ 0b1010 => {
+ // 1000|1010...
+ let ddddd = reg_b0(inst);
+ let ttttt = reg_b8(inst);
+ let sssss = reg_b16(inst);
+ let l_lo = (inst >> 5) & 0b111;
+ let l_hi = (inst >> 21) & 0b111;
+ let l6 = l_lo | (l_hi << 3);
+ let i6 = (inst >> 8) & 0b111111;
+
+ handler.on_opcode_decoded(Extract)?;
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.on_source_decoded(Operand::imm_u8(i6 as u8))?;
+ handler.on_source_decoded(Operand::imm_u8(l6 as u8))?;
+ }
+ 0b1011 => {
+ // 1000|1011...
+ let ddddd = reg_b0(inst);
+ let sssss = reg_b16(inst);
+ let op_lo = (inst >> 5) & 0b111;
+ let op_hi = (inst >> 21) & 0b111;
+ let i6 = (inst >> 8) & 0b111111;
+
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+
+ match (op_hi, op_lo) {
+ (0b001, 0b000) => {
+ handler.on_opcode_decoded(Opcode::ConvertUw2Sf)?;
+ }
+ (0b010, 0b000) => {
+ handler.on_opcode_decoded(Opcode::ConvertW2Sf)?;
+ }
+ (0b011, 0b000) => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::ConvertSf2Uw)?;
+ }
+ (0b011, 0b001) => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::ConvertSf2Uw)?;
+ handler.chop()?;
+ }
+ (0b100, 0b010) => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::ConvertSf2W)?;
+ }
+ (0b100, 0b011) => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::ConvertSf2W)?;
+ handler.chop()?;
+ }
+ (0b101, 0b000) => {
+ handler.on_opcode_decoded(Opcode::SfFixupr)?;
+ }
+ (0b111, low) => {
+ operand_check!(low & 0b100 == 0);
+ let ee = (low & 0b11) as u8;
+ handler.on_opcode_decoded(Opcode::SfInvsqrta)?;
+ handler.on_dest_decoded(Operand::pred(ee))?;
+ }
+ _ => {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ }
+ }
+ 0b1100 => {
+ let opc_lo = (inst >> 5) & 0b111;
+ let opc_hi = (inst >> 21) & 0b111;
+ let opc = opc_lo | (opc_hi << 3);
+ let ddddd = reg_b0(inst);
+ let sssss = reg_b16(inst);
+ let i6 = ((inst >> 8) & 0b11_1111) as u8;
+
+ if opc & 0b111110 == 0b111010 {
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ } else {
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ }
+
+ match opc {
+ 0b000_000 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Asr)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b000_001 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Lsr)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b000_010 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Asl)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b000_011 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Rol)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b000_100 => {
+ handler.on_opcode_decoded(Opcode::Clb)?;
+ }
+ 0b000_101 => {
+ handler.on_opcode_decoded(Opcode::Cl0)?;
+ }
+ 0b000_110 => {
+ handler.on_opcode_decoded(Opcode::Cl1)?;
+ }
+ 0b000_111 => {
+ handler.on_opcode_decoded(Opcode::Normamt)?;
+ }
+ 0b001_000 => {
+ handler.on_opcode_decoded(Opcode::AddClb)?;
+ handler.on_source_decoded(Operand::imm_i8((i6 as i8) << 2 >> 2))?;
+ }
+ 0b010_000 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Asr)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ handler.rounded(RoundingMode::Round)?;
+ }
+ 0b010_010 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Asl)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ handler.saturate()?;
+ }
+ 0b010_100 => {
+ handler.on_opcode_decoded(Opcode::Ct0)?;
+ }
+ 0b010_101 => {
+ handler.on_opcode_decoded(Opcode::Ct1)?;
+ }
+ 0b010_110 => {
+ handler.on_opcode_decoded(Opcode::Brev)?;
+ }
+ 0b010_111 => {
+ handler.on_opcode_decoded(Opcode::Vsplatb)?;
+ }
+ _ if opc & 0b110_110 == 0b100_000 => {
+ handler.on_opcode_decoded(Opcode::Vsathb)?;
+ }
+ _ if opc & 0b110_110 == 0b100_010 => {
+ handler.on_opcode_decoded(Opcode::Vsathub)?;
+ }
+ 0b100_100 => {
+ handler.on_opcode_decoded(Opcode::Abs)?;
+ }
+ 0b100_101 => {
+ handler.on_opcode_decoded(Opcode::Abs)?;
+ handler.saturate()?;
+ }
+ 0b100_110 => {
+ handler.on_opcode_decoded(Opcode::Neg)?;
+ handler.saturate()?;
+ }
+ 0b100_111 => {
+ handler.on_opcode_decoded(Opcode::Swiz)?;
+ }
+ 0b110_000 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Setbit)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b110_001 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Clrbit)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b110_010 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Togglebit)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b110_100 => {
+ handler.on_opcode_decoded(Opcode::Sath)?;
+ }
+ 0b110_101 => {
+ handler.on_opcode_decoded(Opcode::Satuh)?;
+ }
+ 0b110_110 => {
+ handler.on_opcode_decoded(Opcode::Satub)?;
+ }
+ 0b110_111 => {
+ handler.on_opcode_decoded(Opcode::Satb)?;
+ }
+ 0b111_000 | 0b111_001 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Cround)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b111_010 | 0b111_011 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Cround)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b111_100 | 0b111_101 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Round)?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ 0b111_110 | 0b111_111 => {
+ operand_check!(i6 & 0b10_0000 == 0);
+ handler.on_opcode_decoded(Opcode::Round)?;
+ handler.saturate()?;
+ handler.on_source_decoded(Operand::imm_u8(i6))?;
+ }
+ _ => {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ }
+ }
+ 0b1101 => {
+ let ddddd = reg_b0(inst);
+ let sssss = reg_b16(inst);
+ let iiiii = reg_b8(inst);
+ let lll = (inst >> 5) & 0b111;
+ let ll = (inst >> 21) & 0b11;
+ let lllll = (lll | (ll << 3)) as u8;
+ let opc_lo = (inst >> 13) & 1;
+ let opc_hi = (inst >> 23) & 1;
+ let opc = opc_lo | (opc_hi << 1);
+
+ handler.on_dest_decoded(Operand::gpr(ddddd))?;
+
+ match opc {
+ 0b00 => {
+ handler.on_opcode_decoded(Opcode::Extractu)?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ }
+ 0b01 => {
+ handler.on_opcode_decoded(Opcode::Mask)?;
+ }
+ 0b10 => {
+ handler.on_opcode_decoded(Opcode::Extract)?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ }
+ _ => {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ }
+
+ handler.on_source_decoded(Operand::imm_u8(iiiii))?;
+ handler.on_source_decoded(Operand::imm_u8(lllll))?;
+ }
+ 0b1110 => {
+ let opc_hi = (inst >> 22) & 0b11;
+ let opc_lo = (inst >> 5) & 0b111;
+ let opc = (opc_hi << 3) | opc_lo;
+ let sssss = reg_b16(inst);
+ let xxxxx = reg_b0(inst);
+ let iiiiii = ((inst >> 8) & 0b111111) as u8;
+
+ let assign_mode_bits = (opc >> 2) & 0b111;
+ let shift_op_bits = opc & 0b11;
+
+ let assign_mode = match assign_mode_bits {
+ 0b000 => AssignMode::SubAssign,
+ 0b001 => AssignMode::AddAssign,
+ 0b010 => AssignMode::AndAssign,
+ 0b011 => AssignMode::OrAssign,
+ 0b100 => AssignMode::XorAssign,
+ _ => {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ };
+ let opc = match shift_op_bits {
+ 0b00 => Opcode::Asr,
+ 0b01 => Opcode::Lsr,
+ 0b10 => Opcode::Asl,
+ _ => Opcode::Rol,
+ };
+ handler.on_opcode_decoded(opc)?;
+ handler.assign_mode(assign_mode)?;
+
+ if assign_mode_bits < 0b010 {
+ handler.on_dest_decoded(Operand::gprpair(xxxxx)?)?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.on_source_decoded(Operand::imm_u8(iiiiii))?;
+ } else {
+ operand_check!(iiiiii & 0b10_0000 == 0);
+ handler.on_dest_decoded(Operand::gpr(xxxxx))?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ handler.on_source_decoded(Operand::imm_u8(iiiiii))?;
+ }
+ }
0b1111 => {
opcode_check!(inst & 0x00102000 == 0);
handler.on_source_decoded(Operand::gpr(sssss))?;
@@ -3009,7 +3609,7 @@ fn decode_instruction<
handler.on_source_decoded(Operand::imm_u8(llllll))?;
}
_ => {
- // todo!("the rest");
+ unreachable!("impossible bit pattern");
}
}
}
@@ -3611,7 +4211,24 @@ fn decode_instruction<
0b0000 => {
// 1100|0000|...
let op = (inst >> 23) & 1;
- todo!("valignb, vspliaceb");
+
+ let ddddd = reg_b0(inst);
+ let ttttt = reg_b8(inst);
+ let sssss = reg_b16(inst);
+ let iii = (inst >> 5) & 0b111;
+
+ handler.on_dest_decoded(Operand::gprpair(ddddd)?)?;
+
+ if op == 0 {
+ handler.on_opcode_decoded(Opcode::Valignb)?;
+ handler.on_source_decoded(Operand::gprpair(ttttt)?)?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ } else {
+ handler.on_opcode_decoded(Opcode::Vspliceb)?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.on_source_decoded(Operand::gprpair(ttttt)?)?;
+ }
+ handler.on_source_decoded(Operand::imm_u8(iii as u8))?;
}
0b0001 => {
let minbits = (inst >> 22) & 0b11;
@@ -3657,9 +4274,86 @@ fn decode_instruction<
}
0b1011 => {
let minbits = (inst >> 21) & 0b111;
+ let op_bits = (inst >> 5) & 0b111;
+ let xxxxx = reg_b0(inst);
+ let ttttt = reg_b8(inst);
+ let sssss = reg_b16(inst);
+
+ handler.on_dest_decoded(Operand::gprpair(xxxxx)?)?;
+ handler.on_source_decoded(Operand::gprpair(sssss)?)?;
+ handler.on_source_decoded(Operand::gpr(ttttt))?;
+
+ if minbits == 0b001 {
+ static OPS: [Option<Opcode>; 16] = [
+ None, Some(Opcode::Vrmaxh), Some(Opcode::Vrmaxw), None,
+ None, Some(Opcode::Vrminh), Some(Opcode::Vrminw), None,
+ None, Some(Opcode::Vrmaxuh), Some(Opcode::Vrmaxuw), None,
+ None, Some(Opcode::Vrminuh), Some(Opcode::Vrminuw), Some(Opcode::Vrcnegh),
+ ];
+ let op_hi = (inst >> 13) & 1;
+ let op = op_bits | (op_hi << 3);
+ let op = decode_opcode!(OPS[op as usize]);
+ handler.on_opcode_decoded(op);
+ if op == Opcode::Vrcnegh {
+ handler.assign_mode(AssignMode::AddAssign)?;
+ }
+ return Ok(());
+ } else if minbits == 0b101 {
+ handler.on_opcode_decoded(Opcode::Vrcrotate)?;
+ handler.assign_mode(AssignMode::AddAssign)?;
+ let i_lo = (inst >> 5) & 1;
+ let i_hi = (inst >> 13) & 1;
+ let ii = i_lo | (i_hi << 1);
+ handler.on_source_decoded(Operand::imm_u8(ii as u8))?;
+ return Ok(());
+ }
+
+ let assign_mode = match minbits {
+ 0b000 => AssignMode::OrAssign,
+ 0b010 => AssignMode::AndAssign,
+ 0b011 => AssignMode::XorAssign,
+ 0b100 => AssignMode::SubAssign,
+ 0b110 => AssignMode::AddAssign,
+ _ => {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ };
+ let opc = match op_bits >> 1 {
+ 0b00 => Opcode::Asr,
+ 0b01 => Opcode::Lsr,
+ 0b10 => Opcode::Asl,
+ _ => Opcode::Lsl,
+ };
+ handler.on_opcode_decoded(opc)?;
+ handler.assign_mode(assign_mode)?;
}
0b1100 => {
let minbits = (inst >> 22) & 0b11;
+ let op_bits = (inst >> 6) & 0b11;
+ let xxxxx = reg_b0(inst);
+ let ttttt = reg_b8(inst);
+ let sssss = reg_b16(inst);
+
+ let assign_mode = match minbits {
+ 0b00 => AssignMode::OrAssign,
+ 0b01 => AssignMode::AndAssign,
+ 0b10 => AssignMode::SubAssign,
+ 0b11 => AssignMode::AddAssign,
+ _ => {
+ return Err(DecodeError::InvalidOpcode);
+ }
+ };
+ let opc = match op_bits {
+ 0b00 => Opcode::Asr,
+ 0b01 => Opcode::Lsr,
+ 0b10 => Opcode::Asl,
+ _ => Opcode::Lsl,
+ };
+ handler.on_opcode_decoded(opc)?;
+ handler.assign_mode(assign_mode)?;
+ handler.on_dest_decoded(Operand::gpr(xxxxx))?;
+ handler.on_source_decoded(Operand::gpr(sssss))?;
+ handler.on_source_decoded(Operand::gpr(ttttt))?;
}
0b1101 |
0b1110 |
diff --git a/tests/from_brain.rs b/tests/from_brain.rs
index b26f6a9..85eb128 100644
--- a/tests/from_brain.rs
+++ b/tests/from_brain.rs
@@ -346,6 +346,7 @@ fn inst_0111() {
test_display(&0b0111_0000000_00011_11_1_0_1101_000_00100u32.to_le_bytes(), "{ if (!P1.new) R4 = aslh(R3) }");
test_display(&0b0111_0000011_00001_11_0_0_0000_000_00100u32.to_le_bytes(), "{ R4 = R1 }");
+ test_invalid(&0b0111_0000011_00001_11_0_0_0000_000_00100u32.to_le_bytes(), DecodeError::InvalidOpcode);
test_display(&0b0111_0001011_00010_11_0_0_0000_001_00000u32.to_le_bytes(), "{ R2.L = #0x4020 }");
test_display(&0b0111_0001101_00010_11_0_0_0000_001_00000u32.to_le_bytes(), "{ R2.L = #0x8020 }");
@@ -446,6 +447,8 @@ fn inst_1000() {
test_display(&0b1000_0000111_00100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 = convert_df2d(R5:4):chop }");
test_display(&0b1000_0000111_00100_11_000110_111_10110u32.to_le_bytes(), "{ R23:22 = convert_df2ud(R5:4):chop }");
+ test_display(&0b1000_0001101_00100_11_000110_111_10110u32.to_le_bytes(), "{ R23:22 = extractu(R5:4, #0x6, #0x2f) }");
+
test_display(&0b1000_0010000_00100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 -= asr(R5:4, #0x6) }");
test_display(&0b1000_0010000_00100_11_000110_001_10110u32.to_le_bytes(), "{ R23:22 -= lsr(R5:4, #0x6) }");
test_display(&0b1000_0010000_00100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 -= asl(R5:4, #0x6) }");
@@ -478,7 +481,149 @@ fn inst_1000() {
test_display(&0b1000_0011101_10100_11_000110_111_10110u32.to_le_bytes(), "{ R23:22 = insert(R21:20, #0x6, #0x2f) }");
- test_display(&0b1000_0001101_00100_11_000110_111_10110u32.to_le_bytes(), "{ R23:22 = extractu(R5:4, #0x6, #0x2f) }");
+ test_display(&0b1000_0100_000_10100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 = vsxtbh(R20) }");
+ test_display(&0b1000_0100_000_10100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 = vzxtbh(R20) }");
+ test_display(&0b1000_0100_000_10100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 = vsxthw(R20) }");
+ test_display(&0b1000_0100_000_10100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 = vzxthw(R20) }");
+ test_display(&0b1000_0100_010_10100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 = vsplath(R20) }");
+ test_display(&0b1000_0100_010_10100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 = vsplatb(R20) }");
+ test_display(&0b1000_0100_100_10100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 = convert_sf2df(R20) }");
+ test_display(&0b1000_0100_100_10100_11_000110_001_10110u32.to_le_bytes(), "{ R23:22 = convert_uw2df(R20) }");
+ test_display(&0b1000_0100_100_10100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 = convert_w2df(R20) }");
+ test_display(&0b1000_0100_100_10100_11_000110_011_10110u32.to_le_bytes(), "{ R23:22 = convert_sf2ud(R20) }");
+ test_display(&0b1000_0100_100_10100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 = convert_sf2d(R20) }");
+ test_display(&0b1000_0100_100_10100_11_000110_101_10110u32.to_le_bytes(), "{ R23:22 = convert_sf2ud(R20):chop }");
+ test_display(&0b1000_0100_100_10100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 = convert_sf2d(R20):chop }");
+ test_invalid(&0b1000_0100_100_10100_11_000110_111_10110u32.to_le_bytes(), DecodeError::InvalidOpcode);
+
+ test_display(&0b1000_0101_000_10100_11_000110_111_00010u32.to_le_bytes(), "{ P2 = tstbit(R20, #0x6) }");
+ test_display(&0b1000_0101_001_10100_11_000110_111_00010u32.to_le_bytes(), "{ P2 = !tstbit(R20, #0x6) }");
+ test_display(&0b1000_0101_010_10100_11_000110_111_00010u32.to_le_bytes(), "{ P2 = R20 }");
+ test_invalid(&0b1000_0101_011_10100_11_000110_111_00010u32.to_le_bytes(), DecodeError::InvalidOpcode);
+ test_display(&0b1000_0101_100_10100_11_000110_111_00010u32.to_le_bytes(), "{ P2 = bitsclr(R20, #0x6) }");
+ test_display(&0b1000_0101_101_10100_11_000110_111_00010u32.to_le_bytes(), "{ P2 = !bitsclr(R20, #0x6) }");
+ test_invalid(&0b1000_0101_110_10100_11_000110_111_00010u32.to_le_bytes(), DecodeError::InvalidOpcode);
+ test_display(&0b1000_0101_111_10100_11_000110_111_00010u32.to_le_bytes(), "{ P2 = sfclass(R20, #0x6) }");
+
+ test_display(&0b1000_0110_000_00000_11_000010_111_01010u32.to_le_bytes(), "{ R11:10 = mask(P2) }");
+
+ test_display(&0b1000_0111_001_00001_11_000010_001_01010u32.to_le_bytes(), "{ R10 = tableidxb(R1, #0x9, #2):raw }");
+ test_display(&0b1000_0111_011_00001_11_000010_001_01010u32.to_le_bytes(), "{ R10 = tableidxh(R1, #0x9, #2):raw }");
+ test_display(&0b1000_0111_101_00001_11_000010_001_01010u32.to_le_bytes(), "{ R10 = tableidxw(R1, #0x9, #2):raw }");
+ test_display(&0b1000_0111_111_00001_11_000010_001_01010u32.to_le_bytes(), "{ R10 = tableidxd(R1, #0x9, #2):raw }");
+
+ test_display(&0b1000_1000_000_00010_11_000111_000_00110u32.to_le_bytes(), "{ R6 = vsathub(R3:2) }");
+ test_display(&0b1000_1000_000_00010_11_000111_001_00110u32.to_le_bytes(), "{ R6 = convert_df2sf(R3:2) }");
+ test_display(&0b1000_1000_000_00010_11_000111_010_00110u32.to_le_bytes(), "{ R6 = vsatwh(R3:2) }");
+ test_display(&0b1000_1000_000_00010_11_000111_100_00110u32.to_le_bytes(), "{ R6 = vsatwuh(R3:2) }");
+ test_display(&0b1000_1000_000_00010_11_000111_110_00110u32.to_le_bytes(), "{ R6 = vsathb(R3:2) }");
+ test_display(&0b1000_1000_001_00010_11_000111_001_00110u32.to_le_bytes(), "{ R6 = convert_ud2sf(R3:2) }");
+ test_display(&0b1000_1000_010_00010_11_000111_000_00110u32.to_le_bytes(), "{ R6 = clb(R3:2) }");
+ test_display(&0b1000_1000_010_00010_11_000111_001_00110u32.to_le_bytes(), "{ R6 = convert_d2sf(R3:2) }");
+ test_display(&0b1000_1000_010_00010_11_000111_010_00110u32.to_le_bytes(), "{ R6 = cl0(R3:2) }");
+ test_display(&0b1000_1000_010_00010_11_000111_100_00110u32.to_le_bytes(), "{ R6 = cl1(R3:2) }");
+ test_display(&0b1000_1000_011_00010_11_000111_000_00110u32.to_le_bytes(), "{ R6 = normamt(R3:2) }");
+ test_display(&0b1000_1000_011_00010_11_000111_001_00110u32.to_le_bytes(), "{ R7:6 = convert_sf2ud(R2) }");
+ test_display(&0b1000_1000_011_00010_11_000111_010_00110u32.to_le_bytes(), "{ R6 = add(clb(R3:2), #7) }");
+ test_display(&0b1000_1000_011_00010_11_000111_011_00110u32.to_le_bytes(), "{ R6 = popcount(R3:2) }");
+ test_display(&0b1000_1000_011_00010_11_000111_100_00110u32.to_le_bytes(), "{ R6 = vasrhub(R3:2, #0x7):raw }");
+ test_display(&0b1000_1000_011_00010_11_000111_101_00110u32.to_le_bytes(), "{ R6 = vasrhub(R3:2, #0x7):sat }");
+ test_display(&0b1000_1000_100_00010_11_000111_000_00110u32.to_le_bytes(), "{ R6 = vtrunohb(R3:2) }");
+ test_display(&0b1000_1000_100_00010_11_000111_001_00110u32.to_le_bytes(), "{ R7:6 = convert_sf2d(R2) }");
+ test_display(&0b1000_1000_100_00010_11_000111_010_00110u32.to_le_bytes(), "{ R6 = vtrunehb(R3:2) }");
+ test_display(&0b1000_1000_100_00010_11_000111_100_00110u32.to_le_bytes(), "{ R6 = vrndwh(R3:2) }");
+ test_display(&0b1000_1000_100_00010_11_000111_110_00110u32.to_le_bytes(), "{ R6 = vrndwh(R3:2):sat }");
+ test_display(&0b1000_1000_101_00010_11_000111_001_00110u32.to_le_bytes(), "{ R7:6 = convert_sf2ud(R2):chop }");
+ test_display(&0b1000_1000_110_00010_11_000111_000_00110u32.to_le_bytes(), "{ R6 = sat(R3:2) }");
+ test_display(&0b1000_1000_110_00010_11_000111_001_00110u32.to_le_bytes(), "{ R6 = round(R3:2):sat }");
+ test_display(&0b1000_1000_110_00010_11_000111_010_00110u32.to_le_bytes(), "{ R6 = vasrw(R3:2, #7) }");
+ test_display(&0b1000_1000_110_00010_11_000111_100_00110u32.to_le_bytes(), "{ R7:6 = bitsplit(R2, #0x7) }");
+ test_display(&0b1000_1000_110_00010_11_000111_101_00110u32.to_le_bytes(), "{ R6 = clip(R2, #0x7) }");
+ test_display(&0b1000_1000_110_00010_11_000111_110_00110u32.to_le_bytes(), "{ R7:6 = vclip(R3:2, #0x7) }");
+ test_display(&0b1000_1000_111_00010_11_000111_001_00110u32.to_le_bytes(), "{ R7:6 = convert_sf2d(R2):chop }");
+ test_display(&0b1000_1000_111_00010_11_000111_010_00110u32.to_le_bytes(), "{ R6 = ct0(R3:2) }");
+ test_display(&0b1000_1000_111_00010_11_000111_100_00110u32.to_le_bytes(), "{ R6 = ct1(R3:2) }");
+
+ test_display(&0b1000_1001_000_00011_11_000001_000_00110u32.to_le_bytes(), "{ R6 = vitpack(P3, P1) }");
+ test_display(&0b1000_1001_010_00011_11_000000_000_00110u32.to_le_bytes(), "{ R6 = P3 }");
+
+ test_display(&0b1000_1010_101_00010_11_011010_101_00110u32.to_le_bytes(), "{ R7:6 = extract(R3:2, #0x1a, #0x2d) }");
+
+ test_display(&0b1000_1011_001_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = convert_uw2sf(R2) }");
+ test_display(&0b1000_1011_010_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = convert_w2sf(R2) }");
+ test_display(&0b1000_1011_011_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = convert_sf2uw(R2) }");
+ test_display(&0b1000_1011_011_00010_11_011010_001_00110u32.to_le_bytes(), "{ R6 = convert_sf2uw(R2):chop }");
+ test_display(&0b1000_1011_100_00010_11_011010_010_00110u32.to_le_bytes(), "{ R6 = convert_sf2w(R2) }");
+ test_display(&0b1000_1011_100_00010_11_011010_011_00110u32.to_le_bytes(), "{ R6 = convert_sf2w(R2):chop }");
+ test_display(&0b1000_1011_101_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = sffixupr(R2) }");
+ test_display(&0b1000_1011_111_00010_11_011010_011_00110u32.to_le_bytes(), "{ R6, P3 = sfinvsqrta(R2) }");
+
+ test_display(&0b1000_1100_000_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = asr(R2, #0x1a) }");
+ test_display(&0b1000_1100_000_00010_11_011010_001_00110u32.to_le_bytes(), "{ R6 = lsr(R2, #0x1a) }");
+ test_display(&0b1000_1100_000_00010_11_011010_010_00110u32.to_le_bytes(), "{ R6 = asl(R2, #0x1a) }");
+ test_display(&0b1000_1100_000_00010_11_011010_011_00110u32.to_le_bytes(), "{ R6 = rol(R2, #0x1a) }");
+ test_display(&0b1000_1100_000_00010_11_011010_100_00110u32.to_le_bytes(), "{ R6 = clb(R2) }");
+ test_display(&0b1000_1100_000_00010_11_011010_101_00110u32.to_le_bytes(), "{ R6 = cl0(R2) }");
+ test_display(&0b1000_1100_000_00010_11_011010_110_00110u32.to_le_bytes(), "{ R6 = cl1(R2) }");
+ test_display(&0b1000_1100_000_00010_11_011010_111_00110u32.to_le_bytes(), "{ R6 = normamt(R2) }");
+
+ test_display(&0b1000_1100_001_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = add(clb(R2), #26) }");
+
+ test_display(&0b1000_1100_010_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = asr(R2, #0x1a):rnd }");
+ test_display(&0b1000_1100_010_00010_11_011010_010_00110u32.to_le_bytes(), "{ R6 = asl(R2, #0x1a):sat }");
+ test_display(&0b1000_1100_010_00010_11_011010_100_00110u32.to_le_bytes(), "{ R6 = ct0(R2) }");
+ test_display(&0b1000_1100_010_00010_11_011010_101_00110u32.to_le_bytes(), "{ R6 = ct1(R2) }");
+ test_display(&0b1000_1100_010_00010_11_011010_110_00110u32.to_le_bytes(), "{ R6 = brev(R2) }");
+ test_display(&0b1000_1100_010_00010_11_011010_111_00110u32.to_le_bytes(), "{ R6 = vsplatb(R2) }");
+
+ test_display(&0b1000_1100_100_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = vsathb(R2) }");
+ test_display(&0b1000_1100_100_00010_11_011010_010_00110u32.to_le_bytes(), "{ R6 = vsathub(R2) }");
+ test_display(&0b1000_1100_100_00010_11_011010_100_00110u32.to_le_bytes(), "{ R6 = abs(R2) }");
+ test_display(&0b1000_1100_100_00010_11_011010_101_00110u32.to_le_bytes(), "{ R6 = abs(R2):sat }");
+ test_display(&0b1000_1100_100_00010_11_011010_110_00110u32.to_le_bytes(), "{ R6 = neg(R2):sat }");
+ test_display(&0b1000_1100_100_00010_11_011010_111_00110u32.to_le_bytes(), "{ R6 = swiz(R2) }");
+
+ test_display(&0b1000_1100_110_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = setbit(R2, #0x1a) }");
+ test_display(&0b1000_1100_110_00010_11_011010_001_00110u32.to_le_bytes(), "{ R6 = clrbit(R2, #0x1a) }");
+ test_display(&0b1000_1100_110_00010_11_011010_010_00110u32.to_le_bytes(), "{ R6 = togglebit(R2, #0x1a) }");
+
+ test_display(&0b1000_1100_110_00010_11_011010_100_00110u32.to_le_bytes(), "{ R6 = sath(R2) }");
+ test_display(&0b1000_1100_110_00010_11_011010_101_00110u32.to_le_bytes(), "{ R6 = satuh(R2) }");
+ test_display(&0b1000_1100_110_00010_11_011010_110_00110u32.to_le_bytes(), "{ R6 = satub(R2) }");
+ test_display(&0b1000_1100_110_00010_11_011010_111_00110u32.to_le_bytes(), "{ R6 = satb(R2) }");
+
+ test_display(&0b1000_1100_111_00010_11_011010_000_00110u32.to_le_bytes(), "{ R6 = cround(R2, #0x1a) }");
+ test_display(&0b1000_1100_111_00010_11_011010_010_00110u32.to_le_bytes(), "{ R7:6 = cround(R3:2, #0x1a) }");
+ test_display(&0b1000_1100_111_00010_11_011010_100_00110u32.to_le_bytes(), "{ R6 = round(R2, #0x1a) }");
+ test_display(&0b1000_1100_111_00010_11_011010_110_00110u32.to_le_bytes(), "{ R6 = round(R2, #0x1a):sat }");
+
+ test_display(&0b1000_1101011_00100_11_000110_000_10110u32.to_le_bytes(), "{ R22 = extractu(R4, #0x6, #0x18) }");
+ test_display(&0b1000_1101011_00100_11_100110_000_10110u32.to_le_bytes(), "{ R22 = mask(#0x6, #0x18) }");
+ test_display(&0b1000_1101111_00100_11_000110_000_10110u32.to_le_bytes(), "{ R22 = extract(R4, #0x6, #0x18) }");
+ test_invalid(&0b1000_1101111_00100_11_100110_000_10110u32.to_le_bytes(), DecodeError::InvalidOpcode);
+
+ test_display(&0b1000_1110000_00100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 -= asr(R5:4, #0x6) }");
+ test_display(&0b1000_1110000_00100_11_000110_001_10110u32.to_le_bytes(), "{ R23:22 -= lsr(R5:4, #0x6) }");
+ test_display(&0b1000_1110000_00100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 -= asl(R5:4, #0x6) }");
+ test_display(&0b1000_1110000_00100_11_000110_011_10110u32.to_le_bytes(), "{ R23:22 -= rol(R5:4, #0x6) }");
+ test_display(&0b1000_1110000_00100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 += asr(R5:4, #0x6) }");
+ test_display(&0b1000_1110000_00100_11_000110_101_10110u32.to_le_bytes(), "{ R23:22 += lsr(R5:4, #0x6) }");
+ test_display(&0b1000_1110000_00100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 += asl(R5:4, #0x6) }");
+ test_display(&0b1000_1110000_00100_11_000110_111_10110u32.to_le_bytes(), "{ R23:22 += rol(R5:4, #0x6) }");
+ test_display(&0b1000_1110010_00100_11_000110_000_10110u32.to_le_bytes(), "{ R22 &= asr(R4, #0x6) }");
+ test_display(&0b1000_1110010_00100_11_000110_001_10110u32.to_le_bytes(), "{ R22 &= lsr(R4, #0x6) }");
+ test_display(&0b1000_1110010_00100_11_000110_010_10110u32.to_le_bytes(), "{ R22 &= asl(R4, #0x6) }");
+ test_display(&0b1000_1110010_00100_11_000110_011_10110u32.to_le_bytes(), "{ R22 &= rol(R4, #0x6) }");
+ test_display(&0b1000_1110010_00100_11_000110_100_10110u32.to_le_bytes(), "{ R22 |= asr(R4, #0x6) }");
+ test_display(&0b1000_1110010_00100_11_000110_101_10110u32.to_le_bytes(), "{ R22 |= lsr(R4, #0x6) }");
+ test_display(&0b1000_1110010_00100_11_000110_110_10110u32.to_le_bytes(), "{ R22 |= asl(R4, #0x6) }");
+ test_display(&0b1000_1110010_00100_11_000110_111_10110u32.to_le_bytes(), "{ R22 |= rol(R4, #0x6) }");
+ test_display(&0b1000_1110100_00100_11_000110_000_10110u32.to_le_bytes(), "{ R22 ^= asr(R4, #0x6) }");
+ test_display(&0b1000_1110100_00100_11_000110_001_10110u32.to_le_bytes(), "{ R22 ^= lsr(R4, #0x6) }");
+ test_display(&0b1000_1110100_00100_11_000110_010_10110u32.to_le_bytes(), "{ R22 ^= asl(R4, #0x6) }");
+ test_display(&0b1000_1110100_00100_11_000110_011_10110u32.to_le_bytes(), "{ R22 ^= rol(R4, #0x6) }");
+ test_invalid(&0b1000_1110100_00100_11_000110_100_10110u32.to_le_bytes(), DecodeError::InvalidOpcode);
+
test_display(&0b1000_1111011_00100_11_000110_111_10110u32.to_le_bytes(), "{ R22 = insert(R4, #0x6, #0x1f) }");
}
@@ -898,16 +1043,58 @@ fn inst_1011() {
#[test]
fn inst_1100() {
- test_display(&0b1100_0000_000_00100_11_0_1_0000_010_10110u32.to_le_bytes(), "{ R23:22 = valignb(R17:16, R5:4, #2) }");
- test_display(&0b1100_0000_100_00100_11_0_1_0000_010_10110u32.to_le_bytes(), "{ R23:22 = vspliceb(R5:4, R17:16, #2) }");
- test_display(&0b1100_0001_000_00100_11_0_1_0000_000_10110u32.to_le_bytes(), "{ R23:22 = extractu(R5:4, R17:16) }");
- test_display(&0b1100_0001_000_00100_11_0_1_0000_010_10110u32.to_le_bytes(), "{ R23:22 = shuffeb(R5:4, R17:16) }");
- test_display(&0b1100_0001_000_00100_11_0_1_0000_100_10110u32.to_le_bytes(), "{ R23:22 = shuffob(R17:16, R5:4) }");
- test_display(&0b1100_0001_000_00100_11_0_1_0000_110_10110u32.to_le_bytes(), "{ R23:22 = shuffeh(R17:16, R5:4) }");
-
- test_display(&0b1100_0011110_10100_11_000110_011_10110u32.to_le_bytes(), "{ R23:22 = vcnegh(R21:20, R6) }");
-
- test_display(&0b1100_1011001_10100_11_100110_111_10110u32.to_le_bytes(), "{ R23:22 += vrcnegh(R21:20, R6) }");
+ test_display(&0b1100_0000_000_00100_11_0_1_0000_010_10110u32.to_le_bytes(), "{ R23:22 = valignb(R17:16, R5:4, #0x2) }");
+ test_display(&0b1100_0000_100_00100_11_0_1_0000_010_10110u32.to_le_bytes(), "{ R23:22 = vspliceb(R5:4, R17:16, #0x2) }");
+// test_display(&0b1100_0001_000_00100_11_0_1_0000_000_10110u32.to_le_bytes(), "{ R23:22 = extractu(R5:4, R17:16) }");
+// test_display(&0b1100_0001_000_00100_11_0_1_0000_010_10110u32.to_le_bytes(), "{ R23:22 = shuffeb(R5:4, R17:16) }");
+// test_display(&0b1100_0001_000_00100_11_0_1_0000_100_10110u32.to_le_bytes(), "{ R23:22 = shuffob(R17:16, R5:4) }");
+// test_display(&0b1100_0001_000_00100_11_0_1_0000_110_10110u32.to_le_bytes(), "{ R23:22 = shuffeh(R17:16, R5:4) }");
+
+// test_display(&0b1100_0011110_10100_11_000110_011_10110u32.to_le_bytes(), "{ R23:22 = vcnegh(R21:20, R6) }");
+
+ test_display(&0b1100_1011_000_10100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 |= asr(R21:20, R6) }");
+ test_display(&0b1100_1011_000_10100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 |= lsr(R21:20, R6) }");
+ test_display(&0b1100_1011_000_10100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 |= asl(R21:20, R6) }");
+ test_display(&0b1100_1011_000_10100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 |= lsl(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_000110_001_10110u32.to_le_bytes(), "{ R23:22 = vrmaxh(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 = vrmaxw(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_000110_101_10110u32.to_le_bytes(), "{ R23:22 = vrminh(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 = vrminw(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_100110_001_10110u32.to_le_bytes(), "{ R23:22 = vrmaxuh(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_100110_010_10110u32.to_le_bytes(), "{ R23:22 = vrmaxuw(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_100110_101_10110u32.to_le_bytes(), "{ R23:22 = vrminuh(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_100110_110_10110u32.to_le_bytes(), "{ R23:22 = vrminuw(R21:20, R6) }");
+ test_display(&0b1100_1011_001_10100_11_100110_111_10110u32.to_le_bytes(), "{ R23:22 += vrcnegh(R21:20, R6) }");
+ test_display(&0b1100_1011_010_10100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 &= asr(R21:20, R6) }");
+ test_display(&0b1100_1011_010_10100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 &= lsr(R21:20, R6) }");
+ test_display(&0b1100_1011_010_10100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 &= asl(R21:20, R6) }");
+ test_display(&0b1100_1011_010_10100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 &= lsl(R21:20, R6) }");
+ test_display(&0b1100_1011_100_10100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 -= asr(R21:20, R6) }");
+ test_display(&0b1100_1011_100_10100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 -= lsr(R21:20, R6) }");
+ test_display(&0b1100_1011_100_10100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 -= asl(R21:20, R6) }");
+ test_display(&0b1100_1011_100_10100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 -= lsl(R21:20, R6) }");
+ test_display(&0b1100_1011_101_10100_11_100110_110_10110u32.to_le_bytes(), "{ R23:22 += vrcrotate(R21:20, R6, #0x2) }");
+ test_display(&0b1100_1011_110_10100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 += asr(R21:20, R6) }");
+ test_display(&0b1100_1011_110_10100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 += lsr(R21:20, R6) }");
+ test_display(&0b1100_1011_110_10100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 += asl(R21:20, R6) }");
+ test_display(&0b1100_1011_110_10100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 += lsl(R21:20, R6) }");
+
+ test_display(&0b1100_1100_000_10100_11_000110_000_10110u32.to_le_bytes(), "{ R22 |= asr(R20, R6) }");
+ test_display(&0b1100_1100_000_10100_11_000110_010_10110u32.to_le_bytes(), "{ R22 |= lsr(R20, R6) }");
+ test_display(&0b1100_1100_000_10100_11_000110_100_10110u32.to_le_bytes(), "{ R22 |= asl(R20, R6) }");
+ test_display(&0b1100_1100_000_10100_11_000110_110_10110u32.to_le_bytes(), "{ R22 |= lsl(R20, R6) }");
+ test_display(&0b1100_1100_010_10100_11_000110_000_10110u32.to_le_bytes(), "{ R22 &= asr(R20, R6) }");
+ test_display(&0b1100_1100_010_10100_11_000110_010_10110u32.to_le_bytes(), "{ R22 &= lsr(R20, R6) }");
+ test_display(&0b1100_1100_010_10100_11_000110_100_10110u32.to_le_bytes(), "{ R22 &= asl(R20, R6) }");
+ test_display(&0b1100_1100_010_10100_11_000110_110_10110u32.to_le_bytes(), "{ R22 &= lsl(R20, R6) }");
+ test_display(&0b1100_1100_100_10100_11_000110_000_10110u32.to_le_bytes(), "{ R22 -= asr(R20, R6) }");
+ test_display(&0b1100_1100_100_10100_11_000110_010_10110u32.to_le_bytes(), "{ R22 -= lsr(R20, R6) }");
+ test_display(&0b1100_1100_100_10100_11_000110_100_10110u32.to_le_bytes(), "{ R22 -= asl(R20, R6) }");
+ test_display(&0b1100_1100_100_10100_11_000110_110_10110u32.to_le_bytes(), "{ R22 -= lsl(R20, R6) }");
+ test_display(&0b1100_1100_110_10100_11_000110_000_10110u32.to_le_bytes(), "{ R22 += asr(R20, R6) }");
+ test_display(&0b1100_1100_110_10100_11_000110_010_10110u32.to_le_bytes(), "{ R22 += lsr(R20, R6) }");
+ test_display(&0b1100_1100_110_10100_11_000110_100_10110u32.to_le_bytes(), "{ R22 += asl(R20, R6) }");
+ test_display(&0b1100_1100_110_10100_11_000110_110_10110u32.to_le_bytes(), "{ R22 += lsl(R20, R6) }");
}
#[test]