diff options
-rw-r--r-- | notes/encoding_table | 4 | ||||
-rw-r--r-- | notes/grouped_encodings | 4 | ||||
-rw-r--r-- | notes/reordered_encodings | 4 | ||||
-rw-r--r-- | notes/todo | 300 | ||||
-rw-r--r-- | src/display.rs | 87 | ||||
-rw-r--r-- | src/lib.rs | 712 | ||||
-rw-r--r-- | tests/from_brain.rs | 209 |
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 @@ -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") }, } } } @@ -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] |