From fe0a4395eb132e4696e6288e83517d9332e2fd1a Mon Sep 17 00:00:00 2001 From: iximeow Date: Sun, 23 Mar 2025 13:08:36 -0700 Subject: shifts and MORE transcription errors :( --- notes/encoding_table | 4 +-- notes/grouped_encodings | 4 +-- notes/reordered_encodings | 4 +-- notes/todo | 82 +++++++++++++++++++++++------------------------ src/lib.rs | 55 +++++++++++++++++++++++++++++++ tests/from_brain.rs | 36 +++++++++++++++++++++ 6 files changed, 138 insertions(+), 47 deletions(-) diff --git a/notes/encoding_table b/notes/encoding_table index 2d4bc63..7910c7d 100644 --- a/notes/encoding_table +++ b/notes/encoding_table @@ -1085,8 +1085,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 1|0 0 1 1|1 0 0|s s s s s| P P |- t t t t t|1 1 -|d d d d d| Rdd=vnavgw(Rtt,Rss):crnd:sat - XTYPE ALU/slot 2,3 |ICLASS |RegType|MajOp|s5 |Parse| |MinOp|d5 | |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|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 0 0 0|0 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|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|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 1|0 0 1 1|1 1 0|s s s s s| P P |- t t t t t|0 0 0|d d d d d| Rdd=vmaxub(Rtt,Rss) - XTYPE ALU/slot 2,3 |1 1 0 1|0 0 1 1|1 1 0|s s s s s| P P |- t t t t t|1 1 0|d d d d d| Rdd=vmaxb(Rtt,Rss) - XTYPE ALU/slot 2,3 diff --git a/notes/grouped_encodings b/notes/grouped_encodings index 429acae..544889f 100644 --- a/notes/grouped_encodings +++ b/notes/grouped_encodings @@ -1079,8 +1079,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 1|0 0 1 1|1 0 0|s s s s s| P P |- t t t t t|1 1 -|d d d d d| Rdd=vnavgw(Rtt,Rss):crnd:sat - XTYPE ALU/slot 2,3 |ICLASS |RegType|MajOp|s5 |Parse| |MinOp|d5 | |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|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 0 0 0|0 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|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|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 1|0 0 1 1|1 1 0|s s s s s| P P |- t t t t t|0 0 0|d d d d d| Rdd=vmaxub(Rtt,Rss) - XTYPE ALU/slot 2,3 |1 1 0 1|0 0 1 1|1 1 0|s s s s s| P P |- t t t t t|1 1 0|d d d d d| Rdd=vmaxb(Rtt,Rss) - XTYPE ALU/slot 2,3 diff --git a/notes/reordered_encodings b/notes/reordered_encodings index 64a87c4..4378085 100644 --- a/notes/reordered_encodings +++ b/notes/reordered_encodings @@ -492,8 +492,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 0 0 0|0 0 1 0|1 0 -|s s s s s| P P |i i i i i i|0 0 1|x x x x x| Rxx^=lsr(Rss,#u6) - XTYPE PERM/slot 2,3 |1 0 0 0|0 0 1 0|1 0 -|s s s s s| P P |i i i i i i|0 1 0|x x x x x| Rxx^=asl(Rss,#u6) - XTYPE PERM/slot 2,3 |1 0 0 0|0 0 1 0|1 0 -|s s s s s| P P |i i i i i i|0 1 1|x x x x x| Rxx^=rol(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 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 0 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 0 0 0|0 0 1 1|l l l|s s s s s| P P |i i i i i i|l l l|x x x x x| Rxx=insert(Rss,#u6,#U6) - XTYPE ALU/slot 2,3 |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 @@ -961,6 +959,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 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 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 @@ -1015,6 +1014,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 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 diff --git a/notes/todo b/notes/todo index f438457..f357ab4 100644 --- a/notes/todo +++ b/notes/todo @@ -357,24 +357,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) -|0 1 1 0|1 0 1 1 0 0 0|0 - - s s| P P |0 - - - t t - - -|- - - d d| Pd=and(Pt,Ps) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 0 0|0 - - s s| P P |1 - - - t t 1 - -|1 - - d d| Pd=fastcorner9(Ps,Pt) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 0 0|1 - - s s| P P |0 - - - t t u u -|- - - d d| Pd=and(Ps,and(Pt,Pu)) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 0 0|1 - - s s| P P |1 - - - t t 1 - -|1 - - d d| Pd=!fastcorner9(Ps,Pt) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 0 1|0 - - s s| P P |0 - - - t t - - -|- - - d d| Pd=or(Pt,Ps) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 0 1|1 - - s s| P P |0 - - - t t u u -|- - - d d| Pd=or(Ps,or(Pt,Pu)) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 1 0|0 - - s s| P P |0 - - - t t - - -|- - - d d| Pd=xor(Pt,Ps) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 1 0|1 - - s s| P P |0 - - - t t u u -|- - - d d| Pd=or(Ps,and(Pt,Pu)) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 1 1|0 - - s s| P P |0 - - - t t - - -|- - - d d| Pd=and(Pt,!Ps) - CR/slot 3 -|0 1 1 0|1 0 1 1 0 1 1|1 - - s s| P P |0 - - - t t u u -|- - - d d| Pd=or(Ps,or(Pt,Pu)) - CR/slot 3 -|0 1 1 0|1 0 1 1 1 0 0|0 - - s s| P P |0 - - - - - - - -|- - - d d| Pd=any8(Ps) - CR/slot 3 -|0 1 1 0|1 0 1 1 1 0 0|1 - - s s| P P |0 - - - t t u u -|- - - d d| Pd=and(Ps,and(Pt,Pu)) - CR/slot 3 -|0 1 1 0|1 0 1 1 1 0 1|0 - - s s| P P |0 - - - - - - - -|- - - d d| Pd=all8(Ps) - CR/slot 3 -|0 1 1 0|1 0 1 1 1 0 1|1 - - s s| P P |0 - - - t t u u -|- - - d d| Pd=and(Ps,or(Pt,Pu)) - CR/slot 3 -|0 1 1 0|1 0 1 1 1 1 0|0 - - s s| P P |0 - - - - - - - -|- - - d d| Pd=not(Ps) - CR/slot 3 -|0 1 1 0|1 0 1 1 1 1 0|1 - - s s| P P |0 - - - t t u u -|- - - d d| Pd=or(Ps,and(Pt,Pu)) - CR/slot 3 -|0 1 1 0|1 0 1 1 1 1 1|0 - - s s| P P |0 - - - t t - - -|- - - d d| Pd=or(Pt,!Ps) - CR/slot 3 -|0 1 1 0|1 0 1 1 1 1 1|1 - - s s| P P |0 - - - t t u u -|- - - d d| Pd=or(Ps,or(Pt,Pu)) - CR/slot 3 @@ -471,29 +453,45 @@ 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 0 1 0|0 0 -|s s s s s| P P |i i i i i i|0 0 0|x x x x x| Rxx-=asr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 0 -|s s s s s| P P |i i i i i i|0 0 1|x x x x x| Rxx-=lss(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 0 -|s s s s s| P P |i i i i i i|0 1 0|x x x x x| Rxx-=asl(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 0 -|s s s s s| P P |i i i i i i|0 1 1|x x x x x| Rxx-=rol(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 0 -|s s s s s| P P |i i i i i i|1 0 0|x x x x x| Rxx+=asr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 0 -|s s s s s| P P |i i i i i i|1 0 1|x x x x x| Rxx+=lsr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 0 -|s s s s s| P P |i i i i i i|1 1 0|x x x x x| Rxx+=asl(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 0 -|s s s s s| P P |i i i i i i|1 1 1|x x x x x| Rxx+=rol(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 1 -|s s s s s| P P |i i i i i i|0 0 0|x x x x x| Rxx&=asr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 1 -|s s s s s| P P |i i i i i i|0 0 1|x x x x x| Rxx&=lsr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 1 -|s s s s s| P P |i i i i i i|0 1 0|x x x x x| Rxx&=asl(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 1 -|s s s s s| P P |i i i i i i|0 1 1|x x x x x| Rxx&=rol(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 1 -|s s s s s| P P |i i i i i i|1 0 0|x x x x x| Rxx|=asr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 1 -|s s s s s| P P |i i i i i i|1 0 1|x x x x x| Rxx|=lsr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 1 -|s s s s s| P P |i i i i i i|1 1 0|x x x x x| Rxx|=asl(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|0 1 -|s s s s s| P P |i i i i i i|1 1 1|x x x x x| Rxx|=rol(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|1 0 -|s s s s s| P P |i i i i i i|0 0 0|x x x x x| Rxx^=asr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|1 0 -|s s s s s| P P |i i i i i i|0 0 1|x x x x x| Rxx^=lsr(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|1 0 -|s s s s s| P P |i i i i i i|0 1 0|x x x x x| Rxx^=asl(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 0 1 0|1 0 -|s s s s s| P P |i i i i i i|0 1 1|x x x x x| Rxx^=rol(Rss,#u6) - XTYPE PERM/slot 2,3 -|1 0 0 0|0 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 0 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 0 0 0|0 0 1 1|l l l|s s s s s| P P |i i i i i i|l l l|x x x x x| Rxx=insert(Rss,#u6,#U6) - XTYPE ALU/slot 2,3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + |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 @@ -958,6 +956,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 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 |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 @@ -1013,6 +1012,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 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 diff --git a/src/lib.rs b/src/lib.rs index 06e971e..7a255f8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2941,6 +2941,61 @@ fn decode_instruction< let llllll = (l_high << 3) | l_low; handler.on_source_decoded(Operand::imm_u8(llllll))?; } + 0b0010 => { + let opc_hi = (inst >> 22) & 0b11; + let opc_lo = (inst >> 5) & 0b111; + let opc = (opc_hi << 3) | opc_lo; + + let assign_mode_bits = opc >> 2; + 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, + }; + let sssss = reg_b16(inst); + let xxxxx = reg_b0(inst); + let u6 = ((inst >> 8) & 0b11_1111) as u8; + handler.assign_mode(assign_mode)?; + handler.on_opcode_decoded(opc)?; + handler.on_dest_decoded(Operand::gprpair(xxxxx)?)?; + handler.on_source_decoded(Operand::gprpair(sssss)?)?; + handler.on_source_decoded(Operand::imm_u8(u6))?; + } + 0b0011 => { + let xxxxx = reg_b0(inst); + let sssss = reg_b16(inst); + + let opc_lo = (inst >> 5) & 0b111; + let opc_hi = (inst >> 21) & 0b111; + let opc = (opc_hi << 3) | opc_lo; + + // TODO: it's not clear which immediate is the #u6 versus #U6 + // they may be backwards in the decoding.. + handler.on_dest_decoded(Operand::gprpair(xxxxx)?)?; + handler.on_source_decoded(Operand::gprpair(sssss)?)?; + handler.on_opcode_decoded(Opcode::Insert)?; + + let iiiiii = (inst >> 8) & 0b111111; + let l_lo = (inst >> 5) & 0b111; + let l_hi = (inst >> 21) & 0b111; + let llllll = l_lo | (l_hi << 3); + + handler.on_source_decoded(Operand::imm_u8(iiiiii as u8))?; + handler.on_source_decoded(Operand::imm_u8(llllll as u8))?; + } 0b1111 => { opcode_check!(inst & 0x00102000 == 0); handler.on_source_decoded(Operand::gpr(sssss))?; diff --git a/tests/from_brain.rs b/tests/from_brain.rs index 8c1f44d..b26f6a9 100644 --- a/tests/from_brain.rs +++ b/tests/from_brain.rs @@ -446,6 +446,38 @@ 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_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) }"); + test_display(&0b1000_0010000_00100_11_000110_011_10110u32.to_le_bytes(), "{ R23:22 -= rol(R5:4, #0x6) }"); + + test_display(&0b1000_0010000_00100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 += asr(R5:4, #0x6) }"); + test_display(&0b1000_0010000_00100_11_000110_101_10110u32.to_le_bytes(), "{ R23:22 += lsr(R5:4, #0x6) }"); + test_display(&0b1000_0010000_00100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 += asl(R5:4, #0x6) }"); + test_display(&0b1000_0010000_00100_11_000110_111_10110u32.to_le_bytes(), "{ R23:22 += rol(R5:4, #0x6) }"); + + test_display(&0b1000_0010010_00100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 &= asr(R5:4, #0x6) }"); + test_display(&0b1000_0010010_00100_11_000110_001_10110u32.to_le_bytes(), "{ R23:22 &= lsr(R5:4, #0x6) }"); + test_display(&0b1000_0010010_00100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 &= asl(R5:4, #0x6) }"); + test_display(&0b1000_0010010_00100_11_000110_011_10110u32.to_le_bytes(), "{ R23:22 &= rol(R5:4, #0x6) }"); + + test_display(&0b1000_0010010_00100_11_000110_100_10110u32.to_le_bytes(), "{ R23:22 |= asr(R5:4, #0x6) }"); + test_display(&0b1000_0010010_00100_11_000110_101_10110u32.to_le_bytes(), "{ R23:22 |= lsr(R5:4, #0x6) }"); + test_display(&0b1000_0010010_00100_11_000110_110_10110u32.to_le_bytes(), "{ R23:22 |= asl(R5:4, #0x6) }"); + test_display(&0b1000_0010010_00100_11_000110_111_10110u32.to_le_bytes(), "{ R23:22 |= rol(R5:4, #0x6) }"); + + test_display(&0b1000_0010100_00100_11_000110_000_10110u32.to_le_bytes(), "{ R23:22 ^= asr(R5:4, #0x6) }"); + test_display(&0b1000_0010100_00100_11_000110_001_10110u32.to_le_bytes(), "{ R23:22 ^= lsr(R5:4, #0x6) }"); + test_display(&0b1000_0010100_00100_11_000110_010_10110u32.to_le_bytes(), "{ R23:22 ^= asl(R5:4, #0x6) }"); + test_display(&0b1000_0010100_00100_11_000110_011_10110u32.to_le_bytes(), "{ R23:22 ^= rol(R5:4, #0x6) }"); + + 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) }"); + test_display(&0b1000_0010000_00100_11_000110_011_10110u32.to_le_bytes(), "{ R23:22 -= rol(R5:4, #0x6) }"); + + 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_1111011_00100_11_000110_111_10110u32.to_le_bytes(), "{ R22 = insert(R4, #0x6, #0x1f) }"); } @@ -872,6 +904,10 @@ fn inst_1100() { 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] -- cgit v1.1