From a6f1da1a434e369809159d43da480e083d24ea1b Mon Sep 17 00:00:00 2001 From: Nicholas Coughlin Date: Thu, 13 Apr 2023 13:27:11 +1000 Subject: [PATCH] Move from ASL sources to marshalled state --- .github/workflows/test.yml | 2 +- .gitignore | 2 + cntlm.bir | 1 - cpus/armv8.6.cpu | Bin 0 -> 4711077 bytes mra_tools/arch/arch.asl | 17699 ------ mra_tools/arch/arch_decode.asl | 8951 --- mra_tools/arch/arch_instrs.asl | 91584 --------------------------- mra_tools/arch/regs.asl | 2928 - mra_tools/support/aes.asl | 34 - mra_tools/support/barriers.asl | 29 - mra_tools/support/debug.asl | 41 - mra_tools/support/feature.asl | 60 - mra_tools/support/fetchdecode.asl | 254 - mra_tools/support/hints.asl | 31 - mra_tools/support/interrupts.asl | 55 - mra_tools/support/memory.asl | 109 - mra_tools/support/stubs.asl | 113 - mra_tools/types.asl | 35 - coverage.sh => scripts/coverage.sh | 4 +- scripts/stash.sh | 39 + 20 files changed, 43 insertions(+), 121928 deletions(-) delete mode 100644 cntlm.bir create mode 100644 cpus/armv8.6.cpu delete mode 100644 mra_tools/arch/arch.asl delete mode 100644 mra_tools/arch/arch_decode.asl delete mode 100644 mra_tools/arch/arch_instrs.asl delete mode 100644 mra_tools/arch/regs.asl delete mode 100644 mra_tools/support/aes.asl delete mode 100644 mra_tools/support/barriers.asl delete mode 100644 mra_tools/support/debug.asl delete mode 100644 mra_tools/support/feature.asl delete mode 100644 mra_tools/support/fetchdecode.asl delete mode 100644 mra_tools/support/hints.asl delete mode 100644 mra_tools/support/interrupts.asl delete mode 100644 mra_tools/support/memory.asl delete mode 100644 mra_tools/support/stubs.asl delete mode 100644 mra_tools/types.asl rename coverage.sh => scripts/coverage.sh (73%) create mode 100755 scripts/stash.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d257ce37..c978729f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,7 +42,7 @@ jobs: run: | eval `opam env` export LD_LIBRARY_PATH=`opam config var z3:lib` - ./coverage.sh test + scripts/coverage.sh test - name: Upload new coverage results if: always() diff --git a/.gitignore b/.gitignore index 184db933..36d30805 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ scripts/result.txt scripts/output.txt scripts/cntlm.bir scripts/total.txt + +mra_tools diff --git a/cntlm.bir b/cntlm.bir deleted file mode 100644 index 9b3858c7..00000000 --- a/cntlm.bir +++ /dev/null @@ -1 +0,0 @@ -000daeb9: program diff --git a/cpus/armv8.6.cpu b/cpus/armv8.6.cpu new file mode 100644 index 0000000000000000000000000000000000000000..63394171361b295371ce1ca477e7aa73907bfe22 GIT binary patch literal 4711077 zcmcG12VfP|*7coaCL|C@C%xR{CV}(<2%;ED02Lt=QPC$Yp(un%2%>^r#2!>YeU=NN zsLz6;pvH%Rr(i+Eik&9d8#b{1Ywfvn?>RRC@q6!o-{&H;v-dh@PT6~(GiN53FS&QU zYsl`!uIPWKx+;F3>niVmyEokB>fzev|6f&eVgCW6$B!Fdga5|2;Zjr zb+e~&`uTNZ2jHjdnyDuYSxUvKWWyi8C6x@mgV_FC(f-KJ+`_E|MT9tqP5@5*%Qal z!EYN&C(fQcOAfZwqu?%t@J=j7w-=k&)#MU@w~ zL1if-Q>9$nYGxU8t5}0q1+*gEQ(Me#F?$EhYiWM6s-E9!jy2{Eq-9S5YMg4!A-1qlg~!qRo73PG^4K8ZvOGc+-mBH#p$i)1Y_=C zUXK^hYS*o9M%~Q1`Z{lpHlE$GJg>$k^O_N)b4wpwshZy0YA!P74kgRI0;Dpts;ZjvXEoH# zo>*TCmT?YC2Vs$}xJ9*ktkt~Ln0q`4UJwwLa&F;E8-DOp{vBsuJz6M&_>~A^rZF!Z}sQJD|#poR^qu1Yn7|`9T z(c;d1RQVdjxkt85o!5+&A->(1I}Ftr8bio!HQzDjp2Q!A3pjH*zwVszlcvvU2y$pg-W9|t4 zyh^~kW{J1iX<{@~H@U~gx;ePN*(ldHe7sA|NZ%cH^sZd$FV(xe#hlH0+In&$Y;h^N zNG+)aMHd@$Ygp>X0y5$)qf~91e?Y6um^+dRUlD#1Cd}~@aW#Z}uZb8xu>N+gM@7fTq7OcNEl*HwCJ;ZL4Z7>OW{u&9L#K#*aF_t-sD5RbNBz?3q4u zX0PhO^wXn){WN^ExaBOm>oWX!C_il(Q_-Q80goq+*)k@FxLhxN6yi#2hIdG7=8e`; zw1Zce-T+^NOwlz5L366EIa?dE?s^n-y5CQY;@q+fIC+)45u)=b+R36W5ztv`!7?+z z!Z~IcSL-HAAi9R4T_m_$Kx4^4UbdwW-L6}$1JNB6?Iy>I0-|>pg>U2f z227Z=8_s~9m!dsXd5N$cEh;Y5GKSdWY$X*irqY_xgwQh1m(g@K2a~(EZ=8Il z7uFZ$e@@XSEP9%N&(oOw>?va3ASX{AZqc4Sn5%(_1ByRM0qV5HR}tVbLR=JqI&Cpp z8h~1G{+;S$IL0Q|XhNcB^99u(C9DTcG(}(XYKs8-J0zAuxa_pW=Md&Ygh=dq36no< z@hgP)s;c_S%pLn*&0Ht3`pcOcaunM-q$gULDU}sciTbP^8sbXckw+K~Q4fla=N0@J z!0wR{gm_i6Cp3@JH79Gcg)=v#Ffiw2T!o-0mAn=#D9W|=1Qs=0Kxe_s4LLTzA~QE+ zoNlrZET>ZhKbpMbW&w>wX0B!2-Dc{B%+Ss51Jg{35aE({JS`wyIg3JMa>*Yd%S`_0 zB+Lj}aA(cEYBKB1EX<9hlMpXAb#iiA-H{n>`bK zbJpDIHKRFK%`J?I$y(%eK}piiOy(0DZM&L=Da-*Xg= z;nflWl)q-3`JC76Ve{z(uTlGCDy|?r0)p2m8q2GH3rNSkN#Q77Pa@2O-dhx%!mIU! zm#eA<43tS|uXc`bxieFiJ2~TO>)Wn(WbKm$v;(TW+L<>mXuV^F{4Op1EBe-+jR#S) zRoNk~#8)w-5?|ee%Kk!84zJ+x0np{V{Y}?=38LS1%>&vD@U3U8kOR`I?BJi!z543K z3Z;8eN;}wUg~n6lLD}141vFZ$VXV+_5GjioD>PR($pZ_#i)$6+iQ9SzXe`;a@D-sc zppnIlv?*>fl>S9A8VXTwia?gQ?NkAc$2}7?MGj5&xS4FKQ2H0eWCld=Hm+6qB*5qc zh#scAYgIC?x2_{>f*xkKYgIR@TtHZaezK!;$PdyDp&0(IRo(f!s|a4$V63@T74QlH z1)$Z?pPi%q_elvEqS+J`(HwybARM6`!QuA=;QZXjgB}s0i*>7?L4@?mwW=5#uXPcyiINqf3J@K1 zDrEP;4Z2YZc<8)Vm5`!Lz`GhZ71|BW;iS4!gIjgAV_daE$;oLz@!N z5TT)7b7;FIRA?o33n^_CWQBa= zHK%#akuWqn*p+ZU05g zr@jb-kMWwKI%JD|D*YZ1I{gQofVb+FE9cUG_072sugO>oW)!qwHfTg3m~N zon7+!BkVf!I0^%;_$x$J6v2@szWyX(gXj&QP)6b?2wyu>)?rp?wAWn2T5v)HQb{uk zG$UxyhYZ^UunOZktN`mU1d?&>tiqICv&LyB_4lpEdRGs{Pii2+t{IkKSbpIL{4dM5 zFgx^u%)EfZ!8{MaK>~?+Zivh16CUC!90e~|IBEo{JCC9WUcqSrpv(4w15`D8L3Dwx zIo?0;?#B4Y=lF1T!Ybfv%TZ>_^1_J?4R!T)`j3&*(QAgY+2oGde2vq@b(%5Q7sT40 zxut5;H#up*PH;&<+|q0nwxc^or&eM?AKZ5ZC-Pzpy@n4uU8c7QaO+im;@?V@P{r%*V0 z7^q-i^oikBjeyoRj<;#VaK1|h^&Q~!dkfr$g<7cg7z`E)F#5!j?K}aAN#=b@OoFpF z7wN&x%FwN@08u7IapbsNK!TFF4pmTtl7*B&Rl};mLK0x~L9SFd8p8^}c2I(nc?s{r ze|Iu(+6x)1=RB`j61ZiW1-U>8N)}qr=mURSIQk>P*Qf+$w$UdMS7TBIf_<+!+>1?L z(~Y{cb^TW8Eht#6CS5*d5sh$u_$)sm>P}>tBJw{T#sH)Kx%5ur6`#y zrx7M0vA4`Y&H&b3YiHDl6oqwh9Ok6+t z8eu2&(BQ@>DX5uxbQ8AgvF?`f8s?%xJ%4v6;fYo&%%Er%ubvXnYUrPwsOWO(`n!T$ zPZ+$GYX2fA;dP8r4P@IbAg+glCNOKkceRraOBaM?=|-5kVQz{r+DlqY0h{M3g$LQB zb*sZ8oe);48(~0%l~IJLTG9fS4iFD!y%6NV!usfH6|g*-BFyNLmg5A1JeYN(>KYo+ zlZfN(B)#xp)>TK8R)@mUI}c7yN@WX4r3~#&~XgR zrwI8`NeeryWp}WTw9fOIqr7I{_I+dsdUB}R5N*@qFy=K%3HwnfMxZfj9?E+rO@Mp?3}I85D6|Cjrfxo-yq0fH$(I<@dTtCRms>S^p*hmb?I+1)eeN z(*TQ1$_|!p(!bT}5Ju5@5{wYgS>PGNehILMXY7C|u9{2+3j(cSJxc=k34q3uJB!bt zvB_V7_UM3oOjSi{)4@YgD-9P5h&3O!*G;T%?$%V_IDKk;T`e-L!TpDgt|kdxiDGdN zMCBB*E6-aepj9Dn=A`rH)FE^0fJ__i0Yjlf0e+A$#&IS+-C>B%@iJ&J{tZSq&v_pU za71)Cfx<^|eePPq^AI6A84P)z^Y#+H_xt>?{Wdq6*RU{dJoDXz-ms~mXgjYkM*v!t z6`vpWt&H8TgM5C63A#Np*bWmZdWURv0^+N~4#HP^CQWRtLwCOG_-Pqf9T0Lk})oY4f?+)Klw1f3#-!G^O4j*A(dzrvbM2*@> zvBQvk*R!(Hf_(ZFCeIRmca2~8CXwwG!;|&Wnp&;!6pD7T?3DtnXgH#ZVSRw>`J5f| zUxg^0qFq#Zh_IHSBS5@tVlJEkm!)JOHJSV`ETa6@5|C31KJYxRKND@ApvoU-m zJCKniTxRwbRPB6pisynPh-z5nS9pas0r=W%6vckc^AQWeN9&rp7uO<5_?fzD39QFc zw3S61Euf88Mw0N+7;wrt94ov*H^F1I@N+17l>}!9=q!jN;dKEPneyS6>Lv|ffwM5I zZ6ts{0O%};B;n@jS52$m%jy+#7$AOMX;izMMtP*t%V9S&z>ScvSN3t9!l zx}8WOhr8H!7=Wt5n-DQ`v5*RQE}$pBV6RpKe;^6J-w7n)t8iO-APL7nRXOmmBK&!Z zu)y)mj}?%~v6({73p;B30KFF|LdxNpA4kZlsQGvpPspBN`Px*d6Ci77&KROpJ(ey1}{N zIGv(LXpXQA&}!kI7!hNgi4iddx28{w2yrz5j@v;yo3yLR_=Er_M#LNn@5FTzT~gE8 z5H(TsC{-lsdJYpKq=4Jn#r=m58jZuC_&=No4PH&SN87WZW@gPG&I%j~wg0WJw*RfI z8e|^|_3dqAgIgYs;;<3d7G<)g5D8+VdMMP2xSNw9V!1OJBJM&J`&!r+T6!{J0cuSr z)fY*2;ZmeT0DCe-tk5-a*dXF=UGqk*d3}+<-J6YrepERzlOoWhM&AxB0gVRGjQJ=u zf+q~*aWz^%niw8ZHF*py8z>4V0e%V4SrASlo(QnmGY8IAHGu<-fbTT=Mv!2)fX>31 zvpK+G&zz5Slb^r>=WF!E>@Hkp3g|4HIqwEo?3weEZh}A@@iRqm2!+e?1cb#u?vc$+ znK5x{qpxGpwjD!tgQFor`9|MJnx81Z*6YZ1)6u`;dI|O`3YXvka7Q%1(YG^Ih7nFf zeqe9=M8E~o2K6xdcH!?Zy9$>f*X{^fqi+-a>1ro8KKr>uQm(979n&jgYVcf|e6(*LF6)t%xiAJL0_4g`YVFc`#GP#AqN9|~`sARu~sC=9gJzo93-29u=l*6D;s(c4G81YF;eO(?-LR%ug= z4aZ4%*Q~&a-I~#3`j4shHoJ%8zj63)ApRR$g?6c#T~|A%t`V(n${N*adEfb_K=Z>D zbi$N3`ev~FO9?kagehzE&E!?9K$SR+PMAGL-#~TeKob)|)qD}_r{%d$w{2mU==*Va zB-{zNW%QL6-%j@J_UXRigT~@m?%#cnVr=mFT)s!abra4N`4Y)Poh#~e0!L@3p}09& zJarn3dSz@2apk}G9pI&8RCNeNuki{U4DdAs-GZX&f+pR9qFJJOPbYuugts{CC#{_Z z;s;4c{BK2AoiJEbj#AK0qzHj6|D~Y<8ZCoqr;|aXo-67!TQ|Y^*-niVy+MMr1auYz z(@s;tqOQ$4U9Ov42$m}-dXoh30|1=`VX)JAeirl#$JSEa#0$|firyjt90ox2Zlw@2 zH2;OK3BN<{Hj3V+3KEL^m!3f{VH!loTAljaqY)v+$iN87f9c z31OX%ldeBj9G=}dQVo=(+J6d4WP?V=yP$m85RkCZsc#^Jb?W1U3<+VK*6Rk?fbR4x zMeorZa|&Q{oB|H#)d95KQ4WnnuuiY&Hh7NMX)8tVlc7ogG>#v2LJwYA7*Su>$a&|x zEw5?Ht?kr}u|d~~UMk}QQgKwgd=}eRc^KQNkLpo<+gsv^P}@YW)hR(55eHQUQql1- zhw$$HHw!w$BmXZ?z(GD8k+4 zZ(#>*G3+TCnM?6URJw_P!5EoG5pFtvOGiQ++aRbX!DQWDiY^iwbVcI z65ZrZuv|*fPb7FyKxcusikur@k=YW7K2}Xy!E!T2Ka&9S2B5Pb^^aT>V3BMu@*dq} zH(2ha=l}`670_AW^CE8xu!zr#T&I~VF~RaAMF&B!gbC=9SYc@=_4hwjh{W(#EpRwA z@_CAWp?z-w8NSSFj{XeSH(_)a-qaI%%xaY7zz{A@H{g-iAbW($yNZWD9^ijj@o=Yi zohbVkr*|XefkEWg{?Ykmh|9J9)eu*z3l&XueTy1@MG*pTs%yW1Z*+d6Yi@@oIziDi zEUi17C>!~O6J;YmL+1oV+0J1)M_8-XxdTNA^Qi_LG(e-3ar-NX)F|6INjIqkOEN`> z)u{&N9YAA|V^N(ugGM{O+qpnDIvG4z1i99~L5ey7jfbaqJ7+pHzSFy%kI_xe1Iw`# zAzG&zR|;^rbUu#4O(Cw7KQX{k{(J+XDvA(~Q;kK0CH^=Y`HA@4&V#6cK%8nUCE&qG z=W2?!^XgFnt%gdRjod4)X-`m`?R>IszX6nEDSC%&2$TSck&(LsaW-;?6Cfqdc7~%; z4R8vqGn&h_96EH=JS?%Sa;-;fP7OiB z0D@vO8@8Rbq7(J~3p?KL2f>e@oE07yNp8eeIVjcnah8aHnHq8t0Z-04KS9wBUOgkA zCLB&Lvmt&uqGJY~;fGbaEhqtgz_lL1J2eE}5n!)$K>4%Riu_Rq&-eeA)4P$o4|96g z3dL((XQ~a@cDdL^yu>b4Dikv`HMC!=)kVC-ZeE=wfNs>6i&kgTYhI03b#kwzIN~X7 z?1&JkJD=(`pE~TR-7dv!l|3xu0s^|CO9@3E^9uPTfa9i1nbvxt;SiNmw3jM~45^{p zM6Z%U7l&5E*`ndDUK_34yty+E)^0QK({um_7AHsu?IC4=fF&#J8(Fn!KR*cL&`jvSZo)!HrTZN4+R9FZ#^ zSdPdc4{TLYc6qt;o~3LDvnp`OYPqW+dW@ofu@*lFNPA(z8*yG-51L89dv{$h;f**X zU3t|%0tSbm6YMotmow}(eu@eY@pqvFoR01CG(`{dDnmePW5-M2Nqv`b(zBOJVxyD5=D=Y32_G?uD8o1ZLQR0fbPP(Aa1Be$YZ-83>a~%Niju0TyK|iP`c`R zyI?x2YO`Uvhaxm$-e7bpAjtK0;h87DgY`f4x8E)Gy@?IC+ojxV7Tb3U^`O;EC*FNj zI15_CGB}tAKM7F;Md+Bk!SKX@U3b_d1|rVG)_ToCwPy5b{$r_8 z-F0F-Rf>XNGvd(Wc|(wt0;Enw6k@pK4MsMQH~41g!5bNIYpH@@m^Z}3N93J<^_nNQ z<2$h0jXIk8NP_c*!0!OKz2kU}cJfZ=+2ElMqxyGp@Pj-MIi&Z9f>&>`qA*x(?-4Z) zp6?(WNA}AD2xp;sr&EM{Df{Ia0?=h={6p6q3DKFl=0)1b=EJ+FQI7NQof?grrJGy~ zmIjIt{_CQE-on(H2CoD7Y!t!GWOIk|AL83{-fK zazy1gJd%4w!7r&s1>k{Savg*Z$=<>n!B!-OZ5JGF=iK3n9>*giyk@RU8D%ToNscO{ zZJ4qgM7Eo~<#+-%(xaHN930FmbT$C*MdGpF=uwP}*u8A;g_b#u=TFl<1LJ{Y#!#Lo z!ckVFGzr03x|cc;-;TPKoE;UhUHo~30E`F zad9(-JGoYL7$;4%S>>BF(IHes+8KA&bp#v-jfS^(Ej)!+nAia5qLgS$*Tf^#=rCP# zGrA8e{^r~{@}(H7)8!bZd?ChOm9b^e9nv0ED@;5li$<@z7M{vdJ`#`!6py$l4Bpk= z8$CRe?o<{I%eC+{YT}mT&Q1pd9F}V#W`5k+nF3XgQ8|p(G@Jdg1T6+y=3XQis%uY!2*bp+@C@443-}1I6|ED<0mNvusH)uz z0^GT4A)Ha%*_f9An}A!{I)R+%jGm%vBZNdxr3f=Q?(FpfzOI^1aiCehfhI9JEy0mhI&nHw)rj5#8k5L@yK^}Fx)S81jGRteO@R}Il{_%ss#wq7( zm9=`I9Df+#u7wj>1^5j>mAL^eZ>K@gXWHYwg*ub@>k))0FnflgT3&I&%{WV|zLEw- zpCPkt960^8=UCdJ+n*27D-k~sQ(-QX^8d_WOK zN!$!%Gyt1pj^a(>m7}rgYOy}PC2{oUx)mN(MSnpN##Y>nHw7f0ioOiDq2^Q3Kj>;Z zVTn}IwQw4Zz7hz^r=m|17wpTNoO~+a*8Hg!D|%v}(de^|_nMVn6Gt79kSRXgjYVy= z^i+&^6ZXi=t^@>z7&ryj!n1jGvVh+Y4)I#i)zUiyy(W&1{MDYey%)YbZ-(>Ht3X;< zjvU$0`_x)NU^DYd`rHGBHh zY3Q6!0PqOTDc*SO^U&z1}^E8ElF;EMU%<0)wxq)zt z=>3~|aGh~8ege!4u~*K~*Lcl0Sc|qR=a`ph(MSd?S^-s61FHv1g22}ekRY^^0xNI4 z9@*CGUnB*-hcq$!IhbR<#rTl5bj;UA!@VJ{=!LkK=qodD&)*mgsAcq(SpvRs^qs0@ zL2JLNRjD~PXUjF_D-KzF^396*0zU+8xyFX83_V({*a)NHK9+fsfJVvf)|lTxq6VJW z6xCoN7*dUf`)Q0(1<)8I=)^{WLh@lJ=)@MOCYOPu*l2iw=5Vh7jf2~)v2KULmzc-) zQw>&u;W(oK(=z%>ETaG%GO_)QhC6U|#dm;(E(it~4G;3yYYG2BU)ZrE<}(?xv4f3< zhxnW42za0sJH%*sm_P3j&}!v46D+4=5D9^M!RO36DgG4I8c{y>RHNY$Ff9rf5dR;u zClEtoc4;vrc8aPV5BsS`1C|`oi}D0)`#<&g5#wyl`r=1ylWJ1|lDS3$;!pIV;{}8y zwu?f7ls*PW!X*f~C8dwOTs6VAc2 zfj58Ph_+B;x2a@!wKDcKqX9lI`l@^ZZLs)qrsX*&O|M5YVLZR+wLb&pzpbFL^QlUP zk4eRTW;DQkMqh>W4&VgJ*ch)B8zqdLz2*{<{Kdmx?P!k`^PAVa*lUh}q1pD+3OQIy zA&JxWXC>2Qw>UZBTfLMIyK|Fj3kKFR^pr z)ejq9;*K{O5GJCp+DSmt8h3)xfW$BQ>Kp-1z_?**o7F>blF@)L5`A?Mp{MAKFdDGQ z6TRpxoj0Pn0(N_-=us36i&`$rKmYi5#9d5~quac;1&A2NN z^7f?j4x#aR{}p{o8Q03#(4|?l5QQ#NEVU6Svq2NpXm^uKjR*?w!>HY(B)H zQ(gO?=M{WAzz$1sH|m;Wpb5XNYGQ*%TWdz~RP^E2n%oj~?cc;wmI{b#KIB?64r9)> ze={}V5#2lALKT=u?0){H|Ts@_4Eg2=W1MOytKaM-nG+*_LVt}GC|O%d`9 z_b&Kmz+u;#aUbj2LqV{YqL*nqT;Q;4&A9J%?FJAq+uy&1wsQr1UG)>ifo4UZjQd&F zyh`&_4Eb@)8`O{=kAS6;U)^fOM^N+%i@HTXW09~Q$IL+s`|&Bd5nc<3Po-!pDKL8h z8jrKqjKlFcr0B6&p9HTp<5Mw;qww%VS!+f;bojMqJTg+X&~2y(=Cf-*e3pCH0ReTb z8TW}M_?_SDUMp^!bjen)iIwKxjGJ-)_VUvd_&8xZ zanmw3cug!L1GlFvCmD3&cd=UUu|~%bY9QK85q1sSdoB=Y8#v>T+BJaG*=K2QT^5fu z_+5t$oCz|Qu@~Xq!yet^ZM702SoVj!;sn_9D(jel22-03&zBM+Df);iY~?+>M6U~l z^tihpCOmD2&^SEmUdAS98$uIg$|I$A@A+21K6L7Y&{Nue4EAp?%J`7;Fk#cTC`-U$ zxfUy-KU}3O$`X#lt*p((C-&aMvLX3Byuh1)jVISy`1IuW5F-H4W#bIcHQ~q-=u;HU zx16CCe>Q!Vj4{k5Ac+ye()6K3cX_;gOfOp3ap==ZT01!$}c5D61;OKN~fxKKC2x-#J+in@~k zjRnwHBtRrE%hv)#0uv6!Xe@XZQ&d2TDFPY~*MgAooxWJ^{ze6qV8Z zpn%OWS&t(L*k4ok8x!Cx6{`=h>5u?N&Arry4ne_WWKYul17*W0QQM;JeCa`aJGkCJ0{?H^$~nP zuPZZ^wLMwb#f0Wot1I2s+FrcE8Ulc3(4I825l;7-L;O#goqbTgqnPl#WH9lku%>SH ztqXYq?==%SBDr)i=!1V_c2s7*m znQ*1oe2uke8zH-Hq6H_(N7(}QnPw+K{!g|ok0?TR#Y?srR$n0kNrdeB1r8Ksp!xHk zznp-$*Y!(^5c>05+=*6Q`Js|P;1t?K%mKBujjdK< z7)6h;0`QdpZGtddb>+88)NqxUsGDGKE-{Is)g<^`Kx2_`l^E&78D|?a5#dcS+Jxii ziHKB2#-pIvIDnoAO(Ww8UdHc4zkinoU9x0?rJH* z{K?-W)qULN_)Up2SoU;9TB(Ms#M!!4D~K8?dXhxj1%xQElR^Yf-4!2}P{LK>CAtwl zWSn>@MVPz!n+^&{xJpbxbEx4e@fuBSGXiEJoR^XDG>kUK3Iv5KHtZ3GtFG@KQMgLP z5HK>3G~{o_V9MWoA}WDaG%^sW@;A>DKr=Yq=wEiRA$~lf?astkbh=Qf&K}KOi8J%Rx4`sLIwdV_9Uc5M#ctS{X+ml zBq%Z^CVNe9U>da>nG$Du%~uZ_nUV&upp7h}o^UD3mI?kJUeW2i@F+b+QnlW6zdf%(FJL~kgCEx6u{yUO33Z%3xYu3l4~kG73WNix%)C&TLk_JrHUy_w~1-Xcm6E|(onXR_MuT=Lwljh@Qdcf%xc(V!RxakEH9fhkE zKLGAFoFSBSHHS~qqAK(hKh~18kcx%SS&k+ySbi2nS5j2Os~G~&r6!gIs^&AE-XMB?A8G4k%c14cBVfQ|h-q*FOLGS@Z z6|_B3;IMn2NuTT5*rrZmR??%Aw($J`Usu6xsLhIp6G_ZU6wQTN?BhAYq}_q&Ea&2q z{?tvbY_*bI6!liG z6d(zY&g{r7{gXUiHyQ<=2^8VB3htgJAdx%i0BWE{?&RsZ+8kJ(MbR-dLP7utirh&X z)yQzzg=P|7EI5LX;wCRZVI`|s8z|K_Zel7DHlua}ab65z$Ul&;47Yfxlv zrhqnE>G)DQ23(d*tdxA!058?0bTj5(OJfWGfX;x0O-fpTLCy`N^id6PZXo4oWBzqC zo-CjQB{gg7?n12zja{ftp0D=+5{2Tad1ohb5 zo6za@k|_Bn>DQFe#{6df=4Jx=HD!!3AG0tv7i&m>Rx8DiCI29!Xn&9&OQ}_@p9Ni= zF&{HHHuoI?@nOlo>pm>mdGXEuyErM0s>#RTm}AVpiRQlu2uDh!!hys+S%2p(z4Ak zF@G70I+K8B^eImm^KaqL?9RM@GMAD+73QoPaN}69w7zbOsd2`9tjS~Z5MpBUu$P(|Z_KCP z%O6jeMh~8h!+bYNlLddTH`Q&-zk_;n1?4XG#4mE+$U;POKL+0_Aq%X?MNn*%w1 z!<0UCID${aW%w}I&yNwlglGgsm-7mFAOO15WZI!<;uYA`QJUrfLmLy^Q%W5SSEcSL zrNXBv9*H{&Px&M z;W@BUK-^zyA>5zuuyty8Ck2$K8=q3pHsazpNTn~bSra+KaP0dv& zx!{Kog66BLd;hb8rXYQ?^GMRwqUT#;fOGXF{^Qy^-1hC#_ixJzhPX0D>;%-{ z(R|uWidOLo;T`~8w!kb+a|AZJ(;9TmQf;!*wWaYTIMubKVJ)PRmx1L{itb}k2rK}d z1+Fbkc?nLYR~q_JHNiqH4ISp%em@B&20<{(_C9xwL@dK{rkENHU!f?plCH1M#c)*G;>tfmgc;S zf|{cs1 zhN8!L)hyt+Hn71TNO$0Q=-+c~X?U4YcWtTo>`=g|nO!&);WrQA#L`b-rJi7Y(A60u zu{W1~B1LO)H7Z0PI0;M}>NT4*cbfD*YoB_#T5`ah=8mhIJ*yGlO-QmQdAdyUKmlD* zW&_K_YCU6APXV9iY`w|wR#JK+MNd+xA7KbPI=zX)$8bHeFJXx7IMZ-e;I?)hXF4XH zYx`3qI9Wj6#2heq&2bm(s}*{eR#2FIV^>^0IL{_QG1M z^m}o${P#g($Qih@-DWyn!oG|US5~i~giCRwbP4-1d3Ct}bb0@95~?N+)1_njtD4I+ zN5BPix;NmeWYVQ`{ww4-6qk-c;o6tQqTsXuItv!j>5m0iWD%YIs&0Y}qV#PPxk>PX zfX0$tI}tR`IW*F)yr*5d(FYLirYM^fUkb>*Bhhi~>x%21@X1*{XF+c-MLAUYitvly zai(8ux7TM>@bGuP0*;D>4SmJFTwamusIFQa{SE;&m96;nMT+B0Kd9U0fes5{*S56H*pddqt?=he-aQ$C*KoNLpWUavpU?vMJ-#R8|IH--Zzjp4&5%ipL6p@Sejuy&ev~Vd z7J)pgj}5`0D*Y3$i9f7muR)Oc%PtF70H&<$G7!fPBE5!9t&l6sQNG4wos&Ml4xr&<@>HECqewM(w=Kqr63KRR# znQ%j{eF%hEeQpuJK1Nk@i4vZsw>@*3J-tGnRx(ZvRGw8HE>3Z0Npud4Z@=64yV zGLLscgYQcjnNxHVJQU2FN)hCqlS~1f1#v3#bgdlw{gh~4sV5r%m-e|Hf94@WZZp=buL zZWGXI>G#8^Xti|vKz2805<3!UtZIv0?93-9nn|Ws0gbK%lfAK_Zgykc)R}elb3lqw zbZ1U^MehLT^E$ycaBiZgo^%N00QeP{o~cAFMA6KCPV|#BCi6|*2=B{ezC{tzPS5Zt z0hNEhV~W@l!{LVjHqU&82T?Th3_Xfw?$@ob&5`*% zMeM5Km=XYqqM6sAiPb2Y`J1jb0hYg0G@C|j>)|tlqA1(7Z4^~ri7)hZf&F)sGHa>s zuEX0Z%ezgPT{qMBmuG$3(LvoNLn#Y$!!YNt@TCOweO5k2O}s+m1GK((H)3t@2+L8+ z#-%+IIG(cl=meiabTmbCK{vt>keH(80-5J~&GRvQWLwAIk^G}rsarT=Gn(`W=8uZ7dawCNn|os}kQObaJ>@U0kv|3QO`Jo3`Wlob&H=v7GvY}By)@q2P8{uQzce@~ zv?SJdzBQ$k7Pz+!ypaI)3n*{GMfMjLkRru83 z0(gPc1$e>UJ&+>A#nc6p1)xmLYF)DzM1ytBxw_*(^miZa1YBSAcb}r0;32E~REiLE zQx{wzptB(QyN3l>#JRf>Q&p2&!GiGV+ITGqRtab<68+u$s7+6Hm$OQBV=$^lE#Sdm zbZxwj6fXc;TL|y^W41fbZm-Lza07q$9^pIKTuxCl zuQ0g)S{;>`?e<7#Wh*h;jp3=-UWgq=_stY72GfP90+_34tRf|zA-=jJowz9R)xAPD z$_LNg6x~P)-ra@A+B|&~9>iBS9tbG$)%~b$gin{cAEOBMOucZtfX#D)!h`tgF3{tv z8~KK6g}pX6{E}-U?k@GhO9dppx=#y=ukM$0H9X95qt9F$m(b{+0zvWBox|?;w=~8B zoS|=n(2=6e((!FbgbJTeMV;MVbF|lt5M%!-e(0UUe#%Pm``0?ho2TIy%k8Z*tSU3` zU#5(T>@Zev8SC~O;muYny8}hH;OZhc89;D_xJ7`MjA{vS7*dWE=RGT#SeB|z|m(R37lP85J1wbm(GnV&=O zq^eb*c{Hy7vLAGut}g;)zo;7E7(w<+MpJJV(MLdMfcMW{4+eGZm;JtKa1t0kFq*{p zbTXW-F^K2S-sV)o@%-6esV3NR$^P1CI-2J2>i~_zS@UJ@Mw4aCvnLl_2b(ZsuGhrD z@GuSu_M`pJ3~8;LNR<>XrQ~!rn)DfpT(< zrsK%+i-1NIw3qe5r82uVru1<5JEf z)dqP=&Sax$Ang(K0TPq4e?@buYrdQrs?u$+nrSo*q5-lJKu|nl8wQ-1^DO?5>%HtZ zsqW@_&kAku{k*g}sB7$Dam`?g7i46n#m8H3AxoL`Bby4viBP zJ&)){h(;dtw-NdkDYgs9y(7~%LXkUpj=_BM9CIr4P>K=yHC5gr>_vmxamzE#Zm)Gz z_=dmRNBA8!2zf^6x47zO2xxUwVwdMs>8!ErBwy_EY}ReD3*>o$qVLF*FCc#2GePn5 za79>J`C^5{8_(Oi5h9KUH)@3LCk5}W-|;rjEQJTI#Df%Ei8-FVx)Gv|2lr`&eoqR- z9e~Yqp~3?P;W<-}JDwkOD?}d8j}$@f>4(?@kl5q74$Yy)9?u`T8vK*zPl{mf>9b`S(vu;1LT8L4e zet7VZi!9CvJ%Fp@QU!t?D%w43T~J-{^t7Rk3y0ooQkS47ih;UJ(CSjF7mTztw~nHN zti}|9;JUEy?qL}7?M}6``2;tSi~R(ZW-devC_;+mIS%s{5bWSR*c!dQT?Zdp@qcpg zx%cQLK7>l#OVO_^pOgEzuQ;!B@1yW1T=&DY_w<9C&%K|b->5?Qaeva$d(QQmNGIEK z^to%P|2tHxkZ1sWhuXLR^7;AyKMSD4x&Dr~aV+G1EV!G#9#@|dJKlmT+x6#ujMdw+ zi$h!q&yFM9jGM=#b}hSvS4#z;%VzpS*Tieixu5Eq_iL_<3!&T(9B=D${ka%hDmixI zc>v$F>{1p5*9g#A;QDjF28+5F%Il7DainXht{A!f?tviz4^Ehh7xrVR56-w&M6k-mw&2fkIll3$T^* zkWIRl&BgWlqX;-woQK7PYuQ4o6cCO=*V#cP_Y>)vyg^jBlD~s@NoYk!d38F$Rp5k! zaVbL{30!$|bfd?>(?k(6iiB2#LV)n(byj%bKy$xx zcqDho!$47uup^a+K6foc8j{e8vJKer|u^l=mD< zZf2n)2<-FcDMB)qutDzSI<3#Sc*@47;t&pgvS-2J7EgH}=v>&2%KMNav|hr7^#Z|> zhO1;e09Q8v^K#o?KxH?{AjXDcyAjyJpD7CL0Op751#fM&@*^lhw&&BJ$|4!el5^3+9CKBlf(1bREakfNJe;4p#UQZd}}&i>1VRQ>>+<_s`n#qL_R zgrszc8!rovwRuQR+FwkW_%dsuI?9f0F_n*8Pc0FQSjiIJz_3d4}MdJl4f2}nT8ZvPB$M-D`AbjF1Hc$F&vU1~z2 zXx@GRqWg8t-umQ2WX-?B31+^?n*X$J(g!Rp6oIPjjv)d%3nFVi9@yGXhkPGO$={-z zoDP;(D0+Yd(*-mZiLCh>92zIG=6|FcEdb9BivC3kI23@~`z{La!u9PgLKO6NQ}iHJ z;0nv`_$M0Fj(7Q2+3mHD3J>vj@S$aQtbq-Z6Jx@|yjmxq)e(P4T8?nQXXRfhopl8} zi4jWb@RM$g1zv|8Q5C_-9UcBdg= z^W3TMz_;XI=K3mX;doWI1d1LdMUH^Y^N_*=Z;^kU9-O*CSG6hyk%uCzWXtXx zEFi%t{~5H08l1Wn>uRH5Swhho8jTl#r5)s(b7nP^XXJ z*#!cM?d-Zn6g{!Fwys`Iz;`=d*S!+vCs6bREpHQW;$kDW$#CB*#A7+VjIoFn5B?Yd z>xJJg^_q3Q-e&mpKgzOqyyUf>ZZlZ|ht8edMXjHrt1eZ8*j{h-IEgQ*K9Db5clYi`9!{AbR{sC$X6Jr8=NZDN% z3IvA{cn|Ytf0gaCil{2jEaspFoLk*q);aLFvYWV=XUGVD2oSxk)LV<|JMShu0=-u$ z`ZrZL5$}4EfdOvM#G&){7Gd2!pgxj`vb#15a1mBK;P`=~5BX<`vukG74C28u4yhzDE=_ikyg8x3Td_M(`-Q;i4aZK{9ukOgYfFVvC=_6|*JxbRc594TxI<-1{J#ScX@Kn@Re`ouXJ$JRo56o}Fze%n*;;xBcUF(CemA`Y^>=L`59 zQi9j&9w#Fu1|f#b%4?|pfkX9nUq#Ktrs0{eGQ(i$4%{HTT;`de?kjb5{uHE~%B-I? zXZ)n;b5NGmy;}Wsh3)AIy0fmytR^}!dv9y2RZu`t3a>aR_wGkG27TZw^GYoL+N+3N z^D<7sf&rvS1;ajg)9igo5Dla#jaL-{q9@KJ&|27#C=lm@$eg{eFQHoWhSC_>SN6wW z6Mn&KTH@$2J{s%hOqnrpYNL0}3dHf6(PR3LsrELzhvUC-_-`Qo8;k5DbCTEG$wqKm z-S=9v)}aNnSWX7Z9YdIc`ZQ2PN3!om0bkqArZ`Z|!O(2fHUG&-$!>d*#p znCe;NykCHCk`*CP{x9OB9L~qu34cQl|0|OxQ|-pd0(q0H;9lI7td|N_qE-igK!tYY z6R?X_a1TX4@@k}juLV}=n!TWTpRQS}xlA=q79fLFIqP6d55c#Qvv;A%0h%%6WWjxb zs3PvM;CbETaI9WjVpqShX7P^On2S|Wg0dy9`$$~8b z7IBRQpXnwz&|2_0MF&anwt&upI9c#ffJNeD!LParPPr5ylDQ84LISDK0byw;PUa5o zKWub0W?x~rX0baGq6msWp1qr+dv^wBRUv|}>);o--pQc1vnNE66a`{uaaEONtgIS1 z$R3&hv%e*UWDeQfA^*Un%C52oN_IlM!GK z&caGvGX$DFbj>oYH|)WQ!b(w;{7tDs{2^Vpyk!yihIru#I!8HZPoxMgEp9M=3D9Uc zYzvPAk-cwjr+0;C=q5M|T=)-)Q0chAGXyji`6z4QNYM18E5Yhs25w=!Zgeqt=)kVP zoyHAr7SMS3QP#rA4vlZGp^$z^F27ZwP-t?{bQIQ3dlk zZg4C530)T*YZVqsT2+V?#dXC|{M`luqJH636!qrS2Lf6Rm9(m`yL5g&IQ`L)gBFV~ z)&5I}ZlkCV*oIgFlFAe!$#c@GLcHv(q*aCVQ;Go|;1=Fb(a|)|5wJP>E9nr@szRLE z5FUOnl9gGfTVZKm_#{OLU2#JY$pAJ{jY5R%qOijly8W$VcX_aZ9kdH`_1wm$v4Cc;h0=k9LK^Q zAUusq!0oxNsN&Tp0%!)O8`U(c@aQA@C~HxyPWN-GRTM`NQuDZ>9sxTeK&AV7twQ94 z_~|IGxqvt8#C&%kZ<3MPZl+a;E#qn4L;b}I_Z4ma;srMLL-M`mFtu4LY(G>qoRu8F z`khR`y9{LRjanU>q0}Y8|2u0^n#PK^6U5md!C3+W7*bmo3t|lzC-<2=K z-@|-@wP^bd)gqbxL&y*6)iO^I=`{ zO3iEW8EX+x=P?Pr&B6N#TJnEy8A(%_A*V9HARkv|7a-DLRc5ytn&@GBYoHhkvgX;})4Y9xR>a zHM{C_iPIX3zzkK2X^k0EoK3!Qq~hSYe;hquVH=N z${~i1QVkj)LZiC2-bZu9b$|>-+?{Ldt+S(vEC+wt z3+8P%yFS48#t}M7>SXvygIB?=N*-tbEBj9+;y#{0o#HwW(ookatm|4{4Hw`O8oSHz zH|9zLd}xAvUsG{{mCV)cY9SK0vW_fBod8u{8u=VSa59(kuGhS_y?a4N;K_}oPR`S? z;5|mEfR`0Oq)(4yyT?6<3Sg?cwm!uxtf2rHK0zsD&L3X$(e_GJTL}!VtxuByyO!zk zAz;RpYbz#mdVHFI)Ier(pqt^JOa4tg$kXF<38kXPjAtu@ODtL_J@&G{ze|V4@_ls5 z887W^)0OOFL8wA{Jkrth_!?B`6N=XJYQBIS-AZJ}2I^S`&ChksE0_%AZ1bSG?_?rZEy2g1jqMM zyqwlzm8RpaB$+KuWvv#YLS5+gyS&(Hm8Ma2Bd_2!0d@dSL1tW zfv&j&#^MIp6kX7e0L_^3y)-irQ^m2D9z&LZ2|RKsmZz?*H-jK5Qb1=xd@to+v-d@2 z@$03SwyFvIap?$(5N*?=N(6Kk#P`yH0T%J>s0u z{YF%Fh%0x^(S%8;DMGmsmBTCKd;s4VMMzaOkB25=q^fzY*0tIgg||{Q=fM~g-iY$B z1hgtZGnO&BIxsHmG5U&bf;6~vD@AZ`xohqb&{;S}HwIYjF}g!Hc?v8$Das?kW&xdr zWAx1ci#s zNjJ!DwaPGCji~N4uN2^rECZbpm4fTXMibD{WlVE}LhCvzbN;S9<9Jm34{w4SEl>#=$vsw;X>VFGR#z7hGNwtB~EgMKtDH%2i z*fd-99JJJV6A*ETEjv;-dL5!s6qS(z2`WJA#Wp!;*_pcf0WgfGs2s*mbP$jnwDfZ{ zr<#M7P1DulU^$(l3L0ezuuqkp#nKJz5r0qF-f}~`IcVuhuT_czLm2+p$U4#-wCrY9 z03DM1#PI|ik12!uH==s-YLNiz#1kOs605XDN_gtXa?n6Nm>|z*?Z#wkr{sfW;%<7e zD5OuhPrQmMh`Tw8S9=74ld-&HuQ?e_)8^T&FP$yhAtU*a>1>&}l|TXPL~$#Cej{~=#gO*RA zdKEdV1-QAy6m-CUoq{5^w+-*@rl94EIG4&7;-(}8Ex(+VibZ`M#ogpSdI4_h3X0-* zwLrkv0LV{N%}LP2TvaujHD9lW_wt)`&BZVlFA&cXZWqvu8Q#nJF=b!!D1N>C9Djr6_>}>jiWcg!l5>0xaUz%h%~9aL46Xm>E%BNq`v%&{+`P%lQ=oUtPqhm%pf+ z`~a4hC`tsuV<7^<5**%N)<5_VSSYI?QQ{k zgjQh8s+yajiNT_3>L1MEAgc%ubgT@r3i>F8{3o!`M;TjC)OV(UK0GkUDpCS0GRP{9 z(oK@U(wib=s5#$(51_GR*W$rJMUg`zO$d)!0Z*+O9SzY56v3(He21R^hZ+)223Rpx zH-O)-IEA8DX+BGUBckFo3OC~V8~)~-k02UH(Kf0y5Ej5~*co7jAsJu=GZW)A{_aA; z64;EV=yhJ*Dj+#h`R9Rjt^8AGkIruKnYsa9KCY;z=na~$6R^zh--8!Y?V}8OVL~8_)S34t%}5;bgN>C zrnWyEmRM36#@jI34>tvHQk(MiUaR~W4EE&(!zMP)=|6eS^tsp(Gmm8&;cT2ZdrDkK z_g0^F;*=DQ1vkx@gH+A;;IM*yh~_ekcUaJ9!W4)wZ486Azkjv>W4zxSf9e@KuVr>; zZlLCSRJw?Oytx9y!7$$E)g1!TKF?9Oo!1!zY_C^5Ptgawf=ABTzuLY_RPG2*cIEHj zte=9JjDPbxdQBYtwI2vMdq->l-XZ;)@gWO&mhc)x^l!#Ty!u_h=MU)NlsaLNUGc4^ z`F$8ecK(Mr)Xqj{_v@cxtpJ~4>;UQa?7Z(2s;UOcVtlxBzU%+w4DH9BN8k)A-E5A^ zOg0N&gsDtteV##8zCpCg`KBL4=mNv|H?NRe0PLHu%+fV;q3PB&M{5p<&ag7U@jp1l z&Bm^*&`oeQva*t*^(<`amTHRFf!|y%ps|QEtnA~^IL@$A z99h8V7Vw-xo>o%aCvYfd=#P(;lXVNcqFh-^5e9$GH*~AtY?WJ|LgC}M{u+5;&ez96 zZz@F_sUi;YL&nF>z7J81IcXR=yBmk&Li%uWoWaSoTqL2?>xY1BAuN z2>q@x@W8Ngzix0lIKHRoQkp*`AcONq3TNZ`w>5-~(EEv^%c$}&p#`JD4%L-+hy6w$;oJZ=$Gu9_M)b#E@SPZtq0j>> zMb)SPJOvc7<^QY_uz8+Pco6+7*El>f82D#HRik0x=|j;~q?jZi!N2l3w1yLf*(veXIv6&+%H7v)IB0>eBxR;y+89pi^H1(L{=nyyX7* zv;YTyva?eupPln}E5`9l?6FWBWZ zN21cs#t2Vd%AN?uHSZ851V7sAv63}~zshq(6A+zx+(QxkRi1040FxB4#~1u2*4H|J zRLw`q7qKhxoT+lV)cGy1c@5jmp9|qW^tmqD}V zV2+obgK%FGG<(XVJqykJYYSly?hF+){vU7O0bW&=eScp}M8p;X2~i+)(GVa&NGFXz z29-w_pL4d|5Q(_|ZPIXvWRfCOE5%Yocf&2}THL78K1mezecSBAGI7nKr>W zWn3FYi%5_opjl8f7r(e$=-aqF~&8zi?iED*%q zLDBJ4kwW?yTe|gF@)$$cbS}C5Z@!6j53a@Gu1Ef-o5wifUKihd)$5xtt|uSuTUhv8Yyb@_~vU`b1F1n*P6@J!BD>Wp4LQr9``;)D0`9DpDCb>#W!E~ z9Z9L>Y8nx4~&vgo)F&{X9_SQIttGy21@-N)r{g-Ph2?q4?UjZi*vJ ztkDJ+fnx?mNUM=ItP!v|J~kRLG<0wVv!R>VqK$B?(nO>cYyD(WJSJfC{M+C`Ll^hG z!(%(ca&7bycut}S`8@K5T>{e3O$^3tm<`>;v$WdRusoZhDKz>`KskWZ(8b;B4vE7j z5Ac#rjAcI?x`}Q@y#|f&#I+Pn#fH|<|JNk@HFR;m@bGyLE26;H(8X=X7`Dn$eq)~v zozrQB1o8dJcH6}c3y~EP_k)mp=X~7PS#5&eVAUCpwY~BqjyadZy_B#HyYVqaaIMHS zuL}70SEKNyHeRgzFFMHh12res=;C`&1b2;ehYH|u`ZaRATlsRo4H=DGJem}1eLjtc z5aK}^MNt8Ni9DZ?7eAQ7X%MbK`Hft&6e1W{>kFw@L6{|a!ze^Wja);gT~qYmH*%vU zxr6aGQyi0p4NDi`zkwRLcnRAgZg(-^OpHguwwS-}5=fV$6OTPHhlzU<<1uJ!y-#x^ z8@W*_?qGD*0UEjZTB?_j^GShp`8W})WjAYL`@Q-RsF4f!%wv2z-7@}c?3Xlh@n>>e zBQT_EndPr-!k(Q)(b4=hN5C@&=V(pb*&E-kHT6rm%wie8QfuNYKOTN=tsluPfCiwF zE{kP+yRSe=j*P!in_L5ynmho?ClRv=nHbtXAaNVH-!V;iZdK*;G_WCKNF77nkWPbp;|LZ9T3|;v9UuC3i8-v!om1s zoTQDVEq`m4&`-cN%&jGZ7EWv3hDNbpc$t8rrROH}2a);MV*)1JG(m@uz&_-*H%Nff z2!LXd#~u?#gC>sSkvT;QO<>A0jLwIMDeJa3NwHc$@$j)nTmkVuo+G}SFjJe{4VF5J zwvyms0mU+WHs|BrkdbY;%7CXto#qEGB%3%PU0&PAzc|1XG|#ILEu&}~S$`4`YOh1L zEX{15v-tRCa5@hWBrqxYEFyY=# zn0M2@5|r0c^bXmU2uRD7Fv8dVB@A=gElF(&w`+q_z;Opf@6!BY0dP2*^{&{U0i5`w zJGci& z2;2CQq7Ome?-&7Ro$lyO!ohVl#KKs0DR1qu{M2st@)Pj-rwrVC?+%v8b=JgUxvj(l zNxYMsh`@gRa4|Ts2SsRv`}Je|_G_~}jjMu*eYmxej%Ul(>>Ui5z&^^;DYEY*Hyql! z4LQ7DzqJIcgC(+~x(zwJU%$r%Jo~YB#N1}@x5k8#+wt6?g;vm6`@=4hc!Fm62BJ8M zJ|XA71?=3J7_T+ALNh^WM)vS%CQ-bbw&>~m^}7tcnQ>V(crpfLA0l@!o(({>;M=3; zyMqss88Mn*d-QmQQ>LIyZwwcJ6U!+=#p)M{3I-6pN(y&y!{Z3Jx|CQ&(Pvaa1Jf@u zn|)Y(l{@$nZqe_#OuTv`v6=dxQxzKpcwXM;sdg3rb+xMqRPAtMQ7o&SEMatA?GjgV ziV`oz+)6i=cp=tRYH`vsw&zgFw%`_bQ?r3P?SarYy_ZqSnU$GI5eJz{1cHvO_LYFf>h|L#Tvlao=E!u zVd<_UCBnl@i#;HL6S-C)Q$^TN4lF&Vw26&%WQg4c;(EK=oz$Izzh>Fp89t^L0vp@0RDNISjwDqYV98M9c z?%0E`60isLh%QWtc;%YCR3e2b2?@b8x(Pf;b*|bRQozvwc42B}+oB3n5?serdVBP2PPq6%*NQUMi-EHz2I2h=Pz$v8Hq$t_?BrwEOyx02Z~?L~|ZE&oM8 zSh_1U$;hvUMFpCcWMoKdZw>4#q6Fxm$w*n&UO4E`vhjpWh>&uuy)&pXh!Eo~HA&w} zsYylzS$k{wZ^$G=E3#pO*tho1(`qN6U~ri=sNR9WNkR zoxbOknxxO1j4q`nd6722^{nK@6oGqa1^OC*a3uFIDg(}al0Nb9cuGw2soDy6f+U|t z5k@q$g6>dpzfBZw5MlK@2`5oTiAlat8*Ks4MHDrVVyl3xekTvdbU3Sva#XI=YCB+w z(q`>#q|qJ$HN&0)6ZDwhJ&e9$o_vS4{~eTfQZyTEm8hTqCq*BN@9g+8ygJeGrNmfz z&lWN?(-_V*w6X@G4vLUohgRBPdk@cOl3(hwro`u)Ta+`J-PDxiFSPxKpp?8cpKKoq*y$=6b8K!26+ZcEihP`9WB0udn9{&xlTwc( zCFLpw3CdORNsu+B@_RtlQ5Y=}jH}{P{u&@)AJr6ux~UliO+>A!8Tj>QDYZ_yN~yt- z_FD%`IZ<=Of_6DYpK;r{0xGUqu2S%hW>v0I&eJAXM@TuJqR&Zy0}W6tQm#@?1C3e- zOkv|>7@YwgHck}?lQC6Dm;lAYa+R{uq4AWfl)JRa&0x8kB1G1hD#R&3u{i61qn^eK zrcS35dCv7atplb!sd=6T^-~m~a~M-)gHQ*kgw9pql-HC&wF?}tQ-lZ~Q{7uY9Q{oS z-^XuZulNmmNYSneg#DQ6Fv1`^mEkII$|+I^Q{JY+H~hE3gap{&RM1s{oG_+3ML_Mk zQ3zAeU}H9ygVUJ+83vA_X^&grQgAq272lB!nHC_mC#B6-2vbgQ>W&n`6!ZwD!ExaD zl_ENQHClB5IGoLTn_QH_+#C{I;O753pKYan^mWlWtV zB_hyTU&4p{Cuj3g8B<$G^cy+QCyc4N6WsGD+RI;?1f0>^PloQZGNzuU?Q!~oMU_}W5=&V!K7Vo^=h&~5p<_<{ zC-q%aohE=&FFcXusbzoSDj#dvK34fsWvOqV%&xmS$clJ$6ajajq#}h` z>#pIi3IWe?*rqjc@rj=UG&NgP{Md1_IVAOUrK-N0crie#x5l}2r%Tj-EiqKHcD&M3~ZS){`kld|x zC}PU<^Sa3&>C!Oee*BH*6;Nl0bZ zI{13T7GyAh+DoJ0q~hjK9DwcMbTYpT1D7MvUaB*WA7oHMUf+}2{B z=t#ktRHY3TgQJ?Fn`n-N0qCOO1W(lkXA*LoX?GE*klU^WlzBg!P|(sC^(Z4sHQ#I z?Mc^A#69ZhFW{u?82Q45lkxouPRLzd6r4%-lJ0ggO(GOy3-?iU2Y+E!0k%8wRBY0g zE(=alTBm|D=~)u}gB+I=ZU;A}&{~JqFQQ|EfHV4#JALNeoQh3)PuuST<@*$&b&Tjh zKMt_d*Q5`%=Cjb;p*4T?Xzrr;PTIB++WiX7B)oif|CaYA{h~MUA8Zqa+ggW$5b@ZN z0unqZ!q&RmxUu1cvCu;iw$|N46(p00$40TnjKghu?VOj+H74y~>f_)=JeDjVulTgr z_cC$M1n!&o?{1vnT2!YSC%C@1A4Mi@0&_&#ILxOMnKb6IT~`HJQ6D}?z&b=4bJ;Gq zbJT~JZh$@aY0PGZCXP}Xvzej!qly`)$fTinvM(j21$bX{TCV0mqn0+EA_Py=4kS~6 zqGgdu^M7A-TCFz0^^~-k6rof_?HDJZSft3Lb$VZP+9GW<1w4x>La~b4ftm|YJS;M4 z{_l%UJ42hGaHb(gTDz_z0rD0=Sh^`PX%}gO3&C+QMJQBJJ8YnXrmdt9{}S~9l0no5 zk3n=PMJPs5I|T0Z7MZjJDKcqSPytmaY6n6-YR40>xsoE(ov0np2&la@icH!>ai9r) zMJ5fI)3iqmpN7n5?OIE=Zv-T()AgJplQ!1L=u%|TkY`K-oS>y`r07PN?>tPv<|r^K z1I}sEMtgV|e4LXfwbhXjJw*|!Rn$(nH^3&EX%Jy~FD=y>ket(`u>&)VQo+LxY!^yZ z)Xq`?S>8))#dMgv&kF@V7!pukQ zls&u2NztPp@ug_L>qmNdFa1C=AiYKH!~{j{e5)fQy$3}oGf_Kt3)tSnnv&l24GYPg zZ&*klKq4gTs9lE>5R>TxDWcEq8Y|!oxQFE%a5pt29g%F>V_hU&(h|y4)UMeAcD727 z)0((Mo<5NxpXTu%%>;^3L!)+LhNE^_otF2~aQWRB6p~rz<-IiAWV^5By|kLs7fVC0vVvFQf>CDQeeC0`&28NlU)H!CkWHOQ?4bRkji2ai{d-DMTnn?c}`g z++;8Bp#|t_c`yBRTHH&9Jp#NO6`hq=YS*gHkKYEm$8V9`&ALiP(Gv{F}@FW7;$LbIE%l+1w2QTxyYwE4z)cU6JTl{qk_+= zROxuzl3l6rs-RA%L+Oubj$=XlC`Aq2c9wvmWu;2L4@BmbsPtE~NhMfbrKphv%>tSQ zH>ajQ2^P;4B*}2;JG9A3VA)9#VjyBX90#CTa9e5mHXn=JR+|33HleTmKv5G3kOBbW zYd=z0f#0#86Mli-PZY^;5jqj$H`!SNCo<_bNR3IyvVe8t9RAw_gjZn0Uh2lV{Ds5{ zP$M*IO!{?l=vRZ&Jdw#bMBAgI%s7;yd1M1QK+<~p)xH{&j*sdYCo&mFDT4{Pg(#yx zMJ+Jr)3N}YV?8*WcfMloE_Y~T{xgo%HX}e2P0@TZqzKqFPk_dAS2kGZM8) z4p@>XT0nwY0cJ?!QbYP>0dkSC(&xN~3)?ymcc}U14}Up(gFgp1yMyI2cLto-x)BK` zVnRFN3Jd|BXx+Gozd8h*B%OY~J0x9Rag@Ho9b7FL+jHMM_`FAo>H)tRkiLxHrT6K1 z-`S5#AvbScJ0WZFvPCE4;f4^rE4s90?xIZjFjMeUZphiMboW~9+UGvUfJ?`wv&PX; zGbAA(Ge%56E{}){f#??Q4Kiay+++beM`TDs@a-hrGXrJNy74$F|^MTgPgyx4@bBPLECwpe#sV6&o zX1t9*{1%fkm_v-MVaYm!Ib_c{-1hkbik8_k;|ma(*)#JXZE{0LNM=up;Jky2QQ!cY z1=%xWFIdd%nTa?zO>oOB%C59rT-@(P-2+)Nx z$540@eiy|O(jgj4(ch^8KOJ2BJC2fl`*Fs0apX*%S?xKG|MmxJ}SmQ9VwLQvL<`jx9AREdTKvGu5YrgE6@rskMq(jdv(*}j$D5vN` znj@6}Y>ux~_RM(6p^@yFi7I8d@sj3?Y78IQ@K+46tMo*8%z=l*6--l^PW_RJjWa}1dQCwpc}Lb!~hMo&Dr6j!D) zdD60H6@Sr9N-wZ;M5ZJJ-%ip!*^%tIoJs=Mi|g;A@Dd117@H*z*x57V-mbD|Cc?(r za|K!M6ySP%R`!$}tjXsWWfvobV!32mcRlE^mW2!Biui;HKbD#$Pn>x2X{WbK^MPUh zPc6=i2p443$5ONU^T=f#>EzR_ei&%`Y4~JI;nM`%=$REs5t`?)LhJ>=o~tZo7DE$j zjamJbX3+sEl%0H<72)L5EWSC&FP~`Jjl$aS*VGo z2`*P>F;BFgNrE&1&4PTI#dimp`7{fyp=p9kVOfn?5o8Yu6kD2{BO3rI@NO7vBSEPNZm z=&iFJ)&@U<;}MD`!h8-YH^Am72ZwXxCDw1U;v60+4_Pm0Bb@1FA-!5F;z@C=fGoRY zRbnrk?ph{ut5%x`%WV`PpM}lI67VYtS@K;2?*zdaSQ79;Ugt#<&Oc$CDP}*7VIRvH zVLw#k-5d6VXs(ZtLgV-a$2R!@4g~Fe*ql}Z?!}lKOi?m_tru`=Mb;=c*yTWtbO+av z%XzQ`*A6?;gp>@G*WM3W%qCLc!;h8{MT`F!rv z25(-OIcmIJtxH}e4ub^ubxvmDSdmG}-vtcbsfrg5?VR9!XeZ!oxE0mBpjyOzP7o$PMA2jtFA}f|+GGiHp9}Sari8gq^XyJ{za8lg{t46O zJcI7Iu=iC)bTr4C?f>HCKf!}R{XPeQniMwgegPf}{feZdWW0^IUm$ib6L@|k&lFNT zNq8HgpD3EjU*8LeNB=^hFD9RW-metpP~|s3%fX_DKdlvs_&q0&P{r1!+t2GJg<_cX z^c^RbJ3nn6j78FHM3S{)8n?uQ+A>jY$Lj^-QW~o>PH0DK?KFr+QItztoX7(B>=OT% zuDYno?z$*kF5j;nYAhbw_4H7<{$w{(z<@neHgU_szHbURr0Ip(X zBlKOoQ!e`X=LJ05T&gwif+mJ(YQComh10iXFLwI2?1k>&C^_KX=Y+G74@`>p!FnD= z*KyNuNPuEx+m?MQcFAnpvN1!3$qT)}f*o+BTn~a5A_X)H+O}+do5O6|vj3q?V!(nn zz?H(Oe*qx?&@AYeve)`pqy%I?s!ecCn7xIfH6)lRpjl8+vhN3r+5Ba{s!gywko_7( zNP5vPoGw6?E}FmW_q6V1Fn^ySB*^F&WF%{35Z$$G*=Tc23zUWIFDSZ^Bu@!2^s~RB z5N9>f&y^8oL$rsYo2Y{F5&goOaB&va-XYmnNXwS}9TZZl@NYX_CwvAQBpp|3HGhE+ zpk~Rb0824ht0ZnN1*elYIgBYN;HEvQ`;=gcYQVNLTtM2b>`QztTlPgxt0gD&Q+jKI zA>at32%#ChbAo`)ai?zCvM+FWq-C2jSQ}xDW6BVU5YN#&D+FwwhYTKEam!xq@Q5=_ z8LN#N!4pdn{b=WM0criRAI5B$t>2U+t#%G9;li%eIvQOnz(ZoJrE*?7uLcBe{U%-Q zn|mg)OWeWuU_cKc@H|1pzG!g3)^Ex@4rCU`@DSl;jID*D2K?F;BoOf6V}d3vQ^M2vI+@A0@gFb(uakHzgO3smvl*STN^c$~@KY|QsF8!Ao9?P| z5^DCt?vU(<#04L)U-05BU}|G_u|=K@+>B0HPyX4YM#78UwHBM)Kv5Ha-6|k4vyWyp z8>hv-qsB>hLS>vp1rteXGwB{D;H{Zcm`GCR@Yf##Mwg^J(vTo^sjoBnCyHq|s`Zpl zDVhu3-6;YFxnDzi=o{US{CCaN0CJ4il?v~P-hGmQLGIU;#&u6VwXbHv!s%3`2p8`( zjo!Ucz#!MHX-E*-Y~MV0nwF_(I83H@KpsQUeDWgA0St28nT7=M({J8`*qI#dt-z6xtQ|A)?$ADwokwsHW= z1dx&Z*`ESCUpd~X?=?Epsb`R9At_c6uEns=qzFxS^hXF006lx^*%bN$bS^~aP_&pT zj}qiXm{Y;xO0CE5ooExHcdpxKXPR;?hAGLg`_6RgZDd};E&VLO&NSr;7~>iKPMzsg ziEgj<$1aQ)j^;`|4z?d3F2GC6=E`38H$wgQJ*jz>IbcsZbte^>u8{sjAoV64+k%AsI;6KtJ=8VE@mN2zc-@K^Y^}hI68LnMil0o^PfGSd`?q>&>lPgAM;e5!!5$bt(6cb!je+i9!^np`P zF%M3swqaTvIZ>U%qv8p**vv$VP-w%W5C#CFC-Lh8?XOHZA=a5ZPcvcKrZK^+M#&D3 zx>vv;_v-_Xz?-&wZq=Dw!rsTU4dn1{Yc=Y8c+?&NgWRtVOxOqc-xSlJFp!^25i`u7 zXaR%VuMZ4H8`s^)CCGhDMIe_TN5u~xL|+~>&mi~f1B1Wqo*d1Gwc5vY5y)?+=y>un z&knjJT~g^Z32UD_;iA^Ge`w8z{5!R@p6FsiF@R2;n)9;tE>|e0Axx~*$hF~vSONxp zj>O~F2c{hhb{6_h>~^roi_WKgL>_wPAm*{bM_||=Q?!h~jul{anf57#z5vBV=V_l& z)JB!@gbdO9g2FlYJ#YZwn0@wvX%>cw8+`V)LYaFgnNQ@F7)^s0vJaf}D~uP?*l&e0 zSEAde-PRG3dlU(l)Ak$zd@)%1z^U1P)fHaPt1smxO94BFpbrxVQOAAX%+F1rY0 zYgiu5Wf#%Dj@w3a4N$b~1anJ3WOjnN$Qq`}b6`P)TJ5)zV7q{3K_{5o1Qv6tF!xMt zf-4)jXHkTp3@by$0B9EUaJg+@F?+b&Rm!CNP_SH15#l(k96kXcOXnVLYBn4{m$l!} z9Ssp{e>*CBSb4I58iaj?ciLyp&Umlz=H92xux6QiKSjtKVdZF#0K(K=H<-IcTi|+i zZU;rkHDTrF3NQ|HAE$6NewU^YrbF}uMR!q!j#PeSdU{BYXlH@m34%X;fj-u=Qs31A zeJ(OE4%^q>5cmqGYblT6Ozo8_0vgC%)E`$0_9*%l9De|GxsTsyO`MzNeycTCI(%XOW6B+zu$%7kh8?;z zzXkf~$X4dY9tSHt)5Ry%qhEPPK(R9Frt{t~GwP;~(k5SnC5ED>NU&ExvmolG4|W`N zNR2ej(B zi2&%0(@&>x6Mny(K$r^A85F%h6=aL(S06ycgU9dKx= zIn$9&t<~&-`{D?N_dN*%$8K4xS-|_AEZ}i|WGYj07Br>D@o8SH4yxDrZ*`o1`Ykxb zzBrUPp8mMr+9jYx;908&a@!akK+%f#Zvv6>{x`J=7UHIFr3fw?-WLZ8pjqhs&-wh; z_WqBx2`-gQ|AeAJB=}N5v(Wpwq~fVuw)e{!j@KmI0*jpC3!9drkd*cn5T83SVb-HxL;{R{ z=`f7^KNPX|dFcoNPYCQ)nlJtvn!jt!flkwvHv-4Q=j(n=SN`GJ3}Kg#ExA(u$;~0` z0QNTX5timqqM#Y3H3NrT{$WnoB>jSGB<{(%SXy`rQE|!BkBOk$ryF{{%=pu zPt+!ey8I-H?j-@D4xm{Ob@|?xr+b>N{OQ^RQJ0@b(S0P~ae2uv>QHv@ax-0a@@Hxj zL|uLzML5lfehJPA&|^XD=JVvuEIav&waG59ETL#U3BDB|OBb=5k2GZHz8nm5q#;)d zP9CFQ4i%6=bQf{?=V^=KAUU6+jkJ#!V8rELNa0QRZQla16{3qM+C&xU!=@nOdaQAp zE>FPyl}%T`fXm0L+sjhthQA!yU}6O#|(#6v=QJIeBDjv(ho!;$L$;@9@|zj?MLE;KAo60Z>ru1VBN6m*y3ms5w3b?Q)6`Tw#1W6F|EQ(tm;fOY;hls7#Z-U^$jF+Dw9M0nGx}E#NEj%*0)QI$@ergGIWghe+YBStiQ1B8(kCFtV z1PD`rAaGu=SMatrKrJiy7e#33!YW@EkZrw7Avx_;Eu5Ygyhjnbys*kQ2s;o1y|R7x zqB>FVXLntA#@u@^YQPvMJd`m|*vpB5LgarJUk4cd+Vh0(IzkGOB3vok_zM{jV8=iq z@~Nr$HZ%`any&{rT~|RI4u~(?`*mG~1GO1)OCipXT`AkKxz`5?c(yrMYoc{79HKSH zD}Qj}u5f@8cZElF>beRiYKjS9ji=}>ZaQB;v9j(IMq`)Ex>J~=O&Y*5jUsqW^y_F~ z0Gb71SC|SGbAh?AMw^@smKhYm(V}0!R6w(!?i3dKSmb2CuvMGjYIWg4irygsTd&vg zUSH!5zrhIJ!UnLI!CQEmHhBgtr&9#~j((j!^7>Y?bP>FT=rm1TWV6BxDMBnnzy5Cl z8ALZBS9rBDc%vscuA%6Cn7?tP07I_uS_)slZ+lq_3Ayk(iawyqQG{ah=96yuSY!j<7EbrRgffOqv{MR|_#|)@l^|@Q6JEidLNe4G<~k|3;bc<1&TcQiL8M zydT?!etvH+qVs>`b6cr7MM2tRSVu_F0ThiVfl!UpW1;i^xgdv-{=fND?w^k$9g!j8rKnBr` z^B1LSgFC>HK@pNuc)!g8bpE0&3enPeR<&@2u4pnv2~8V3B}kf%_L-@-}Sn)6pST!G_ltHj$I-gtWrX<>CHiee;^ zQTUOlBgIH2)@t}<_>l(+czpj&r5TBPJ&Lz#%}8}jy}tjd*Y{t>5%z_lG+f09GIMK3 zf);*ntwscdABnaBplHSUKLn9-{=M1+mv)PPrzo2Qhzx*cq4R&|b6cr6C5LO1mX45; zBPfEeg&%pMfM$X7mjwG*#Q95bR%V)90G1&XO(g+55TIG${3YRFF`d5zyKb7?1s3U; za!9~#=g7@u>B9L-q*?Om;@P4SX_ltZ5~THj4sJN{pSOl7qr zNrcTrl!nd3J=rD5R8~7;K5XVj0o(sePSKiJGATJ#Yd)tAtKu75pRl?R0nGycFIf#1Gx?Wn z(k78$d4QrHNPu=9pjqg-{{V~f+~>4OGFYT#VoO^GcLI>5v*+fq<0{!kbDwT4MB6F) zk(Mn2Y7lnERTAawjQ7f7$*0;37k)}Uqv$7+Tp}P$0b;=W!j2M*#I(2xBp8X+{xj`2 z2uKj%x7GeJe%HvPEf?P; zWSSihrbLRuxVaMqJljMYXlhnMGev9aR~kBDSBm!A4!cskN5rq?Dn-gNH}-e1B4xQ! z`*7211(cI9>PmU@lNoiTjoM@bSY}hymjq7;Xck0WX{F<+o-2!`*j>|PJ6M)c6i$MV z1T+h(PAN~`Jh3ZPr*wrj`2{TJQWOD#fAtX1EQsAwp1GN^TY9xNISMS-P}GkE#|V(6 zi`Xqi8ZvcLV7`u`NLnKF0Wyg0BChm4Z7~xh_fv%KKKfsa1sHLq2tHRT_iQ^#ee_$n zZL}0|=1M(^DoY5bA>s~w*3)z475;VS`M!_~*maf4<7A~D!lmVguG06B8CD#Cq)`7B zU>5E^D&;EEieUZ<5`Zpua);8a{{*6)TC=Y@tX}u`K2BB|;Bm6jpEU;>^im`$YXwWi ztT6(LR{Y=pak8?5wMkY-NLeq64kQ8M37}c%|Nf7YmG##q&0xW)thEA%Hf+{X0nGx> zE#u>4rstO7)XX$F7cAHhYsEn%xI%y|0X&!Yvy>stn7X$?gfwHV=t)a>8bA%gt~zC7 zF${g4U&gMxielMaL5Ze|FJ{HHuEa2q?qTyf|v-I}yM;}S6-=x6B;4(>ABeCgsS^3@#Q$EI^E4u@` zWEP#WXUO6+IT|d_QpD{1Zk&K-LC}>w3>LH1D|=g;OasfmC_0t|l>(XtMW>ACZ)VXc z`$C&601HmuT&d9{I7vXWFmyiziwfPn+Ta6en+0SL-2_}Ys-$V~3OG>mT&c(^(eHjJzspdg0Lwgl85?3z=41%{z(PB~g8)2t7e z&@x#o29N|P6(CIAg}@eVkOYnniU!hrx`2eh;}rS|44y|TN2_bCh@wg!p#~w)JKFPJ zDZC(F-p=_~mYl!=@C{2&`5tcoe91sfM2x=gA{>K(e??Iee=%ddAMFW%ueBz3@f)p~ z=#-rDe#+DR&T}fTC36Gi9U&D#6eV+WOtbG-+S{x^>t||W`YX_knVR#JGdMw4VL2tI z{P#{Jrvg!7QXoNBND4!56aD@<0*aL-r{XZ|l38*pFgdPNp9${%su)F4DhbvJXcoj= z#UQYFiiNDMRY2P`c?c|%C;~*kj}ivZEGRh@<9sY~o>Nh%O>p;DMG-}5B=}rFvmkOS zCWFO{+=>Qm@;g`>DM|;y2ZsodrHja|Sfq8MV2-@xO3k1prUoE`=qBDOPSysvAHU)h ziZW@A<{7|vt2m9qG5BrQmv10Cog(D(=nqN=v)JQZ%2(n}&X&8#^8UhG_kCq2V53)o z&p=_qZ--aQsZPbM$PMl9AuY_n+=k7-h2x6bD0-j2<_kcVJ9>xKEQIJzt$C_Cvfc<- z=R`oo%{b0}WvAjX&2buNAE)R8Zu=?$MJpk&5kx8k-q0p@g5^z$J|w||0-A*(@T|{y z?GX4#o4f=T^qp4w4ida0pjqg=|MGXU4_6m?Cfb;THrxKaQ(5*#w zt3;-;+IPXSc7T8ygk5$j_*jI*vv+~565WJph9{~k(M?$GyGa871PD`rFz_z0@fJMO z0t-Bq!zjXBh1IqQ&^;@+tSbVBHnj%b~XU%On;vno2-)&@082s6#$6R6y7zCA- z41&sXCkQG_5wIyZGSS=qL3k5mFQe#p{@NyB2SH_p*4zxuO0BuuDLoaZt7+fz53X67XzufzsUe5j0!1X5cl3%DGP9RpJF_erG$CXJ`s6F;t!j zQL4pFGoNiAquh*fSGf$kWX4_PW!eNw43+4*T&XS+FiURlyu?t+cRiY=r}AcPf+dE^ zTPTugSW1?qdMqeCmDl)Kr1Vs7)FxPBsN6)+0VKFWK(iovEAIr0S$ZnvWX)%CJ6N70 z3&JvbJNN)(=_-1+YF%6}sDuN#QW3(@+qVnIAi9mYo!a6HknE!9K-$w!x9^phLkybN zFmcVJ65(d9x*dX;3;o%1x>N9%UDz={lNzwwtLn{=t2zQMEp?~rFyw|6#~?Q}p;(7C zUD***bvQ-G^4HY@w)>09%~V*^Qv!;X{$Di!M5g~&p*b~8-UbVLM{5O|jIgFp1T+ikPSqH&nEqdtr%nC? z7M$@}D`G&<+*3faz;mlIz+!rCRh>4$-APsT6pbbUcdI#?ES){KfTufENHeDHB#4k^ ztQE)wVa?M8)FAA-Q^_?QU3aQZ)n@fzLYHK%7)z4l1ca%(7^pg5TeO4Z0*Yd3f0Y1Z zpz0zDqww24xtRgc#T1RB3LUBW7Q{fGA3f(gP7M6%MaOuLZr}*mED`XaHv%L#;V?&k zcsyY>2L1qpw}8K{6Yxa9LlpZo&xGb?t$Bx2bSih@aQIx^ujo|0sLh@R(@PW;a&yRh z0M9mG(VA$es$SKa_A;sS!gX)d;bR@1sKZyI{fbT%IuCPWI6J6f4ok%;LiC6K7EnGW zLC5dXsG$2%ne6BZmY*nMz1a~VpjjAnUpRj1xvo=vkT!|#2&qP>x%h?f=p8%{-I1tS zP;{z{kJ3odsg~0KnAlgNRz*Vf(H6(anK(o;O`Q`!T{ybGPOuhrlR*Dcm;RDc+0?5*p`{VS? z)D46APKs)2IY>YT(XIRM(H0Xx@-;;>X^+?di2Hv_A)Up(bq1$r)!$Ks>Ki@)0TVu; zj6K)os5hgs3JS~qyf28w?#CCzYVg+J%^@|Bj?dR19a?L9;hSa$!ucW�@kx{U|zw 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ⅈy2k)5YU?T{l-VrK)rB=w-Tc~)Peb2(!v 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�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

T0vav`W-5HmyYd8kLSI2e1}j_n}?g#U1jX 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ΜGCLOI31m5m(*iIHcpln_U$*!|j|5eB8DZB_? zMhy}KuI_W`T-H5-FQ3k3Bh|WQIr24*!i(vqS`ZCSL@Kkfh`UNEf@g0=;UzTMP_QP> zmG!AER8T_jIal_dthrW$>|H6mlQBHEeJAh_JLOW42=YcMy%@!DlQ^CUF}` z@^>7C$a~qNz7rVAG<0$FLP++hMzgKI%uk~b88W*K^ALd3cRAP4=MoBL*@&E27ua8R zTLGb7UM`^U8XmU^yztG&tai`!S?OYO#=5Sh+602WB4apL)=G{;7>>xyZrv*DnQpQP zygWmWm8BEpRa);CLei4uAuX;KLQ;S8j{13iQ~&4vKU*IzkCLj_nc#(x)Sq#!y%$2V z@uN)tpYNb&D+A8qh+r_Y+pgDGea^80z0Yo2F3`1M#OU11x_i73lKln8uD9=?4^xJU ze2J6|!|EFAnhW3U!vuVcpMMWrtOr}n-mVWXgk<9b^G-3{sqhVJwSB1OnGeIQX{>7= z`!rb)1l6#1{$Vy`ZGRygD(%q}&ZpuO!tvhx8#adGXsT`Le`Jntgjg!~|Nl*!^?4&? z*uLK68n!p5kN50x*q-d`>F9k6u1R)_;%XQOXsqiD9ybcYQ4sZuw6in{`&#XZW_k0- z+_3N&bNHFJVIU)JBOA*X_(iO1Ivd?VV120uHSFM!fCXf3SeG^1U%t+w@JzZnN??77 z%nidw76X#$uW!SUQeCsN>jJEH%y1YF4l!xx9pZT1lEHkbHg6D$|63)o}iFCuH}1y@et*m@QsjR zAPJ5^tM=Lsdx=7D=Iqwt0(n_CnH%<&wQJO{yiMV`^s}kJbSWTn-geYspITj&NroX; z#k$U;?S2A38b$n0fW+f%{nVJ!-uYD9pKv61C;V^X#(EvZiP7Khbr5V)2w%is_h#~( z94}OJvZGMV8Orl(LU*eM5Sn-*Iaw4o^SDJ2glY~FtE(+Ol#^q%6TSn^pPx$385D(t zUzN(KvSyRiG8k2?OO5WtmUlAO%e(K&DGYrDp_+sHWY_E<`5H?h5^{Fcu>$K$p_;?b zZ~OOyeyHYbZOz2CbGD&y6y1;Jh3rNb9cI0`*JTk=&vR_fG)hDK zuwulzBIOt50SiN{3yVi~)xQMRgALUjoV=^7eZV=#Q8=2${}mVyZm9bEiE@yi9fRsL z^#j>F*3|(A)kOk%={;0A3x=`K5B}53>mWIoSyy`Al%uSPg)h4r;}0;s45HV&70a1R z2a)dH>fk&IF*&lU4-t6Ln{yq-BOw|29zjnRa;~Qkb0)j`P{N6P9ppj(WsrpEUFQ

VUy){$aBjWxo=WfLO1mS<0}YZf9cCb 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

e|b8qma_RV8c%l-cZMXiBDU_BhU~)(4nwoH)@R> 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 z k_{;mHnz8ZcSJ@1`uzba1qIGuO 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�W4Yd`Ds}*| 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�i}la7R1z0SHvs4&T_ZmRU8BebE;65V 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

{-XA!!_24ZwAFL*@=7hhhc4DDeg%CQ_Tr8n1y! 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 z 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 z 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

UZ?O_-3ND$#Guj%NCJfjg(l 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

2n9+gUPM^!^dj4IAA8q}P)g~2 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 z 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

k50=^RZCY@oiQ3yjkJR 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%0Dc+b3)4rQ3_TQ`+=zkV1L@VsjXX`jYuiGc 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ℜ1emffRR2`_Edn} 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 z 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�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 &YxWP5HLkMfQy$sjP1+vOlcFUfi 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≪1ec8grCu!vFbLknO6JE-|L#w? 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%0D{w-C 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 H#= 0 && n <= 14; - - case n of // Select index by mode: usr fiq irq svc abt und hyp - when 8 result = RBankSelect(mode, 8, 24, 8, 8, 8, 8, 8); - when 9 result = RBankSelect(mode, 9, 25, 9, 9, 9, 9, 9); - when 10 result = RBankSelect(mode, 10, 26, 10, 10, 10, 10, 10); - when 11 result = RBankSelect(mode, 11, 27, 11, 11, 11, 11, 11); - when 12 result = RBankSelect(mode, 12, 28, 12, 12, 12, 12, 12); - when 13 result = RBankSelect(mode, 13, 29, 17, 19, 21, 23, 15); - when 14 result = RBankSelect(mode, 14, 30, 16, 18, 20, 22, 14); - otherwise result = n; - - return result; - -enumeration Unpredictable {// Writeback/transfer register overlap (load) - Unpredictable_WBOVERLAPLD, - // Writeback/transfer register overlap (store) - Unpredictable_WBOVERLAPST, - // Load Pair transfer register overlap - Unpredictable_LDPOVERLAP, - // Store-exclusive base/status register overlap - Unpredictable_BASEOVERLAP, - // Store-exclusive data/status register overlap - Unpredictable_DATAOVERLAP, - // Load-store alignment checks - Unpredictable_DEVPAGE2, - // Instruction fetch from Device memory - Unpredictable_INSTRDEVICE, - // Reserved CPACR value - Unpredictable_RESCPACR, - // Reserved MAIR value - Unpredictable_RESMAIR, - // Reserved TEX:C:B value - Unpredictable_RESTEXCB, - // Reserved PRRR value - Unpredictable_RESPRRR, - // Reserved DACR field - Unpredictable_RESDACR, - // Reserved VTCR.S value - Unpredictable_RESVTCRS, - // Reserved TCR.TnSZ value - Unpredictable_RESTnSZ, - // Reserved SCTLR_ELx.TCF value - Unpredictable_RESTCF, - // Out-of-range TCR.TnSZ value - Unpredictable_OORTnSZ, - // IPA size exceeds PA size - Unpredictable_LARGEIPA, - // Syndrome for a known-passing conditional A32 instruction - Unpredictable_ESRCONDPASS, - // Illegal State exception: zero PSTATE.IT - Unpredictable_ILZEROIT, - // Illegal State exception: zero PSTATE.T - Unpredictable_ILZEROT, - // Debug: prioritization of Vector Catch - Unpredictable_BPVECTORCATCHPRI, - // Debug Vector Catch: match on 2nd halfword - Unpredictable_VCMATCHHALF, - // Debug Vector Catch: match on Data Abort or Prefetch abort - Unpredictable_VCMATCHDAPA, - // Debug watchpoints: non-zero MASK and non-ones BAS - Unpredictable_WPMASKANDBAS, - // Debug watchpoints: non-contiguous BAS - Unpredictable_WPBASCONTIGUOUS, - // Debug watchpoints: reserved MASK - Unpredictable_RESWPMASK, - // Debug watchpoints: non-zero MASKed bits of address - Unpredictable_WPMASKEDBITS, - // Debug breakpoints and watchpoints: reserved control bits - Unpredictable_RESBPWPCTRL, - // Debug breakpoints: not implemented - Unpredictable_BPNOTIMPL, - // Debug breakpoints: reserved type1 - Unpredictable_RESBPTYPE, - // Debug breakpoints: not-context-aware breakpoint - Unpredictable_BPNOTCTXCMP, - // Debug breakpoints: match on 2nd halfword of instruction - Unpredictable_BPMATCHHALF, - // Debug breakpoints: mismatch on 2nd halfword of instruction - Unpredictable_BPMISMATCHHALF, - // Debug: restart to a misaligned AArch32 PC value - Unpredictable_RESTARTALIGNPC, - // Debug: restart to a not-zero-extended AArch32 PC value - Unpredictable_RESTARTZEROUPPERPC, - // Zero top 32 bits of X registers in AArch32 state - Unpredictable_ZEROUPPER, - // Zero top 32 bits of PC on illegal return to AArch32 state - Unpredictable_ERETZEROUPPERPC, - // Force address to be aligned when interworking branch to A32 state - Unpredictable_A32FORCEALIGNPC, - // SMC disabled - Unpredictable_SMD, - // FF speculation - Unpredictable_NONFAULT, - // Zero top bits of Z registers in EL change - Unpredictable_SVEZEROUPPER, - // Load mem data in NF loads - Unpredictable_SVELDNFDATA, - // Write zeros in NF loads - Unpredictable_SVELDNFZERO, - // Access Flag Update by HW - Unpredictable_AFUPDATE, - // Consider SCTLR[].IESB in Debug state - Unpredictable_IESBinDebug, - // Bad settings for PMSFCR_EL1/PMSEVFR_EL1/PMSLATFR_EL1 - Unpredictable_BADPMSFCR, - // Zero saved BType value in SPSR_ELx/DPSR_EL0 - Unpredictable_ZEROBTYPE, - // Timestamp constrained to virtual or physical - Unpredictable_EL2TIMESTAMP, - Unpredictable_EL1TIMESTAMP, - // Clearing DCC/ITR sticky flags when instruction is in flight - Unpredictable_CLEARERRITEZERO}; - -array bits(64) _R[0..30]; - -// Rmode[] - non-assignment form -// ============================= - -bits(32) Rmode[integer n, bits(5) mode] - assert n >= 0 && n <= 14; - - // Check for attempted use of Monitor mode in Non-secure state. - if !IsSecure() then assert mode != M32_Monitor; - assert !BadMode(mode); - - if mode == M32_Monitor then - if n == 13 then return SP_mon; - elsif n == 14 then return LR_mon; - else return _R[n][31:0]; - else - return _R[LookUpRIndex(n, mode)][31:0]; - -// Rmode[] - assignment form -// ========================= - -Rmode[integer n, bits(5) mode] = bits(32) value - assert n >= 0 && n <= 14; - - // Check for attempted use of Monitor mode in Non-secure state. - if !IsSecure() then assert mode != M32_Monitor; - assert !BadMode(mode); - - if mode == M32_Monitor then - if n == 13 then SP_mon = value; - elsif n == 14 then LR_mon = value; - else _R[n][31:0] = value; - else - // It is CONSTRAINED UNPREDICTABLE whether the upper 32 bits of the X - // register are unchanged or set to zero. This is also tested for on - // exception entry, as this applies to all AArch32 registers. - if !HighestELUsingAArch32() && ConstrainUnpredictableBool(Unpredictable_ZEROUPPER) then - _R[LookUpRIndex(n, mode)] = ZeroExtend(value); - else - _R[LookUpRIndex(n, mode)][31:0] = value; - - return; - -// R[] - assignment form -// ===================== - -R[integer n] = bits(32) value - Rmode[n, PSTATE.M] = value; - return; - -// R[] - non-assignment form -// ========================= - -bits(32) R[integer n] - if n == 15 then - offset = (if CurrentInstrSet() == InstrSet_A32 then 8 else 4); - return _PC[31:0] + offset; - else - return Rmode[n, PSTATE.M]; - -// SP - assignment form -// ==================== - -SP = bits(32) value - R[13] = value; - return; - -// SP - non-assignment form -// ======================== - -bits(32) SP - return R[13]; - -type ProcState is ( - bits (1) N, // Negative condition flag - bits (1) Z, // Zero condition flag - bits (1) C, // Carry condition flag - bits (1) V, // oVerflow condition flag - bits (1) D, // Debug mask bit [AArch64 only] - bits (1) A, // SError interrupt mask bit - bits (1) I, // IRQ mask bit - bits (1) F, // FIQ mask bit - bits (1) PAN, // Privileged Access Never Bit [v8.1] - bits (1) UAO, // User Access Override [v8.2] - bits (1) DIT, // Data Independent Timing [v8.4] - bits (1) TCO, // Tag Check Override [v8.5, AArch64 only] - bits (2) BTYPE, // Branch Type [v8.5] - bits (1) SS, // Software step bit - bits (1) IL, // Illegal Execution state bit - bits (2) EL, // Exception Level - bits (1) nRW, // not Register Width: 0=64, 1=32 - bits (1) SP, // Stack pointer select: 0=SP0, 1=SPx [AArch64 only] - bits (1) Q, // Cumulative saturation flag [AArch32 only] - bits (4) GE, // Greater than or Equal flags [AArch32 only] - bits (1) SSBS, // Speculative Store Bypass Safe - bits (8) IT, // If-then bits, RES0 in CPSR [AArch32 only] - bits (1) J, // J bit, RES0 [AArch32 only, RES0 in SPSR and CPSR] - bits (1) T, // T32 bit, RES0 in CPSR [AArch32 only] - bits (1) E, // Endianness bit [AArch32 only] - bits (5) M // Mode field [AArch32 only] -) - -ProcState PSTATE; - -// ConstrainUnpredictable() -// ======================== -// Return the appropriate Constraint result to control the caller's behavior. The return value -// is IMPLEMENTATION DEFINED within a permitted list for each UNPREDICTABLE case. -// (The permitted list is determined by an assert or case statement at the call site.) - -// NOTE: This version of the function uses an Unpredictable argument to define the call site. -// This argument does not appear in the version used in the Armv8 Architecture Reference Manual. -// The extra argument is used here to allow this example definition. This is an example only and -// does not imply a fixed implementation of these behaviors. Indeed the intention is that it should -// be defined by each implementation, according to its implementation choices. - -Constraint ConstrainUnpredictable(Unpredictable which) - case which of - when Unpredictable_WBOVERLAPLD - return Constraint_WBSUPPRESS; // return loaded value - when Unpredictable_WBOVERLAPST - return Constraint_NONE; // store pre-writeback value - when Unpredictable_LDPOVERLAP - return Constraint_UNDEF; // instruction is UNDEFINED - when Unpredictable_BASEOVERLAP - return Constraint_NONE; // use original address - when Unpredictable_DATAOVERLAP - return Constraint_NONE; // store original value - when Unpredictable_DEVPAGE2 - return Constraint_FAULT; // take an alignment fault - when Unpredictable_INSTRDEVICE - return Constraint_NONE; // Do not take a fault - when Unpredictable_RESCPACR - return Constraint_TRUE; // Map to UNKNOWN value - when Unpredictable_RESMAIR - return Constraint_UNKNOWN; // Map to UNKNOWN value - when Unpredictable_RESTEXCB - return Constraint_UNKNOWN; // Map to UNKNOWN value - when Unpredictable_RESDACR - return Constraint_UNKNOWN; // Map to UNKNOWN value - when Unpredictable_RESPRRR - return Constraint_UNKNOWN; // Map to UNKNOWN value - when Unpredictable_RESVTCRS - return Constraint_UNKNOWN; // Map to UNKNOWN value - when Unpredictable_RESTnSZ - return Constraint_FORCE; // Map to the limit value - when Unpredictable_OORTnSZ - return Constraint_FORCE; // Map to the limit value - when Unpredictable_LARGEIPA - return Constraint_FORCE; // Restrict the inputsize to the PAMax value - when Unpredictable_ESRCONDPASS - return Constraint_FALSE; // Report as "AL" - when Unpredictable_ILZEROIT - return Constraint_FALSE; // Do not zero PSTATE.IT - when Unpredictable_ILZEROT - return Constraint_FALSE; // Do not zero PSTATE.T - when Unpredictable_BPVECTORCATCHPRI - return Constraint_TRUE; // Debug Vector Catch: match on 2nd halfword - when Unpredictable_VCMATCHHALF - return Constraint_FALSE; // No match - when Unpredictable_VCMATCHDAPA - return Constraint_FALSE; // No match on Data Abort or Prefetch abort - when Unpredictable_WPMASKANDBAS - return Constraint_FALSE; // Watchpoint disabled - when Unpredictable_WPBASCONTIGUOUS - return Constraint_FALSE; // Watchpoint disabled - when Unpredictable_RESWPMASK - return Constraint_DISABLED; // Watchpoint disabled - when Unpredictable_WPMASKEDBITS - return Constraint_FALSE; // Watchpoint disabled - when Unpredictable_RESBPWPCTRL - return Constraint_DISABLED; // Breakpoint/watchpoint disabled - when Unpredictable_BPNOTIMPL - return Constraint_DISABLED; // Breakpoint disabled - when Unpredictable_RESBPTYPE - return Constraint_DISABLED; // Breakpoint disabled - when Unpredictable_BPNOTCTXCMP - return Constraint_DISABLED; // Breakpoint disabled - when Unpredictable_BPMATCHHALF - return Constraint_FALSE; // No match - when Unpredictable_BPMISMATCHHALF - return Constraint_FALSE; // No match - when Unpredictable_RESTARTALIGNPC - return Constraint_FALSE; // Do not force alignment - when Unpredictable_RESTARTZEROUPPERPC - return Constraint_TRUE; // Force zero extension - when Unpredictable_ZEROUPPER - return Constraint_TRUE; // zero top halves of X registers - when Unpredictable_ERETZEROUPPERPC - return Constraint_TRUE; // zero top half of PC - when Unpredictable_A32FORCEALIGNPC - return Constraint_FALSE; // Do not force alignment - when Unpredictable_SMD - return Constraint_UNDEF; // disabled SMC is Unallocated - when Unpredictable_NONFAULT - return Constraint_FALSE; // Speculation enabled - when Unpredictable_SVEZEROUPPER - return Constraint_TRUE; // zero top bits of Z registers - when Unpredictable_SVELDNFDATA - return Constraint_TRUE; // Load mem data in NF loads - when Unpredictable_SVELDNFZERO - return Constraint_TRUE; // Write zeros in NF loads - when Unpredictable_AFUPDATE // AF update for alignment or permission fault - return Constraint_TRUE; - when Unpredictable_IESBinDebug // Use SCTLR[].IESB in Debug state - return Constraint_TRUE; - when Unpredictable_BADPMSFCR // Bad settings for PMSFCR_EL1/PMSEVFR_EL1/PMSLATFR_EL1 - return Constraint_TRUE; - when Unpredictable_ZEROBTYPE - return Constraint_TRUE; // Save BTYPE in SPSR_ELx/DPSR_EL0 as '00' - when Unpredictable_CLEARERRITEZERO // Clearing sticky errors when instruction in flight - return Constraint_FALSE; - -// ConstrainUnpredictableBool() -// ============================ - -// This is a simple wrapper function for cases where the constrained result is either TRUE or FALSE. - -// NOTE: This version of the function uses an Unpredictable argument to define the call site. -// This argument does not appear in the version used in the Armv8 Architecture Reference Manual. -// See the NOTE on ConstrainUnpredictable() for more information. - -boolean ConstrainUnpredictableBool(Unpredictable which) - - c = ConstrainUnpredictable(which); - assert c IN {Constraint_TRUE, Constraint_FALSE}; - return (c == Constraint_TRUE); - -// HaveVirtHostExt() -// ================= - -boolean HaveVirtHostExt() - return HasArchVersion(ARMv8p1); - -// ELStateUsingAArch32K() -// ====================== - -(boolean,boolean) ELStateUsingAArch32K(bits(2) el, boolean secure) - // Returns (known, aarch32): - // 'known' is FALSE for EL0 if the current Exception level is not EL0 and EL1 is - // using AArch64, since it cannot determine the state of EL0; TRUE otherwise. - // 'aarch32' is TRUE if the specified Exception level is using AArch32; FALSE otherwise. - if !HaveAArch32EL(el) then - return (TRUE, FALSE); // Exception level is using AArch64 - elsif secure && el == EL2 then - return (TRUE, FALSE); // Secure EL2 is using AArch64 - elsif HighestELUsingAArch32() then - return (TRUE, TRUE); // Highest Exception level, and therefore all levels are using AArch32 - elsif el == HighestEL() then - return (TRUE, FALSE); // This is highest Exception level, so is using AArch64 - - // Remainder of function deals with the interprocessing cases when highest Exception level is using AArch64 - - boolean aarch32 = boolean UNKNOWN; - boolean known = TRUE; - - aarch32_below_el3 = HaveEL(EL3) && SCR_EL3.RW == '0' && (!secure || !HaveSecureEL2Ext() || SCR_EL3.EEL2 == '0'); - aarch32_at_el1 = (aarch32_below_el3 || (HaveEL(EL2) && - ((HaveSecureEL2Ext() && SCR_EL3.EEL2 == '1') || !secure) && HCR_EL2.RW == '0' && - !(HCR_EL2.E2H == '1' && HCR_EL2.TGE == '1' && HaveVirtHostExt()))); - if el == EL0 && !aarch32_at_el1 then // Only know if EL0 using AArch32 from PSTATE - if PSTATE.EL == EL0 then - aarch32 = PSTATE.nRW == '1'; // EL0 controlled by PSTATE - else - known = FALSE; // EL0 state is UNKNOWN - else - aarch32 = (aarch32_below_el3 && el != EL3) || (aarch32_at_el1 && el IN {EL1,EL0}); - - if !known then aarch32 = boolean UNKNOWN; - return (known, aarch32); - -// ELStateUsingAArch32() -// ===================== - -boolean ELStateUsingAArch32(bits(2) el, boolean secure) - // See ELStateUsingAArch32K() for description. Must only be called in circumstances where - // result is valid (typically, that means 'el IN {EL1,EL2,EL3}'). - (known, aarch32) = ELStateUsingAArch32K(el, secure); - assert known; - return aarch32; - -// ELUsingAArch32() -// ================ - -boolean ELUsingAArch32(bits(2) el) - return ELStateUsingAArch32(el, IsSecureBelowEL3()); - -// DebugTargetFrom() -// ================= - -bits(2) DebugTargetFrom(boolean secure) - if HaveEL(EL2) && (!secure || (HaveSecureEL2Ext() && - (!HaveEL(EL3) ||SCR_EL3.EEL2 == '1'))) then - if ELUsingAArch32(EL2) then - route_to_el2 = (HDCR.TDE == '1' || HCR.TGE == '1'); - else - route_to_el2 = (MDCR_EL2.TDE == '1' || HCR_EL2.TGE == '1'); - else - route_to_el2 = FALSE; - - if route_to_el2 then - target = EL2; - elsif HaveEL(EL3) && HighestELUsingAArch32() && secure then - target = EL3; - else - target = EL1; - - return target; - -// DebugTarget() -// ============= -// Returns the debug exception target Exception level - -bits(2) DebugTarget() - secure = IsSecure(); - return DebugTargetFrom(secure); - -// IsSecureEL2Enabled() -// ==================== -// Returns TRUE if Secure EL2 is enabled, FALSE otherwise. - -boolean IsSecureEL2Enabled() - if HaveEL(EL2) && HaveSecureEL2Ext() then - if HaveEL(EL3) then - if !ELUsingAArch32(EL3) && SCR_EL3.EEL2 == '1' then - return TRUE; - else - return FALSE; - else - return IsSecure(); - else - return FALSE; - -// ELIsInHost() -// ============ - -boolean ELIsInHost(bits(2) el) - return ((IsSecureEL2Enabled() || !IsSecureBelowEL3()) && HaveVirtHostExt() && !ELUsingAArch32(EL2) && - HCR_EL2.E2H == '1' && (el == EL2 || (el == EL0 && HCR_EL2.TGE == '1'))); - -// S1TranslationRegime() -// ===================== -// Stage 1 translation regime for the given Exception level - -bits(2) S1TranslationRegime(bits(2) el) - if el != EL0 then - return el; - elsif HaveEL(EL3) && ELUsingAArch32(EL3) && SCR.NS == '0' then - return EL3; - elsif HaveVirtHostExt() && ELIsInHost(el) then - return EL2; - else - return EL1; - -// S1TranslationRegime() -// ===================== -// Returns the Exception level controlling the current Stage 1 translation regime. For the most -// part this is unused in code because the system register accessors (SCTLR[], etc.) implicitly -// return the correct value. - -bits(2) S1TranslationRegime() - return S1TranslationRegime(PSTATE.EL); - -// VBAR[] - non-assignment form -// ============================ - -bits(64) VBAR[bits(2) regime] - bits(64) r; - case regime of - when EL1 r = VBAR_EL1; - when EL2 r = VBAR_EL2; - when EL3 r = VBAR_EL3; - otherwise Unreachable(); - return r; - -// VBAR[] - non-assignment form -// ============================ - -bits(64) VBAR[] - return VBAR[S1TranslationRegime()]; - -// ExcVectorBase() -// =============== - -bits(32) ExcVectorBase() - if SCTLR.V == '1' then // Hivecs selected, base = 0xFFFF0000 - return Ones(16):Zeros(16); - else - return VBAR[31:5]:Zeros(5); - -// AArch32.VCRMatch() -// ================== - -boolean AArch32.VCRMatch(bits(32) vaddress) - - if UsingAArch32() && ELUsingAArch32(EL1) && IsZero(vaddress[1:0]) && PSTATE.EL != EL2 then - // Each bit position in this string corresponds to a bit in DBGVCR and an exception vector. - match_word = Zeros(32); - - if vaddress[31:5] == ExcVectorBase()[31:5] then - if HaveEL(EL3) && !IsSecure() then - match_word[UInt(vaddress[4:2]) + 24] = '1'; // Non-secure vectors - else - match_word[UInt(vaddress[4:2]) + 0] = '1'; // Secure vectors (or no EL3) - - if HaveEL(EL3) && ELUsingAArch32(EL3) && IsSecure() && vaddress[31:5] == MVBAR[31:5] then - match_word[UInt(vaddress[4:2]) + 8] = '1'; // Monitor vectors - - // Mask out bits not corresponding to vectors. - if !HaveEL(EL3) then - mask = '00000000':'00000000':'00000000':'11011110'; // DBGVCR[31:8] are RES0 - elsif !ELUsingAArch32(EL3) then - mask = '11011110':'00000000':'00000000':'11011110'; // DBGVCR[15:8] are RES0 - else - mask = '11011110':'00000000':'11011100':'11011110'; - - match_word = match_word AND DBGVCR AND mask; - match = !IsZero(match_word); - - // Check for UNPREDICTABLE case - match on Prefetch Abort and Data Abort vectors - if !IsZero(match_word[28:27,12:11,4:3]) && DebugTarget() == PSTATE.EL then - match = ConstrainUnpredictableBool(Unpredictable_VCMATCHDAPA); - else - match = FALSE; - - return match; - -signal DBGEN; -signal NIDEN; -signal SPIDEN; -signal SPNIDEN; - -// AArch32.SelfHostedSecurePrivilegedInvasiveDebugEnabled() -// ======================================================== - -boolean AArch32.SelfHostedSecurePrivilegedInvasiveDebugEnabled() - // The definition of this function is IMPLEMENTATION DEFINED. - // In the recommended interface, AArch32.SelfHostedSecurePrivilegedInvasiveDebugEnabled returns - // the state of the (DBGEN AND SPIDEN) signal. - if !HaveEL(EL3) && !IsSecure() then return FALSE; - return DBGEN == HIGH && SPIDEN == HIGH; - -// ConstrainUnpredictableBits() -// ============================ - -// This is a variant of ConstrainUnpredictable for when the result can be Constraint_UNKNOWN. -// If the result is Constraint_UNKNOWN then the function also returns UNKNOWN value, but that -// value is always an allocated value; that is, one for which the behavior is not itself -// CONSTRAINED. - -// NOTE: This version of the function uses an Unpredictable argument to define the call site. -// This argument does not appear in the version used in the Armv8 Architecture Reference Manual. -// See the NOTE on ConstrainUnpredictable() for more information. - -// This is an example placeholder only and does not imply a fixed implementation of the bits part -// of the result, and may not be applicable in all cases. - -(Constraint,bits(width)) ConstrainUnpredictableBits(Unpredictable which) - - c = ConstrainUnpredictable(which); - - if c == Constraint_UNKNOWN then - return (c, Zeros(width)); // See notes; this is an example implementation only - else - return (c, bits(width) UNKNOWN); // bits result not used - -// ConstrainUnpredictableInteger() -// =============================== - -// This is a variant of ConstrainUnpredictable for when the result can be Constraint_UNKNOWN. If -// the result is Constraint_UNKNOWN then the function also returns an UNKNOWN value in the range -// low to high, inclusive. - -// NOTE: This version of the function uses an Unpredictable argument to define the call site. -// This argument does not appear in the version used in the Armv8 Architecture Reference Manual. -// See the NOTE on ConstrainUnpredictable() for more information. - -// This is an example placeholder only and does not imply a fixed implementation of the integer part -// of the result. - -(Constraint,integer) ConstrainUnpredictableInteger(integer low, integer high, Unpredictable which) - - c = ConstrainUnpredictable(which); - - if c == Constraint_UNKNOWN then - return (c, low); // See notes; this is an example implementation only - else - return (c, integer UNKNOWN); // integer result not used - -// EL2Enabled() -// ============ -// Returns TRUE if EL2 is present and executing -// - with SCR_EL3.NS==1 when Non-secure EL2 is implemented, or -// - with SCR_EL3.NS==0 when Secure EL2 is implemented and enabled, or -// - when EL3 is not implemented. - -boolean EL2Enabled() - return HaveEL(EL2) && (!HaveEL(EL3) || SCR_EL3.NS == '1' || IsSecureEL2Enabled()); - -// Halted() -// ======== - -boolean Halted() - return !(EDSCR.STATUS IN {'000001', '000010'}); // Halted - -// HaveDoubleLock() -// ================ -// Returns TRUE if support for the OS Double Lock is implemented. - -boolean HaveDoubleLock() - return !HasArchVersion(ARMv8p4) || boolean IMPLEMENTATION_DEFINED "OS Double Lock is implemented"; - -// DoubleLockStatus() -// ================== -// Returns the state of the OS Double Lock. -// FALSE if OSDLR_EL1.DLK == 0 or DBGPRCR_EL1.CORENPDRQ == 1 or the PE is in Debug state. -// TRUE if OSDLR_EL1.DLK == 1 and DBGPRCR_EL1.CORENPDRQ == 0 and the PE is in Non-debug state. - -boolean DoubleLockStatus() - if !HaveDoubleLock() then - return FALSE; - elsif ELUsingAArch32(EL1) then - return DBGOSDLR.DLK == '1' && DBGPRCR.CORENPDRQ == '0' && !Halted(); - else - return OSDLR_EL1.DLK == '1' && DBGPRCR_EL1.CORENPDRQ == '0' && !Halted(); - -// ExternalInvasiveDebugEnabled() -// ============================== -// The definition of this function is IMPLEMENTATION DEFINED. -// In the recommended interface, this function returns the state of the DBGEN signal. - -boolean ExternalInvasiveDebugEnabled() - return DBGEN == HIGH; - -// ExternalSecureInvasiveDebugEnabled() -// ==================================== -// The definition of this function is IMPLEMENTATION DEFINED. -// In the recommended interface, this function returns the state of the (DBGEN AND SPIDEN) signal. -// CoreSight allows asserting SPIDEN without also asserting DBGEN, but this is not recommended. - -boolean ExternalSecureInvasiveDebugEnabled() - if !HaveEL(EL3) && !IsSecure() then return FALSE; - return ExternalInvasiveDebugEnabled() && SPIDEN == HIGH; - -// HaltingAllowed() -// ================ -// Returns TRUE if halting is currently allowed, FALSE if halting is prohibited. - -boolean HaltingAllowed() - if Halted() || DoubleLockStatus() then - return FALSE; - elsif IsSecure() then - return ExternalSecureInvasiveDebugEnabled(); - else - return ExternalInvasiveDebugEnabled(); - -// HaltOnBreakpointOrWatchpoint() -// ============================== -// Returns TRUE if the Breakpoint and Watchpoint debug events should be considered for Debug -// state entry, FALSE if they should be considered for a debug exception. - -boolean HaltOnBreakpointOrWatchpoint() - return HaltingAllowed() && EDSCR.HDE == '1' && OSLSR_EL1.OSLK == '0'; - -// Have16bitVMID() -// =============== -// Returns TRUE if EL2 and support for a 16-bit VMID are implemented. - -boolean Have16bitVMID() - return HaveEL(EL2) && boolean IMPLEMENTATION_DEFINED; - -// AArch32.BreakpointValueMatch() -// ============================== -// The first result is whether an Address Match or Context breakpoint is programmed on the -// instruction at "address". The second result is whether an Address Mismatch breakpoint is -// programmed on the instruction, that is, whether the instruction should be stepped. - -(boolean,boolean) AArch32.BreakpointValueMatch(integer n, bits(32) vaddress, boolean linked_to) - - // "n" is the identity of the breakpoint unit to match against. - // "vaddress" is the current instruction address, ignored if linked_to is TRUE and for Context - // matching breakpoints. - // "linked_to" is TRUE if this is a call from StateMatch for linking. - - // If a non-existent breakpoint then it is CONSTRAINED UNPREDICTABLE whether this gives - // no match or the breakpoint is mapped to another UNKNOWN implemented breakpoint. - if n > UInt(DBGDIDR.BRPs) then - (c, n) = ConstrainUnpredictableInteger(0, UInt(DBGDIDR.BRPs), Unpredictable_BPNOTIMPL); - assert c IN {Constraint_DISABLED, Constraint_UNKNOWN}; - if c == Constraint_DISABLED then return (FALSE,FALSE); - - // If this breakpoint is not enabled, it cannot generate a match. (This could also happen on a - // call from StateMatch for linking). - if DBGBCR[n].E == '0' then return (FALSE,FALSE); - - context_aware = (n >= UInt(DBGDIDR.BRPs) - UInt(DBGDIDR.CTX_CMPs)); - - // If BT is set to a reserved type1, behaves either as disabled or as a not-reserved type1. - dbgtype = DBGBCR[n].BT; - - if ((dbgtype IN {'011x','11xx'} && !HaveVirtHostExt()) || // Context matching - (dbgtype == '010x' && HaltOnBreakpointOrWatchpoint()) || // Address mismatch - (dbgtype != '0x0x' && !context_aware) || // Context matching - (dbgtype == '1xxx' && !HaveEL(EL2))) then // EL2 extension - (c, dbgtype) = ConstrainUnpredictableBits(Unpredictable_RESBPTYPE); - assert c IN {Constraint_DISABLED, Constraint_UNKNOWN}; - if c == Constraint_DISABLED then return (FALSE,FALSE); - // Otherwise the value returned by ConstrainUnpredictableBits must be a not-reserved value - - // Determine what to compare against. - match_addr = (dbgtype == '0x0x'); - mismatch = (dbgtype == '010x'); - match_vmid = (dbgtype == '10xx'); - match_cid1 = (dbgtype == 'xx1x'); - match_cid2 = (dbgtype == '11xx'); - linked = (dbgtype == 'xxx1'); - - // If this is a call from StateMatch, return FALSE if the breakpoint is not programmed for a - // VMID and/or context ID match, of if not context-aware. The above assertions mean that the - // code can just test for match_addr == TRUE to confirm all these things. - if linked_to && (!linked || match_addr) then return (FALSE,FALSE); - - // If called from BreakpointMatch return FALSE for Linked context ID and/or VMID matches. - if !linked_to && linked && !match_addr then return (FALSE,FALSE); - - // Do the comparison. - if match_addr then - byte = UInt(vaddress[1:0]); - assert byte IN {0,2}; // "vaddress" is halfword aligned - byte_select_match = (DBGBCR[n].BAS[byte] == '1'); - BVR_match = vaddress[31:2] == DBGBVR[n][31:2] && byte_select_match; - elsif match_cid1 then - BVR_match = (PSTATE.EL != EL2 && CONTEXTIDR == DBGBVR[n][31:0]); - if match_vmid then - if ELUsingAArch32(EL2) then - vmid = ZeroExtend(VTTBR.VMID, 16); - bvr_vmid = ZeroExtend(DBGBXVR[n][7:0], 16); - elsif !Have16bitVMID() || VTCR_EL2.VS == '0' then - vmid = ZeroExtend(VTTBR_EL2.VMID[7:0], 16); - bvr_vmid = ZeroExtend(DBGBXVR[n][7:0], 16); - else - vmid = VTTBR_EL2.VMID; - bvr_vmid = DBGBXVR[n][15:0]; - BXVR_match = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - vmid == bvr_vmid); - elsif match_cid2 then - BXVR_match = (!IsSecure() && HaveVirtHostExt() && - !ELUsingAArch32(EL2) && - DBGBXVR[n][31:0] == CONTEXTIDR_EL2); - - bvr_match_valid = (match_addr || match_cid1); - bxvr_match_valid = (match_vmid || match_cid2); - - match = (!bxvr_match_valid || BXVR_match) && (!bvr_match_valid || BVR_match); - - return (match && !mismatch, !match && mismatch); - -// CheckValidStateMatch() -// ====================== -// Checks for an invalid state match that will generate Constrained Unpredictable behaviour, otherwise -// returns Constraint_NONE. - -(Constraint, bits(2), bit, bits(2)) CheckValidStateMatch(bits(2) SSC, bit HMC, bits(2) PxC, boolean isbreakpnt) - boolean reserved = FALSE; - - // Match 'Usr/Sys/Svc' only valid for AArch32 breakpoints - if (!isbreakpnt || !HaveAArch32EL(EL1)) && HMC:PxC == '000' && SSC != '11' then - reserved = TRUE; - - // Both EL3 and EL2 are not implemented - if !HaveEL(EL3) && !HaveEL(EL2) && (HMC != '0' || SSC != '00') then - reserved = TRUE; - - // EL3 is not implemented - if !HaveEL(EL3) && SSC IN {'01','10'} && HMC:SSC:PxC != '10100' then - reserved = TRUE; - - // EL3 using AArch64 only - if (!HaveEL(EL3) || HighestELUsingAArch32()) && HMC:SSC:PxC == '11000' then - reserved = TRUE; - - // EL2 is not implemented - if !HaveEL(EL2) && HMC:SSC:PxC == '11100' then - reserved = TRUE; - - // Secure EL2 is not implemented - if !HaveSecureEL2Ext() && (HMC:SSC:PxC) IN {'01100','10100','x11x1'} then - reserved = TRUE; - - // Values that are not allocated in any architecture version - if (HMC:SSC:PxC) IN {'01110','100x0','10110','11x10'} then - reserved = TRUE; - - if reserved then - // If parameters are set to a reserved type1, behaves as either disabled or a defined type1 - (c, [HMC,SSC,PxC]) = ConstrainUnpredictableBits(Unpredictable_RESBPWPCTRL); - assert c IN {Constraint_DISABLED, Constraint_UNKNOWN}; - if c == Constraint_DISABLED then - return (c, bits(2) UNKNOWN, bit UNKNOWN, bits(2) UNKNOWN); - // Otherwise the value returned by ConstrainUnpredictableBits must be a not-reserved value - - return (Constraint_NONE, SSC, HMC, PxC); - -// AArch32.StateMatch() -// ==================== -// Determine whether a breakpoint or watchpoint is enabled in the current mode and state. - -boolean AArch32.StateMatch(bits(2) SSC, bit HMC, bits(2) PxC, boolean linked, bits(4) LBN, - boolean isbreakpnt, boolean ispriv) - // "SSC", "HMC", "PxC" are the control fields from the DBGBCR[n] or DBGWCR[n] register. - // "linked" is TRUE if this is a linked breakpoint/watchpoint type1. - // "LBN" is the linked breakpoint number from the DBGBCR[n] or DBGWCR[n] register. - // "isbreakpnt" is TRUE for breakpoints, FALSE for watchpoints. - // "ispriv" is valid for watchpoints, and selects between privileged and unprivileged accesses. - - // If parameters are set to a reserved type1, behaves as either disabled or a defined type1 - (c, SSC, HMC, PxC) = CheckValidStateMatch(SSC, HMC, PxC, isbreakpnt); - if c == Constraint_DISABLED then return FALSE; - // Otherwise the HMC,SSC,PxC values are either valid or the values returned by - // CheckValidStateMatch are valid. - - PL2_match = HaveEL(EL2) && ((HMC == '1' && (SSC:PxC != '1000')) || SSC == '11'); - PL1_match = PxC[0] == '1'; - PL0_match = PxC[1] == '1'; - SSU_match = isbreakpnt && HMC == '0' && PxC == '00' && SSC != '11'; - - if !ispriv && !isbreakpnt then - priv_match = PL0_match; - elsif SSU_match then - priv_match = PSTATE.M IN {M32_User,M32_Svc,M32_System}; - else - case PSTATE.EL of - when EL3 priv_match = PL1_match; // EL3 and EL1 are both PL1 - when EL2 priv_match = PL2_match; - when EL1 priv_match = PL1_match; - when EL0 priv_match = PL0_match; - - case SSC of - when '00' security_state_match = TRUE; // Both - when '01' security_state_match = !IsSecure(); // Non-secure only - when '10' security_state_match = IsSecure(); // Secure only - when '11' security_state_match = (HMC == '1' || IsSecure()); // HMC=1 -> Both, 0 -> Secure only - - if linked then - // "LBN" must be an enabled context-aware breakpoint unit. If it is not context-aware then - // it is CONSTRAINED UNPREDICTABLE whether this gives no match, or LBN is mapped to some - // UNKNOWN breakpoint that is context-aware. - lbn = UInt(LBN); - first_ctx_cmp = (UInt(DBGDIDR.BRPs) - UInt(DBGDIDR.CTX_CMPs)); - last_ctx_cmp = UInt(DBGDIDR.BRPs); - if (lbn < first_ctx_cmp || lbn > last_ctx_cmp) then - (c, lbn) = ConstrainUnpredictableInteger(first_ctx_cmp, last_ctx_cmp, Unpredictable_BPNOTCTXCMP); - assert c IN {Constraint_DISABLED, Constraint_NONE, Constraint_UNKNOWN}; - case c of - when Constraint_DISABLED return FALSE; // Disabled - when Constraint_NONE linked = FALSE; // No linking - // Otherwise ConstrainUnpredictableInteger returned a context-aware breakpoint - - if linked then - vaddress = bits(32) UNKNOWN; - linked_to = TRUE; - (linked_match,-) = AArch32.BreakpointValueMatch(lbn, vaddress, linked_to); - - return priv_match && security_state_match && (!linked || linked_match); - -// AArch32.BreakpointMatch() -// ========================= -// Breakpoint matching in an AArch32 translation regime. - -(boolean,boolean) AArch32.BreakpointMatch(integer n, bits(32) vaddress, integer size) - assert ELUsingAArch32(S1TranslationRegime()); - assert n <= UInt(DBGDIDR.BRPs); - - enabled = DBGBCR[n].E == '1'; - ispriv = PSTATE.EL != EL0; - linked = DBGBCR[n].BT == '0x01'; - isbreakpnt = TRUE; - linked_to = FALSE; - - state_match = AArch32.StateMatch(DBGBCR[n].SSC, DBGBCR[n].HMC, DBGBCR[n].PMC, - linked, DBGBCR[n].LBN, isbreakpnt, ispriv); - (value_match, value_mismatch) = AArch32.BreakpointValueMatch(n, vaddress, linked_to); - - if size == 4 then // Check second halfword - // If the breakpoint address and BAS of an Address breakpoint match the address of the - // second halfword of an instruction, but not the address of the first halfword, it is - // CONSTRAINED UNPREDICTABLE whether or not this breakpoint generates a Breakpoint debug - // event. - (match_i, mismatch_i) = AArch32.BreakpointValueMatch(n, vaddress + 2, linked_to); - if !value_match && match_i then - value_match = ConstrainUnpredictableBool(Unpredictable_BPMATCHHALF); - if value_mismatch && !mismatch_i then - value_mismatch = ConstrainUnpredictableBool(Unpredictable_BPMISMATCHHALF); - if vaddress[1] == '1' && DBGBCR[n].BAS == '1111' then - // The above notwithstanding, if DBGBCR[n].BAS == '1111', then it is CONSTRAINED - // UNPREDICTABLE whether or not a Breakpoint debug event is generated for an instruction - // at the address DBGBVR[n]+2. - if value_match then value_match = ConstrainUnpredictableBool(Unpredictable_BPMATCHHALF); - if !value_mismatch then value_mismatch = ConstrainUnpredictableBool(Unpredictable_BPMISMATCHHALF); - - match = value_match && state_match && enabled; - mismatch = value_mismatch && state_match && enabled; - - return (match, mismatch); - -// AArch64.GenerateDebugExceptionsFrom() -// ===================================== - -boolean AArch64.GenerateDebugExceptionsFrom(bits(2) from, boolean secure, bit mask) - - if OSLSR_EL1.OSLK == '1' || DoubleLockStatus() || Halted() then - return FALSE; - - route_to_el2 = HaveEL(EL2) && (!secure || IsSecureEL2Enabled()) && (HCR_EL2.TGE == '1' || MDCR_EL2.TDE == '1'); - target = (if route_to_el2 then EL2 else EL1); - enabled = !HaveEL(EL3) || !secure || MDCR_EL3.SDD == '0'; - - if from == target then - enabled = enabled && MDSCR_EL1.KDE == '1' && mask == '0'; - else - enabled = enabled && UInt(target) > UInt(from); - - return enabled; - -// AArch32.GenerateDebugExceptionsFrom() -// ===================================== - -boolean AArch32.GenerateDebugExceptionsFrom(bits(2) from, boolean secure) - - if from == EL0 && !ELStateUsingAArch32(EL1, secure) then - mask = bit UNKNOWN; // PSTATE.D mask, unused for EL0 case - return AArch64.GenerateDebugExceptionsFrom(from, secure, mask); - - if DBGOSLSR.OSLK == '1' || DoubleLockStatus() || Halted() then - return FALSE; - - if HaveEL(EL3) && secure then - spd = if ELUsingAArch32(EL3) then SDCR.SPD else MDCR_EL3.SPD32; - if spd[1] == '1' then - enabled = spd[0] == '1'; - else - // SPD == 0b01 is reserved, but behaves the same as 0b00. - enabled = AArch32.SelfHostedSecurePrivilegedInvasiveDebugEnabled(); - if from == EL0 then enabled = enabled || SDER.SUIDEN == '1'; - else - enabled = from != EL2; - - return enabled; - -// AArch32.GenerateDebugExceptions() -// ================================= - -boolean AArch32.GenerateDebugExceptions() - return AArch32.GenerateDebugExceptionsFrom(PSTATE.EL, IsSecure()); - -enumeration CrossTriggerOut {CrossTriggerOut_DebugRequest, CrossTriggerOut_RestartRequest, - CrossTriggerOut_IRQ, CrossTriggerOut_RSVD3, - CrossTriggerOut_TraceExtIn0, CrossTriggerOut_TraceExtIn1, - CrossTriggerOut_TraceExtIn2, CrossTriggerOut_TraceExtIn3}; - -enumeration CrossTriggerIn {CrossTriggerIn_CrossHalt, CrossTriggerIn_PMUOverflow, - CrossTriggerIn_RSVD2, CrossTriggerIn_RSVD3, - CrossTriggerIn_TraceExtOut0, CrossTriggerIn_TraceExtOut1, - CrossTriggerIn_TraceExtOut2, CrossTriggerIn_TraceExtOut3}; - -enumeration InterruptID {InterruptID_PMUIRQ, InterruptID_COMMIRQ, InterruptID_CTIIRQ, - InterruptID_COMMRX, InterruptID_COMMTX}; - -// AArch64.CheckForPMUOverflow() -// ============================= -// Signal Performance Monitors overflow IRQ and CTI overflow events - -boolean AArch64.CheckForPMUOverflow() - - pmuirq = PMCR_EL0.E == '1' && PMINTENSET_EL1[31] == '1' && PMOVSSET_EL0[31] == '1'; - for n = 0 to UInt(PMCR_EL0.N) - 1 - if HaveEL(EL2) then - E = (if n < UInt(MDCR_EL2.HPMN) then PMCR_EL0.E else MDCR_EL2.HPME); - else - E = PMCR_EL0.E; - if E == '1' && PMINTENSET_EL1[n] == '1' && PMOVSSET_EL0[n] == '1' then pmuirq = TRUE; - - SetInterruptRequestLevel(InterruptID_PMUIRQ, if pmuirq then HIGH else LOW); - - CTI_SetEventLevel(CrossTriggerIn_PMUOverflow, if pmuirq then HIGH else LOW); - - // The request remains set until the condition is cleared. (For example, an interrupt handler - // or cross-triggered event handler clears the overflow status flag by writing to PMOVSCLR_EL0.) - - return pmuirq; - -// AArch32.CheckForPMUOverflow() -// ============================= -// Signal Performance Monitors overflow IRQ and CTI overflow events - -boolean AArch32.CheckForPMUOverflow() - - if !ELUsingAArch32(EL1) then return AArch64.CheckForPMUOverflow(); - pmuirq = PMCR.E == '1' && PMINTENSET[31] == '1' && PMOVSSET[31] == '1'; - for n = 0 to UInt(PMCR.N) - 1 - if HaveEL(EL2) then - hpmn = if !ELUsingAArch32(EL2) then MDCR_EL2.HPMN else HDCR.HPMN; - hpme = if !ELUsingAArch32(EL2) then MDCR_EL2.HPME else HDCR.HPME; - E = (if n < UInt(hpmn) then PMCR.E else hpme); - else - E = PMCR.E; - if E == '1' && PMINTENSET[n] == '1' && PMOVSSET[n] == '1' then pmuirq = TRUE; - - SetInterruptRequestLevel(InterruptID_PMUIRQ, if pmuirq then HIGH else LOW); - - CTI_SetEventLevel(CrossTriggerIn_PMUOverflow, if pmuirq then HIGH else LOW); - - // The request remains set until the condition is cleared. (For example, an interrupt handler - // or cross-triggered event handler clears the overflow status flag by writing to PMOVSCLR_EL0.) - - return pmuirq; - -// HaveNoninvasiveDebugAuth() -// ========================== -// Returns TRUE if the Non-invasive debug controls are implemented. - -boolean HaveNoninvasiveDebugAuth() - return !HasArchVersion(ARMv8p4); - -// ExternalNoninvasiveDebugEnabled() -// ================================= -// This function returns TRUE if the ARMv8.4-Debug is implemented, otherwise this -// function is IMPLEMENTATION DEFINED. -// In the recommended interface, ExternalNoninvasiveDebugEnabled returns the state of the (DBGEN -// OR NIDEN) signal. - -boolean ExternalNoninvasiveDebugEnabled() - return !HaveNoninvasiveDebugAuth() || ExternalInvasiveDebugEnabled() || NIDEN == HIGH; - -// ExternalSecureNoninvasiveDebugEnabled() -// ======================================= -// This function returns the value of ExternalSecureInvasiveDebugEnabled() when ARMv8.4-Debug -// is implemented. Otherwise, the definition of this function is IMPLEMENTATION DEFINED. -// In the recommended interface, this function returns the state of the (DBGEN OR NIDEN) AND -// (SPIDEN OR SPNIDEN) signal. - -boolean ExternalSecureNoninvasiveDebugEnabled() - if !HaveEL(EL3) && !IsSecure() then return FALSE; - if HaveNoninvasiveDebugAuth() then - return ExternalNoninvasiveDebugEnabled() && (SPIDEN == HIGH || SPNIDEN == HIGH); - else - return ExternalSecureInvasiveDebugEnabled(); - -// HaveHPMDExt() -// ============= - -boolean HaveHPMDExt() - return HasArchVersion(ARMv8p1); - -// HaveNoSecurePMUDisableOverride() -// ================================ - -boolean HaveNoSecurePMUDisableOverride() - return HasArchVersion(ARMv8p2); - -// AArch64.CountEvents() -// ===================== -// Return TRUE if counter "n" should count its event. For the cycle counter, n == 31. - -boolean AArch64.CountEvents(integer n) - assert n == 31 || n < UInt(PMCR_EL0.N); - - // Event counting is disabled in Debug state - debug = Halted(); - - // In Non-secure state, some counters are reserved for EL2 - if HaveEL(EL2) then - E = if n < UInt(MDCR_EL2.HPMN) || n == 31 then PMCR_EL0.E else MDCR_EL2.HPME; - else - E = PMCR_EL0.E; - enabled = E == '1' && PMCNTENSET_EL0[n] == '1'; - - // Event counting in Secure state is prohibited unless any one of: - // * EL3 is not implemented - // * EL3 is using AArch64 and MDCR_EL3.SPME == 1 - prohibited = HaveEL(EL3) && IsSecure() && MDCR_EL3.SPME == '0'; - - // Event counting at EL2 is prohibited if all of: - // * The HPMD Extension is implemented - // * Executing at EL2 - // * PMNx is not reserved for EL2 - // * MDCR_EL2.HPMD == 1 - if !prohibited && HaveEL(EL2) && HaveHPMDExt() && PSTATE.EL == EL2 && (n < UInt(MDCR_EL2.HPMN) || n == 31) then - prohibited = (MDCR_EL2.HPMD == '1'); - - // The IMPLEMENTATION DEFINED authentication interface might override software controls - if prohibited && !HaveNoSecurePMUDisableOverride() then - prohibited = !ExternalSecureNoninvasiveDebugEnabled(); - // For the cycle counter, PMCR_EL0.DP enables counting when otherwise prohibited - if prohibited && n == 31 then prohibited = (PMCR_EL0.DP == '1'); - - // Event counting can be filtered by the {P, U, NSK, NSU, NSH, M, SH} bits - filter = if n == 31 then PMCCFILTR else PMEVTYPER[n]; - - P = filter[31]; - U = filter[30]; - NSK = if HaveEL(EL3) then filter[29] else '0'; - NSU = if HaveEL(EL3) then filter[28] else '0'; - NSH = if HaveEL(EL2) then filter[27] else '0'; - M = if HaveEL(EL3) then filter[26] else '0'; - SH = if HaveSecureEL2Ext() then filter[24] else '0'; - - case PSTATE.EL of - when EL0 filtered = if IsSecure() then U == '1' else U != NSU; - when EL1 filtered = if IsSecure() then P == '1' else P != NSK; - when EL2 filtered = (if IsSecure() then NSH == SH else NSH == '0'); - when EL3 filtered = (M != P); - - return !debug && enabled && !prohibited && !filtered; - -// AArch32.CountEvents() -// ===================== -// Return TRUE if counter "n" should count its event. For the cycle counter, n == 31. - -boolean AArch32.CountEvents(integer n) - assert n == 31 || n < UInt(PMCR.N); - - if !ELUsingAArch32(EL1) then return AArch64.CountEvents(n); - // Event counting is disabled in Debug state - debug = Halted(); - - // In Non-secure state, some counters are reserved for EL2 - if HaveEL(EL2) then - hpmn = if !ELUsingAArch32(EL2) then MDCR_EL2.HPMN else HDCR.HPMN; - hpme = if !ELUsingAArch32(EL2) then MDCR_EL2.HPME else HDCR.HPME; - if HaveHPMDExt() then - hpmd = if !ELUsingAArch32(EL2) then MDCR_EL2.HPMD else HDCR.HPMD; - E = if n < UInt(hpmn) || n == 31 then PMCR.E else hpme; - else - E = PMCR.E; - enabled = E == '1' && PMCNTENSET[n] == '1'; - - // Event counting in Secure state is prohibited unless any one of: - // * EL3 is not implemented - // * EL3 is using AArch64 and MDCR_EL3.SPME == 1 - // * EL3 is using AArch32 and SDCR.SPME == 1 - // * Executing at EL0, and SDER.SUNIDEN == 1. - spme = (if ELUsingAArch32(EL3) then SDCR.SPME else MDCR_EL3.SPME); - prohibited = HaveEL(EL3) && IsSecure() && spme == '0' && (PSTATE.EL != EL0 || SDER.SUNIDEN == '0'); - - // Event counting at EL2 is prohibited if all of: - // * The HPMD Extension is implemented - // * Executing at EL2 - // * PMNx is not reserved for EL2 - // * HDCR.HPMD == 1 - if !prohibited && HaveEL(EL2) && HaveHPMDExt() && PSTATE.EL == EL2 && (n < UInt(hpmn) || n == 31) then - prohibited = (hpmd == '1'); - - // The IMPLEMENTATION DEFINED authentication interface might override software controls - if prohibited && !HaveNoSecurePMUDisableOverride() then - prohibited = !ExternalSecureNoninvasiveDebugEnabled(); - // For the cycle counter, PMCR.DP enables counting when otherwise prohibited - if prohibited && n == 31 then prohibited = (PMCR.DP == '1'); - - // Event counting can be filtered by the {P, U, NSK, NSU, NSH} bits - filter = if n == 31 then PMCCFILTR else PMEVTYPER[n]; - - P = filter[31]; - U = filter[30]; - NSK = if HaveEL(EL3) then filter[29] else '0'; - NSU = if HaveEL(EL3) then filter[28] else '0'; - NSH = if HaveEL(EL2) then filter[27] else '0'; - - case PSTATE.EL of - when EL0 filtered = if IsSecure() then U == '1' else U != NSU; - when EL1 filtered = if IsSecure() then P == '1' else P != NSK; - when EL2 filtered = (NSH == '0'); - when EL3 filtered = (P == '1'); - - return !debug && enabled && !prohibited && !filtered; - -enumeration Exception {Exception_Uncategorized, // Uncategorized or unknown reason - Exception_WFxTrap, // Trapped WFI or WFE instruction - Exception_CP15RTTrap, // Trapped AArch32 MCR or MRC access to CP15 - Exception_CP15RRTTrap, // Trapped AArch32 MCRR or MRRC access to CP15 - Exception_CP14RTTrap, // Trapped AArch32 MCR or MRC access to CP14 - Exception_CP14DTTrap, // Trapped AArch32 LDC or STC access to CP14 - Exception_AdvSIMDFPAccessTrap, // HCPTR-trapped access to SIMD or FP - Exception_FPIDTrap, // Trapped access to SIMD or FP ID register - // Trapped BXJ instruction not supported in Armv8 - Exception_PACTrap, // Trapped invalid PAC use - Exception_CP14RRTTrap, // Trapped MRRC access to CP14 from AArch32 - Exception_IllegalState, // Illegal Execution state - Exception_SupervisorCall, // Supervisor Call - Exception_HypervisorCall, // Hypervisor Call - Exception_MonitorCall, // Monitor Call or Trapped SMC instruction - Exception_SystemRegisterTrap, // Trapped MRS or MSR system register access - Exception_ERetTrap, // Trapped invalid ERET use - Exception_InstructionAbort, // Instruction Abort or Prefetch Abort - Exception_PCAlignment, // PC alignment fault - Exception_DataAbort, // Data Abort - Exception_NV2DataAbort, // Data abort at EL1 reported as being from EL2 - Exception_PACFail, // PAC Authentication failure - Exception_SPAlignment, // SP alignment fault - Exception_FPTrappedException, // IEEE trapped FP exception - Exception_SError, // SError interrupt - Exception_Breakpoint, // (Hardware) Breakpoint - Exception_SoftwareStep, // Software Step - Exception_Watchpoint, // Watchpoint - Exception_NV2Watchpoint, // Watchpoint at EL1 reported as being from EL2 - Exception_SoftwareBreakpoint, // Software Breakpoint Instruction - Exception_VectorCatch, // AArch32 Vector Catch - Exception_IRQ, // IRQ interrupt - Exception_SVEAccessTrap, // HCPTR trapped access to SVE - Exception_BranchTarget, // Branch Target Identification - Exception_FIQ}; // FIQ interrupt - -integer ThisInstrLength(); - -// AArch32.ExceptionClass() -// ======================== -// Returns the Exception Class and Instruction Length fields to be reported in HSR - -(integer,bit) AArch32.ExceptionClass(Exception exceptype) - - il = if ThisInstrLength() == 32 then '1' else '0'; - - case exceptype of - when Exception_Uncategorized ec = 0x00; il = '1'; - when Exception_WFxTrap ec = 0x01; - when Exception_CP15RTTrap ec = 0x03; - when Exception_CP15RRTTrap ec = 0x04; - when Exception_CP14RTTrap ec = 0x05; - when Exception_CP14DTTrap ec = 0x06; - when Exception_AdvSIMDFPAccessTrap ec = 0x07; - when Exception_FPIDTrap ec = 0x08; - when Exception_PACTrap ec = 0x09; - when Exception_CP14RRTTrap ec = 0x0C; - when Exception_BranchTarget ec = 0x0D; - when Exception_IllegalState ec = 0x0E; il = '1'; - when Exception_SupervisorCall ec = 0x11; - when Exception_HypervisorCall ec = 0x12; - when Exception_MonitorCall ec = 0x13; - when Exception_ERetTrap ec = 0x1A; - when Exception_PACFail ec = 0x1C; - when Exception_InstructionAbort ec = 0x20; il = '1'; - when Exception_PCAlignment ec = 0x22; il = '1'; - when Exception_DataAbort ec = 0x24; - when Exception_NV2DataAbort ec = 0x25; - when Exception_FPTrappedException ec = 0x28; - otherwise Unreachable(); - - if ec IN {0x20,0x24} && PSTATE.EL == EL2 then - ec = ec + 1; - - return (ec,il); - -type ExceptionRecord is (Exception exceptype, // Exception class - bits(25) syndrome, // Syndrome record - bits(64) vaddress, // Virtual fault address - boolean ipavalid, // Physical fault address for second stage faults is valid - bits(1) NS, // Physical fault address for second stage faults is Non-secure or secure - bits(52) ipaddress) // Physical fault address for second stage faults - -// AArch32.ReportHypEntry() -// ======================== -// Report syndrome information to Hyp mode registers. - -AArch32.ReportHypEntry(ExceptionRecord exception) - - Exception exceptype = exception.exceptype; - - (ec,il) = AArch32.ExceptionClass(exceptype); - iss = exception.syndrome; - - // IL is not valid for Data Abort exceptions without valid instruction syndrome information - if ec IN {0x24,0x25} && iss[24] == '0' then - il = '1'; - - HSR = ec[5:0]:il:iss; - - if exceptype IN {Exception_InstructionAbort, Exception_PCAlignment} then - HIFAR = exception.vaddress[31:0]; - HDFAR = bits(32) UNKNOWN; - elsif exceptype == Exception_DataAbort then - HIFAR = bits(32) UNKNOWN; - HDFAR = exception.vaddress[31:0]; - - if exception.ipavalid then - HPFAR[31:4] = exception.ipaddress[39:12]; - else - HPFAR[31:4] = bits(28) UNKNOWN; - - return; - -// ELFromM32() -// =========== - -(boolean,bits(2)) ELFromM32(bits(5) mode) - // Convert an AArch32 mode encoding to an Exception level. - // Returns (valid,EL): - // 'valid' is TRUE if 'mode[4:0]' encodes a mode that is both valid for this implementation - // and the current value of SCR.NS/SCR_EL3.NS. - // 'EL' is the Exception level decoded from 'mode'. - bits(2) el; - boolean valid = !BadMode(mode); // Check for modes that are not valid for this implementation - case mode of - when M32_Monitor - el = EL3; - when M32_Hyp - el = EL2; - valid = valid && (!HaveEL(EL3) || SCR_GEN[].NS == '1'); - when M32_FIQ, M32_IRQ, M32_Svc, M32_Abort, M32_Undef, M32_System - // If EL3 is implemented and using AArch32, then these modes are EL3 modes in Secure - // state, and EL1 modes in Non-secure state. If EL3 is not implemented or is using - // AArch64, then these modes are EL1 modes. - el = (if HaveEL(EL3) && HighestELUsingAArch32() && SCR.NS == '0' then EL3 else EL1); - when M32_User - el = EL0; - otherwise - valid = FALSE; // Passed an illegal mode value - if !valid then el = bits(2) UNKNOWN; - return (valid, el); - -// AArch32.WriteMode() -// =================== -// Function for dealing with writes to PSTATE.M from AArch32 state only. -// This ensures that PSTATE.EL and PSTATE.SP are always valid. - -AArch32.WriteMode(bits(5) mode) - (valid,el) = ELFromM32(mode); - assert valid; - PSTATE.M = mode; - PSTATE.EL = el; - PSTATE.nRW = '1'; - PSTATE.SP = (if mode IN {M32_User,M32_System} then '0' else '1'); - return; - -// Terminate processing of the current instruction. -EndOfInstruction(); - -// HaveSSBSExt() -// ============= -// Returns TRUE if support for SSBS is implemented, and FALSE otherwise. - -boolean HaveSSBSExt() - return HasArchVersion(ARMv8p5) || boolean IMPLEMENTATION_DEFINED "Has SSBS extension"; - -// SPSR[] - non-assignment form -// ============================ - -bits(32) SPSR[] - bits(32) result; - if UsingAArch32() then - case PSTATE.M of - when M32_FIQ result = SPSR_fiq; - when M32_IRQ result = SPSR_irq; - when M32_Svc result = SPSR_svc; - when M32_Monitor result = SPSR_mon; - when M32_Abort result = SPSR_abt; - when M32_Hyp result = SPSR_hyp; - when M32_Undef result = SPSR_und; - otherwise Unreachable(); - else - case PSTATE.EL of - when EL1 result = SPSR_EL1; - when EL2 result = SPSR_EL2; - when EL3 result = SPSR_EL3; - otherwise Unreachable(); - return result; - -// SPSR[] - assignment form -// ======================== - -SPSR[] = bits(32) value - if UsingAArch32() then - case PSTATE.M of - when M32_FIQ SPSR_fiq = value; - when M32_IRQ SPSR_irq = value; - when M32_Svc SPSR_svc = value; - when M32_Monitor SPSR_mon = value; - when M32_Abort SPSR_abt = value; - when M32_Hyp SPSR_hyp = value; - when M32_Undef SPSR_und = value; - otherwise Unreachable(); - else - case PSTATE.EL of - when EL1 SPSR_EL1 = value; - when EL2 SPSR_EL2 = value; - when EL3 SPSR_EL3 = value; - otherwise Unreachable(); - return; - -SynchronizeContext(); - -// UpdateEDSCRFields() -// =================== -// Update EDSCR PE state fields - -UpdateEDSCRFields() - - if !Halted() then - EDSCR.EL = '00'; - EDSCR.NS = bit UNKNOWN; - EDSCR.RW = '1111'; - else - EDSCR.EL = PSTATE.EL; - EDSCR.NS = if IsSecure() then '0' else '1'; - - bits(4) RW; - RW[1] = if ELUsingAArch32(EL1) then '0' else '1'; - if PSTATE.EL != EL0 then - RW[0] = RW[1]; - else - RW[0] = if UsingAArch32() then '0' else '1'; - if !HaveEL(EL2) || (HaveEL(EL3) && SCR_GEN[].NS == '0' && !IsSecureEL2Enabled()) then - RW[2] = RW[1]; - else - RW[2] = if ELUsingAArch32(EL2) then '0' else '1'; - if !HaveEL(EL3) then - RW[3] = RW[2]; - else - RW[3] = if ELUsingAArch32(EL3) then '0' else '1'; - - // The least-significant bits of EDSCR.RW are UNKNOWN if any higher EL is using AArch32. - if RW[3] == '0' then RW[2:0] = bits(3) UNKNOWN; - elsif RW[2] == '0' then RW[1:0] = bits(2) UNKNOWN; - elsif RW[1] == '0' then RW[0] = bit UNKNOWN; - EDSCR.RW = RW; - return; - -// AArch32.EnterHypModeInDebugState() -// ================================== -// Take an exception in Debug state to Hyp mode. - -AArch32.EnterHypModeInDebugState(ExceptionRecord exception) - SynchronizeContext(); - assert HaveEL(EL2) && !IsSecure() && ELUsingAArch32(EL2); - - AArch32.ReportHypEntry(exception); - AArch32.WriteMode(M32_Hyp); - SPSR[] = bits(32) UNKNOWN; - ELR_hyp = bits(32) UNKNOWN; - // In Debug state, the PE always execute T32 instructions when in AArch32 state, and - // PSTATE.{SS,A,I,F} are not observable so behave as UNKNOWN. - PSTATE.T = '1'; // PSTATE.J is RES0 - PSTATE.[SS,A,I,F] = bits(4) UNKNOWN; - DLR = bits(32) UNKNOWN; - DSPSR = bits(32) UNKNOWN; - PSTATE.E = HSCTLR.EE; - PSTATE.IL = '0'; - PSTATE.IT = '00000000'; - if HaveSSBSExt() then PSTATE.SSBS = bit UNKNOWN; - EDSCR.ERR = '1'; - UpdateEDSCRFields(); - - EndOfInstruction(); - -// HavePANExt() -// ============ - -boolean HavePANExt() - return HasArchVersion(ARMv8p1); - -// AArch32.EnterModeInDebugState() -// =============================== -// Take an exception in Debug state to a mode other than Monitor and Hyp mode. - -AArch32.EnterModeInDebugState(bits(5) target_mode) - SynchronizeContext(); - assert ELUsingAArch32(EL1) && PSTATE.EL != EL2; - - if PSTATE.M == M32_Monitor then SCR.NS = '0'; - AArch32.WriteMode(target_mode); - SPSR[] = bits(32) UNKNOWN; - R[14] = bits(32) UNKNOWN; - // In Debug state, the PE always execute T32 instructions when in AArch32 state, and - // PSTATE.{SS,A,I,F} are not observable so behave as UNKNOWN. - PSTATE.T = '1'; // PSTATE.J is RES0 - PSTATE.[SS,A,I,F] = bits(4) UNKNOWN; - DLR = bits(32) UNKNOWN; - DSPSR = bits(32) UNKNOWN; - PSTATE.E = SCTLR.EE; - PSTATE.IL = '0'; - PSTATE.IT = '00000000'; - if HavePANExt() && SCTLR.SPAN == '0' then PSTATE.PAN = '1'; - if HaveSSBSExt() then PSTATE.SSBS = bit UNKNOWN; - EDSCR.ERR = '1'; - UpdateEDSCRFields(); // Update EDSCR processor state flags. - - EndOfInstruction(); - -// AArch32.EnterMonitorModeInDebugState() -// ====================================== -// Take an exception in Debug state to Monitor mode. - -AArch32.EnterMonitorModeInDebugState() - SynchronizeContext(); - assert HaveEL(EL3) && ELUsingAArch32(EL3); - from_secure = IsSecure(); - if PSTATE.M == M32_Monitor then SCR.NS = '0'; - AArch32.WriteMode(M32_Monitor); - SPSR[] = bits(32) UNKNOWN; - R[14] = bits(32) UNKNOWN; - // In Debug state, the PE always execute T32 instructions when in AArch32 state, and - // PSTATE.{SS,A,I,F} are not observable so behave as UNKNOWN. - PSTATE.T = '1'; // PSTATE.J is RES0 - PSTATE.[SS,A,I,F] = bits(4) UNKNOWN; - PSTATE.E = SCTLR.EE; - PSTATE.IL = '0'; - PSTATE.IT = '00000000'; - if HavePANExt() then - if !from_secure then - PSTATE.PAN = '0'; - elsif SCTLR.SPAN == '0' then - PSTATE.PAN = '1'; - if HaveSSBSExt() then PSTATE.SSBS = bit UNKNOWN; - DLR = bits(32) UNKNOWN; - DSPSR = bits(32) UNKNOWN; - EDSCR.ERR = '1'; - UpdateEDSCRFields(); // Update EDSCR processor state flags. - - EndOfInstruction(); - -// AArch32.WatchpointByteMatch() -// ============================= - -boolean AArch32.WatchpointByteMatch(integer n, bits(32) vaddress) - - bottom = if DBGWVR[n][2] == '1' then 2 else 3; // Word or doubleword - byte_select_match = (DBGWCR[n].BAS[UInt(vaddress[bottom-1:0])] != '0'); - mask = UInt(DBGWCR[n].MASK); - - // If DBGWCR[n].MASK is non-zero value and DBGWCR[n].BAS is not set to '11111111', or - // DBGWCR[n].BAS specifies a non-contiguous set of bytes behavior is CONSTRAINED - // UNPREDICTABLE. - if mask > 0 && !IsOnes(DBGWCR[n].BAS) then - byte_select_match = ConstrainUnpredictableBool(Unpredictable_WPMASKANDBAS); - else - LSB = (DBGWCR[n].BAS AND NOT(DBGWCR[n].BAS - 1)); MSB = (DBGWCR[n].BAS + LSB); - if !IsZero(MSB AND (MSB - 1)) then // Not contiguous - byte_select_match = ConstrainUnpredictableBool(Unpredictable_WPBASCONTIGUOUS); - bottom = 3; // For the whole doubleword - - // If the address mask is set to a reserved value, the behavior is CONSTRAINED UNPREDICTABLE. - if mask > 0 && mask <= 2 then - (c, mask) = ConstrainUnpredictableInteger(3, 31, Unpredictable_RESWPMASK); - assert c IN {Constraint_DISABLED, Constraint_NONE, Constraint_UNKNOWN}; - case c of - when Constraint_DISABLED return FALSE; // Disabled - when Constraint_NONE mask = 0; // No masking - // Otherwise the value returned by ConstrainUnpredictableInteger is a not-reserved value - - if mask > bottom then - WVR_match = (vaddress[31:mask] == DBGWVR[n][31:mask]); - // If masked bits of DBGWVR_EL1[n] are not zero, the behavior is CONSTRAINED UNPREDICTABLE. - if WVR_match && !IsZero(DBGWVR[n][mask-1:bottom]) then - WVR_match = ConstrainUnpredictableBool(Unpredictable_WPMASKEDBITS); - else - WVR_match = vaddress[31:bottom] == DBGWVR[n][31:bottom]; - - return WVR_match && byte_select_match; - -// AArch32.WatchpointMatch() -// ========================= -// Watchpoint matching in an AArch32 translation regime. - -boolean AArch32.WatchpointMatch(integer n, bits(32) vaddress, integer size, boolean ispriv, - boolean iswrite) - assert ELUsingAArch32(S1TranslationRegime()); - assert n <= UInt(DBGDIDR.WRPs); - - // "ispriv" is FALSE for LDRT/STRT instructions executed at EL1 and all - // load/stores at EL0, TRUE for all other load/stores. "iswrite" is TRUE for stores, FALSE for - // loads. - enabled = DBGWCR[n].E == '1'; - linked = DBGWCR[n].WT == '1'; - isbreakpnt = FALSE; - - state_match = AArch32.StateMatch(DBGWCR[n].SSC, DBGWCR[n].HMC, DBGWCR[n].PAC, - linked, DBGWCR[n].LBN, isbreakpnt, ispriv); - - ls_match = (DBGWCR[n].LSC[(if iswrite then 1 else 0)] == '1'); - - value_match = FALSE; - for byte = 0 to size - 1 - value_match = value_match || AArch32.WatchpointByteMatch(n, vaddress + byte); - - return value_match && state_match && ls_match && enabled; - -enumeration AccType {AccType_NORMAL, AccType_VEC, // Normal loads and stores - AccType_STREAM, AccType_VECSTREAM, // Streaming loads and stores - AccType_ATOMIC, AccType_ATOMICRW, // Atomic loads and stores - AccType_ORDERED, AccType_ORDEREDRW, // Load-Acquire and Store-Release - AccType_ORDEREDATOMIC, // Load-Acquire and Store-Release with atomic access - AccType_ORDEREDATOMICRW, - AccType_LIMITEDORDERED, // Load-LOAcquire and Store-LORelease - AccType_UNPRIV, // Load and store unprivileged - AccType_IFETCH, // Instruction fetch - AccType_PTW, // Page table walk - AccType_NONFAULT, // Non-faulting loads - AccType_CNOTFIRST, // Contiguous FF load, not first element - AccType_NV2REGISTER, // MRS/MSR instruction used at EL1 and which is converted - // to a memory access that uses the EL2 translation regime - // Other operations - AccType_DC, // Data cache maintenance - AccType_DC_UNPRIV, // Data cache maintenance instruction used at EL0 - AccType_IC, // Instruction cache maintenance - AccType_DCZVA, // DC ZVA instructions - AccType_AT}; // Address translation - -enumeration Fault {Fault_None, - Fault_AccessFlag, - Fault_Alignment, - Fault_Background, - Fault_Domain, - Fault_Permission, - Fault_Translation, - Fault_AddressSize, - Fault_SyncExternal, - Fault_SyncExternalOnWalk, - Fault_SyncParity, - Fault_SyncParityOnWalk, - Fault_AsyncParity, - Fault_AsyncExternal, - Fault_Debug, - Fault_TLBConflict, - Fault_BranchTarget, - Fault_HWUpdateAccessFlag, - Fault_Lockdown, - Fault_Exclusive, - Fault_ICacheMaint}; - -// EncodeLDFSC() -// ============= -// Function that gives the Long-descriptor FSC code for types of Fault - -bits(6) EncodeLDFSC(Fault statuscode, integer level) - - bits(6) result; - case statuscode of - when Fault_AddressSize result = '0000':level[1:0]; assert level IN {0,1,2,3}; - when Fault_AccessFlag result = '0010':level[1:0]; assert level IN {1,2,3}; - when Fault_Permission result = '0011':level[1:0]; assert level IN {1,2,3}; - when Fault_Translation result = '0001':level[1:0]; assert level IN {0,1,2,3}; - when Fault_SyncExternal result = '010000'; - when Fault_SyncExternalOnWalk result = '0101':level[1:0]; assert level IN {0,1,2,3}; - when Fault_SyncParity result = '011000'; - when Fault_SyncParityOnWalk result = '0111':level[1:0]; assert level IN {0,1,2,3}; - when Fault_AsyncParity result = '011001'; - when Fault_AsyncExternal result = '010001'; - when Fault_Alignment result = '100001'; - when Fault_Debug result = '100010'; - when Fault_TLBConflict result = '110000'; - when Fault_HWUpdateAccessFlag result = '110001'; - when Fault_Lockdown result = '110100'; // IMPLEMENTATION DEFINED - when Fault_Exclusive result = '110101'; // IMPLEMENTATION DEFINED - otherwise Unreachable(); - - return result; - -type FullAddress is ( - bits(52) address, - bit NS // '0' = Secure, '1' = Non-secure -) - -type FaultRecord is (Fault statuscode, // Fault Status - AccType acctype, // Type of access that faulted - FullAddress ipaddress, // Intermediate physical address - boolean s2fs1walk, // Is on a Stage 1 page table walk - boolean write, // TRUE for a write, FALSE for a read - integer level, // For translation, access flag and permission faults - bit extflag, // IMPLEMENTATION DEFINED syndrome for external aborts - boolean secondstage, // Is a Stage 2 abort - bits(4) domain, // Domain number, AArch32 only - bits(2) errortype, // [Armv8.2 RAS] AArch32 AET or AArch64 SET - bits(4) debugmoe) // Debug method of entry, from AArch32 only - -type PARTIDtype = bits(16); -type PMGtype = bits(8); - -type MPAMinfo is ( - bit mpam_ns, - PARTIDtype partid, - PMGtype pmg -) - -// HaveRASExt() -// ============ - -boolean HaveRASExt() - return (HasArchVersion(ARMv8p2) || - boolean IMPLEMENTATION_DEFINED "Has RAS extension"); - -// IsAsyncAbort() -// ============== -// Returns TRUE if the abort currently being processed is an asynchronous abort, and FALSE -// otherwise. - -boolean IsAsyncAbort(Fault statuscode) - assert statuscode != Fault_None; - - return (statuscode IN {Fault_AsyncExternal, Fault_AsyncParity}); - -// IsAsyncAbort() -// ============== - -boolean IsAsyncAbort(FaultRecord fault) - return IsAsyncAbort(fault.statuscode); - -// IsExternalAbort() -// ================= -// Returns TRUE if the abort currently being processed is an external abort and FALSE otherwise. - -boolean IsExternalAbort(Fault statuscode) - assert statuscode != Fault_None; - - return (statuscode IN {Fault_SyncExternal, Fault_SyncParity, Fault_SyncExternalOnWalk, Fault_SyncParityOnWalk, - Fault_AsyncExternal, Fault_AsyncParity }); - -// IsExternalAbort() -// ================= - -boolean IsExternalAbort(FaultRecord fault) - return IsExternalAbort(fault.statuscode); - -// IsSecondStage() -// =============== - -boolean IsSecondStage(FaultRecord fault) - assert fault.statuscode != Fault_None; - - return fault.secondstage; - -bits(11) LSInstructionSyndrome(); - -// AArch32.FaultSyndrome() -// ======================= -// Creates an exception syndrome value for Abort and Watchpoint exceptions taken to -// AArch32 Hyp mode. - -bits(25) AArch32.FaultSyndrome(boolean d_side, FaultRecord fault) - assert fault.statuscode != Fault_None; - - bits(25) iss = Zeros(); - if HaveRASExt() && IsAsyncAbort(fault) then iss[11:10] = fault.errortype; // AET - if d_side then - if IsSecondStage(fault) && !fault.s2fs1walk then iss[24:14] = LSInstructionSyndrome(); - if fault.acctype IN {AccType_DC, AccType_DC_UNPRIV, AccType_IC, AccType_AT} then - iss[8] = '1'; iss[6] = '1'; - else - iss[6] = if fault.write then '1' else '0'; - if IsExternalAbort(fault) then iss[9] = fault.extflag; - iss[7] = if fault.s2fs1walk then '1' else '0'; - iss[5:0] = EncodeLDFSC(fault.statuscode, fault.level); - - return iss; - -// ExceptionSyndrome() -// =================== -// Return a blank exception syndrome record for an exception of the given type1. - -ExceptionRecord ExceptionSyndrome(Exception exceptype) - - ExceptionRecord r; - - r.exceptype = exceptype; - - // Initialize all other fields - r.syndrome = Zeros(); - r.vaddress = Zeros(); - r.ipavalid = FALSE; - r.NS = '0'; - r.ipaddress = Zeros(); - - return r; - -// IPAValid() -// ========== -// Return TRUE if the IPA is reported for the abort - -boolean IPAValid(FaultRecord fault) - assert fault.statuscode != Fault_None; - - if fault.s2fs1walk then - return fault.statuscode IN {Fault_AccessFlag, Fault_Permission, Fault_Translation, - Fault_AddressSize}; - elsif fault.secondstage then - return fault.statuscode IN {Fault_AccessFlag, Fault_Translation, Fault_AddressSize}; - else - return FALSE; - -// AArch32.AbortSyndrome() -// ======================= -// Creates an exception syndrome record for Abort exceptions taken to Hyp mode -// from an AArch32 translation regime. - -ExceptionRecord AArch32.AbortSyndrome(Exception exceptype, FaultRecord fault, bits(32) vaddress) - exception = ExceptionSyndrome(exceptype); - - d_side = exceptype == Exception_DataAbort; - - exception.syndrome = AArch32.FaultSyndrome(d_side, fault); - exception.vaddress = ZeroExtend(vaddress); - if IPAValid(fault) then - exception.ipavalid = TRUE; - exception.NS = fault.ipaddress.NS; - exception.ipaddress = ZeroExtend(fault.ipaddress.address); - else - exception.ipavalid = FALSE; - - return exception; - -// HavePACExt() -// ============ -// Returns TRUE if support for the PAC extension is implemented, FALSE otherwise. - -boolean HavePACExt() - return HasArchVersion(ARMv8p3); - -// AddrTop() -// ========= -// Return the MSB number of a virtual address in the stage 1 translation regime for "el". -// If EL1 is using AArch64 then addresses from EL0 using AArch32 are zero-extended to 64 bits. - -integer AddrTop(bits(64) address, boolean IsInstr, bits(2) el) - assert HaveEL(el); - regime = S1TranslationRegime(el); - if ELUsingAArch32(regime) then - // AArch32 translation regime. - return 31; - else - // AArch64 translation regime. - case regime of - when EL1 - tbi = (if address[55] == '1' then TCR_EL1.TBI1 else TCR_EL1.TBI0); - if HavePACExt() then - tbid = if address[55] == '1' then TCR_EL1.TBID1 else TCR_EL1.TBID0; - when EL2 - if HaveVirtHostExt() && ELIsInHost(el) then - tbi = (if address[55] == '1' then TCR_EL2.TBI1 else TCR_EL2.TBI0); - if HavePACExt() then - tbid = if address[55] == '1' then TCR_EL2.TBID1 else TCR_EL2.TBID0; - else - tbi = TCR_EL2.TBI; - if HavePACExt() then tbid = TCR_EL2.TBID; - when EL3 - tbi = TCR_EL3.TBI; - if HavePACExt() then tbid = TCR_EL3.TBID; - - return (if tbi == '1' && (!HavePACExt() || tbid == '0' || !IsInstr ) then 55 else 63); - -// IsInHost() -// ========== - -boolean IsInHost() - return ELIsInHost(PSTATE.EL); - -// AArch64.BranchAddr() -// ==================== -// Return the virtual address with tag bits removed for storing to the program counter. - -bits(64) AArch64.BranchAddr(bits(64) vaddress) - assert !UsingAArch32(); - msbit = AddrTop(vaddress, TRUE, PSTATE.EL); - if msbit == 63 then - return vaddress; - elsif (PSTATE.EL IN {EL0, EL1} || IsInHost()) && vaddress[msbit] == '1' then - return SignExtend(vaddress[msbit:0]); - else - return ZeroExtend(vaddress[msbit:0]); - -enumeration BranchType { - BranchType_DIRCALL, // Direct Branch with link - BranchType_INDCALL, // Indirect Branch with link - BranchType_ERET, // Exception return (indirect) - BranchType_DBGEXIT, // Exit from Debug state - BranchType_RET, // Indirect branch with function return hint - BranchType_DIR, // Direct branch - BranchType_INDIR, // Indirect branch - BranchType_EXCEPTION, // Exception entry - BranchType_RESET, // Reset - BranchType_UNKNOWN}; // Other - -// Report the hint passed to BranchTo() and BranchToAddr(), for consideration when processing -// the next instruction. -Hint_Branch(BranchType hint); - -bits(64) _PC; - -// BranchTo() -// ========== - -// Set program counter to a new address, with a branch type1 -// In AArch64 state the address might include a tag in the top eight bits. - -BranchTo(bits(N) target, BranchType branch_type) - Hint_Branch(branch_type); - if N == 32 then - assert UsingAArch32(); - _PC = ZeroExtend(target); - else - assert N == 64 && !UsingAArch32(); - _PC = AArch64.BranchAddr(target[63:0]); - return; - -// HaveBTIExt() -// ============ -// Returns TRUE if support for Branch Target Indentification is implemented. - -boolean HaveBTIExt() - return HasArchVersion(ARMv8p5); - -// HaveDITExt() -// ============ - -boolean HaveDITExt() - return HasArchVersion(ARMv8p4); - -// HaveMTEExt() -// ============ -// Returns TRUE if MTE implemented, and FALSE otherwise. - -boolean HaveMTEExt() - if !HasArchVersion(ARMv8p5) then - return FALSE; - return boolean IMPLEMENTATION_DEFINED "Has MTE extension"; - -// HaveUAOExt() -// ============ - -boolean HaveUAOExt() - return HasArchVersion(ARMv8p2); - -// GetPSRFromPSTATE() -// ================== -// Return a PSR value which represents the current PSTATE - -bits(32) GetPSRFromPSTATE() - bits(32) spsr = Zeros(); - spsr[31:28] = PSTATE.[N,Z,C,V]; - if HavePANExt() then spsr[22] = PSTATE.PAN; - spsr[20] = PSTATE.IL; - if PSTATE.nRW == '1' then // AArch32 state - spsr[27] = PSTATE.Q; - spsr[26:25] = PSTATE.IT[1:0]; - if HaveSSBSExt() then spsr[23] = PSTATE.SSBS; - if HaveDITExt() then spsr[21] = PSTATE.DIT; - spsr[19:16] = PSTATE.GE; - spsr[15:10] = PSTATE.IT[7:2]; - spsr[9] = PSTATE.E; - spsr[8:6] = PSTATE.[A,I,F]; // No PSTATE.D in AArch32 state - spsr[5] = PSTATE.T; - assert PSTATE.M[4] == PSTATE.nRW; // bit [4] is the discriminator - spsr[4:0] = PSTATE.M; - else // AArch64 state - if HaveMTEExt() then spsr[25] = PSTATE.TCO; - if HaveDITExt() then spsr[24] = PSTATE.DIT; - if HaveUAOExt() then spsr[23] = PSTATE.UAO; - spsr[21] = PSTATE.SS; - if HaveSSBSExt() then spsr[12] = PSTATE.SSBS; - if HaveBTIExt() then spsr[11:10] = PSTATE.BTYPE; - spsr[9:6] = PSTATE.[D,A,I,F]; - spsr[4] = PSTATE.nRW; - spsr[3:2] = PSTATE.EL; - spsr[0] = PSTATE.SP; - return spsr; - -// AArch32.EnterHypMode() -// ====================== -// Take an exception to Hyp mode. - -AArch32.EnterHypMode(ExceptionRecord exception, bits(32) preferred_exception_return, - integer vect_offset) - SynchronizeContext(); - assert HaveEL(EL2) && !IsSecure() && ELUsingAArch32(EL2); - - spsr = GetPSRFromPSTATE(); - if !(exception.exceptype IN {Exception_IRQ, Exception_FIQ}) then - AArch32.ReportHypEntry(exception); - AArch32.WriteMode(M32_Hyp); - SPSR[] = spsr; - ELR_hyp = preferred_exception_return; - PSTATE.T = HSCTLR.TE; // PSTATE.J is RES0 - PSTATE.SS = '0'; - if !HaveEL(EL3) || SCR_GEN[].EA == '0' then PSTATE.A = '1'; - if !HaveEL(EL3) || SCR_GEN[].IRQ == '0' then PSTATE.I = '1'; - if !HaveEL(EL3) || SCR_GEN[].FIQ == '0' then PSTATE.F = '1'; - PSTATE.E = HSCTLR.EE; - PSTATE.IL = '0'; - PSTATE.IT = '00000000'; - if HaveSSBSExt() then PSTATE.SSBS = HSCTLR.DSSBS; - BranchTo(HVBAR[31:5]:vect_offset[4:0], BranchType_EXCEPTION); - - EndOfInstruction(); - -// AArch32.EnterMode() -// =================== -// Take an exception to a mode other than Monitor and Hyp mode. - -AArch32.EnterMode(bits(5) target_mode, bits(32) preferred_exception_return, integer lr_offset, - integer vect_offset) - SynchronizeContext(); - assert ELUsingAArch32(EL1) && PSTATE.EL != EL2; - - spsr = GetPSRFromPSTATE(); - if PSTATE.M == M32_Monitor then SCR.NS = '0'; - AArch32.WriteMode(target_mode); - SPSR[] = spsr; - R[14] = preferred_exception_return + lr_offset; - PSTATE.T = SCTLR.TE; // PSTATE.J is RES0 - PSTATE.SS = '0'; - if target_mode == M32_FIQ then - PSTATE.[A,I,F] = '111'; - elsif target_mode IN {M32_Abort, M32_IRQ} then - PSTATE.[A,I] = '11'; - else - PSTATE.I = '1'; - PSTATE.E = SCTLR.EE; - PSTATE.IL = '0'; - PSTATE.IT = '00000000'; - if HavePANExt() && SCTLR.SPAN == '0' then PSTATE.PAN = '1'; - if HaveSSBSExt() then PSTATE.SSBS = SCTLR.DSSBS; - BranchTo(ExcVectorBase()[31:5]:vect_offset[4:0], BranchType_EXCEPTION); - - EndOfInstruction(); - -// AArch32.EnterMonitorMode() -// ========================== -// Take an exception to Monitor mode. - -AArch32.EnterMonitorMode(bits(32) preferred_exception_return, integer lr_offset, - integer vect_offset) - SynchronizeContext(); - assert HaveEL(EL3) && ELUsingAArch32(EL3); - from_secure = IsSecure(); - spsr = GetPSRFromPSTATE(); - if PSTATE.M == M32_Monitor then SCR.NS = '0'; - AArch32.WriteMode(M32_Monitor); - SPSR[] = spsr; - R[14] = preferred_exception_return + lr_offset; - PSTATE.T = SCTLR.TE; // PSTATE.J is RES0 - PSTATE.SS = '0'; - PSTATE.[A,I,F] = '111'; - PSTATE.E = SCTLR.EE; - PSTATE.IL = '0'; - PSTATE.IT = '00000000'; - if HavePANExt() then - if !from_secure then - PSTATE.PAN = '0'; - elsif SCTLR.SPAN == '0' then - PSTATE.PAN = '1'; - if HaveSSBSExt() then PSTATE.SSBS = SCTLR.DSSBS; - BranchTo(MVBAR[31:5]:vect_offset[4:0], BranchType_EXCEPTION); - - EndOfInstruction(); - -// AArch32.FaultStatusLD() -// ======================= -// Creates an exception fault status value for Abort and Watchpoint exceptions taken -// to Abort mode using AArch32 and Long-descriptor format. - -bits(32) AArch32.FaultStatusLD(boolean d_side, FaultRecord fault) - assert fault.statuscode != Fault_None; - - bits(32) fsr = Zeros(); - if HaveRASExt() && IsAsyncAbort(fault) then fsr[15:14] = fault.errortype; - if d_side then - if fault.acctype IN {AccType_DC, AccType_IC, AccType_AT} then - fsr[13] = '1'; fsr[11] = '1'; - else - fsr[11] = if fault.write then '1' else '0'; - if IsExternalAbort(fault) then fsr[12] = fault.extflag; - fsr[9] = '1'; - fsr[5:0] = EncodeLDFSC(fault.statuscode, fault.level); - - return fsr; - -// EncodeSDFSC() -// ============= -// Function that gives the Short-descriptor FSR code for different types of Fault - -bits(5) EncodeSDFSC(Fault statuscode, integer level) - - bits(5) result; - case statuscode of - when Fault_AccessFlag - assert level IN {1,2}; - result = if level == 1 then '00011' else '00110'; - when Fault_Alignment - result = '00001'; - when Fault_Permission - assert level IN {1,2}; - result = if level == 1 then '01101' else '01111'; - when Fault_Domain - assert level IN {1,2}; - result = if level == 1 then '01001' else '01011'; - when Fault_Translation - assert level IN {1,2}; - result = if level == 1 then '00101' else '00111'; - when Fault_SyncExternal - result = '01000'; - when Fault_SyncExternalOnWalk - assert level IN {1,2}; - result = if level == 1 then '01100' else '01110'; - when Fault_SyncParity - result = '11001'; - when Fault_SyncParityOnWalk - assert level IN {1,2}; - result = if level == 1 then '11100' else '11110'; - when Fault_AsyncParity - result = '11000'; - when Fault_AsyncExternal - result = '10110'; - when Fault_Debug - result = '00010'; - when Fault_TLBConflict - result = '10000'; - when Fault_Lockdown - result = '10100'; // IMPLEMENTATION DEFINED - when Fault_Exclusive - result = '10101'; // IMPLEMENTATION DEFINED - when Fault_ICacheMaint - result = '00100'; - otherwise - Unreachable(); - - return result; - -// AArch32.FaultStatusSD() -// ======================= -// Creates an exception fault status value for Abort and Watchpoint exceptions taken -// to Abort mode using AArch32 and Short-descriptor format. - -bits(32) AArch32.FaultStatusSD(boolean d_side, FaultRecord fault) - assert fault.statuscode != Fault_None; - - bits(32) fsr = Zeros(); - if HaveRASExt() && IsAsyncAbort(fault) then fsr[15:14] = fault.errortype; - if d_side then - if fault.acctype IN {AccType_DC, AccType_IC, AccType_AT} then - fsr[13] = '1'; fsr[11] = '1'; - else - fsr[11] = if fault.write then '1' else '0'; - if IsExternalAbort(fault) then fsr[12] = fault.extflag; - fsr[9] = '0'; - fsr[10,3:0] = EncodeSDFSC(fault.statuscode, fault.level); - if d_side then - fsr[7:4] = fault.domain; // Domain field (data fault only) - - return fsr; - -// IsSErrorInterrupt() -// =================== -// Returns TRUE if the abort currently being processed is an SError interrupt, and FALSE -// otherwise. - -boolean IsSErrorInterrupt(Fault statuscode) - assert statuscode != Fault_None; - - return (statuscode IN {Fault_AsyncExternal, Fault_AsyncParity}); - -// IsSErrorInterrupt() -// =================== - -boolean IsSErrorInterrupt(FaultRecord fault) - return IsSErrorInterrupt(fault.statuscode); - -// AArch32.ReportDataAbort() -// ========================= -// Report syndrome information for aborts taken to modes other than Hyp mode. - -AArch32.ReportDataAbort(boolean route_to_monitor, FaultRecord fault, bits(32) vaddress) - - // The encoding used in the IFSR or DFSR can be Long-descriptor format or Short-descriptor - // format. Normally, the current translation table format determines the format. For an abort - // from Non-secure state to Monitor mode, the IFSR or DFSR uses the Long-descriptor format if - // any of the following applies: - // * The Secure TTBCR.EAE is set to 1. - // * The abort is synchronous and either: - // - It is taken from Hyp mode. - // - It is taken from EL1 or EL0, and the Non-secure TTBCR.EAE is set to 1. - long_format = FALSE; - if route_to_monitor && !IsSecure() then - long_format = TTBCR_S.EAE == '1'; - if !IsSErrorInterrupt(fault) && !long_format then - long_format = PSTATE.EL == EL2 || TTBCR.EAE == '1'; - else - long_format = TTBCR.EAE == '1'; - d_side = TRUE; - if long_format then - syndrome = AArch32.FaultStatusLD(d_side, fault); - else - syndrome = AArch32.FaultStatusSD(d_side, fault); - - if fault.acctype == AccType_IC then - if (!long_format && - boolean IMPLEMENTATION_DEFINED "Report I-cache maintenance fault in IFSR") then - i_syndrome = syndrome; - syndrome[10,3:0] = EncodeSDFSC(Fault_ICacheMaint, 1); - else - i_syndrome = bits(32) UNKNOWN; - if route_to_monitor then - IFSR_S = i_syndrome; - else - IFSR = i_syndrome; - - if route_to_monitor then - DFSR_S = syndrome; - DFAR_S = vaddress; - else - DFSR = syndrome; - DFAR = vaddress; - - return; - -// IsDebugException() -// ================== - -boolean IsDebugException(FaultRecord fault) - assert fault.statuscode != Fault_None; - return fault.statuscode == Fault_Debug; - -// ThisInstrAddr() -// =============== -// Return address of the current instruction. - -bits(N) ThisInstrAddr() - assert N == 64 || (N == 32 && UsingAArch32()); - return _PC[N-1:0]; - -// AArch32.TakeDataAbortException() -// ================================ - -AArch32.TakeDataAbortException(bits(32) vaddress, FaultRecord fault) - route_to_monitor = HaveEL(EL3) && SCR.EA == '1' && IsExternalAbort(fault); - route_to_hyp = (HaveEL(EL2) && !IsSecure() && PSTATE.EL IN {EL0, EL1} && - (HCR.TGE == '1' || IsSecondStage(fault) || - (HaveRASExt() && HCR2.TEA == '1' && IsExternalAbort(fault)) || - (IsDebugException(fault) && HDCR.TDE == '1'))); - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x10; - lr_offset = 8; - - if IsDebugException(fault) then DBGDSCRext.MOE = fault.debugmoe; - if route_to_monitor then - AArch32.ReportDataAbort(route_to_monitor, fault, vaddress); - AArch32.EnterMonitorMode(preferred_exception_return, lr_offset, vect_offset); - elsif PSTATE.EL == EL2 || route_to_hyp then - exception = AArch32.AbortSyndrome(Exception_DataAbort, fault, vaddress); - if PSTATE.EL == EL2 then - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - else - AArch32.EnterHypMode(exception, preferred_exception_return, 0x14); - else - AArch32.ReportDataAbort(route_to_monitor, fault, vaddress); - AArch32.EnterMode(M32_Abort, preferred_exception_return, lr_offset, vect_offset); - -// AArch32.ReportPrefetchAbort() -// ============================= -// Report syndrome information for aborts taken to modes other than Hyp mode. - -AArch32.ReportPrefetchAbort(boolean route_to_monitor, FaultRecord fault, bits(32) vaddress) - // The encoding used in the IFSR can be Long-descriptor format or Short-descriptor format. - // Normally, the current translation table format determines the format. For an abort from - // Non-secure state to Monitor mode, the IFSR uses the Long-descriptor format if any of the - // following applies: - // * The Secure TTBCR.EAE is set to 1. - // * It is taken from Hyp mode. - // * It is taken from EL1 or EL0, and the Non-secure TTBCR.EAE is set to 1. - long_format = FALSE; - if route_to_monitor && !IsSecure() then - long_format = TTBCR_S.EAE == '1' || PSTATE.EL == EL2 || TTBCR.EAE == '1'; - else - long_format = TTBCR.EAE == '1'; - - d_side = FALSE; - if long_format then - fsr = AArch32.FaultStatusLD(d_side, fault); - else - fsr = AArch32.FaultStatusSD(d_side, fault); - - if route_to_monitor then - IFSR_S = fsr; - IFAR_S = vaddress; - else - IFSR = fsr; - IFAR = vaddress; - - return; - -// AArch32.TakePrefetchAbortException() -// ==================================== - -AArch32.TakePrefetchAbortException(bits(32) vaddress, FaultRecord fault) - route_to_monitor = HaveEL(EL3) && SCR.EA == '1' && IsExternalAbort(fault); - route_to_hyp = (HaveEL(EL2) && !IsSecure() && PSTATE.EL IN {EL0, EL1} && - (HCR.TGE == '1' || IsSecondStage(fault) || - (HaveRASExt() && HCR2.TEA == '1' && IsExternalAbort(fault)) || - (IsDebugException(fault) && HDCR.TDE == '1'))); - - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0C; - lr_offset = 4; - - if IsDebugException(fault) then DBGDSCRext.MOE = fault.debugmoe; - if route_to_monitor then - AArch32.ReportPrefetchAbort(route_to_monitor, fault, vaddress); - AArch32.EnterMonitorMode(preferred_exception_return, lr_offset, vect_offset); - elsif PSTATE.EL == EL2 || route_to_hyp then - if fault.statuscode == Fault_Alignment then // PC Alignment fault - exception = ExceptionSyndrome(Exception_PCAlignment); - exception.vaddress = ThisInstrAddr(); - else - exception = AArch32.AbortSyndrome(Exception_InstructionAbort, fault, vaddress); - if PSTATE.EL == EL2 then - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - else - AArch32.EnterHypMode(exception, preferred_exception_return, 0x14); - else - AArch32.ReportPrefetchAbort(route_to_monitor, fault, vaddress); - AArch32.EnterMode(M32_Abort, preferred_exception_return, lr_offset, vect_offset); - -// HaveNVExt() -// =========== -// Returns TRUE if Nested Virtualization is implemented. - -boolean HaveNVExt() - return HasArchVersion(ARMv8p3) && boolean IMPLEMENTATION_DEFINED "Has Nested Virtualization"; - -// HaveNV2Ext() -// ============ -// Returns TRUE if Enhanced Nested Virtualization is implemented. - -boolean HaveNV2Ext() - return (HasArchVersion(ARMv8p4) && HaveNVExt() - && boolean IMPLEMENTATION_DEFINED "Has support for Enhanced Nested Virtualization"); - -// IsExternalSyncAbort() -// ===================== -// Returns TRUE if the abort currently being processed is an external synchronous abort and FALSE otherwise. - -boolean IsExternalSyncAbort(Fault statuscode) - assert statuscode != Fault_None; - - return (statuscode IN {Fault_SyncExternal, Fault_SyncParity, Fault_SyncExternalOnWalk, Fault_SyncParityOnWalk}); - -// IsExternalSyncAbort() -// ===================== - -boolean IsExternalSyncAbort(FaultRecord fault) - return IsExternalSyncAbort(fault.statuscode); - -// AArch64.FaultSyndrome() -// ======================= -// Creates an exception syndrome value for Abort and Watchpoint exceptions taken to -// an Exception Level using AArch64. - -bits(25) AArch64.FaultSyndrome(boolean d_side, FaultRecord fault) - assert fault.statuscode != Fault_None; - - bits(25) iss = Zeros(); - if HaveRASExt() && IsExternalSyncAbort(fault) then iss[12:11] = fault.errortype; // SET - if d_side then - if IsSecondStage(fault) && !fault.s2fs1walk then iss[24:14] = LSInstructionSyndrome(); - if HaveNV2Ext() && fault.acctype == AccType_NV2REGISTER then - iss[13] = '1'; // Value of '1' indicates fault is generated by use of VNCR_EL2 - if fault.acctype IN {AccType_DC, AccType_DC_UNPRIV, AccType_IC, AccType_AT} then - iss[8] = '1'; iss[6] = '1'; - else - iss[6] = if fault.write then '1' else '0'; - if IsExternalAbort(fault) then iss[9] = fault.extflag; - iss[7] = if fault.s2fs1walk then '1' else '0'; - iss[5:0] = EncodeLDFSC(fault.statuscode, fault.level); - - return iss; - -// AArch64.AbortSyndrome() -// ======================= -// Creates an exception syndrome record for Abort and Watchpoint exceptions -// from an AArch64 translation regime. - -ExceptionRecord AArch64.AbortSyndrome(Exception exceptype, FaultRecord fault, bits(64) vaddress) - exception = ExceptionSyndrome(exceptype); - - d_side = exceptype IN {Exception_DataAbort, Exception_NV2DataAbort, Exception_Watchpoint, Exception_NV2Watchpoint}; - - exception.syndrome = AArch64.FaultSyndrome(d_side, fault); - exception.vaddress = ZeroExtend(vaddress); - if IPAValid(fault) then - exception.ipavalid = TRUE; - exception.NS = fault.ipaddress.NS; - exception.ipaddress = fault.ipaddress.address; - else - exception.ipavalid = FALSE; - - return exception; - -// AArch64.MaybeZeroRegisterUppers() -// ================================= -// On taking an exception to AArch64 from AArch32, it is CONSTRAINED UNPREDICTABLE whether the top -// 32 bits of registers visible at any lower Exception level using AArch32 are set to zero. - -AArch64.MaybeZeroRegisterUppers() - assert UsingAArch32(); // Always called from AArch32 state before entering AArch64 state - - if PSTATE.EL == EL0 && !ELUsingAArch32(EL1) then - first = 0; last = 14; include_R15 = FALSE; - elsif PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !ELUsingAArch32(EL2) then - first = 0; last = 30; include_R15 = FALSE; - else - first = 0; last = 30; include_R15 = TRUE; - - for n = first to last - if (n != 15 || include_R15) && ConstrainUnpredictableBool(Unpredictable_ZEROUPPER) then - _R[n][63:32] = Zeros(); - - return; - -// AArch64.ExceptionClass() -// ======================== -// Returns the Exception Class and Instruction Length fields to be reported in ESR - -(integer,bit) AArch64.ExceptionClass(Exception exceptype, bits(2) target_el) - - il = if ThisInstrLength() == 32 then '1' else '0'; - from_32 = UsingAArch32(); - assert from_32 || il == '1'; // AArch64 instructions always 32-bit - - case exceptype of - when Exception_Uncategorized ec = 0x00; il = '1'; - when Exception_WFxTrap ec = 0x01; - when Exception_CP15RTTrap ec = 0x03; assert from_32; - when Exception_CP15RRTTrap ec = 0x04; assert from_32; - when Exception_CP14RTTrap ec = 0x05; assert from_32; - when Exception_CP14DTTrap ec = 0x06; assert from_32; - when Exception_AdvSIMDFPAccessTrap ec = 0x07; - when Exception_FPIDTrap ec = 0x08; - when Exception_PACTrap ec = 0x09; - when Exception_CP14RRTTrap ec = 0x0C; assert from_32; - when Exception_BranchTarget ec = 0x0D; - when Exception_IllegalState ec = 0x0E; il = '1'; - when Exception_SupervisorCall ec = 0x11; - when Exception_HypervisorCall ec = 0x12; - when Exception_MonitorCall ec = 0x13; - when Exception_SystemRegisterTrap ec = 0x18; assert !from_32; - when Exception_SVEAccessTrap ec = 0x19; assert !from_32; - when Exception_ERetTrap ec = 0x1A; - when Exception_PACFail ec = 0x1C; - when Exception_InstructionAbort ec = 0x20; il = '1'; - when Exception_PCAlignment ec = 0x22; il = '1'; - when Exception_DataAbort ec = 0x24; - when Exception_NV2DataAbort ec = 0x25; - when Exception_SPAlignment ec = 0x26; il = '1'; assert !from_32; - when Exception_FPTrappedException ec = 0x28; - when Exception_SError ec = 0x2F; il = '1'; - when Exception_Breakpoint ec = 0x30; il = '1'; - when Exception_SoftwareStep ec = 0x32; il = '1'; - when Exception_Watchpoint ec = 0x34; il = '1'; - when Exception_NV2Watchpoint ec = 0x35; il = '1'; - when Exception_SoftwareBreakpoint ec = 0x38; - when Exception_VectorCatch ec = 0x3A; il = '1'; assert from_32; - otherwise Unreachable(); - - if ec IN {0x20,0x24,0x30,0x32,0x34} && target_el == PSTATE.EL then - ec = ec + 1; - - if ec IN {0x11,0x12,0x13,0x28,0x38} && !from_32 then - ec = ec + 4; - - return (ec,il); - -type ESRType; - -// ESR[] - non-assignment form -// =========================== - -ESRType ESR[bits(2) regime] - bits(32) r; - case regime of - when EL1 r = ESR_EL1; - when EL2 r = ESR_EL2; - when EL3 r = ESR_EL3; - otherwise Unreachable(); - return r; - -// ESR[] - non-assignment form -// =========================== - -ESRType ESR[] - return ESR[S1TranslationRegime()]; - -// ESR[] - assignment form -// ======================= - -ESR[bits(2) regime] = ESRType value - bits(32) r = value; - case regime of - when EL1 ESR_EL1 = r; - when EL2 ESR_EL2 = r; - when EL3 ESR_EL3 = r; - otherwise Unreachable(); - return; - -// ESR[] - assignment form -// ======================= - -ESR[] = ESRType value - ESR[S1TranslationRegime()] = value; - -// FAR[] - non-assignment form -// =========================== - -bits(64) FAR[bits(2) regime] - bits(64) r; - case regime of - when EL1 r = FAR_EL1; - when EL2 r = FAR_EL2; - when EL3 r = FAR_EL3; - otherwise Unreachable(); - return r; - -// FAR[] - non-assignment form -// =========================== - -bits(64) FAR[] - return FAR[S1TranslationRegime()]; - -// FAR[] - assignment form -// ======================= - -FAR[bits(2) regime] = bits(64) value - bits(64) r = value; - case regime of - when EL1 FAR_EL1 = r; - when EL2 FAR_EL2 = r; - when EL3 FAR_EL3 = r; - otherwise Unreachable(); - return; - -// FAR[] - assignment form -// ======================= - -FAR[] = bits(64) value - FAR[S1TranslationRegime()] = value; - return; - -// AArch64.ReportException() -// ========================= -// Report syndrome information for exception taken to AArch64 state. - -AArch64.ReportException(ExceptionRecord exception, bits(2) target_el) - - Exception exceptype = exception.exceptype; - - (ec,il) = AArch64.ExceptionClass(exceptype, target_el); - iss = exception.syndrome; - - // IL is not valid for Data Abort exceptions without valid instruction syndrome information - if ec IN {0x24,0x25} && iss[24] == '0' then - il = '1'; - - ESR[target_el] = ec[5:0]:il:iss; - - if exceptype IN {Exception_InstructionAbort, Exception_PCAlignment, Exception_DataAbort, - Exception_NV2DataAbort, Exception_NV2Watchpoint, - Exception_Watchpoint} then - FAR[target_el] = exception.vaddress; - else - FAR[target_el] = bits(64) UNKNOWN; - - if target_el == EL2 then - if exception.ipavalid then - HPFAR_EL2[43:4] = exception.ipaddress[51:12]; - if IsSecureEL2Enabled() && IsSecure() then - HPFAR_EL2.NS = exception.NS; - else - HPFAR_EL2.NS = '0'; - else - HPFAR_EL2[43:4] = bits(40) UNKNOWN; - - return; - -// ELR[] - non-assignment form -// =========================== - -bits(64) ELR[bits(2) el] - bits(64) r; - case el of - when EL1 r = ELR_EL1; - when EL2 r = ELR_EL2; - when EL3 r = ELR_EL3; - otherwise Unreachable(); - return r; - -// ELR[] - non-assignment form -// =========================== - -bits(64) ELR[] - assert PSTATE.EL != EL0; - return ELR[PSTATE.EL]; - -// ELR[] - assignment form -// ======================= - -ELR[bits(2) el] = bits(64) value - bits(64) r = value; - case el of - when EL1 ELR_EL1 = r; - when EL2 ELR_EL2 = r; - when EL3 ELR_EL3 = r; - otherwise Unreachable(); - return; - -// ELR[] - assignment form -// ======================= - -ELR[] = bits(64) value - assert PSTATE.EL != EL0; - ELR[PSTATE.EL] = value; - return; - -// HaveIESB() -// ========== - -boolean HaveIESB() - return (HaveRASExt() && - boolean IMPLEMENTATION_DEFINED "Has Implicit Error Synchronization Barrier"); - -// HaveDoubleFaultExt() -// ==================== - -boolean HaveDoubleFaultExt() - return (HasArchVersion(ARMv8p4) && HaveEL(EL3) && !ELUsingAArch32(EL3) && HaveIESB()); - -// If SCTLR_ELx.IESB is 1 when an exception is generated to ELx, any pending Unrecoverable -// SError interrupt must be taken before executing any instructions in the exception handler. -// However, this can be before the branch to the exception handler is made. -boolean InsertIESBBeforeException(bits(2) el); - -// AArch64.IsFPEnabled() -// ===================== -// Returns TRUE if access to the SIMD&FP instructions or System registers are -// enabled at the target exception level in AArch64 state and FALSE otherwise. - -boolean AArch64.IsFPEnabled(bits(2) el) - // Check if access disabled in CPACR_EL1 - if el IN {EL0, EL1} && !IsInHost() then - // Check FP&SIMD at EL0/EL1 - case CPACR_EL1.FPEN of - when 'x0' disabled = TRUE; - when '01' disabled = el == EL0; - when '11' disabled = FALSE; - if disabled then return FALSE; - - // Check if access disabled in CPTR_EL2 - if el IN {EL0, EL1, EL2} && EL2Enabled() then - if HaveVirtHostExt() && HCR_EL2.E2H == '1' then - case CPTR_EL2.FPEN of - when 'x0' disabled = TRUE; - when '01' disabled = el == EL0 && HCR_EL2.TGE == '1'; - when '11' disabled = FALSE; - if disabled then return FALSE; - else - if CPTR_EL2.TFP == '1' then return FALSE; - - // Check if access disabled in CPTR_EL3 - if HaveEL(EL3) then - if CPTR_EL3.TFP == '1' then return FALSE; - - return TRUE; - -// AArch32.IsFPEnabled() -// ===================== -// Returns TRUE if access to the SIMD&FP instructions or System registers are -// enabled at the target exception level in AArch32 state and FALSE otherwise. - -boolean AArch32.IsFPEnabled(bits(2) el) - if el == EL0 && !ELUsingAArch32(EL1) then - return AArch64.IsFPEnabled(el); - - if HaveEL(EL3) && ELUsingAArch32(EL3) && !IsSecure() then - // Check if access disabled in NSACR - if NSACR.cp10 == '0' then return FALSE; - - if el IN {EL0, EL1} then - // Check if access disabled in CPACR - case CPACR.cp10 of - when '00' disabled = TRUE; - when '01' disabled = el == EL0; - when '10' disabled = ConstrainUnpredictableBool(Unpredictable_RESCPACR); - when '11' disabled = FALSE; - if disabled then return FALSE; - - if el IN {EL0, EL1, EL2} then - if EL2Enabled() then - if !ELUsingAArch32(EL2) then - if CPTR_EL2.TFP == '1' then return FALSE; - else - if HCPTR.TCP10 == '1' then return FALSE; - - if HaveEL(EL3) && !ELUsingAArch32(EL3) then - // Check if access disabled in CPTR_EL3 - if CPTR_EL3.TFP == '1' then return FALSE; - - return TRUE; - -// IsFPEnabled() -// ============= -// Returns TRUE if accesses to the Advanced SIMD and floating-point -// registers are enabled at the target exception level in the current -// execution state and FALSE otherwise. - -boolean IsFPEnabled(bits(2) el) - if ELUsingAArch32(el) then - return AArch32.IsFPEnabled(el); - else - return AArch64.IsFPEnabled(el); - -// IsSVEEnabled() -// ============== -// Returns TRUE if access to SVE instructions and System registers is -// enabled at the target exception level and FALSE otherwise. - -boolean IsSVEEnabled(bits(2) el) - if ELUsingAArch32(el) then - return FALSE; - - // Check if access disabled in CPACR_EL1 - if el IN {EL0, EL1} && !IsInHost() then - // Check SVE at EL0/EL1 - case CPACR_EL1.ZEN of - when 'x0' disabled = TRUE; - when '01' disabled = el == EL0; - when '11' disabled = FALSE; - if disabled then return FALSE; - - // Check if access disabled in CPTR_EL2 - if el IN {EL0, EL1, EL2} && EL2Enabled() then - if HaveVirtHostExt() && HCR_EL2.E2H == '1' then - case CPTR_EL2.ZEN of - when 'x0' disabled = TRUE; - when '01' disabled = el == EL0 && HCR_EL2.TGE == '1'; - when '11' disabled = FALSE; - if disabled then return FALSE; - else - if CPTR_EL2.TZ == '1' then return FALSE; - - // Check if access disabled in CPTR_EL3 - if HaveEL(EL3) then - if CPTR_EL3.EZ == '0' then return FALSE; - - return TRUE; - -// ImplementedSVEVectorLength() -// ============================ -// Reduce SVE vector length to a supported value (e.g. power of two) - -integer ImplementedSVEVectorLength(integer nbits) - return integer IMPLEMENTATION_DEFINED; - -// Min() -// ===== - -integer Min(integer a, integer b) - return if a <= b then a else b; - -// Min() -// ===== - -real Min(real a, real b) - return if a <= b then a else b; - -// VL - non-assignment form -// ======================== - -integer VL - integer vl; - - if PSTATE.EL == EL1 || (PSTATE.EL == EL0 && !IsInHost()) then - vl = UInt(ZCR_EL1.LEN); - - if PSTATE.EL == EL2 || (PSTATE.EL == EL0 && IsInHost()) then - vl = UInt(ZCR_EL2.LEN); - elsif PSTATE.EL IN {EL0, EL1} && EL2Enabled() then - vl = Min(vl, UInt(ZCR_EL2.LEN)); - - if PSTATE.EL == EL3 then - vl = UInt(ZCR_EL3.LEN); - elsif HaveEL(EL3) then - vl = Min(vl, UInt(ZCR_EL3.LEN)); - - vl = (vl + 1) * 128; - vl = ImplementedSVEVectorLength(vl); - - return vl; - -constant integer MAX_PL = 256; - -constant integer MAX_VL = 128; - -array bits(MAX_VL) _Z[0..31]; -array bits(MAX_PL) _P[0..15]; -bits(MAX_PL) _FFR; - -// MaybeZeroSVEUppers() -// ==================== - -MaybeZeroSVEUppers(bits(2) target_el) - boolean lower_enabled; - - if UInt(target_el) <= UInt(PSTATE.EL) || !IsSVEEnabled(target_el) then - return; - - if target_el == EL3 then - if EL2Enabled() then - lower_enabled = IsFPEnabled(EL2); - else - lower_enabled = IsFPEnabled(EL1); - else - lower_enabled = IsFPEnabled(target_el - 1); - - if lower_enabled then - integer vl = if IsSVEEnabled(PSTATE.EL) then VL else 128; - integer pl = vl DIV 8; - for n = 0 to 31 - if ConstrainUnpredictableBool(Unpredictable_SVEZEROUPPER) then - _Z[n] = ZeroExtend(_Z[n][vl-1:0]); - for n = 0 to 15 - if ConstrainUnpredictableBool(Unpredictable_SVEZEROUPPER) then - _P[n] = ZeroExtend(_P[n][pl-1:0]); - if ConstrainUnpredictableBool(Unpredictable_SVEZEROUPPER) then - _FFR = ZeroExtend(_FFR[pl-1:0]); - -type SCTLRType; - -// SCTLR[] - non-assignment form -// ============================= - -SCTLRType SCTLR[bits(2) regime] - bits(64) r; - case regime of - when EL1 r = SCTLR_EL1; - when EL2 r = SCTLR_EL2; - when EL3 r = SCTLR_EL3; - otherwise Unreachable(); - return r; - -// SCTLR[] - non-assignment form -// ============================= - -SCTLRType SCTLR[] - return SCTLR[S1TranslationRegime()]; - -// Implements the error synchronization event. -SynchronizeErrors(); - -// Take any pending unmasked physical SError interrupt -TakeUnmaskedPhysicalSErrorInterrupts(boolean iesb_req); - -// AArch64.TakeException() -// ======================= -// Take an exception to an Exception Level using AArch64. - -AArch64.TakeException(bits(2) target_el, ExceptionRecord exception, - bits(64) preferred_exception_return, integer vect_offset) - assert HaveEL(target_el) && !ELUsingAArch32(target_el) && UInt(target_el) >= UInt(PSTATE.EL); - - sync_errors = HaveIESB() && SCTLR[target_el].IESB == '1'; - if HaveDoubleFaultExt() then - sync_errors = sync_errors || (SCR_EL3.EA == '1' && SCR_EL3.NMEA == '1' && PSTATE.EL == EL3); - if sync_errors && InsertIESBBeforeException(target_el) then - SynchronizeErrors(); - iesb_req = FALSE; - sync_errors = FALSE; - TakeUnmaskedPhysicalSErrorInterrupts(iesb_req); - - SynchronizeContext(); - - // If coming from AArch32 state, the top parts of the X[] registers might be set to zero - from_32 = UsingAArch32(); - if from_32 then AArch64.MaybeZeroRegisterUppers(); - MaybeZeroSVEUppers(target_el); - - if UInt(target_el) > UInt(PSTATE.EL) then - boolean lower_32; - if target_el == EL3 then - if EL2Enabled() then - lower_32 = ELUsingAArch32(EL2); - else - lower_32 = ELUsingAArch32(EL1); - elsif IsInHost() && PSTATE.EL == EL0 && target_el == EL2 then - lower_32 = ELUsingAArch32(EL0); - else - lower_32 = ELUsingAArch32(target_el - 1); - vect_offset = vect_offset + (if lower_32 then 0x600 else 0x400); - - elsif PSTATE.SP == '1' then - vect_offset = vect_offset + 0x200; - - spsr = GetPSRFromPSTATE(); - - if PSTATE.EL == EL1 && target_el == EL1 && EL2Enabled() then - if HaveNV2Ext() && (HCR_EL2.[NV,NV1,NV2] == '100' || HCR_EL2.[NV,NV1,NV2] == '111') then - spsr[3:2] = '10'; - else - if HaveNVExt() && HCR_EL2.[NV,NV1] == '10' then - spsr[3:2] = '10'; - - if HaveBTIExt() then - // SPSR[].BTYPE is only guaranteed valid for these exception types - if exception.exceptype IN {Exception_SError, Exception_IRQ, Exception_FIQ, - Exception_SoftwareStep, Exception_PCAlignment, - Exception_InstructionAbort, Exception_Breakpoint, - Exception_VectorCatch, Exception_SoftwareBreakpoint, - Exception_IllegalState, Exception_BranchTarget} then - zero_btype = FALSE; - else - zero_btype = ConstrainUnpredictableBool(Unpredictable_ZEROBTYPE); - if zero_btype then spsr[11:10] = '00'; - - if HaveNV2Ext() && exception.exceptype == Exception_NV2DataAbort && target_el == EL3 then - // external aborts are configured to be taken to EL3 - exception.exceptype = Exception_DataAbort; - if !(exception.exceptype IN {Exception_IRQ, Exception_FIQ}) then - AArch64.ReportException(exception, target_el); - - PSTATE.EL = target_el; - PSTATE.nRW = '0'; - PSTATE.SP = '1'; - - SPSR[] = spsr; - ELR[] = preferred_exception_return; - - PSTATE.SS = '0'; - PSTATE.[D,A,I,F] = '1111'; - PSTATE.IL = '0'; - if from_32 then // Coming from AArch32 - PSTATE.IT = '00000000'; - PSTATE.T = '0'; // PSTATE.J is RES0 - if (HavePANExt() && (PSTATE.EL == EL1 || (PSTATE.EL == EL2 && ELIsInHost(EL0))) && - SCTLR[].SPAN == '0') then - PSTATE.PAN = '1'; - if HaveUAOExt() then PSTATE.UAO = '0'; - if HaveBTIExt() then PSTATE.BTYPE = '00'; - if HaveSSBSExt() then PSTATE.SSBS = SCTLR[].DSSBS; - if HaveMTEExt() then PSTATE.TCO = '1'; - - BranchTo(VBAR[][63:11]:vect_offset[10:0], BranchType_EXCEPTION); - - if sync_errors then - SynchronizeErrors(); - iesb_req = TRUE; - TakeUnmaskedPhysicalSErrorInterrupts(iesb_req); - - EndOfInstruction(); - -// AArch64.BreakpointException() -// ============================= - -AArch64.BreakpointException(FaultRecord fault) - assert PSTATE.EL != EL3; - - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR_EL2.TGE == '1' || MDCR_EL2.TDE == '1')); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - vaddress = bits(64) UNKNOWN; - exception = AArch64.AbortSyndrome(Exception_Breakpoint, fault, vaddress); - - if PSTATE.EL == EL2 || route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch64.DataAbort() -// =================== - -AArch64.DataAbort(bits(64) vaddress, FaultRecord fault) - route_to_el3 = HaveEL(EL3) && SCR_EL3.EA == '1' && IsExternalAbort(fault); - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && (HCR_EL2.TGE == '1' || - (HaveRASExt() && HCR_EL2.TEA == '1' && IsExternalAbort(fault)) || - (HaveNV2Ext() && fault.acctype == AccType_NV2REGISTER) || - IsSecondStage(fault))); - - bits(64) preferred_exception_return = ThisInstrAddr(); - if (HaveDoubleFaultExt() && (PSTATE.EL == EL3 || route_to_el3) && - IsExternalAbort(fault) && SCR_EL3.EASE == '1') then - vect_offset = 0x180; - else - vect_offset = 0x0; - if HaveNV2Ext() && fault.acctype == AccType_NV2REGISTER then - exception = AArch64.AbortSyndrome(Exception_NV2DataAbort, fault, vaddress); - else - exception = AArch64.AbortSyndrome(Exception_DataAbort, fault, vaddress); - if PSTATE.EL == EL3 || route_to_el3 then - AArch64.TakeException(EL3, exception, preferred_exception_return, vect_offset); - elsif PSTATE.EL == EL2 || route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch64.InstructionAbort() -// ========================== - -AArch64.InstructionAbort(bits(64) vaddress, FaultRecord fault) - // External aborts on instruction fetch must be taken synchronously - if HaveDoubleFaultExt() then assert fault.statuscode != Fault_AsyncExternal; - route_to_el3 = HaveEL(EL3) && SCR_EL3.EA == '1' && IsExternalAbort(fault); - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR_EL2.TGE == '1' || IsSecondStage(fault) || - (HaveRASExt() && HCR_EL2.TEA == '1' && IsExternalAbort(fault)))); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = AArch64.AbortSyndrome(Exception_InstructionAbort, fault, vaddress); - - if PSTATE.EL == EL3 || route_to_el3 then - AArch64.TakeException(EL3, exception, preferred_exception_return, vect_offset); - elsif PSTATE.EL == EL2 || route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch64.VectorCatchException() -// ============================== -// Vector Catch taken from EL0 or EL1 to EL2. This can only be called when debug exceptions are -// being routed to EL2, as Vector Catch is a legacy debug event. - -AArch64.VectorCatchException(FaultRecord fault) - assert PSTATE.EL != EL2; - assert EL2Enabled() && (HCR_EL2.TGE == '1' || MDCR_EL2.TDE == '1'); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - vaddress = bits(64) UNKNOWN; - exception = AArch64.AbortSyndrome(Exception_VectorCatch, fault, vaddress); - - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - -// AArch64.WatchpointException() -// ============================= - -AArch64.WatchpointException(bits(64) vaddress, FaultRecord fault) - assert PSTATE.EL != EL3; - - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR_EL2.TGE == '1' || MDCR_EL2.TDE == '1')); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - if HaveNV2Ext() && fault.acctype == AccType_NV2REGISTER then - exception = AArch64.AbortSyndrome(Exception_NV2Watchpoint, fault, vaddress); - else - exception = AArch64.AbortSyndrome(Exception_Watchpoint, fault, vaddress); - - if PSTATE.EL == EL2 || route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -constant bits(4) DebugException_Breakpoint = '0001'; -constant bits(4) DebugException_BKPT = '0011'; -constant bits(4) DebugException_VectorCatch = '0101'; -constant bits(4) DebugException_Watchpoint = '1010'; - -// AArch64.Abort() -// =============== -// Abort and Debug exception handling in an AArch64 translation regime. - -AArch64.Abort(bits(64) vaddress, FaultRecord fault) - - if IsDebugException(fault) then - if fault.acctype == AccType_IFETCH then - if UsingAArch32() && fault.debugmoe == DebugException_VectorCatch then - AArch64.VectorCatchException(fault); - else - AArch64.BreakpointException(fault); - else - AArch64.WatchpointException(vaddress, fault); - elsif fault.acctype == AccType_IFETCH then - AArch64.InstructionAbort(vaddress, fault); - else - AArch64.DataAbort(vaddress, fault); - -// AArch32.Abort() -// =============== -// Abort and Debug exception handling in an AArch32 translation regime. - -AArch32.Abort(bits(32) vaddress, FaultRecord fault) - - // Check if routed to AArch64 state - route_to_aarch64 = PSTATE.EL == EL0 && !ELUsingAArch32(EL1); - - if !route_to_aarch64 && EL2Enabled() && !ELUsingAArch32(EL2) then - route_to_aarch64 = (HCR_EL2.TGE == '1' || IsSecondStage(fault) || - (HaveRASExt() && HCR2.TEA == '1' && IsExternalAbort(fault)) || - (IsDebugException(fault) && MDCR_EL2.TDE == '1')); - - if !route_to_aarch64 && HaveEL(EL3) && !ELUsingAArch32(EL3) then - route_to_aarch64 = SCR_EL3.EA == '1' && IsExternalAbort(fault); - - if route_to_aarch64 then - AArch64.Abort(ZeroExtend(vaddress), fault); - elsif fault.acctype == AccType_IFETCH then - AArch32.TakePrefetchAbortException(vaddress, fault); - else - AArch32.TakeDataAbortException(vaddress, fault); - -// AArch32.DomainValid() -// ===================== -// Returns TRUE if the Domain is valid for a Short-descriptor translation scheme. - -boolean AArch32.DomainValid(Fault statuscode, integer level) - assert statuscode != Fault_None; - - case statuscode of - when Fault_Domain - return TRUE; - when Fault_Translation, Fault_AccessFlag, Fault_SyncExternalOnWalk, Fault_SyncParityOnWalk - return level == 2; - otherwise - return FALSE; - -// AArch32.CreateFaultRecord() -// =========================== - -FaultRecord AArch32.CreateFaultRecord(Fault statuscode, bits(40) ipaddress, bits(4) domain, - integer level, AccType acctype, boolean write, bit extflag, - bits(4) debugmoe, bits(2) errortype, boolean secondstage, boolean s2fs1walk) - - FaultRecord fault; - fault.statuscode = statuscode; - if (statuscode != Fault_None && PSTATE.EL != EL2 && TTBCR.EAE == '0' && !secondstage && !s2fs1walk && - AArch32.DomainValid(statuscode, level)) then - fault.domain = domain; - else - fault.domain = bits(4) UNKNOWN; - fault.debugmoe = debugmoe; - fault.errortype = errortype; - fault.ipaddress.NS = bit UNKNOWN; - fault.ipaddress.address = ZeroExtend(ipaddress); - fault.level = level; - fault.acctype = acctype; - fault.write = write; - fault.extflag = extflag; - fault.secondstage = secondstage; - fault.s2fs1walk = s2fs1walk; - - return fault; - -// AArch32.AlignmentFault() -// ======================== - -FaultRecord AArch32.AlignmentFault(AccType acctype, boolean iswrite, boolean secondstage) - - ipaddress = bits(40) UNKNOWN; - domain = bits(4) UNKNOWN; - level = integer UNKNOWN; - extflag = bit UNKNOWN; - debugmoe = bits(4) UNKNOWN; - errortype = bits(2) UNKNOWN; - s2fs1walk = boolean UNKNOWN; - - return AArch32.CreateFaultRecord(Fault_Alignment, ipaddress, domain, level, acctype, iswrite, - extflag, debugmoe, errortype, secondstage, s2fs1walk); - -// AArch32.GeneralExceptionsToAArch64() -// ==================================== -// Returns TRUE if exceptions normally routed to EL1 are being handled at an Exception -// level using AArch64, because either EL1 is using AArch64 or TGE is in force and EL2 -// is using AArch64. - -boolean AArch32.GeneralExceptionsToAArch64() - return ((PSTATE.EL == EL0 && !ELUsingAArch32(EL1)) || - (EL2Enabled() && !ELUsingAArch32(EL2) && HCR_EL2.TGE == '1')); - -// AArch64.PCAlignmentFault() -// ========================== -// Called on unaligned program counter in AArch64 state. - -AArch64.PCAlignmentFault() - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_PCAlignment); - exception.vaddress = ThisInstrAddr(); - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif EL2Enabled() && HCR_EL2.TGE == '1' then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.CheckPCAlignment() -// ========================== - -AArch32.CheckPCAlignment() - - bits(32) pc = ThisInstrAddr(); - if (CurrentInstrSet() == InstrSet_A32 && pc[1] == '1') || pc[0] == '1' then - if AArch32.GeneralExceptionsToAArch64() then AArch64.PCAlignmentFault(); - - // Generate an Alignment fault Prefetch Abort exception - vaddress = pc; - acctype = AccType_IFETCH; - iswrite = FALSE; - secondstage = FALSE; - AArch32.Abort(vaddress, AArch32.AlignmentFault(acctype, iswrite, secondstage)); - -// BranchTargetException -// ===================== -// Raise branch target exception. - -AArch64.BranchTargetException(bits(52) vaddress) - - route_to_el2 = PSTATE.EL == EL0 && EL2Enabled() && HCR_EL2.TGE == '1'; - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_BranchTarget); - exception.syndrome[1:0] = PSTATE.BTYPE; - exception.syndrome[24:2] = Zeros(); // RES0 - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch64.TakePhysicalFIQException() -// ================================== - -AArch64.TakePhysicalFIQException() - - route_to_el3 = HaveEL(EL3) && SCR_EL3.FIQ == '1'; - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR_EL2.TGE == '1' || HCR_EL2.FMO == '1')); - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x100; - exception = ExceptionSyndrome(Exception_FIQ); - - if route_to_el3 then - AArch64.TakeException(EL3, exception, preferred_exception_return, vect_offset); - elsif PSTATE.EL == EL2 || route_to_el2 then - assert PSTATE.EL != EL3; - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - assert PSTATE.EL IN {EL0, EL1}; - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.TakePhysicalFIQException() -// ================================== - -AArch32.TakePhysicalFIQException() - - // Check if routed to AArch64 state - route_to_aarch64 = PSTATE.EL == EL0 && !ELUsingAArch32(EL1); - if !route_to_aarch64 && EL2Enabled() && !ELUsingAArch32(EL2) then - route_to_aarch64 = HCR_EL2.TGE == '1' || (HCR_EL2.FMO == '1' && !IsInHost()); - - if !route_to_aarch64 && HaveEL(EL3) && !ELUsingAArch32(EL3) then - route_to_aarch64 = SCR_EL3.FIQ == '1'; - - if route_to_aarch64 then AArch64.TakePhysicalFIQException(); - route_to_monitor = HaveEL(EL3) && SCR.FIQ == '1'; - route_to_hyp = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR.TGE == '1' || HCR.FMO == '1')); - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x1C; - lr_offset = 4; - if route_to_monitor then - AArch32.EnterMonitorMode(preferred_exception_return, lr_offset, vect_offset); - elsif PSTATE.EL == EL2 || route_to_hyp then - exception = ExceptionSyndrome(Exception_FIQ); - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - else - AArch32.EnterMode(M32_FIQ, preferred_exception_return, lr_offset, vect_offset); - -// AArch64.TakePhysicalIRQException() -// ================================== -// Take an enabled physical IRQ exception. - -AArch64.TakePhysicalIRQException() - - route_to_el3 = HaveEL(EL3) && SCR_EL3.IRQ == '1'; - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR_EL2.TGE == '1' || HCR_EL2.IMO == '1')); - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x80; - - exception = ExceptionSyndrome(Exception_IRQ); - - if route_to_el3 then - AArch64.TakeException(EL3, exception, preferred_exception_return, vect_offset); - elsif PSTATE.EL == EL2 || route_to_el2 then - assert PSTATE.EL != EL3; - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - assert PSTATE.EL IN {EL0, EL1}; - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.TakePhysicalIRQException() -// ================================== -// Take an enabled physical IRQ exception. - -AArch32.TakePhysicalIRQException() - - // Check if routed to AArch64 state - route_to_aarch64 = PSTATE.EL == EL0 && !ELUsingAArch32(EL1); - if !route_to_aarch64 && EL2Enabled() && !ELUsingAArch32(EL2) then - route_to_aarch64 = HCR_EL2.TGE == '1' || (HCR_EL2.IMO == '1' && !IsInHost()); - if !route_to_aarch64 && HaveEL(EL3) && !ELUsingAArch32(EL3) then - route_to_aarch64 = SCR_EL3.IRQ == '1'; - - if route_to_aarch64 then AArch64.TakePhysicalIRQException(); - - route_to_monitor = HaveEL(EL3) && SCR.IRQ == '1'; - route_to_hyp = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR.TGE == '1' || HCR.IMO == '1')); - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x18; - lr_offset = 4; - if route_to_monitor then - AArch32.EnterMonitorMode(preferred_exception_return, lr_offset, vect_offset); - elsif PSTATE.EL == EL2 || route_to_hyp then - exception = ExceptionSyndrome(Exception_IRQ); - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - else - AArch32.EnterMode(M32_IRQ, preferred_exception_return, lr_offset, vect_offset); - -// AArch32.AsynchExternalAbort() -// ============================= -// Wrapper function for asynchronous external aborts - -FaultRecord AArch32.AsynchExternalAbort(boolean parity, bits(2) errortype, bit extflag) - - faulttype = if parity then Fault_AsyncParity else Fault_AsyncExternal; - ipaddress = bits(40) UNKNOWN; - domain = bits(4) UNKNOWN; - level = integer UNKNOWN; - acctype = AccType_NORMAL; - iswrite = boolean UNKNOWN; - debugmoe = bits(4) UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - return AArch32.CreateFaultRecord(faulttype, ipaddress, domain, level, acctype, iswrite, extflag, - debugmoe, errortype, secondstage, s2fs1walk); - -// Clear a pending physical SError interrupt -ClearPendingPhysicalSError(); - -// AArch64.TakePhysicalSErrorException() -// ===================================== - -AArch64.TakePhysicalSErrorException(boolean impdef_syndrome, bits(24) syndrome) - - route_to_el3 = HaveEL(EL3) && SCR_EL3.EA == '1'; - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR_EL2.TGE == '1' || (!IsInHost() && HCR_EL2.AMO == '1'))); - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x180; - - exception = ExceptionSyndrome(Exception_SError); - exception.syndrome[24] = if impdef_syndrome then '1' else '0'; - exception.syndrome[23:0] = syndrome; - - ClearPendingPhysicalSError(); - - if PSTATE.EL == EL3 || route_to_el3 then - AArch64.TakeException(EL3, exception, preferred_exception_return, vect_offset); - elsif PSTATE.EL == EL2 || route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.TakePhysicalSErrorException() -// ===================================== - -AArch32.TakePhysicalSErrorException(boolean parity, bit extflag, bits(2) errortype, - boolean impdef_syndrome, bits(24) full_syndrome) - - ClearPendingPhysicalSError(); - // Check if routed to AArch64 state - route_to_aarch64 = PSTATE.EL == EL0 && !ELUsingAArch32(EL1); - - if !route_to_aarch64 && EL2Enabled() && !ELUsingAArch32(EL2) then - route_to_aarch64 = (HCR_EL2.TGE == '1' || (!IsInHost() && HCR_EL2.AMO == '1')); - if !route_to_aarch64 && HaveEL(EL3) && !ELUsingAArch32(EL3) then - route_to_aarch64 = SCR_EL3.EA == '1'; - - if route_to_aarch64 then - AArch64.TakePhysicalSErrorException(impdef_syndrome, full_syndrome); - - route_to_monitor = HaveEL(EL3) && SCR.EA == '1'; - route_to_hyp = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR.TGE == '1' || HCR.AMO == '1')); - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x10; - lr_offset = 8; - - fault = AArch32.AsynchExternalAbort(parity, errortype, extflag); - vaddress = bits(32) UNKNOWN; - if route_to_monitor then - AArch32.ReportDataAbort(route_to_monitor, fault, vaddress); - AArch32.EnterMonitorMode(preferred_exception_return, lr_offset, vect_offset); - elsif PSTATE.EL == EL2 || route_to_hyp then - exception = AArch32.AbortSyndrome(Exception_DataAbort, fault, vaddress); - if PSTATE.EL == EL2 then - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - else - AArch32.EnterHypMode(exception, preferred_exception_return, 0x14); - else - AArch32.ReportDataAbort(route_to_monitor, fault, vaddress); - AArch32.EnterMode(M32_Abort, preferred_exception_return, lr_offset, vect_offset); - -// AArch64.TakeVirtualFIQException() -// ================================= - -AArch64.TakeVirtualFIQException() - assert PSTATE.EL IN {EL0, EL1} && EL2Enabled(); - assert HCR_EL2.TGE == '0' && HCR_EL2.FMO == '1'; // Virtual IRQ enabled if TGE==0 and FMO==1 - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x100; - - exception = ExceptionSyndrome(Exception_FIQ); - - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.TakeVirtualFIQException() -// ================================= - -AArch32.TakeVirtualFIQException() - assert PSTATE.EL IN {EL0, EL1} && EL2Enabled(); - if ELUsingAArch32(EL2) then // Virtual IRQ enabled if TGE==0 and FMO==1 - assert HCR.TGE == '0' && HCR.FMO == '1'; - else - assert HCR_EL2.TGE == '0' && HCR_EL2.FMO == '1'; - // Check if routed to AArch64 state - if PSTATE.EL == EL0 && !ELUsingAArch32(EL1) then AArch64.TakeVirtualFIQException(); - - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x1C; - lr_offset = 4; - - AArch32.EnterMode(M32_FIQ, preferred_exception_return, lr_offset, vect_offset); - -// AArch64.TakeVirtualIRQException() -// ================================= - -AArch64.TakeVirtualIRQException() - assert PSTATE.EL IN {EL0, EL1} && EL2Enabled(); - assert HCR_EL2.TGE == '0' && HCR_EL2.IMO == '1'; // Virtual IRQ enabled if TGE==0 and IMO==1 - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x80; - - exception = ExceptionSyndrome(Exception_IRQ); - - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.TakeVirtualIRQException() -// ================================= - -AArch32.TakeVirtualIRQException() - assert PSTATE.EL IN {EL0, EL1} && EL2Enabled(); - - if ELUsingAArch32(EL2) then // Virtual IRQs enabled if TGE==0 and IMO==1 - assert HCR.TGE == '0' && HCR.IMO == '1'; - else - assert HCR_EL2.TGE == '0' && HCR_EL2.IMO == '1'; - - // Check if routed to AArch64 state - if PSTATE.EL == EL0 && !ELUsingAArch32(EL1) then AArch64.TakeVirtualIRQException(); - - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x18; - lr_offset = 4; - - AArch32.EnterMode(M32_IRQ, preferred_exception_return, lr_offset, vect_offset); - -// Clear a pending virtual SError interrupt -ClearPendingVirtualSError(); - -// AArch64.TakeVirtualSErrorException() -// ==================================== - -AArch64.TakeVirtualSErrorException(boolean impdef_syndrome, bits(24) syndrome) - - assert PSTATE.EL IN {EL0, EL1} && EL2Enabled(); - assert HCR_EL2.TGE == '0' && HCR_EL2.AMO == '1'; // Virtual SError enabled if TGE==0 and AMO==1 - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x180; - - exception = ExceptionSyndrome(Exception_SError); - if HaveRASExt() then - exception.syndrome[24] = VSESR_EL2.IDS; - exception.syndrome[23:0] = VSESR_EL2.ISS; - else - exception.syndrome[24] = if impdef_syndrome then '1' else '0'; - if impdef_syndrome then exception.syndrome[23:0] = syndrome; - - ClearPendingVirtualSError(); - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.TakeVirtualSErrorException() -// ==================================== - -AArch32.TakeVirtualSErrorException(bit extflag, bits(2) errortype, boolean impdef_syndrome, bits(24) full_syndrome) - - assert PSTATE.EL IN {EL0, EL1} && EL2Enabled(); - if ELUsingAArch32(EL2) then // Virtual SError enabled if TGE==0 and AMO==1 - assert HCR.TGE == '0' && HCR.AMO == '1'; - else - assert HCR_EL2.TGE == '0' && HCR_EL2.AMO == '1'; - // Check if routed to AArch64 state - if PSTATE.EL == EL0 && !ELUsingAArch32(EL1) then AArch64.TakeVirtualSErrorException(impdef_syndrome, full_syndrome); - - route_to_monitor = FALSE; - - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x10; - lr_offset = 8; - - vaddress = bits(32) UNKNOWN; - parity = FALSE; - if HaveRASExt() then - if ELUsingAArch32(EL2) then - fault = AArch32.AsynchExternalAbort(FALSE, VDFSR.AET, VDFSR.ExT); - else - fault = AArch32.AsynchExternalAbort(FALSE, VSESR_EL2.AET, VSESR_EL2.ExT); - else - fault = AArch32.AsynchExternalAbort(parity, errortype, extflag); - - ClearPendingVirtualSError(); - AArch32.ReportDataAbort(route_to_monitor, fault, vaddress); - AArch32.EnterMode(M32_Abort, preferred_exception_return, lr_offset, vect_offset); - -// AArch32.DebugFault() -// ==================== - -FaultRecord AArch32.DebugFault(AccType acctype, boolean iswrite, bits(4) debugmoe) - - ipaddress = bits(40) UNKNOWN; - domain = bits(4) UNKNOWN; - errortype = bits(2) UNKNOWN; - level = integer UNKNOWN; - extflag = bit UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - return AArch32.CreateFaultRecord(Fault_Debug, ipaddress, domain, level, acctype, iswrite, - extflag, debugmoe, errortype, secondstage, s2fs1walk); - -// AArch64.SoftwareBreakpoint() -// ============================ - -AArch64.SoftwareBreakpoint(bits(16) immediate) - - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && - EL2Enabled() && (HCR_EL2.TGE == '1' || MDCR_EL2.TDE == '1')); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_SoftwareBreakpoint); - exception.syndrome[15:0] = immediate; - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.SoftwareBreakpoint() -// ============================ - -AArch32.SoftwareBreakpoint(bits(16) immediate) - - if (EL2Enabled() && !ELUsingAArch32(EL2) && - (HCR_EL2.TGE == '1' || MDCR_EL2.TDE == '1')) || !ELUsingAArch32(EL1) then - AArch64.SoftwareBreakpoint(immediate); - vaddress = bits(32) UNKNOWN; - acctype = AccType_IFETCH; // Take as a Prefetch Abort - iswrite = FALSE; - entry = DebugException_BKPT; - - fault = AArch32.DebugFault(acctype, iswrite, entry); - AArch32.Abort(vaddress, fault); - -bits(4) AArch32.CurrentCond(); - -// ConditionHolds() -// ================ -// Return TRUE iff COND currently holds - -boolean ConditionHolds(bits(4) cond) - // Evaluate base condition. - case cond[3:1] of - when '000' result = (PSTATE.Z == '1'); // EQ or NE - when '001' result = (PSTATE.C == '1'); // CS or CC - when '010' result = (PSTATE.N == '1'); // MI or PL - when '011' result = (PSTATE.V == '1'); // VS or VC - when '100' result = (PSTATE.C == '1' && PSTATE.Z == '0'); // HI or LS - when '101' result = (PSTATE.N == PSTATE.V); // GE or LT - when '110' result = (PSTATE.N == PSTATE.V && PSTATE.Z == '0'); // GT or LE - when '111' result = TRUE; // AL - - // Condition flag values in the set '111x' indicate always true - // Otherwise, invert condition if necessary. - if cond[0] == '1' && cond != '1111' then - result = !result; - - return result; - -// ConditionSyndrome() -// =================== -// Return CV and COND fields of instruction syndrome - -bits(5) ConditionSyndrome() - - bits(5) syndrome; - - if UsingAArch32() then - cond = AArch32.CurrentCond(); - if PSTATE.T == '0' then // A32 - syndrome[4] = '1'; - // A conditional A32 instruction that is known to pass its condition code check - // can be presented either with COND set to 0xE, the value for unconditional, or - // the COND value held in the instruction. - if ConditionHolds(cond) && ConstrainUnpredictableBool(Unpredictable_ESRCONDPASS) then - syndrome[3:0] = '1110'; - else - syndrome[3:0] = cond; - else // T32 - // When a T32 instruction is trapped, it is IMPLEMENTATION DEFINED whether: - // * CV set to 0 and COND is set to an UNKNOWN value - // * CV set to 1 and COND is set to the condition code for the condition that - // applied to the instruction. - if boolean IMPLEMENTATION_DEFINED "Condition valid for trapped T32" then - syndrome[4] = '1'; - syndrome[3:0] = cond; - else - syndrome[4] = '0'; - syndrome[3:0] = bits(4) UNKNOWN; - else - syndrome[4] = '1'; - syndrome[3:0] = '1110'; - - return syndrome; - -// AArch32.SystemAccessTrapSyndrome() -// ================================== -// Returns the syndrome information for traps on AArch32 MCR, MCRR, MRC, MRRC, and VMRS, VMSR instructions, -// other than traps that are due to HCPTR or CPACR. - -ExceptionRecord AArch32.SystemAccessTrapSyndrome(bits(32) instr, integer ec) - ExceptionRecord exception; - - case ec of - when 0x0 exception = ExceptionSyndrome(Exception_Uncategorized); - when 0x3 exception = ExceptionSyndrome(Exception_CP15RTTrap); - when 0x4 exception = ExceptionSyndrome(Exception_CP15RRTTrap); - when 0x5 exception = ExceptionSyndrome(Exception_CP14RTTrap); - when 0x6 exception = ExceptionSyndrome(Exception_CP14DTTrap); - when 0x7 exception = ExceptionSyndrome(Exception_AdvSIMDFPAccessTrap); - when 0x8 exception = ExceptionSyndrome(Exception_FPIDTrap); - when 0xC exception = ExceptionSyndrome(Exception_CP14RRTTrap); - otherwise Unreachable(); - - bits(20) iss = Zeros(); - - if exception.exceptype IN {Exception_FPIDTrap, Exception_CP14RTTrap, Exception_CP15RTTrap} then - // Trapped MRC/MCR, VMRS on FPSID - iss[13:10] = instr[19:16]; // CRn, Reg in case of VMRS - iss[8:5] = instr[15:12]; // Rt - iss[9] = '0'; // RES0 - - if exception.exceptype != Exception_FPIDTrap then // When trap is not for VMRS - iss[19:17] = instr[7:5]; // opc2 - iss[16:14] = instr[23:21]; // opc1 - iss[4:1] = instr[3:0]; //CRm - else //VMRS Access - iss[19:17] = '000'; //opc2 - Hardcoded for VMRS - iss[16:14] = '111'; //opc1 - Hardcoded for VMRS - iss[4:1] = '0000'; //CRm - Hardcoded for VMRS - elsif exception.exceptype IN {Exception_CP14RRTTrap, Exception_AdvSIMDFPAccessTrap, Exception_CP15RRTTrap} then - // Trapped MRRC/MCRR, VMRS/VMSR - iss[19:16] = instr[7:4]; // opc1 - iss[13:10] = instr[19:16]; // Rt2 - iss[8:5] = instr[15:12]; // Rt - iss[4:1] = instr[3:0]; // CRm - elsif exception.exceptype == Exception_CP14DTTrap then - // Trapped LDC/STC - iss[19:12] = instr[7:0]; // imm8 - iss[4] = instr[23]; // U - iss[2:1] = instr[24,21]; // P,W - if instr[19:16] == '1111' then // Rn==15, LDC(Literal addressing)/STC - iss[8:5] = bits(4) UNKNOWN; - iss[3] = '1'; - elsif exception.exceptype == Exception_Uncategorized then - // Trapped for unknown reason - iss[8:5] = instr[19:16]; // Rn - iss[3] = '0'; - - iss[0] = instr[20]; // Direction - - exception.syndrome[24:20] = ConditionSyndrome(); - exception.syndrome[19:0] = iss; - - return exception; - -bits(32) ThisInstr(); - -// AArch32.TakeHypTrapException() -// ============================== -// Exceptions routed to Hyp mode as a Hyp Trap exception. - -AArch32.TakeHypTrapException(integer ec) - exception = AArch32.SystemAccessTrapSyndrome(ThisInstr(), ec); - AArch32.TakeHypTrapException(exception); - -// AArch32.TakeHypTrapException() -// ============================== -// Exceptions routed to Hyp mode as a Hyp Trap exception. - -AArch32.TakeHypTrapException(ExceptionRecord exception) - assert HaveEL(EL2) && !IsSecure() && ELUsingAArch32(EL2); - - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x14; - - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - -// AArch32.TakeUndefInstrException() -// ================================= - -AArch32.TakeUndefInstrException() - exception = ExceptionSyndrome(Exception_Uncategorized); - AArch32.TakeUndefInstrException(exception); - -// AArch32.TakeUndefInstrException() -// ================================= - -AArch32.TakeUndefInstrException(ExceptionRecord exception) - - route_to_hyp = PSTATE.EL == EL0 && EL2Enabled() && HCR.TGE == '1'; - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x04; - lr_offset = if CurrentInstrSet() == InstrSet_A32 then 4 else 2; - - if PSTATE.EL == EL2 then - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - elsif route_to_hyp then - AArch32.EnterHypMode(exception, preferred_exception_return, 0x14); - else - AArch32.EnterMode(M32_Undef, preferred_exception_return, lr_offset, vect_offset); - -// AArch32.SystemAccessTrap() -// ========================== -// Trapped system register access. - -AArch32.SystemAccessTrap(bits(5) mode, integer ec) - (valid, target_el) = ELFromM32(mode); - assert valid && HaveEL(target_el) && target_el != EL0 && UInt(target_el) >= UInt(PSTATE.EL); - - if target_el == EL2 then - exception = AArch32.SystemAccessTrapSyndrome(ThisInstr(), ec); - AArch32.TakeHypTrapException(exception); - else - AArch32.TakeUndefInstrException(); - -// AArch64.AArch32SystemAccessTrapSyndrome() -// ========================================= -// Returns the syndrome information for traps on AArch32 MCR, MCRR, MRC, MRRC, and VMRS, VMSR instructions, -// other than traps that are due to HCPTR or CPACR. - -ExceptionRecord AArch64.AArch32SystemAccessTrapSyndrome(bits(32) instr, integer ec) - ExceptionRecord exception; - - case ec of - when 0x0 exception = ExceptionSyndrome(Exception_Uncategorized); - when 0x3 exception = ExceptionSyndrome(Exception_CP15RTTrap); - when 0x4 exception = ExceptionSyndrome(Exception_CP15RRTTrap); - when 0x5 exception = ExceptionSyndrome(Exception_CP14RTTrap); - when 0x6 exception = ExceptionSyndrome(Exception_CP14DTTrap); - when 0x7 exception = ExceptionSyndrome(Exception_AdvSIMDFPAccessTrap); - when 0x8 exception = ExceptionSyndrome(Exception_FPIDTrap); - when 0xC exception = ExceptionSyndrome(Exception_CP14RRTTrap); - otherwise Unreachable(); - - bits(20) iss = Zeros(); - - if exception.exceptype IN {Exception_FPIDTrap, Exception_CP14RTTrap, Exception_CP15RTTrap} then - // Trapped MRC/MCR, VMRS on FPSID - if exception.exceptype != Exception_FPIDTrap then // When trap is not for VMRS - iss[19:17] = instr[7:5]; // opc2 - iss[16:14] = instr[23:21]; // opc1 - iss[13:10] = instr[19:16]; // CRn - iss[4:1] = instr[3:0]; // CRm - else - iss[19:17] = '000'; - iss[16:14] = '111'; - iss[13:10] = instr[19:16]; // reg - iss[4:1] = '0000'; - - if instr[20] == '1' && instr[15:12] == '1111' then // MRC, Rt==15 - iss[9:5] = '11111'; - elsif instr[20] == '0' && instr[15:12] == '1111' then // MCR, Rt==15 - iss[9:5] = bits(5) UNKNOWN; - else - iss[9:5] = LookUpRIndex(UInt(instr[15:12]), PSTATE.M)[4:0]; - elsif exception.exceptype IN {Exception_CP14RRTTrap, Exception_AdvSIMDFPAccessTrap, Exception_CP15RRTTrap} then - // Trapped MRRC/MCRR, VMRS/VMSR - iss[19:16] = instr[7:4]; // opc1 - if instr[19:16] == '1111' then // Rt2==15 - iss[14:10] = bits(5) UNKNOWN; - else - iss[14:10] = LookUpRIndex(UInt(instr[19:16]), PSTATE.M)[4:0]; - - if instr[15:12] == '1111' then // Rt==15 - iss[9:5] = bits(5) UNKNOWN; - else - iss[9:5] = LookUpRIndex(UInt(instr[15:12]), PSTATE.M)[4:0]; - iss[4:1] = instr[3:0]; // CRm - elsif exception.exceptype == Exception_CP14DTTrap then - // Trapped LDC/STC - iss[19:12] = instr[7:0]; // imm8 - iss[4] = instr[23]; // U - iss[2:1] = instr[24,21]; // P,W - if instr[19:16] == '1111' then // Rn==15, LDC(Literal addressing)/STC - iss[9:5] = bits(5) UNKNOWN; - iss[3] = '1'; - elsif exception.exceptype == Exception_Uncategorized then - // Trapped for unknown reason - iss[9:5] = LookUpRIndex(UInt(instr[19:16]), PSTATE.M)[4:0]; // Rn - iss[3] = '0'; - - iss[0] = instr[20]; // Direction - - exception.syndrome[24:20] = ConditionSyndrome(); - exception.syndrome[19:0] = iss; - - return exception; - -// AArch64.AArch32SystemAccessTrap() -// ================================= -// Trapped AARCH32 system register access. - -AArch64.AArch32SystemAccessTrap(bits(2) target_el, integer ec) - assert HaveEL(target_el) && target_el != EL0 && UInt(target_el) >= UInt(PSTATE.EL); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = AArch64.AArch32SystemAccessTrapSyndrome(ThisInstr(), ec); - AArch64.TakeException(target_el, exception, preferred_exception_return, vect_offset); - -// AArch32.CheckAdvSIMDOrFPRegisterTraps() -// ======================================= -// Check if an instruction that accesses an Advanced SIMD and -// floating-point System register is trapped by an appropriate HCR.TIDx -// ID group trap control. - -AArch32.CheckAdvSIMDOrFPRegisterTraps(bits(4) reg) - - if PSTATE.EL == EL1 && EL2Enabled() then - tid0 = if ELUsingAArch32(EL2) then HCR.TID0 else HCR_EL2.TID0; - tid3 = if ELUsingAArch32(EL2) then HCR.TID3 else HCR_EL2.TID3; - - if (tid0 == '1' && reg == '0000') // FPSID - || (tid3 == '1' && reg IN {'0101', '0110', '0111'}) then // MVFRx - if ELUsingAArch32(EL2) then - AArch32.SystemAccessTrap(M32_Hyp, 0x8); // Exception_AdvSIMDFPAccessTrap - else - AArch64.AArch32SystemAccessTrap(EL2, 0x8); // Exception_AdvSIMDFPAccessTrap - -// Resets System registers and memory-mapped control registers that have architecturally-defined -// reset values to those values. -AArch32.ResetControlRegisters(boolean cold_reset); - -// AArch32.ResetGeneralRegisters() -// =============================== - -AArch32.ResetGeneralRegisters() - - for i = 0 to 7 - R[i] = bits(32) UNKNOWN; - for i = 8 to 12 - Rmode[i, M32_User] = bits(32) UNKNOWN; - Rmode[i, M32_FIQ] = bits(32) UNKNOWN; - if HaveEL(EL2) then Rmode[13, M32_Hyp] = bits(32) UNKNOWN; // No R14_hyp - for i = 13 to 14 - Rmode[i, M32_User] = bits(32) UNKNOWN; - Rmode[i, M32_FIQ] = bits(32) UNKNOWN; - Rmode[i, M32_IRQ] = bits(32) UNKNOWN; - Rmode[i, M32_Svc] = bits(32) UNKNOWN; - Rmode[i, M32_Abort] = bits(32) UNKNOWN; - Rmode[i, M32_Undef] = bits(32) UNKNOWN; - if HaveEL(EL3) then Rmode[i, M32_Monitor] = bits(32) UNKNOWN; - - return; - -// Q[] - non-assignment form -// ========================= - -bits(128) Q[integer n] - assert n >= 0 && n <= 15; - return V[n]; - -// Q[] - assignment form -// ===================== - -Q[integer n] = bits(128) value - assert n >= 0 && n <= 15; - V[n] = value; - return; - -// AArch32.ResetSIMDFPRegisters() -// ============================== - -AArch32.ResetSIMDFPRegisters() - - for i = 0 to 15 - Q[i] = bits(128) UNKNOWN; - - return; - -// AArch32.ResetSpecialRegisters() -// =============================== - -AArch32.ResetSpecialRegisters() - - // AArch32 special registers - SPSR_fiq = bits(32) UNKNOWN; - SPSR_irq = bits(32) UNKNOWN; - SPSR_svc = bits(32) UNKNOWN; - SPSR_abt = bits(32) UNKNOWN; - SPSR_und = bits(32) UNKNOWN; - if HaveEL(EL2) then - SPSR_hyp = bits(32) UNKNOWN; - ELR_hyp = bits(32) UNKNOWN; - if HaveEL(EL3) then - SPSR_mon = bits(32) UNKNOWN; - - // External debug special registers - DLR = bits(32) UNKNOWN; - DSPSR = bits(32) UNKNOWN; - - return; - -// Reset the External Debug registers in the Core power domain. -ResetExternalDebugRegisters(boolean cold_reset); - -// AArch32.TakeReset() -// =================== -// Reset into AArch32 state - -AArch32.TakeReset(boolean cold_reset) - assert HighestELUsingAArch32(); - - // Enter the highest implemented Exception level in AArch32 state - if HaveEL(EL3) then - AArch32.WriteMode(M32_Svc); - SCR.NS = '0'; // Secure state - elsif HaveEL(EL2) then - AArch32.WriteMode(M32_Hyp); - else - AArch32.WriteMode(M32_Svc); - - // Reset the CP14 and CP15 registers and other system components - AArch32.ResetControlRegisters(cold_reset); - FPEXC.EN = '0'; - - // Reset all other PSTATE fields, including instruction set and endianness according to the - // SCTLR values produced by the above call to ResetControlRegisters() - PSTATE.[A,I,F] = '111'; // All asynchronous exceptions masked - PSTATE.IT = '00000000'; // IT block state reset - PSTATE.T = SCTLR.TE; // Instruction set: TE=0: A32, TE=1: T32. PSTATE.J is RES0. - PSTATE.E = SCTLR.EE; // Endianness: EE=0: little-endian, EE=1: big-endian - PSTATE.IL = '0'; // Clear Illegal Execution state bit - - // All registers, bits and fields not reset by the above pseudocode or by the BranchTo() call - // below are UNKNOWN bitstrings after reset. In particular, the return information registers - // R14 or ELR_hyp and SPSR have UNKNOWN values, so that it - // is impossible to return from a reset in an architecturally defined way. - AArch32.ResetGeneralRegisters(); - AArch32.ResetSIMDFPRegisters(); - AArch32.ResetSpecialRegisters(); - ResetExternalDebugRegisters(cold_reset); - - bits(32) rv; // IMPLEMENTATION DEFINED reset vector - - if HaveEL(EL3) then - if MVBAR[0] == '1' then // Reset vector in MVBAR - rv = MVBAR[31:1]:'0'; - else - rv = bits(32) IMPLEMENTATION_DEFINED "reset vector address"; - else - rv = RVBAR[31:1]:'0'; - - // The reset vector must be correctly aligned - assert rv[0] == '0' && (PSTATE.T == '1' || rv[1] == '0'); - - BranchTo(rv, BranchType_RESET); - -// AArch64.FPTrappedException() -// ============================ - -AArch64.FPTrappedException(boolean is_ase, integer element, bits(8) accumulated_exceptions) - exception = ExceptionSyndrome(Exception_FPTrappedException); - if is_ase then - if boolean IMPLEMENTATION_DEFINED "vector instructions set TFV to 1" then - exception.syndrome[23] = '1'; // TFV - else - exception.syndrome[23] = '0'; // TFV - else - exception.syndrome[23] = '1'; // TFV - exception.syndrome[10:8] = bits(3) UNKNOWN; // VECITR - if exception.syndrome[23] == '1' then - exception.syndrome[7,4:0] = accumulated_exceptions[7,4:0]; // IDF,IXF,UFF,OFF,DZF,IOF - else - exception.syndrome[7,4:0] = bits(6) UNKNOWN; - - route_to_el2 = EL2Enabled() && HCR_EL2.TGE == '1'; - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.FPTrappedException() -// ============================ - -AArch32.FPTrappedException(bits(8) accumulated_exceptions) - if AArch32.GeneralExceptionsToAArch64() then - is_ase = FALSE; - element = 0; - AArch64.FPTrappedException(is_ase, element, accumulated_exceptions); - FPEXC.DEX = '1'; - FPEXC.TFV = '1'; - FPEXC[7,4:0] = accumulated_exceptions[7,4:0]; // IDF,IXF,UFF,OFF,DZF,IOF - FPEXC[10:8] = '111'; // VECITR is RES1 - - AArch32.TakeUndefInstrException(); - -// LSL_C() -// ======= - -(bits(N), bit) LSL_C(bits(N) x, integer shift) - assert shift > 0; - extended_x = x : Zeros(shift); - result = extended_x[N-1:0]; - carry_out = extended_x[N]; - return (result, carry_out); - -// LSL() -// ===== - -bits(N) LSL(bits(N) x, integer shift) - assert shift >= 0; - if shift == 0 then - result = x; - else - (result, -) = LSL_C(x, shift); - return result; - -// AArch32.ITAdvance() -// =================== - -AArch32.ITAdvance() - if PSTATE.IT[2:0] == '000' then - PSTATE.IT = '00000000'; - else - PSTATE.IT[4:0] = LSL(PSTATE.IT[4:0], 1); - return; - -// Return address of the sequentially next instruction. -bits(N) NextInstrAddr(); - -// SSAdvance() -// =========== -// Advance the Software Step state machine. - -SSAdvance() - - // A simpler implementation of this function just clears PSTATE.SS to zero regardless of the - // current Software Step state machine. However, this check is made to illustrate that the - // processor only needs to consider advancing the state machine from the active-not-pending - // state. - target = DebugTarget(); - step_enabled = !ELUsingAArch32(target) && MDSCR_EL1.SS == '1'; - active_not_pending = step_enabled && PSTATE.SS == '1'; - - if active_not_pending then PSTATE.SS = '0'; - - return; - -// AArch32.TakeHVCException() -// ========================== - -AArch32.TakeHVCException(bits(16) immediate) - assert HaveEL(EL2) && ELUsingAArch32(EL2); - - AArch32.ITAdvance(); - SSAdvance(); - bits(32) preferred_exception_return = NextInstrAddr(); - vect_offset = 0x08; - - exception = ExceptionSyndrome(Exception_HypervisorCall); - exception.syndrome[15:0] = immediate; - - if PSTATE.EL == EL2 then - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - else - AArch32.EnterHypMode(exception, preferred_exception_return, 0x14); - -// AArch64.CallHypervisor() -// ======================== -// Performs a HVC call - -AArch64.CallHypervisor(bits(16) immediate) - assert HaveEL(EL2); - - if UsingAArch32() then AArch32.ITAdvance(); - SSAdvance(); - bits(64) preferred_exception_return = NextInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_HypervisorCall); - exception.syndrome[15:0] = immediate; - - if PSTATE.EL == EL3 then - AArch64.TakeException(EL3, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - -// AArch32.CallHypervisor() -// ======================== -// Performs a HVC call - -AArch32.CallHypervisor(bits(16) immediate) - assert HaveEL(EL2); - - if !ELUsingAArch32(EL2) then - AArch64.CallHypervisor(immediate); - else - AArch32.TakeHVCException(immediate); - -// AArch32.TakeSVCException() -// ========================== - -AArch32.TakeSVCException(bits(16) immediate) - - AArch32.ITAdvance(); - SSAdvance(); - route_to_hyp = PSTATE.EL == EL0 && EL2Enabled() && HCR.TGE == '1'; - - bits(32) preferred_exception_return = NextInstrAddr(); - vect_offset = 0x08; - lr_offset = 0; - - if PSTATE.EL == EL2 || route_to_hyp then - exception = ExceptionSyndrome(Exception_SupervisorCall); - exception.syndrome[15:0] = immediate; - if PSTATE.EL == EL2 then - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - else - AArch32.EnterHypMode(exception, preferred_exception_return, 0x14); - else - AArch32.EnterMode(M32_Svc, preferred_exception_return, lr_offset, vect_offset); - -// AArch64.CallSupervisor() -// ======================== -// Calls the Supervisor - -AArch64.CallSupervisor(bits(16) immediate) - - if UsingAArch32() then AArch32.ITAdvance(); - SSAdvance(); - route_to_el2 = PSTATE.EL == EL0 && EL2Enabled() && HCR_EL2.TGE == '1'; - - bits(64) preferred_exception_return = NextInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_SupervisorCall); - exception.syndrome[15:0] = immediate; - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.CallSupervisor() -// ======================== -// Calls the Supervisor - -AArch32.CallSupervisor(bits(16) immediate) - - if AArch32.CurrentCond() != '1110' then - immediate = bits(16) UNKNOWN; - if AArch32.GeneralExceptionsToAArch64() then - AArch64.CallSupervisor(immediate); - else - AArch32.TakeSVCException(immediate); - -// AArch32.TakeSMCException() -// ========================== - -AArch32.TakeSMCException() - assert HaveEL(EL3) && ELUsingAArch32(EL3); - AArch32.ITAdvance(); - SSAdvance(); - bits(32) preferred_exception_return = NextInstrAddr(); - vect_offset = 0x08; - lr_offset = 0; - - AArch32.EnterMonitorMode(preferred_exception_return, lr_offset, vect_offset); - -// AArch64.AdvSIMDFPAccessTrap() -// ============================= -// Trapped access to Advanced SIMD or FP registers due to CPACR[]. - -AArch64.AdvSIMDFPAccessTrap(bits(2) target_el) - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - route_to_el2 = (target_el == EL1 && EL2Enabled() && HCR_EL2.TGE == '1'); - - if route_to_el2 then - exception = ExceptionSyndrome(Exception_Uncategorized); - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - exception = ExceptionSyndrome(Exception_AdvSIMDFPAccessTrap); - exception.syndrome[24:20] = ConditionSyndrome(); - AArch64.TakeException(target_el, exception, preferred_exception_return, vect_offset); - - return; - -// AArch64.CheckFPAdvSIMDTrap() -// ============================ -// Check against CPTR_EL2 and CPTR_EL3. - -AArch64.CheckFPAdvSIMDTrap() - if PSTATE.EL IN {EL0, EL1, EL2} && EL2Enabled() then - // Check if access disabled in CPTR_EL2 - if HaveVirtHostExt() && HCR_EL2.E2H == '1' then - case CPTR_EL2.FPEN of - when 'x0' disabled = TRUE; - when '01' disabled = PSTATE.EL == EL0 && HCR_EL2.TGE == '1'; - when '11' disabled = FALSE; - if disabled then AArch64.AdvSIMDFPAccessTrap(EL2); - else - if CPTR_EL2.TFP == '1' then AArch64.AdvSIMDFPAccessTrap(EL2); - - if HaveEL(EL3) then - // Check if access disabled in CPTR_EL3 - if CPTR_EL3.TFP == '1' then AArch64.AdvSIMDFPAccessTrap(EL3); - - return; - -// AArch32.CheckFPAdvSIMDTrap() -// ============================ -// Check against CPTR_EL2 and CPTR_EL3. - -AArch32.CheckFPAdvSIMDTrap(boolean advsimd) - if EL2Enabled() && !ELUsingAArch32(EL2) then - AArch64.CheckFPAdvSIMDTrap(); - else - if HaveEL(EL2) && !IsSecure() then - hcptr_tase = HCPTR.TASE; - hcptr_cp10 = HCPTR.TCP10; - - if HaveEL(EL3) && ELUsingAArch32(EL3) && !IsSecure() then - // Check if access disabled in NSACR - if NSACR.NSASEDIS == '1' then hcptr_tase = '1'; - if NSACR.cp10 == '0' then hcptr_cp10 = '1'; - - // Check if access disabled in HCPTR - if (advsimd && hcptr_tase == '1') || hcptr_cp10 == '1' then - exception = ExceptionSyndrome(Exception_AdvSIMDFPAccessTrap); - exception.syndrome[24:20] = ConditionSyndrome(); - - if advsimd then - exception.syndrome[5] = '1'; - else - exception.syndrome[5] = '0'; - exception.syndrome[3:0] = '1010'; // coproc field, always 0xA - - if PSTATE.EL == EL2 then - AArch32.TakeUndefInstrException(exception); - else - AArch32.TakeHypTrapException(exception); - - if HaveEL(EL3) && !ELUsingAArch32(EL3) then - // Check if access disabled in CPTR_EL3 - if CPTR_EL3.TFP == '1' then AArch64.AdvSIMDFPAccessTrap(EL3); - return; - -// AArch64.CheckFPAdvSIMDEnabled() -// =============================== -// Check against CPACR[] - -AArch64.CheckFPAdvSIMDEnabled() - if PSTATE.EL IN {EL0, EL1} && !IsInHost() then - // Check if access disabled in CPACR_EL1 - case CPACR_EL1.FPEN of - when 'x0' disabled = TRUE; - when '01' disabled = PSTATE.EL == EL0; - when '11' disabled = FALSE; - if disabled then AArch64.AdvSIMDFPAccessTrap(EL1); - - AArch64.CheckFPAdvSIMDTrap(); // Also check against CPTR_EL2 and CPTR_EL3 - -// AArch32.CheckAdvSIMDOrFPEnabled() -// ================================= -// Check against CPACR, FPEXC, HCPTR, NSACR, and CPTR_EL3. - -AArch32.CheckAdvSIMDOrFPEnabled(boolean fpexc_check, boolean advsimd) - if PSTATE.EL == EL0 && (!HaveEL(EL2) || (!ELUsingAArch32(EL2) && HCR_EL2.TGE == '0')) && !ELUsingAArch32(EL1) then - // The PE behaves as if FPEXC.EN is 1 - AArch64.CheckFPAdvSIMDEnabled(); - elsif PSTATE.EL == EL0 && HaveEL(EL2) && !ELUsingAArch32(EL2) && HCR_EL2.TGE == '1' && !ELUsingAArch32(EL1) then - if fpexc_check && HCR_EL2.RW == '0' then - fpexc_en = bits(1) IMPLEMENTATION_DEFINED "FPEXC.EN value when TGE==1 and RW==0"; - if fpexc_en == '0' then UNDEFINED; - AArch64.CheckFPAdvSIMDEnabled(); - else - cpacr_asedis = CPACR.ASEDIS; - cpacr_cp10 = CPACR.cp10; - - if HaveEL(EL3) && ELUsingAArch32(EL3) && !IsSecure() then - // Check if access disabled in NSACR - if NSACR.NSASEDIS == '1' then cpacr_asedis = '1'; - if NSACR.cp10 == '0' then cpacr_cp10 = '00'; - - if PSTATE.EL != EL2 then - // Check if Advanced SIMD disabled in CPACR - if advsimd && cpacr_asedis == '1' then UNDEFINED; - - // Check if access disabled in CPACR - case cpacr_cp10 of - when '00' disabled = TRUE; - when '01' disabled = PSTATE.EL == EL0; - when '10' disabled = ConstrainUnpredictableBool(Unpredictable_RESCPACR); - when '11' disabled = FALSE; - if disabled then UNDEFINED; - - // If required, check FPEXC enabled bit. - if fpexc_check && FPEXC.EN == '0' then UNDEFINED; - - AArch32.CheckFPAdvSIMDTrap(advsimd); // Also check against HCPTR and CPTR_EL3 - -// AArch64.CheckForSMCUndefOrTrap() -// ================================ -// Check for UNDEFINED or trap on SMC instruction - -AArch64.CheckForSMCUndefOrTrap(bits(16) imm) - route_to_el2 = PSTATE.EL == EL1 && EL2Enabled() && HCR_EL2.TSC == '1'; - if PSTATE.EL == EL0 then UNDEFINED; - if !HaveEL(EL3) then - if PSTATE.EL == EL1 && EL2Enabled() then - if HaveNVExt() && HCR_EL2.NV == '1' && HCR_EL2.TSC == '1' then - route_to_el2 = TRUE; - else - UNDEFINED; - else - UNDEFINED; - else - route_to_el2 = PSTATE.EL == EL1 && EL2Enabled() && HCR_EL2.TSC == '1'; - if route_to_el2 then - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - exception = ExceptionSyndrome(Exception_MonitorCall); - exception.syndrome[15:0] = imm; - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - -// AArch32.CheckForSMCUndefOrTrap() -// ================================ -// Check for UNDEFINED or trap on SMC instruction - -AArch32.CheckForSMCUndefOrTrap() - if !HaveEL(EL3) || PSTATE.EL == EL0 then - UNDEFINED; - - if EL2Enabled() && !ELUsingAArch32(EL2) then - AArch64.CheckForSMCUndefOrTrap(Zeros(16)); - else - route_to_hyp = HaveEL(EL2) && !IsSecure() && PSTATE.EL == EL1 && HCR.TSC == '1'; - if route_to_hyp then - exception = ExceptionSyndrome(Exception_MonitorCall); - AArch32.TakeHypTrapException(exception); - -// HaveFGTExt() -// ============ -// Returns TRUE if Fine Grained Trap is implemented, and FALSE otherwise. - -boolean HaveFGTExt() - return HasArchVersion(ARMv8p6) && !ELUsingAArch32(EL2); - -// AArch32.CheckForSVCTrap() -// ========================= -// Check for trap on SVC instruction - -AArch32.CheckForSVCTrap(bits(16) immediate) - if HaveFGTExt() then - route_to_el2 = FALSE; - if PSTATE.EL == EL0 then - route_to_el2 = !ELUsingAArch32(EL1) && EL2Enabled() && HFGITR_EL2.SVC_EL0 == '1' && (HCR_EL2.[E2H, TGE] != '11' && (!HaveEL(EL3) || SCR_EL3.FGTEn == '1')) ; - - if route_to_el2 then - exception = ExceptionSyndrome(Exception_SupervisorCall); - exception.syndrome[15:0] = immediate; - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - -// AArch32.TakeMonitorTrapException() -// ================================== -// Exceptions routed to Monitor mode as a Monitor Trap exception. - -AArch32.TakeMonitorTrapException() - assert HaveEL(EL3) && ELUsingAArch32(EL3); - - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x04; - lr_offset = if CurrentInstrSet() == InstrSet_A32 then 4 else 2; - - AArch32.EnterMonitorMode(preferred_exception_return, lr_offset, vect_offset); - -// AArch64.WFxTrap() -// ================= - -AArch64.WFxTrap(bits(2) target_el, boolean is_wfe) - assert UInt(target_el) > UInt(PSTATE.EL); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_WFxTrap); - exception.syndrome[24:20] = ConditionSyndrome(); - exception.syndrome[0] = if is_wfe then '1' else '0'; - - if target_el == EL1 && EL2Enabled() && HCR_EL2.TGE == '1' then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(target_el, exception, preferred_exception_return, vect_offset); - -// AArch64.CheckForWFxTrap() -// ========================= -// Check for trap on WFE or WFI instruction - -AArch64.CheckForWFxTrap(bits(2) target_el, boolean is_wfe) - assert HaveEL(target_el); - - case target_el of - when EL1 trap = (if is_wfe then SCTLR[].nTWE else SCTLR[].nTWI) == '0'; - when EL2 trap = (if is_wfe then HCR_EL2.TWE else HCR_EL2.TWI) == '1'; - when EL3 trap = (if is_wfe then SCR_EL3.TWE else SCR_EL3.TWI) == '1'; - if trap then - AArch64.WFxTrap(target_el, is_wfe); - -// AArch32.CheckForWFxTrap() -// ========================= -// Check for trap on WFE or WFI instruction - -AArch32.CheckForWFxTrap(bits(2) target_el, boolean is_wfe) - assert HaveEL(target_el); - - // Check for routing to AArch64 - if !ELUsingAArch32(target_el) then - AArch64.CheckForWFxTrap(target_el, is_wfe); - return; - case target_el of - when EL1 trap = (if is_wfe then SCTLR.nTWE else SCTLR.nTWI) == '0'; - when EL2 trap = (if is_wfe then HCR.TWE else HCR.TWI) == '1'; - when EL3 trap = (if is_wfe then SCR.TWE else SCR.TWI) == '1'; - if trap then - if target_el == EL1 && EL2Enabled() && !ELUsingAArch32(EL2) && HCR_EL2.TGE == '1' then - AArch64.WFxTrap(target_el, is_wfe); - if target_el == EL3 then - AArch32.TakeMonitorTrapException(); - elsif target_el == EL2 then - exception = ExceptionSyndrome(Exception_WFxTrap); - exception.syndrome[24:20] = ConditionSyndrome(); - exception.syndrome[0] = if is_wfe then '1' else '0'; - AArch32.TakeHypTrapException(exception); - else - AArch32.TakeUndefInstrException(); - -// AArch32.NoFault() -// ================= - -FaultRecord AArch32.NoFault() - - ipaddress = bits(40) UNKNOWN; - domain = bits(4) UNKNOWN; - level = integer UNKNOWN; - acctype = AccType_NORMAL; - iswrite = boolean UNKNOWN; - extflag = bit UNKNOWN; - debugmoe = bits(4) UNKNOWN; - errortype = bits(2) UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - return AArch32.CreateFaultRecord(Fault_None, ipaddress, domain, level, acctype, iswrite, - extflag, debugmoe, errortype, secondstage, s2fs1walk); - -constant bits(6) DebugHalt_Breakpoint = '000111'; -constant bits(6) DebugHalt_EDBGRQ = '010011'; -constant bits(6) DebugHalt_Step_Normal = '011011'; -constant bits(6) DebugHalt_Step_Exclusive = '011111'; -constant bits(6) DebugHalt_OSUnlockCatch = '100011'; -constant bits(6) DebugHalt_ResetCatch = '100111'; -constant bits(6) DebugHalt_Watchpoint = '101011'; -constant bits(6) DebugHalt_HaltInstruction = '101111'; -constant bits(6) DebugHalt_SoftwareAccess = '110011'; -constant bits(6) DebugHalt_ExceptionCatch = '110111'; -constant bits(6) DebugHalt_Step_NoSyndrome = '111011'; - -// Signal a discrete event on a Cross Trigger input event trigger. -CTI_SignalEvent(CrossTriggerIn id); - -StopInstructionPrefetchAndEnableITR(); - -// Halt() -// ====== - -Halt(bits(6) reason) - - CTI_SignalEvent(CrossTriggerIn_CrossHalt); // Trigger other cores to halt - - bits(64) preferred_restart_address = ThisInstrAddr(); - spsr = GetPSRFromPSTATE(); - - if UsingAArch32() then - // If entering from AArch32 state, spsr[21] is the DIT bit which has to be moved for DSPSR - spsr[24] = spsr[21]; - spsr[21] = PSTATE.SS; // Always save the SS bit - - if (HaveBTIExt() && - !(reason IN {DebugHalt_Step_Normal, DebugHalt_Step_Exclusive, DebugHalt_Step_NoSyndrome, - DebugHalt_Breakpoint, DebugHalt_HaltInstruction}) && - ConstrainUnpredictableBool(Unpredictable_ZEROBTYPE)) then - DSPSR[11:10] = '00'; - - if UsingAArch32() then - DLR = preferred_restart_address[31:0]; - DSPSR = spsr; - else - DLR_EL0 = preferred_restart_address; - DSPSR_EL0 = spsr; - - EDSCR.ITE = '1'; - EDSCR.ITO = '0'; - if IsSecure() then - EDSCR.SDD = '0'; // If entered in Secure state, allow debug - elsif HaveEL(EL3) then - EDSCR.SDD = if ExternalSecureInvasiveDebugEnabled() then '0' else '1'; - else - assert EDSCR.SDD == '1'; // Otherwise EDSCR.SDD is RES1 - EDSCR.MA = '0'; - - // PSTATE.{SS,D,A,I,F} are not observable and ignored in Debug state, so behave as if - // UNKNOWN. PSTATE.{N,Z,C,V,Q,GE} are also not observable, but since these are not changed on - // exception entry, this function also leaves them unchanged. PSTATE.{E,M,nRW,EL,SP} are - // unchanged. PSTATE.IL is set to 0. - if UsingAArch32() then - PSTATE.[SS,A,I,F] = bits(4) UNKNOWN; - // In AArch32, all instructions are T32 and unconditional. - PSTATE.IT = '00000000'; - PSTATE.T = '1'; // PSTATE.J is RES0 - else - PSTATE.[SS,D,A,I,F] = bits(5) UNKNOWN; - PSTATE.IL = '0'; - - StopInstructionPrefetchAndEnableITR(); - EDSCR.STATUS = reason; // Signal entered Debug state - UpdateEDSCRFields(); // Update EDSCR PE state flags. - - return; - -// AArch32.CheckBreakpoint() -// ========================= -// Called before executing the instruction of length "size" bytes at "vaddress" in an AArch32 -// translation regime, when either debug exceptions are enabled, or halting debug is enabled -// and halting is allowed. - -FaultRecord AArch32.CheckBreakpoint(bits(32) vaddress, integer size) - assert ELUsingAArch32(S1TranslationRegime()); - assert size IN {2,4}; - - match = FALSE; - mismatch = FALSE; - - for i = 0 to UInt(DBGDIDR.BRPs) - (match_i, mismatch_i) = AArch32.BreakpointMatch(i, vaddress, size); - match = match || match_i; - mismatch = mismatch || mismatch_i; - - if match && HaltOnBreakpointOrWatchpoint() then - reason = DebugHalt_Breakpoint; - Halt(reason); - elsif (match || mismatch) then - acctype = AccType_IFETCH; - iswrite = FALSE; - debugmoe = DebugException_Breakpoint; - return AArch32.DebugFault(acctype, iswrite, debugmoe); - else - return AArch32.NoFault(); - -// AArch32.CheckVectorCatch() -// ========================== -// Called before executing the instruction of length "size" bytes at "vaddress" in an AArch32 -// translation regime, when debug exceptions are enabled. - -FaultRecord AArch32.CheckVectorCatch(bits(32) vaddress, integer size) - assert ELUsingAArch32(S1TranslationRegime()); - - match = AArch32.VCRMatch(vaddress); - if size == 4 && !match && AArch32.VCRMatch(vaddress + 2) then - match = ConstrainUnpredictableBool(Unpredictable_VCMATCHHALF); - - if match then - acctype = AccType_IFETCH; - iswrite = FALSE; - debugmoe = DebugException_VectorCatch; - return AArch32.DebugFault(acctype, iswrite, debugmoe); - else - return AArch32.NoFault(); - -// AArch32.AccessUsesEL() -// ====================== -// Returns the Exception Level of the regime that will manage the translation for a given access type1. - -bits(2) AArch32.AccessUsesEL(AccType acctype) - if acctype == AccType_UNPRIV then - return EL0; - else - return PSTATE.EL; - -// AArch32.AccessIsPrivileged() -// ============================ - -boolean AArch32.AccessIsPrivileged(AccType acctype) - - el = AArch32.AccessUsesEL(acctype); - - if el == EL0 then - ispriv = FALSE; - elsif el != EL1 then - ispriv = TRUE; - else - ispriv = (acctype != AccType_UNPRIV); - - return ispriv; - -// AArch32.CheckWatchpoint() -// ========================= -// Called before accessing the memory location of "size" bytes at "address", -// when either debug exceptions are enabled for the access, or halting debug -// is enabled and halting is allowed. - -FaultRecord AArch32.CheckWatchpoint(bits(32) vaddress, AccType acctype, - boolean iswrite, integer size) - assert ELUsingAArch32(S1TranslationRegime()); - - match = FALSE; - ispriv = AArch32.AccessIsPrivileged(acctype); - - for i = 0 to UInt(DBGDIDR.WRPs) - match = match || AArch32.WatchpointMatch(i, vaddress, size, ispriv, iswrite); - - if match && HaltOnBreakpointOrWatchpoint() then - reason = DebugHalt_Watchpoint; - Halt(reason); - elsif match then - debugmoe = DebugException_Watchpoint; - return AArch32.DebugFault(acctype, iswrite, debugmoe); - else - return AArch32.NoFault(); - -// AArch32.CheckDebug() -// ==================== -// Called on each access to check for a debug exception or entry to Debug state. - -FaultRecord AArch32.CheckDebug(bits(32) vaddress, AccType acctype, boolean iswrite, integer size) - - FaultRecord fault = AArch32.NoFault(); - - d_side = (acctype != AccType_IFETCH); - generate_exception = AArch32.GenerateDebugExceptions() && DBGDSCRext.MDBGen == '1'; - halt = HaltOnBreakpointOrWatchpoint(); - // Relative priority of Vector Catch and Breakpoint exceptions not defined in the architecture - vector_catch_first = ConstrainUnpredictableBool(Unpredictable_BPVECTORCATCHPRI); - - if !d_side && vector_catch_first && generate_exception then - fault = AArch32.CheckVectorCatch(vaddress, size); - - if fault.statuscode == Fault_None && (generate_exception || halt) then - if d_side then - fault = AArch32.CheckWatchpoint(vaddress, acctype, iswrite, size); - else - fault = AArch32.CheckBreakpoint(vaddress, size); - - if fault.statuscode == Fault_None && !d_side && !vector_catch_first && generate_exception then - return AArch32.CheckVectorCatch(vaddress, size); - - return fault; - -// AArch32.DomainFault() -// ===================== - -FaultRecord AArch32.DomainFault(bits(4) domain, integer level, AccType acctype, boolean iswrite) - - ipaddress = bits(40) UNKNOWN; - extflag = bit UNKNOWN; - debugmoe = bits(4) UNKNOWN; - errortype = bits(2) UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - return AArch32.CreateFaultRecord(Fault_Domain, ipaddress, domain, level, acctype, iswrite, - extflag, debugmoe, errortype, secondstage, s2fs1walk); - -// AArch32.CheckDomain() -// ===================== - -(boolean, FaultRecord) AArch32.CheckDomain(bits(4) domain, bits(32) vaddress, integer level, - AccType acctype, boolean iswrite) - - index = 2 * UInt(domain); - attrfield = DACR[index+1:index]; - - if attrfield == '10' then // Reserved, maps to an allocated value - // Reserved value maps to an allocated value - (-, attrfield) = ConstrainUnpredictableBits(Unpredictable_RESDACR); - - if attrfield == '00' then - fault = AArch32.DomainFault(domain, level, acctype, iswrite); - else - fault = AArch32.NoFault(); - - permissioncheck = (attrfield == '01'); - - return (permissioncheck, fault); - -// HavePrivATExt() -// =============== - -boolean HavePrivATExt() - return HasArchVersion(ARMv8p2); - -// AArch32.ExecutingATS1xPInstr() -// ============================== -// Return TRUE if current instruction is AT S1CPR/WP - -boolean AArch32.ExecutingATS1xPInstr() - if !HavePrivATExt() then return FALSE; - - instr = ThisInstr(); - if instr[24+:4] == '1110' && instr[8+:4] == '1110' then - op1 = instr[21+:3]; - CRn = instr[16+:4]; - CRm = instr[0+:4]; - op2 = instr[5+:3]; - return (op1 == '000' && CRn == '0111' && CRm == '1001' && op2 IN {'000','001'}); - else - return FALSE; - -// AArch32.PermissionFault() -// ========================= - -FaultRecord AArch32.PermissionFault(bits(40) ipaddress, bits(4) domain, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - extflag = bit UNKNOWN; - debugmoe = bits(4) UNKNOWN; - errortype = bits(2) UNKNOWN; - return AArch32.CreateFaultRecord(Fault_Permission, ipaddress, domain, level, acctype, iswrite, - extflag, debugmoe, errortype, secondstage, s2fs1walk); - -type Permissions is ( - bits(3) ap, // Access permission bits - bit xn, // Execute-never bit - bit xxn, // [Armv8.2] Extended execute-never bit for stage 2 - bit pxn // Privileged execute-never bit -) - -// AArch32.CheckPermission() -// ========================= -// Function used for permission checking from AArch32 stage 1 translations - -FaultRecord AArch32.CheckPermission(Permissions perms, bits(32) vaddress, integer level, - bits(4) domain, bit NS, AccType acctype, boolean iswrite) - assert ELUsingAArch32(S1TranslationRegime()); - - if PSTATE.EL != EL2 then - wxn = SCTLR.WXN == '1'; - if TTBCR.EAE == '1' || SCTLR.AFE == '1' || perms.ap[0] == '1' then - priv_r = TRUE; - priv_w = perms.ap[2] == '0'; - user_r = perms.ap[1] == '1'; - user_w = perms.ap[2:1] == '01'; - else - priv_r = perms.ap[2:1] != '00'; - priv_w = perms.ap[2:1] == '01'; - user_r = perms.ap[1] == '1'; - user_w = FALSE; - uwxn = SCTLR.UWXN == '1'; - - ispriv = AArch32.AccessIsPrivileged(acctype); - - pan = if HavePANExt() then PSTATE.PAN else '0'; - is_ldst = !(acctype IN {AccType_DC, AccType_DC_UNPRIV, AccType_AT, AccType_IFETCH}); - is_ats1xp = (acctype == AccType_AT && AArch32.ExecutingATS1xPInstr()); - if pan == '1' && user_r && ispriv && (is_ldst || is_ats1xp) then - priv_r = FALSE; - priv_w = FALSE; - - user_xn = !user_r || perms.xn == '1' || (user_w && wxn); - priv_xn = (!priv_r || perms.xn == '1' || perms.pxn == '1' || - (priv_w && wxn) || (user_w && uwxn)); - - if ispriv then - (r, w, xn) = (priv_r, priv_w, priv_xn); - else - (r, w, xn) = (user_r, user_w, user_xn); - else - // Access from EL2 - wxn = HSCTLR.WXN == '1'; - r = TRUE; - w = perms.ap[2] == '0'; - xn = perms.xn == '1' || (w && wxn); - - // Restriction on Secure instruction fetch - if HaveEL(EL3) && IsSecure() && NS == '1' then - secure_instr_fetch = if ELUsingAArch32(EL3) then SCR.SIF else SCR_EL3.SIF; - if secure_instr_fetch == '1' then xn = TRUE; - - if acctype == AccType_IFETCH then - fail = xn; - failedread = TRUE; - elsif acctype IN { AccType_ATOMICRW, AccType_ORDEREDRW, AccType_ORDEREDATOMICRW } then - fail = !r || !w; - failedread = !r; - elsif acctype == AccType_DC then - // DC maintenance instructions operating by VA, cannot fault from stage 1 translation. - fail = FALSE; - elsif iswrite then - fail = !w; - failedread = FALSE; - else - fail = !r; - failedread = TRUE; - - if fail then - secondstage = FALSE; - s2fs1walk = FALSE; - ipaddress = bits(40) UNKNOWN; - return AArch32.PermissionFault(ipaddress, domain, level, acctype, - !failedread, secondstage, s2fs1walk); - else - return AArch32.NoFault(); - -// AArch32.ExecutingLSMInstr() -// =========================== -// Returns TRUE if processor is executing a Load/Store Multiple instruction - -boolean AArch32.ExecutingLSMInstr() - instr = ThisInstr(); - instr_set = CurrentInstrSet(); - assert instr_set IN {InstrSet_A32, InstrSet_T32}; - - if instr_set == InstrSet_A32 then - return (instr[28+:4] != '1111' && instr[25+:3] == '100'); - else // InstrSet_T32 - if ThisInstrLength() == 16 then - return (instr[12+:4] == '1100'); - else - return (instr[25+:7] == '1110100' && instr[22] == '0'); - -enumeration DeviceType {DeviceType_GRE, DeviceType_nGRE, DeviceType_nGnRE, DeviceType_nGnRnE}; - -type MemAttrHints is ( - bits(2) attrs, // See MemAttr_*, Cacheability attributes - bits(2) hints, // See MemHint_*, Allocation hints - boolean transient -) - -enumeration MemType {MemType_Normal, MemType_Device}; - -type MemoryAttributes is ( - MemType memtype, - - DeviceType device, // For Device memory types - MemAttrHints inner, // Inner hints and attributes - MemAttrHints outer, // Outer hints and attributes - boolean tagged, // Tagged access - boolean shareable, - boolean outershareable -) - -type AddressDescriptor is ( - FaultRecord fault, // fault.statuscode indicates whether the address is valid - MemoryAttributes memattrs, - FullAddress paddress, - bits(64) vaddress -) - -constant bits(2) MemAttr_NC = '00'; // Non-cacheable -constant bits(2) MemAttr_WT = '10'; // Write-through -constant bits(2) MemAttr_WB = '11'; // Write-back - -// MemAttrDefaults() -// ================= -// Supply default values for memory attributes, including overriding the shareability attributes -// for Device and Non-cacheable memory types. - -MemoryAttributes MemAttrDefaults(MemoryAttributes memattrs) - - if memattrs.memtype == MemType_Device then - memattrs.inner = MemAttrHints UNKNOWN; - memattrs.outer = MemAttrHints UNKNOWN; - memattrs.shareable = TRUE; - memattrs.outershareable = TRUE; - else - memattrs.device = DeviceType UNKNOWN; - if memattrs.inner.attrs == MemAttr_NC && memattrs.outer.attrs == MemAttr_NC then - memattrs.shareable = TRUE; - memattrs.outershareable = TRUE; - - return memattrs; - -constant bits(2) MemHint_No = '00'; // No Read-Allocate, No Write-Allocate -constant bits(2) MemHint_WA = '01'; // No Read-Allocate, Write-Allocate -constant bits(2) MemHint_RA = '10'; // Read-Allocate, No Write-Allocate -constant bits(2) MemHint_RWA = '11'; // Read-Allocate, Write-Allocate - -// AArch32.InstructionDevice() -// =========================== -// Instruction fetches from memory marked as Device but not execute-never might generate a -// Permission Fault but are otherwise treated as if from Normal Non-cacheable memory. - -AddressDescriptor AArch32.InstructionDevice(AddressDescriptor addrdesc, bits(32) vaddress, - bits(40) ipaddress, integer level, bits(4) domain, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - c = ConstrainUnpredictable(Unpredictable_INSTRDEVICE); - assert c IN {Constraint_NONE, Constraint_FAULT}; - - if c == Constraint_FAULT then - addrdesc.fault = AArch32.PermissionFault(ipaddress, domain, level, acctype, iswrite, - secondstage, s2fs1walk); - else - addrdesc.memattrs.memtype = MemType_Normal; - addrdesc.memattrs.inner.attrs = MemAttr_NC; - addrdesc.memattrs.inner.hints = MemHint_No; - addrdesc.memattrs.outer = addrdesc.memattrs.inner; - addrdesc.memattrs.tagged = FALSE; - addrdesc.memattrs = MemAttrDefaults(addrdesc.memattrs); - - return addrdesc; - -// HasS2Translation() -// ================== -// Returns TRUE if stage 2 translation is present for the current translation regime - -boolean HasS2Translation() - return (EL2Enabled() && !IsInHost() && PSTATE.EL IN {EL0,EL1}); - -type DescriptorUpdate is ( - boolean AF, // AF needs to be set - boolean AP, // AP[2] / S2AP[2] will be modified - AddressDescriptor descaddr // Descriptor to be updated -) - -type TLBRecord is ( - Permissions perms, - bit nG, // '0' = Global, '1' = not Global - bits(4) domain, // AArch32 only - bit GP, // Guarded Page - boolean contiguous, // Contiguous bit from page table - integer level, // AArch32 Short-descriptor format: Indicates Section/Page - integer blocksize, // Describes size of memory translated in KBytes - DescriptorUpdate descupdate, // [Armv8.1] Context for h/w update of table descriptor - bit CnP, // [Armv8.2] TLB entry can be shared between different PEs - AddressDescriptor addrdesc -) - -// AArch32.TranslateAddressS1Off() -// =============================== -// Called for stage 1 translations when translation is disabled to supply a default translation. -// Note that there are additional constraints on instruction prefetching that are not described in -// this pseudocode. - -TLBRecord AArch32.TranslateAddressS1Off(bits(32) vaddress, AccType acctype, boolean iswrite) - assert ELUsingAArch32(S1TranslationRegime()); - - TLBRecord result; - result.descupdate.AF = FALSE; - result.descupdate.AP = FALSE; - - default_cacheable = (HasS2Translation() && ((if ELUsingAArch32(EL2) then HCR.DC else HCR_EL2.DC) == '1')); - - if default_cacheable then - // Use default cacheable settings - result.addrdesc.memattrs.memtype = MemType_Normal; - result.addrdesc.memattrs.inner.attrs = MemAttr_WB; // Write-back - result.addrdesc.memattrs.inner.hints = MemHint_RWA; - result.addrdesc.memattrs.shareable = FALSE; - result.addrdesc.memattrs.outershareable = FALSE; - result.addrdesc.memattrs.tagged = HCR_EL2.DCT == '1'; - elsif acctype != AccType_IFETCH then - // Treat data as Device - result.addrdesc.memattrs.memtype = MemType_Device; - result.addrdesc.memattrs.device = DeviceType_nGnRnE; - result.addrdesc.memattrs.inner = MemAttrHints UNKNOWN; - result.addrdesc.memattrs.tagged = FALSE; - else - // Instruction cacheability controlled by SCTLR/HSCTLR.I - if PSTATE.EL == EL2 then - cacheable = HSCTLR.I == '1'; - else - cacheable = SCTLR.I == '1'; - result.addrdesc.memattrs.memtype = MemType_Normal; - if cacheable then - result.addrdesc.memattrs.inner.attrs = MemAttr_WT; - result.addrdesc.memattrs.inner.hints = MemHint_RA; - else - result.addrdesc.memattrs.inner.attrs = MemAttr_NC; - result.addrdesc.memattrs.inner.hints = MemHint_No; - result.addrdesc.memattrs.shareable = TRUE; - result.addrdesc.memattrs.outershareable = TRUE; - result.addrdesc.memattrs.tagged = FALSE; - - result.addrdesc.memattrs.outer = result.addrdesc.memattrs.inner; - - result.addrdesc.memattrs = MemAttrDefaults(result.addrdesc.memattrs); - - result.perms.ap = bits(3) UNKNOWN; - result.perms.xn = '0'; - result.perms.pxn = '0'; - - result.nG = bit UNKNOWN; - result.contiguous = boolean UNKNOWN; - result.domain = bits(4) UNKNOWN; - result.level = integer UNKNOWN; - result.blocksize = integer UNKNOWN; - result.addrdesc.paddress.address = ZeroExtend(vaddress); - result.addrdesc.paddress.NS = if IsSecure() then '0' else '1'; - result.addrdesc.fault = AArch32.NoFault(); - return result; - -// AArch32.AccessFlagFault() -// ========================= - -FaultRecord AArch32.AccessFlagFault(bits(40) ipaddress, bits(4) domain, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - extflag = bit UNKNOWN; - debugmoe = bits(4) UNKNOWN; - errortype = bits(2) UNKNOWN; - return AArch32.CreateFaultRecord(Fault_AccessFlag, ipaddress, domain, level, acctype, iswrite, - extflag, debugmoe, errortype, secondstage, s2fs1walk); - -// AArch32.AddressSizeFault() -// ========================== - -FaultRecord AArch32.AddressSizeFault(bits(40) ipaddress, bits(4) domain, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - extflag = bit UNKNOWN; - debugmoe = bits(4) UNKNOWN; - errortype = bits(2) UNKNOWN; - return AArch32.CreateFaultRecord(Fault_AddressSize, ipaddress, domain, level, acctype, iswrite, - extflag, debugmoe, errortype, secondstage, s2fs1walk); - -// AArch32.HaveHPDExt() -// ==================== - -boolean AArch32.HaveHPDExt() - return HasArchVersion(ARMv8p2); - -// S1CacheDisabled() -// ================= - -boolean S1CacheDisabled(AccType acctype) - if ELUsingAArch32(S1TranslationRegime()) then - if PSTATE.EL == EL2 then - enable = if acctype == AccType_IFETCH then HSCTLR.I else HSCTLR.C; - else - enable = if acctype == AccType_IFETCH then SCTLR.I else SCTLR.C; - else - enable = if acctype == AccType_IFETCH then SCTLR[].I else SCTLR[].C; - return enable == '0'; - -// LongConvertAttrsHints() -// ======================= -// Convert the long attribute fields for Normal memory as used in the MAIR fields -// to orthogonal attributes and hints - -MemAttrHints LongConvertAttrsHints(bits(4) attrfield, AccType acctype) - assert !IsZero(attrfield); - MemAttrHints result; - if S1CacheDisabled(acctype) then // Force Non-cacheable - result.attrs = MemAttr_NC; - result.hints = MemHint_No; - else - if attrfield[3:2] == '00' then // Write-through transient - result.attrs = MemAttr_WT; - result.hints = attrfield[1:0]; - result.transient = TRUE; - elsif attrfield[3:0] == '0100' then // Non-cacheable (no allocate) - result.attrs = MemAttr_NC; - result.hints = MemHint_No; - result.transient = FALSE; - elsif attrfield[3:2] == '01' then // Write-back transient - result.attrs = MemAttr_WB; - result.hints = attrfield[1:0]; - result.transient = TRUE; - else // Write-through/Write-back non-transient - result.attrs = attrfield[3:2]; - result.hints = attrfield[1:0]; - result.transient = FALSE; - - return result; - -// AArch32.S1AttrDecode() -// ====================== -// Converts the Stage 1 attribute fields, using the MAIR, to orthogonal -// attributes and hints. - -MemoryAttributes AArch32.S1AttrDecode(bits(2) SH, bits(3) attr, AccType acctype) - - MemoryAttributes memattrs; - - if PSTATE.EL == EL2 then - mair = HMAIR1:HMAIR0; - else - mair = MAIR1:MAIR0; - index = 8 * UInt(attr); - attrfield = mair[index+7:index]; - - memattrs.tagged = FALSE; - if ((attrfield[7:4] != '0000' && attrfield[7:4] != '1111' && attrfield[3:0] == '0000') || - (attrfield[7:4] == '0000' && attrfield[3:0] != 'xx00')) then - // Reserved, maps to an allocated value - (-, attrfield) = ConstrainUnpredictableBits(Unpredictable_RESMAIR); - if !HaveMTEExt() && attrfield[7:4] == '1111' && attrfield[3:0] == '0000' then - // Reserved, maps to an allocated value - (-, attrfield) = ConstrainUnpredictableBits(Unpredictable_RESMAIR); - - if attrfield[7:4] == '0000' then // Device - memattrs.memtype = MemType_Device; - case attrfield[3:0] of - when '0000' memattrs.device = DeviceType_nGnRnE; - when '0100' memattrs.device = DeviceType_nGnRE; - when '1000' memattrs.device = DeviceType_nGRE; - when '1100' memattrs.device = DeviceType_GRE; - otherwise Unreachable(); // Reserved, handled above - - elsif attrfield[3:0] != '0000' then // Normal - memattrs.memtype = MemType_Normal; - memattrs.outer = LongConvertAttrsHints(attrfield[7:4], acctype); - memattrs.inner = LongConvertAttrsHints(attrfield[3:0], acctype); - memattrs.shareable = SH[1] == '1'; - memattrs.outershareable = SH == '10'; - elsif HaveMTEExt() && attrfield == '11110000' then // Normal, Tagged if WB-RWA - memattrs.memtype = MemType_Normal; - memattrs.outer = LongConvertAttrsHints('1111', acctype); // WB_RWA - memattrs.inner = LongConvertAttrsHints('1111', acctype); // WB_RWA - memattrs.shareable = SH[1] == '1'; - memattrs.outershareable = SH == '10'; - memattrs.tagged = (memattrs.inner.attrs == MemAttr_WB && - memattrs.inner.hints == MemHint_RWA && - memattrs.outer.attrs == MemAttr_WB && - memattrs.outer.hints == MemHint_RWA); - else - Unreachable(); // Reserved, handled above - - return MemAttrDefaults(memattrs); - -// HaveExtendedExecuteNeverExt() -// ============================= - -boolean HaveExtendedExecuteNeverExt() - return HasArchVersion(ARMv8p2); - -// AArch32.CheckS2Permission() -// =========================== -// Function used for permission checking from AArch32 stage 2 translations - -FaultRecord AArch32.CheckS2Permission(Permissions perms, bits(32) vaddress, bits(40) ipaddress, - integer level, AccType acctype, boolean iswrite, - boolean s2fs1walk) - - assert HaveEL(EL2) && !IsSecure() && ELUsingAArch32(EL2) && HasS2Translation(); - - r = perms.ap[1] == '1'; - w = perms.ap[2] == '1'; - if HaveExtendedExecuteNeverExt() then - case perms.xn:perms.xxn of - when '00' xn = !r; - when '01' xn = !r || PSTATE.EL == EL1; - when '10' xn = TRUE; - when '11' xn = !r || PSTATE.EL == EL0; - else - xn = !r || perms.xn == '1'; - // Stage 1 walk is checked as a read, regardless of the original type1 - if acctype == AccType_IFETCH && !s2fs1walk then - fail = xn; - failedread = TRUE; - elsif (acctype IN { AccType_ATOMICRW, AccType_ORDEREDRW, AccType_ORDEREDATOMICRW }) && !s2fs1walk then - fail = !r || !w; - failedread = !r; - elsif acctype == AccType_DC && !s2fs1walk then - // DC maintenance instructions operating by VA, do not generate Permission faults - // from stage 2 translation, other than from stage 1 translation table walk. - fail = FALSE; - elsif iswrite && !s2fs1walk then - fail = !w; - failedread = FALSE; - else - fail = !r; - failedread = !iswrite; - - if fail then - domain = bits(4) UNKNOWN; - secondstage = TRUE; - return AArch32.PermissionFault(ipaddress, domain, level, acctype, - !failedread, secondstage, s2fs1walk); - else - return AArch32.NoFault(); - -// HaveStage2MemAttrControl() -// ========================== -// Returns TRUE if support for Stage2 control of memory types and cacheability attributes is implemented. - -boolean HaveStage2MemAttrControl() - return HasArchVersion(ARMv8p4); - -// CombineS1S2AttrHints() -// ====================== -// Combines cacheability attributes and allocation hints from stage 1 and stage 2 - -MemAttrHints CombineS1S2AttrHints(MemAttrHints s1desc, MemAttrHints s2desc) - - MemAttrHints result; - - apply_force_writeback = HaveStage2MemAttrControl() && HCR_EL2.FWB == '1'; - if apply_force_writeback then - if s2desc.attrs == '11' then - result.attrs = s1desc.attrs; - elsif s2desc.attrs == '10' then - result.attrs = MemAttr_WB; // force Write-back - else - result.attrs = MemAttr_NC; - else - if s2desc.attrs == '01' || s1desc.attrs == '01' then - result.attrs = bits(2) UNKNOWN; // Reserved - elsif s2desc.attrs == MemAttr_NC || s1desc.attrs == MemAttr_NC then - result.attrs = MemAttr_NC; // Non-cacheable - elsif s2desc.attrs == MemAttr_WT || s1desc.attrs == MemAttr_WT then - result.attrs = MemAttr_WT; // Write-through - else - result.attrs = MemAttr_WB; // Write-back - - if result.attrs == MemAttr_NC then - result.hints = MemHint_No; - elsif apply_force_writeback then - if s1desc.attrs != MemAttr_NC then - result.hints = s1desc.hints; - else - result.hints = MemHint_RWA; - else - result.hints = s1desc.hints; - result.transient = s1desc.transient; - - return result; - -// CombineS1S2Device() -// =================== -// Combines device types from stage 1 and stage 2 - -DeviceType CombineS1S2Device(DeviceType s1device, DeviceType s2device) - - if s2device == DeviceType_nGnRnE || s1device == DeviceType_nGnRnE then - result = DeviceType_nGnRnE; - elsif s2device == DeviceType_nGnRE || s1device == DeviceType_nGnRE then - result = DeviceType_nGnRE; - elsif s2device == DeviceType_nGRE || s1device == DeviceType_nGRE then - result = DeviceType_nGRE; - else - result = DeviceType_GRE; - - return result; - -// IsFault() -// ========= -// Return TRUE if a fault is associated with an address descriptor - -boolean IsFault(AddressDescriptor addrdesc) - return addrdesc.fault.statuscode != Fault_None; - -// AArch32.CombineS1S2Desc() -// ========================= -// Combines the address descriptors from stage 1 and stage 2 - -AddressDescriptor AArch32.CombineS1S2Desc(AddressDescriptor s1desc, AddressDescriptor s2desc) - - AddressDescriptor result; - - result.paddress = s2desc.paddress; - - apply_force_writeback = HaveStage2MemAttrControl() && HCR_EL2.FWB == '1'; - if IsFault(s1desc) || IsFault(s2desc) then - result = if IsFault(s1desc) then s1desc else s2desc; - else - result.fault = AArch32.NoFault(); - if s2desc.memattrs.memtype == MemType_Device || ( - (apply_force_writeback && s1desc.memattrs.memtype == MemType_Device && s2desc.memattrs.inner.attrs != '10') || - (!apply_force_writeback && s1desc.memattrs.memtype == MemType_Device) ) then - result.memattrs.memtype = MemType_Device; - if s1desc.memattrs.memtype == MemType_Normal then - result.memattrs.device = s2desc.memattrs.device; - elsif s2desc.memattrs.memtype == MemType_Normal then - result.memattrs.device = s1desc.memattrs.device; - else // Both Device - result.memattrs.device = CombineS1S2Device(s1desc.memattrs.device, - s2desc.memattrs.device); - result.memattrs.tagged = FALSE; - // S1 can be either Normal or Device, S2 is Normal. - else - result.memattrs.memtype = MemType_Normal; - result.memattrs.device = DeviceType UNKNOWN; - result.memattrs.inner = CombineS1S2AttrHints(s1desc.memattrs.inner, s2desc.memattrs.inner); - result.memattrs.outer = CombineS1S2AttrHints(s1desc.memattrs.outer, s2desc.memattrs.outer); - result.memattrs.shareable = (s1desc.memattrs.shareable || s2desc.memattrs.shareable); - result.memattrs.outershareable = (s1desc.memattrs.outershareable || - s2desc.memattrs.outershareable); - result.memattrs.tagged = (s1desc.memattrs.tagged && - result.memattrs.inner.attrs == MemAttr_WB && - result.memattrs.inner.hints == MemHint_RWA && - result.memattrs.outer.attrs == MemAttr_WB && - result.memattrs.outer.hints == MemHint_RWA); - - result.memattrs = MemAttrDefaults(result.memattrs); - - return result; - -// AArch64.CreateFaultRecord() -// =========================== - -FaultRecord AArch64.CreateFaultRecord(Fault statuscode, bits(52) ipaddress, boolean NS, - integer level, AccType acctype, boolean write, bit extflag, - bits(2) errortype, boolean secondstage, boolean s2fs1walk) - - FaultRecord fault; - fault.statuscode = statuscode; - fault.domain = bits(4) UNKNOWN; // Not used from AArch64 - fault.debugmoe = bits(4) UNKNOWN; // Not used from AArch64 - fault.errortype = errortype; - fault.ipaddress.NS = if NS then '1' else '0'; - fault.ipaddress.address = ipaddress; - fault.level = level; - fault.acctype = acctype; - fault.write = write; - fault.extflag = extflag; - fault.secondstage = secondstage; - fault.s2fs1walk = s2fs1walk; - - return fault; - -// AArch64.AlignmentFault() -// ======================== - -FaultRecord AArch64.AlignmentFault(AccType acctype, boolean iswrite, boolean secondstage) - - ipaddress = bits(52) UNKNOWN; - level = integer UNKNOWN; - extflag = bit UNKNOWN; - errortype = bits(2) UNKNOWN; - s2fs1walk = boolean UNKNOWN; - - return AArch64.CreateFaultRecord(Fault_Alignment, ipaddress, boolean UNKNOWN, level, acctype, iswrite, - extflag, errortype, secondstage, s2fs1walk); - -// AArch64.AccessUsesEL() -// ====================== -// Returns the Exception Level of the regime that will manage the translation for a given access type1. - -bits(2) AArch64.AccessUsesEL(AccType acctype) - if acctype == AccType_UNPRIV then - return EL0; - elsif acctype == AccType_NV2REGISTER then - return EL2; - else - return PSTATE.EL; - -// AArch64.SecondStageWalk() -// ========================= -// Perform a stage 2 translation on a stage 1 translation page table walk access. - -AddressDescriptor AArch64.SecondStageWalk(AddressDescriptor S1, bits(64) vaddress, AccType acctype, - boolean iswrite, integer size, boolean hwupdatewalk) - - assert HasS2Translation(); - - s2fs1walk = TRUE; - wasaligned = TRUE; - return AArch64.SecondStageTranslate(S1, vaddress, acctype, iswrite, wasaligned, s2fs1walk, - size, hwupdatewalk); - -// BigEndianReverse() -// ================== - -bits(width) BigEndianReverse (bits(width) value) - assert width IN {8, 16, 32, 64, 128}; - integer half = width DIV 2; - if width == 8 then return value; - return BigEndianReverse(value[half-1:0]) : BigEndianReverse(value[width-1:half]); - -type AccessDescriptor is ( - AccType acctype, - MPAMinfo mpam, - boolean page_table_walk, - boolean secondstage, - boolean s2fs1walk, - integer level -) - -// CreateAccessDescriptor() -// ======================== - -AccessDescriptor CreateAccessDescriptor(AccType acctype) - AccessDescriptor accdesc; - accdesc.acctype = acctype; - accdesc.mpam = GenMPAMcurEL(acctype IN {AccType_IFETCH, AccType_IC}); - accdesc.page_table_walk = FALSE; - return accdesc; - -// These two _Mem[] accessors are the hardware operations which perform single-copy atomic, -// aligned, little-endian memory accesses of size bytes from/to the underlying physical -// memory array of bytes. -// -// The functions address the array using desc.paddress which supplies: -// * A 52-bit physical address -// * A single NS bit to select between Secure and Non-secure parts of the array. -// -// The accdesc descriptor describes the access type1: normal, exclusive, ordered, streaming, -// etc and other parameters required to access the physical memory or for setting syndrome -// register in the event of an external abort. -bits(8*size) _Mem[AddressDescriptor desc, integer size, AccessDescriptor accdesc]; - -_Mem[AddressDescriptor desc, integer size, AccessDescriptor accdesc] = bits(8*size) value; - -// AArch64.CheckAndUpdateDescriptor() -// ================================== -// Check and update translation table descriptor if hardware update is configured - -FaultRecord AArch64.CheckAndUpdateDescriptor(DescriptorUpdate result, FaultRecord fault, - boolean secondstage, bits(64) vaddress, AccType acctype, - boolean iswrite, boolean s2fs1walk, boolean hwupdatewalk) - - boolean hw_update_AF = FALSE; - boolean hw_update_AP = FALSE; - - // Check if access flag can be updated - // Address translation instructions are permitted to update AF but not required - if result.AF then - if fault.statuscode == Fault_None || ConstrainUnpredictable(Unpredictable_AFUPDATE) == Constraint_TRUE then - hw_update_AF = TRUE; - - if result.AP && fault.statuscode == Fault_None then - write_perm_req = (iswrite || acctype IN {AccType_ATOMICRW,AccType_ORDEREDRW, AccType_ORDEREDATOMICRW }) && !s2fs1walk; - hw_update_AP = (write_perm_req && !(acctype IN {AccType_AT, AccType_DC, AccType_DC_UNPRIV})) || hwupdatewalk; - - if hw_update_AF || hw_update_AP then - if secondstage || !HasS2Translation() then - descaddr2 = result.descaddr; - else - hwupdatewalk = TRUE; - descaddr2 = AArch64.SecondStageWalk(result.descaddr, vaddress, acctype, iswrite, 8, hwupdatewalk); - if IsFault(descaddr2) then - return descaddr2.fault; - - accdesc = CreateAccessDescriptor(AccType_ATOMICRW); - desc = _Mem[descaddr2, 8, accdesc]; - el = AArch64.AccessUsesEL(acctype); - case el of - when EL3 - reversedescriptors = SCTLR_EL3.EE == '1'; - when EL2 - reversedescriptors = SCTLR_EL2.EE == '1'; - otherwise - reversedescriptors = SCTLR_EL1.EE == '1'; - if reversedescriptors then - desc = BigEndianReverse(desc); - - if hw_update_AF then - desc[10] = '1'; - if hw_update_AP then - desc[7] = (if secondstage then '1' else '0'); - - _Mem[descaddr2,8,accdesc] = if reversedescriptors then BigEndianReverse(desc) else desc; - - return fault; - -// AArch64.NoFault() -// ================= - -FaultRecord AArch64.NoFault() - - ipaddress = bits(52) UNKNOWN; - level = integer UNKNOWN; - acctype = AccType_NORMAL; - iswrite = boolean UNKNOWN; - extflag = bit UNKNOWN; - errortype = bits(2) UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - return AArch64.CreateFaultRecord(Fault_None, ipaddress, boolean UNKNOWN, level, acctype, iswrite, - extflag, errortype, secondstage, s2fs1walk); - -// AArch64.PermissionFault() -// ========================= - -FaultRecord AArch64.PermissionFault(bits(52) ipaddress,boolean NS, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - extflag = bit UNKNOWN; - errortype = bits(2) UNKNOWN; - return AArch64.CreateFaultRecord(Fault_Permission, ipaddress, NS, level, acctype, iswrite, - extflag, errortype, secondstage, s2fs1walk); - -// AArch64.CheckS2Permission() -// =========================== -// Function used for permission checking from AArch64 stage 2 translations - -FaultRecord AArch64.CheckS2Permission(Permissions perms, bits(64) vaddress, bits(52) ipaddress, - integer level, AccType acctype, boolean iswrite, boolean NS, - boolean s2fs1walk, boolean hwupdatewalk) - - assert (IsSecureEL2Enabled() || (HaveEL(EL2) && !IsSecure() && !ELUsingAArch32(EL2))) && HasS2Translation(); - - r = perms.ap[1] == '1'; - w = perms.ap[2] == '1'; - if HaveExtendedExecuteNeverExt() then - case perms.xn:perms.xxn of - when '00' xn = FALSE; - when '01' xn = PSTATE.EL == EL1; - when '10' xn = TRUE; - when '11' xn = PSTATE.EL == EL0; - else - xn = perms.xn == '1'; - // Stage 1 walk is checked as a read, regardless of the original type1 - if acctype == AccType_IFETCH && !s2fs1walk then - fail = xn; - failedread = TRUE; - elsif (acctype IN { AccType_ATOMICRW, AccType_ORDEREDRW, AccType_ORDEREDATOMICRW }) && !s2fs1walk then - fail = !r || !w; - failedread = !r; - elsif iswrite && !s2fs1walk then - fail = !w; - failedread = FALSE; - elsif acctype == AccType_DC && PSTATE.EL != EL0 && !s2fs1walk then - // DC maintenance instructions operating by VA, with the exception of DC IVAC, do - // not generate Permission faults from stage 2 translation, other than when - // performing a stage 1 translation table walk. - fail = FALSE; - elsif hwupdatewalk then - fail = !w; - failedread = !iswrite; - else - fail = !r; - failedread = !iswrite; - - if fail then - domain = bits(4) UNKNOWN; - secondstage = TRUE; - return AArch64.PermissionFault(ipaddress,NS, level, acctype, - !failedread, secondstage, s2fs1walk); - else - return AArch64.NoFault(); - -// AArch64.CombineS1S2Desc() -// ========================= -// Combines the address descriptors from stage 1 and stage 2 - -AddressDescriptor AArch64.CombineS1S2Desc(AddressDescriptor s1desc, AddressDescriptor s2desc) - - AddressDescriptor result; - - result.paddress = s2desc.paddress; - - apply_force_writeback = HaveStage2MemAttrControl() && HCR_EL2.FWB == '1'; - if IsFault(s1desc) || IsFault(s2desc) then - result = if IsFault(s1desc) then s1desc else s2desc; - else - result.fault = AArch64.NoFault(); - if s2desc.memattrs.memtype == MemType_Device || ( - (apply_force_writeback && s1desc.memattrs.memtype == MemType_Device && s2desc.memattrs.inner.attrs != '10') || - (!apply_force_writeback && s1desc.memattrs.memtype == MemType_Device) ) then - result.memattrs.memtype = MemType_Device; - if s1desc.memattrs.memtype == MemType_Normal then - result.memattrs.device = s2desc.memattrs.device; - elsif s2desc.memattrs.memtype == MemType_Normal then - result.memattrs.device = s1desc.memattrs.device; - else // Both Device - result.memattrs.device = CombineS1S2Device(s1desc.memattrs.device, - s2desc.memattrs.device); - result.memattrs.tagged = FALSE; - // S1 can be either Normal or Device, S2 is Normal. - else - result.memattrs.memtype = MemType_Normal; - result.memattrs.device = DeviceType UNKNOWN; - result.memattrs.inner = CombineS1S2AttrHints(s1desc.memattrs.inner, s2desc.memattrs.inner); - result.memattrs.outer = CombineS1S2AttrHints(s1desc.memattrs.outer, s2desc.memattrs.outer); - result.memattrs.shareable = (s1desc.memattrs.shareable || s2desc.memattrs.shareable); - result.memattrs.outershareable = (s1desc.memattrs.outershareable || - s2desc.memattrs.outershareable); - result.memattrs.tagged = (s1desc.memattrs.tagged && - result.memattrs.inner.attrs == MemAttr_WB && - result.memattrs.inner.hints == MemHint_RWA && - result.memattrs.outer.attrs == MemAttr_WB && - result.memattrs.outer.hints == MemHint_RWA); - - result.memattrs = MemAttrDefaults(result.memattrs); - - return result; - -// AArch64.InstructionDevice() -// =========================== -// Instruction fetches from memory marked as Device but not execute-never might generate a -// Permission Fault but are otherwise treated as if from Normal Non-cacheable memory. - -AddressDescriptor AArch64.InstructionDevice(AddressDescriptor addrdesc, bits(64) vaddress, - bits(52) ipaddress, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - c = ConstrainUnpredictable(Unpredictable_INSTRDEVICE); - assert c IN {Constraint_NONE, Constraint_FAULT}; - - if c == Constraint_FAULT then - addrdesc.fault = AArch64.PermissionFault(ipaddress, boolean UNKNOWN, level, acctype, iswrite, - secondstage, s2fs1walk); - else - addrdesc.memattrs.memtype = MemType_Normal; - addrdesc.memattrs.inner.attrs = MemAttr_NC; - addrdesc.memattrs.inner.hints = MemHint_No; - addrdesc.memattrs.outer = addrdesc.memattrs.inner; - addrdesc.memattrs.tagged = FALSE; - addrdesc.memattrs = MemAttrDefaults(addrdesc.memattrs); - - return addrdesc; - -// AArch64.AccessFlagFault() -// ========================= - -FaultRecord AArch64.AccessFlagFault(bits(52) ipaddress,boolean NS, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - extflag = bit UNKNOWN; - errortype = bits(2) UNKNOWN; - return AArch64.CreateFaultRecord(Fault_AccessFlag, ipaddress, NS, level, acctype, iswrite, - extflag, errortype, secondstage, s2fs1walk); - -// AArch64.AddressSizeFault() -// ========================== - -FaultRecord AArch64.AddressSizeFault(bits(52) ipaddress,boolean NS, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - extflag = bit UNKNOWN; - errortype = bits(2) UNKNOWN; - return AArch64.CreateFaultRecord(Fault_AddressSize, ipaddress, NS, level, acctype, iswrite, - extflag, errortype, secondstage, s2fs1walk); - -// AArch64.HaveHPDExt() -// ==================== - -boolean AArch64.HaveHPDExt() - return HasArchVersion(ARMv8p1); - -type MAIRType; - -// MAIR[] - non-assignment form -// ============================ - -MAIRType MAIR[bits(2) regime] - bits(64) r; - case regime of - when EL1 r = MAIR_EL1; - when EL2 r = MAIR_EL2; - when EL3 r = MAIR_EL3; - otherwise Unreachable(); - return r; - -// MAIR[] - non-assignment form -// ============================ - -MAIRType MAIR[] - return MAIR[S1TranslationRegime()]; - -// AArch64.S1AttrDecode() -// ====================== -// Converts the Stage 1 attribute fields, using the MAIR, to orthogonal -// attributes and hints. - -MemoryAttributes AArch64.S1AttrDecode(bits(2) SH, bits(3) attr, AccType acctype) - - MemoryAttributes memattrs; - - mair = MAIR[]; - index = 8 * UInt(attr); - attrfield = mair[index+7:index]; - - memattrs.tagged = FALSE; - if ((attrfield[7:4] != '0000' && attrfield[7:4] != '1111' && attrfield[3:0] == '0000') || - (attrfield[7:4] == '0000' && attrfield[3:0] != 'xx00')) then - // Reserved, maps to an allocated value - (-, attrfield) = ConstrainUnpredictableBits(Unpredictable_RESMAIR); - if !HaveMTEExt() && attrfield[7:4] == '1111' && attrfield[3:0] == '0000' then - // Reserved, maps to an allocated value - (-, attrfield) = ConstrainUnpredictableBits(Unpredictable_RESMAIR); - - if attrfield[7:4] == '0000' then // Device - memattrs.memtype = MemType_Device; - case attrfield[3:0] of - when '0000' memattrs.device = DeviceType_nGnRnE; - when '0100' memattrs.device = DeviceType_nGnRE; - when '1000' memattrs.device = DeviceType_nGRE; - when '1100' memattrs.device = DeviceType_GRE; - otherwise Unreachable(); // Reserved, handled above - - elsif attrfield[3:0] != '0000' then // Normal - memattrs.memtype = MemType_Normal; - memattrs.outer = LongConvertAttrsHints(attrfield[7:4], acctype); - memattrs.inner = LongConvertAttrsHints(attrfield[3:0], acctype); - memattrs.shareable = SH[1] == '1'; - memattrs.outershareable = SH == '10'; - elsif HaveMTEExt() && attrfield == '11110000' then // Normal, Tagged if WB-RWA - memattrs.memtype = MemType_Normal; - memattrs.outer = LongConvertAttrsHints('1111', acctype); // WB_RWA - memattrs.inner = LongConvertAttrsHints('1111', acctype); // WB_RWA - memattrs.shareable = SH[1] == '1'; - memattrs.outershareable = SH == '10'; - memattrs.tagged = (memattrs.inner.attrs == MemAttr_WB && - memattrs.inner.hints == MemHint_RWA && - memattrs.outer.attrs == MemAttr_WB && - memattrs.outer.hints == MemHint_RWA); - else - Unreachable(); // Reserved, handled above - - return MemAttrDefaults(memattrs); - -// AArch64.TranslationFault() -// ========================== - -FaultRecord AArch64.TranslationFault(bits(52) ipaddress, boolean NS, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - extflag = bit UNKNOWN; - errortype = bits(2) UNKNOWN; - return AArch64.CreateFaultRecord(Fault_Translation, ipaddress, NS, level, acctype, iswrite, - extflag, errortype, secondstage, s2fs1walk); - -// CreateAccessDescriptorPTW() -// =========================== - -AccessDescriptor CreateAccessDescriptorPTW(AccType acctype, boolean secondstage, - boolean s2fs1walk, integer level) - AccessDescriptor accdesc; - accdesc.acctype = acctype; - accdesc.mpam = GenMPAMcurEL(acctype IN {AccType_IFETCH, AccType_IC}); - accdesc.page_table_walk = TRUE; - accdesc.s2fs1walk = s2fs1walk; - accdesc.secondstage = secondstage; - accdesc.level = level; - return accdesc; - -// Have52BitPAExt() -// ================ -// Returns TRUE if Large Physical Address extension -// support is implemented and FALSE otherwise. - -boolean Have52BitPAExt() - return HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Has large 52-bit PA/IPA support"; - -// Have52BitVAExt() -// ================ -// Returns TRUE if Large Virtual Address extension -// support is implemented and FALSE otherwise. - -boolean Have52BitVAExt() - return HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Has large 52-bit VA support"; - -// HaveQRDMLAHExt() -// ================ - -boolean HaveQRDMLAHExt() - return HasArchVersion(ARMv8p1); - -boolean HaveAccessFlagUpdateExt() - return HasArchVersion(ARMv8p1); - -boolean HaveDirtyBitModifierExt() - return HasArchVersion(ARMv8p1); - -// HaveBlockBBM() -// ============== -// Returns TRUE if support for changing block size without requring break-before-make is implemented. - -boolean HaveBlockBBM() - return HasArchVersion(ARMv8p4); - -// HaveCommonNotPrivateTransExt() -// ============================== - -boolean HaveCommonNotPrivateTransExt() - return HasArchVersion(ARMv8p2); - -// HaveE0PDExt() -// ============= -// Returns TRUE if support for constant fault times for unprivileged accesses -// to the memory map is implemented. - -boolean HaveE0PDExt() - return HasArchVersion(ARMv8p5); - -// HaveSmallPageTblExt() -// ===================== -// Returns TRUE if Small Page Table Support is implemented. - -boolean HaveSmallPageTblExt() - return HasArchVersion(ARMv8p4) && boolean IMPLEMENTATION_DEFINED "Has Small Page Table extension"; - -// If the implementation supports changing the block size without a break-before-make -// approach, then for implementations that have level 1 or 2 support, the nT bit in -// the block descriptor is valid. -boolean IsBlockDescriptorNTBitValid(); - -// PAMax() -// ======= -// Returns the IMPLEMENTATION DEFINED upper limit on the physical address -// size for this processor, as log2(). - -integer PAMax() - return integer IMPLEMENTATION_DEFINED "Maximum Physical Address Size"; - -// S2CacheDisabled() -// ================= - -boolean S2CacheDisabled(AccType acctype) - if ELUsingAArch32(EL2) then - disable = if acctype == AccType_IFETCH then HCR2.ID else HCR2.CD; - else - disable = if acctype == AccType_IFETCH then HCR_EL2.ID else HCR_EL2.CD; - return disable == '1'; - -// S2ConvertAttrsHints() -// ===================== -// Converts the attribute fields for Normal memory as used in stage 2 -// descriptors to orthogonal attributes and hints - -MemAttrHints S2ConvertAttrsHints(bits(2) attr, AccType acctype) - assert !IsZero(attr); - - MemAttrHints result; - - if HCR_EL2.FWB=='0' && S2CacheDisabled(acctype) then // Force Non-cacheable - result.attrs = MemAttr_NC; - result.hints = MemHint_No; - else - case attr of - when '01' // Non-cacheable (no allocate) - result.attrs = MemAttr_NC; - result.hints = MemHint_No; - when '10' // Write-through - result.attrs = MemAttr_WT; - result.hints = MemHint_RWA; - when '11' // Write-back - result.attrs = MemAttr_WB; - result.hints = MemHint_RWA; - - result.transient = FALSE; - - return result; - -// S2AttrDecode() -// ============== -// Converts the Stage 2 attribute fields into orthogonal attributes and hints - -MemoryAttributes S2AttrDecode(bits(2) SH, bits(4) attr, AccType acctype) - - MemoryAttributes memattrs; - - apply_force_writeback = HaveStage2MemAttrControl() && HCR_EL2.FWB == '1'; - - // Device memory - if (apply_force_writeback && attr[2] == '0') || attr[3:2] == '00' then - memattrs.memtype = MemType_Device; - case attr[1:0] of - when '00' memattrs.device = DeviceType_nGnRnE; - when '01' memattrs.device = DeviceType_nGnRE; - when '10' memattrs.device = DeviceType_nGRE; - when '11' memattrs.device = DeviceType_GRE; - - // Normal memory - elsif apply_force_writeback then - if attr[2] == '1' then - memattrs.memtype = MemType_Normal; - memattrs.inner.attrs = attr[1:0]; - memattrs.outer.attrs = attr[1:0]; - elsif attr[1:0] != '00' then - memattrs.memtype = MemType_Normal; - memattrs.outer = S2ConvertAttrsHints(attr[3:2], acctype); - memattrs.inner = S2ConvertAttrsHints(attr[1:0], acctype); - memattrs.shareable = SH[1] == '1'; - memattrs.outershareable = SH == '10'; - else - memattrs = MemoryAttributes UNKNOWN; // Reserved - - return MemAttrDefaults(memattrs); - -// ShortConvertAttrsHints() -// ======================== -// Converts the short attribute fields for Normal memory as used in the TTBR and -// TEX fields to orthogonal attributes and hints - -MemAttrHints ShortConvertAttrsHints(bits(2) RGN, AccType acctype, boolean secondstage) - - MemAttrHints result; - - if (!secondstage && S1CacheDisabled(acctype)) || (secondstage && S2CacheDisabled(acctype)) then - // Force Non-cacheable - result.attrs = MemAttr_NC; - result.hints = MemHint_No; - else - case RGN of - when '00' // Non-cacheable (no allocate) - result.attrs = MemAttr_NC; - result.hints = MemHint_No; - when '01' // Write-back, Read and Write allocate - result.attrs = MemAttr_WB; - result.hints = MemHint_RWA; - when '10' // Write-through, Read allocate - result.attrs = MemAttr_WT; - result.hints = MemHint_RA; - when '11' // Write-back, Read allocate - result.attrs = MemAttr_WB; - result.hints = MemHint_RA; - - result.transient = FALSE; - - return result; - -// WalkAttrDecode() -// ================ - -MemoryAttributes WalkAttrDecode(bits(2) SH, bits(2) ORGN, bits(2) IRGN, boolean secondstage) - - MemoryAttributes memattrs; - - AccType acctype = AccType_NORMAL; - - memattrs.memtype = MemType_Normal; - memattrs.inner = ShortConvertAttrsHints(IRGN, acctype, secondstage); - memattrs.outer = ShortConvertAttrsHints(ORGN, acctype, secondstage); - memattrs.shareable = SH[1] == '1'; - memattrs.outershareable = SH == '10'; - memattrs.tagged = FALSE; - - return MemAttrDefaults(memattrs); - -// AArch64.TranslationTableWalk() -// ============================== -// Returns a result of a translation table walk -// -// Implementations might cache information from memory in any number of non-coherent TLB -// caching structures, and so avoid memory accesses that have been expressed in this -// pseudocode. The use of such TLBs is not expressed in this pseudocode. - -TLBRecord AArch64.TranslationTableWalk(bits(52) ipaddress, boolean s1_nonsecure, bits(64) vaddress, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk, integer size) - if !secondstage then - assert !ELUsingAArch32(S1TranslationRegime()); - else - assert (IsSecureEL2Enabled() || (HaveEL(EL2) && !IsSecure() && !ELUsingAArch32(EL2))) && HasS2Translation(); - - TLBRecord result; - AddressDescriptor descaddr; - bits(64) baseregister; - bits(64) inputaddr; // Input Address is 'vaddress' for stage 1, 'ipaddress' for stage 2 - bit nswalk; // Stage 2 translation table walks are to Secure or to Non-secure PA space - - descaddr.memattrs.memtype = MemType_Normal; - result.descupdate.AF = FALSE; - result.descupdate.AP = FALSE; - - // Derived parameters for the page table walk: - // grainsize = Log2(Size of Table) - Size of Table is 4KB, 16KB or 64KB in AArch64 - // stride = Log2(Address per Level) - Bits of address consumed at each level - // firstblocklevel = First level where a block entry is allowed - // ps = Physical Address size as encoded in TCR_EL1.IPS or TCR_ELx/VTCR_EL2.PS - // inputsize = Log2(Size of Input Address) - Input Address size in bits - // level = Level to start walk from - // This means that the number of levels after start level = 3-level - - if !secondstage then - // First stage translation - inputaddr = ZeroExtend(vaddress); - el = AArch64.AccessUsesEL(acctype); - top = AddrTop(inputaddr, (acctype == AccType_IFETCH), el); - if el == EL3 then - largegrain = TCR_EL3.TG0 == '01'; - midgrain = TCR_EL3.TG0 == '10'; - inputsize = 64 - UInt(TCR_EL3.T0SZ); - inputsize_max = if Have52BitVAExt() && largegrain then 52 else 48; - inputsize_min = 64 - (if !HaveSmallPageTblExt() then 39 else if largegrain then 47 else 48); - if inputsize < inputsize_min then - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_FAULT}; - if c == Constraint_FORCE then inputsize = inputsize_min; - ps = TCR_EL3.PS; - basefound = inputsize >= inputsize_min && inputsize <= inputsize_max && IsZero(inputaddr[top:inputsize]); - disabled = FALSE; - baseregister = TTBR0_EL3; - descaddr.memattrs = WalkAttrDecode(TCR_EL3.SH0, TCR_EL3.ORGN0, TCR_EL3.IRGN0, secondstage); - reversedescriptors = SCTLR_EL3.EE == '1'; - lookupsecure = TRUE; - singlepriv = TRUE; - update_AF = HaveAccessFlagUpdateExt() && TCR_EL3.HA == '1'; - update_AP = HaveDirtyBitModifierExt() && update_AF && TCR_EL3.HD == '1'; - hierattrsdisabled = AArch64.HaveHPDExt() && TCR_EL3.HPD == '1'; - elsif ELIsInHost(el) then - if inputaddr[top] == '0' then - largegrain = TCR_EL2.TG0 == '01'; - midgrain = TCR_EL2.TG0 == '10'; - inputsize = 64 - UInt(TCR_EL2.T0SZ); - inputsize_max = if Have52BitVAExt() && largegrain then 52 else 48; - inputsize_min = 64 - (if !HaveSmallPageTblExt() then 39 else if largegrain then 47 else 48); - if inputsize < inputsize_min then - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_FAULT}; - if c == Constraint_FORCE then inputsize = inputsize_min; - basefound = inputsize >= inputsize_min && inputsize <= inputsize_max && IsZero(inputaddr[top:inputsize]); - disabled = TCR_EL2.EPD0 == '1' || (PSTATE.EL == EL0 && HaveE0PDExt() && TCR_EL2.E0PD0 == '1'); - baseregister = TTBR0_EL2; - descaddr.memattrs = WalkAttrDecode(TCR_EL2.SH0, TCR_EL2.ORGN0, TCR_EL2.IRGN0, secondstage); - hierattrsdisabled = AArch64.HaveHPDExt() && TCR_EL2.HPD0 == '1'; - else - inputsize = 64 - UInt(TCR_EL2.T1SZ); - largegrain = TCR_EL2.TG1 == '11'; // TG1 and TG0 encodings differ - midgrain = TCR_EL2.TG1 == '01'; - inputsize_max = if Have52BitVAExt() && largegrain then 52 else 48; - inputsize_min = 64 - (if !HaveSmallPageTblExt() then 39 else if largegrain then 47 else 48); - if inputsize < inputsize_min then - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_FAULT}; - if c == Constraint_FORCE then inputsize = inputsize_min; - basefound = inputsize >= inputsize_min && inputsize <= inputsize_max && IsOnes(inputaddr[top:inputsize]); - disabled = TCR_EL2.EPD1 == '1' || (PSTATE.EL == EL0 && HaveE0PDExt() && TCR_EL2.E0PD1 == '1'); - baseregister = TTBR1_EL2; - descaddr.memattrs = WalkAttrDecode(TCR_EL2.SH1, TCR_EL2.ORGN1, TCR_EL2.IRGN1, secondstage); - hierattrsdisabled = AArch64.HaveHPDExt() && TCR_EL2.HPD1 == '1'; - ps = TCR_EL2.IPS; - reversedescriptors = SCTLR_EL2.EE == '1'; - lookupsecure = if IsSecureEL2Enabled() then IsSecure() else FALSE; - singlepriv = FALSE; - update_AF = HaveAccessFlagUpdateExt() && TCR_EL2.HA == '1'; - update_AP = HaveDirtyBitModifierExt() && update_AF && TCR_EL2.HD == '1'; - elsif el == EL2 then - inputsize = 64 - UInt(TCR_EL2.T0SZ); - largegrain = TCR_EL2.TG0 == '01'; - midgrain = TCR_EL2.TG0 == '10'; - inputsize_max = if Have52BitVAExt() && largegrain then 52 else 48; - inputsize_min = 64 - (if !HaveSmallPageTblExt() then 39 else if largegrain then 47 else 48); - if inputsize < inputsize_min then - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_FAULT}; - if c == Constraint_FORCE then inputsize = inputsize_min; - ps = TCR_EL2.PS; - basefound = inputsize >= inputsize_min && inputsize <= inputsize_max && IsZero(inputaddr[top:inputsize]); - disabled = FALSE; - baseregister = TTBR0_EL2; - descaddr.memattrs = WalkAttrDecode(TCR_EL2.SH0, TCR_EL2.ORGN0, TCR_EL2.IRGN0, secondstage); - reversedescriptors = SCTLR_EL2.EE == '1'; - lookupsecure = if IsSecureEL2Enabled() then IsSecure() else FALSE; - singlepriv = TRUE; - update_AF = HaveAccessFlagUpdateExt() && TCR_EL2.HA == '1'; - update_AP = HaveDirtyBitModifierExt() && update_AF && TCR_EL2.HD == '1'; - hierattrsdisabled = AArch64.HaveHPDExt() && TCR_EL2.HPD == '1'; - else - if inputaddr[top] == '0' then - inputsize = 64 - UInt(TCR_EL1.T0SZ); - largegrain = TCR_EL1.TG0 == '01'; - midgrain = TCR_EL1.TG0 == '10'; - inputsize_max = if Have52BitVAExt() && largegrain then 52 else 48; - inputsize_min = 64 - (if !HaveSmallPageTblExt() then 39 else if largegrain then 47 else 48); - if inputsize < inputsize_min then - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_FAULT}; - if c == Constraint_FORCE then inputsize = inputsize_min; - basefound = inputsize >= inputsize_min && inputsize <= inputsize_max && IsZero(inputaddr[top:inputsize]); - disabled = TCR_EL1.EPD0 == '1' || (PSTATE.EL == EL0 && HaveE0PDExt() && TCR_EL1.E0PD0 == '1'); - disabled = disabled || (el == EL0 && acctype == AccType_NONFAULT && TCR_EL1.NFD0 == '1'); - baseregister = TTBR0_EL1; - descaddr.memattrs = WalkAttrDecode(TCR_EL1.SH0, TCR_EL1.ORGN0, TCR_EL1.IRGN0, secondstage); - hierattrsdisabled = AArch64.HaveHPDExt() && TCR_EL1.HPD0 == '1'; - else - inputsize = 64 - UInt(TCR_EL1.T1SZ); - largegrain = TCR_EL1.TG1 == '11'; // TG1 and TG0 encodings differ - midgrain = TCR_EL1.TG1 == '01'; - inputsize_max = if Have52BitVAExt() && largegrain then 52 else 48; - inputsize_min = 64 - (if !HaveSmallPageTblExt() then 39 else if largegrain then 47 else 48); - if inputsize < inputsize_min then - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_FAULT}; - if c == Constraint_FORCE then inputsize = inputsize_min; - basefound = inputsize >= inputsize_min && inputsize <= inputsize_max && IsOnes(inputaddr[top:inputsize]); - disabled = TCR_EL1.EPD1 == '1' || (PSTATE.EL == EL0 && HaveE0PDExt() && TCR_EL1.E0PD1 == '1'); - disabled = disabled || (el == EL0 && acctype == AccType_NONFAULT && TCR_EL1.NFD1 == '1'); - baseregister = TTBR1_EL1; - descaddr.memattrs = WalkAttrDecode(TCR_EL1.SH1, TCR_EL1.ORGN1, TCR_EL1.IRGN1, secondstage); - hierattrsdisabled = AArch64.HaveHPDExt() && TCR_EL1.HPD1 == '1'; - ps = TCR_EL1.IPS; - reversedescriptors = SCTLR_EL1.EE == '1'; - lookupsecure = IsSecure(); - singlepriv = FALSE; - update_AF = HaveAccessFlagUpdateExt() && TCR_EL1.HA == '1'; - update_AP = HaveDirtyBitModifierExt() && update_AF && TCR_EL1.HD == '1'; - if largegrain then - grainsize = 16; // Log2(64KB page size) - firstblocklevel = (if Have52BitPAExt() then 1 else 2); // Largest block is 4TB (2^42 bytes) for 52 bit PA - // and 512MB (2^29 bytes) otherwise - elsif midgrain then - grainsize = 14; // Log2(16KB page size) - firstblocklevel = 2; // Largest block is 32MB (2^25 bytes) - else // Small grain - grainsize = 12; // Log2(4KB page size) - firstblocklevel = 1; // Largest block is 1GB (2^30 bytes) - stride = grainsize - 3; // Log2(page size / 8 bytes) - // The starting level is the number of strides needed to consume the input address - level = 4 - (1 + ((inputsize - grainsize - 1) DIV stride)); - - else - // Second stage translation - inputaddr = ZeroExtend(ipaddress); - if IsSecureBelowEL3() then - // Second stage for Secure translation regime - if s1_nonsecure then // Non-secure IPA space - t0size = VTCR_EL2.T0SZ; - tg0 = VTCR_EL2.TG0; - nswalk = VTCR_EL2.NSW; - else // Secure IPA space - t0size = VSTCR_EL2.T0SZ; - tg0 = VSTCR_EL2.TG0; - nswalk = VSTCR_EL2.SW; - - // Stage 2 translation accesses the Non-secure PA space or the Secure PA space - if nswalk == '1' then - // When walk is Non-secure, access must be to the Non-secure PA space - nsaccess = '1'; - elsif !s1_nonsecure then - // When walk is Secure and in the Secure IPA space, - // access is specified by VSTCR_EL2.SA - nsaccess = VSTCR_EL2.SA; - elsif VSTCR_EL2.SW == '1' || VSTCR_EL2.SA == '1' then - // When walk is Secure and in the Non-secure IPA space, - // access is Non-secure when VSTCR_EL2.SA specifies the Non-secure PA space - nsaccess = '1'; - else - // When walk is Secure and in the Non-secure IPA space, - // if VSTCR_EL2.SA specifies the Secure PA space, access is specified by VTCR_EL2.NSA - nsaccess = VTCR_EL2.NSA; - else - // Second stage for Non-secure translation regime - t0size = VTCR_EL2.T0SZ; - tg0 = VTCR_EL2.TG0; - nswalk = '1'; - nsaccess = '1'; - - inputsize = 64 - UInt(t0size); - largegrain = tg0 == '01'; - midgrain = tg0 == '10'; - - inputsize_max = if Have52BitPAExt() && PAMax() == 52 && largegrain then 52 else 48; - inputsize_min = 64 - (if !HaveSmallPageTblExt() then 39 else if largegrain then 47 else 48); - if inputsize < inputsize_min then - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_FAULT}; - if c == Constraint_FORCE then inputsize = inputsize_min; - ps = VTCR_EL2.PS; - basefound = inputsize >= inputsize_min && inputsize <= inputsize_max && IsZero(inputaddr[63:inputsize]); - disabled = FALSE; - descaddr.memattrs = WalkAttrDecode(VTCR_EL2.SH0, VTCR_EL2.ORGN0, VTCR_EL2.IRGN0, secondstage); - reversedescriptors = SCTLR_EL2.EE == '1'; - singlepriv = TRUE; - update_AF = HaveAccessFlagUpdateExt() && VTCR_EL2.HA == '1'; - update_AP = HaveDirtyBitModifierExt() && update_AF && VTCR_EL2.HD == '1'; - - if IsSecureEL2Enabled() then - lookupsecure = !s1_nonsecure; - else - lookupsecure = FALSE; - - if lookupsecure then - baseregister = VSTTBR_EL2; - startlevel = UInt(VSTCR_EL2.SL0); - else - baseregister = VTTBR_EL2; - startlevel = UInt(VTCR_EL2.SL0); - if largegrain then - grainsize = 16; // Log2(64KB page size) - level = 3 - startlevel; - firstblocklevel = (if Have52BitPAExt() then 1 else 2); // Largest block is 4TB (2^42 bytes) for 52 bit PA - // and 512MB (2^29 bytes) otherwise - elsif midgrain then - grainsize = 14; // Log2(16KB page size) - level = 3 - startlevel; - firstblocklevel = 2; // Largest block is 32MB (2^25 bytes) - else // Small grain - grainsize = 12; // Log2(4KB page size) - if HaveSmallPageTblExt() && startlevel == 3 then - level = startlevel; // Startlevel 3 (VTCR_EL2.SL0 or VSCTR_EL2.SL0 == 0b11) for 4KB granule - else - level = 2 - startlevel; - firstblocklevel = 1; // Largest block is 1GB (2^30 bytes) - stride = grainsize - 3; // Log2(page size / 8 bytes) - - // Limits on IPA controls based on implemented PA size. Level 0 is only - // supported by small grain translations - if largegrain then // 64KB pages - // Level 1 only supported if implemented PA size is greater than 2^42 bytes - if level == 0 || (level == 1 && PAMax() <= 42) then basefound = FALSE; - elsif midgrain then // 16KB pages - // Level 1 only supported if implemented PA size is greater than 2^40 bytes - if level == 0 || (level == 1 && PAMax() <= 40) then basefound = FALSE; - else // Small grain, 4KB pages - // Level 0 only supported if implemented PA size is greater than 2^42 bytes - if level < 0 || (level == 0 && PAMax() <= 42) then basefound = FALSE; - - // If the inputsize exceeds the PAMax value, the behavior is CONSTRAINED UNPREDICTABLE - inputsizecheck = inputsize; - if inputsize > PAMax() && (!ELUsingAArch32(EL1) || inputsize > 40) then - case ConstrainUnpredictable(Unpredictable_LARGEIPA) of - when Constraint_FORCE - // Restrict the inputsize to the PAMax value - inputsize = PAMax(); - inputsizecheck = PAMax(); - when Constraint_FORCENOSLCHECK - // As FORCE, except use the configured inputsize in the size checks below - inputsize = PAMax(); - when Constraint_FAULT - // Generate a translation fault - basefound = FALSE; - otherwise - Unreachable(); - - // Number of entries in the starting level table = - // (Size of Input Address)/((Address per level)^(Num levels remaining)*(Size of Table)) - startsizecheck = inputsizecheck - ((3 - level)*stride + grainsize); // Log2(Num of entries) - - // Check for starting level table with fewer than 2 entries or longer than 16 pages. - // Lower bound check is: startsizecheck < Log2(2 entries) - // Upper bound check is: startsizecheck > Log2(pagesize/8*16) - if startsizecheck < 1 || startsizecheck > stride + 4 then basefound = FALSE; - if !basefound || disabled then - level = 0; // AArch32 reports this as a level 1 fault - result.addrdesc.fault = AArch64.TranslationFault(ipaddress, s1_nonsecure, level, acctype, iswrite, - secondstage, s2fs1walk); - return result; - - case ps of - when '000' outputsize = 32; - when '001' outputsize = 36; - when '010' outputsize = 40; - when '011' outputsize = 42; - when '100' outputsize = 44; - when '101' outputsize = 48; - when '110' outputsize = (if Have52BitPAExt() && largegrain then 52 else 48); - otherwise outputsize = integer IMPLEMENTATION_DEFINED "Reserved Intermediate Physical Address size value"; - - if outputsize > PAMax() then outputsize = PAMax(); - - if outputsize < 48 && !IsZero(baseregister[47:outputsize]) then - level = 0; - result.addrdesc.fault = AArch64.AddressSizeFault(ipaddress,s1_nonsecure, level, acctype, iswrite, - secondstage, s2fs1walk); - return result; - - // Bottom bound of the Base address is: - // Log2(8 bytes per entry)+Log2(Number of entries in starting level table) - // Number of entries in starting level table = - // (Size of Input Address)/((Address per level)^(Num levels remaining)*(Size of Table)) - baselowerbound = 3 + inputsize - ((3-level)*stride + grainsize); // Log2(Num of entries*8) - bits(52) baseaddress; - if outputsize == 52 then - z = (if baselowerbound < 6 then 6 else baselowerbound); - baseaddress = baseregister[5:2]:baseregister[47:z]:Zeros(z); - else - baseaddress = ZeroExtend(baseregister[47:baselowerbound]:Zeros(baselowerbound)); - - ns_table = if lookupsecure then '0' else '1'; - ap_table = '00'; - xn_table = '0'; - pxn_table = '0'; - - addrselecttop = inputsize - 1; - - apply_nvnv1_effect = HaveNVExt() && EL2Enabled() && HCR_EL2.[NV,NV1] == '11' && S1TranslationRegime() == EL1 && !secondstage; - repeat - addrselectbottom = (3-level)*stride + grainsize; - - bits(52) index = ZeroExtend(inputaddr[addrselecttop:addrselectbottom]:'000'); - descaddr.paddress.address = baseaddress OR index; - descaddr.paddress.NS = if secondstage then nswalk else ns_table; - - // If there are two stages of translation, then the first stage table walk addresses - // are themselves subject to translation - if secondstage || !HasS2Translation() || (HaveNV2Ext() && acctype == AccType_NV2REGISTER) then - descaddr2 = descaddr; - else - hwupdatewalk = FALSE; - descaddr2 = AArch64.SecondStageWalk(descaddr, vaddress, acctype, iswrite, 8, hwupdatewalk); - // Check for a fault on the stage 2 walk - if IsFault(descaddr2) then - result.addrdesc.fault = descaddr2.fault; - return result; - - // Update virtual address for abort functions - descaddr2.vaddress = ZeroExtend(vaddress); - - accdesc = CreateAccessDescriptorPTW(acctype, secondstage, s2fs1walk, level); - desc = _Mem[descaddr2, 8, accdesc]; - - if reversedescriptors then desc = BigEndianReverse(desc); - - if desc[0] == '0' || (desc[1:0] == '01' && (level == 3 || - (HaveBlockBBM() && IsBlockDescriptorNTBitValid() && desc[16] == '1'))) then - // Fault (00), Reserved (10), Block (01) at level 3, or Block(01) with nT bit set. - result.addrdesc.fault = AArch64.TranslationFault(ipaddress, s1_nonsecure, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - // Valid Block, Page, or Table entry - if desc[1:0] == '01' || level == 3 then // Block (01) or Page (11) - blocktranslate = TRUE; - else // Table (11) - if (outputsize < 52 && largegrain && !IsZero(desc[15:12])) || (outputsize < 48 && !IsZero(desc[47:outputsize])) then - result.addrdesc.fault = AArch64.AddressSizeFault(ipaddress,s1_nonsecure, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - if outputsize == 52 then - baseaddress = desc[15:12]:desc[47:grainsize]:Zeros(grainsize); - else - baseaddress = ZeroExtend(desc[47:grainsize]:Zeros(grainsize)); - if !secondstage then - // Unpack the upper and lower table attributes - ns_table = ns_table OR desc[63]; - if !secondstage && !hierattrsdisabled then - ap_table[1] = ap_table[1] OR desc[62]; // read-only - - if apply_nvnv1_effect then - pxn_table = pxn_table OR desc[60]; - else - xn_table = xn_table OR desc[60]; - // pxn_table and ap_table[0] apply in EL1&0 or EL2&0 translation regimes - if !singlepriv then - if !apply_nvnv1_effect then - pxn_table = pxn_table OR desc[59]; - ap_table[0] = ap_table[0] OR desc[61]; // privileged - - level = level + 1; - addrselecttop = addrselectbottom - 1; - blocktranslate = FALSE; - until blocktranslate; - - // Check block size is supported at this level - if level < firstblocklevel then - result.addrdesc.fault = AArch64.TranslationFault(ipaddress, s1_nonsecure, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - // Check for misprogramming of the contiguous bit - if largegrain then - num_ch_entries = 5; - elsif midgrain then - if level == 3 then - num_ch_entries = 7; - else num_ch_entries = 5; - else num_ch_entries = 4; - - contiguousbitcheck = inputsize < (addrselectbottom + num_ch_entries); - - if contiguousbitcheck && desc[52] == '1' then - if boolean IMPLEMENTATION_DEFINED "Translation fault on misprogrammed contiguous bit" then - result.addrdesc.fault = AArch64.TranslationFault(ipaddress, s1_nonsecure, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - // Unpack the descriptor into address and upper and lower block attributes - if largegrain then - outputaddress = desc[15:12]:desc[47:addrselectbottom]:inputaddr[addrselectbottom-1:0]; - else - outputaddress = ZeroExtend(desc[47:addrselectbottom]:inputaddr[addrselectbottom-1:0]); - - // When 52-bit PA is supported, for 64 Kbyte translation granule, - // block size might be larger than the supported output address size - if outputsize < 52 && !IsZero(outputaddress[51:outputsize]) then - result.addrdesc.fault = AArch64.AddressSizeFault(ipaddress,s1_nonsecure, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - // Check Access Flag - if desc[10] == '0' then - if !update_AF then - result.addrdesc.fault = AArch64.AccessFlagFault(ipaddress,s1_nonsecure, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - else - result.descupdate.AF = TRUE; - - if update_AP && desc[51] == '1' then - // If hw update of access permission field is configured consider AP[2] as '0' / S2AP[2] as '1' - if !secondstage && desc[7] == '1' then - desc[7] = '0'; - result.descupdate.AP = TRUE; - elsif secondstage && desc[7] == '0' then - desc[7] = '1'; - result.descupdate.AP = TRUE; - - // Required descriptor if AF or AP[2]/S2AP[2] needs update - result.descupdate.descaddr = descaddr; - - if apply_nvnv1_effect then - pxn = desc[54]; // Bit[54] of the block/page descriptor holds PXN instead of UXN - xn = '0'; // XN is '0' - ap = desc[7]:'01'; // Bit[6] of the block/page descriptor is treated as '0' regardless of value programmed - else - xn = desc[54]; // Bit[54] of the block/page descriptor holds UXN - pxn = desc[53]; // Bit[53] of the block/page descriptor holds PXN - ap = desc[7:6]:'1'; // Bits[7:6] of the block/page descriptor hold AP[2:1] - contiguousbit = desc[52]; - nG = desc[11]; - sh = desc[9:8]; - memattr = desc[5:2]; // AttrIndx and NS bit in stage 1 - - result.domain = bits(4) UNKNOWN; // Domains not used - result.level = level; - result.blocksize = 2^((3-level)*stride + grainsize); - - // Stage 1 translation regimes also inherit attributes from the tables - if !secondstage then - result.perms.xn = xn OR xn_table; - result.perms.ap[2] = ap[2] OR ap_table[1]; // Force read-only - // PXN, nG and AP[1] apply in EL1&0 or EL2&0 stage 1 translation regimes - if !singlepriv then - result.perms.ap[1] = ap[1] AND NOT(ap_table[0]); // Force privileged only - result.perms.pxn = pxn OR pxn_table; - // Pages from Non-secure tables are marked non-global in Secure EL1&0 - if IsSecure() then - result.nG = nG OR ns_table; - else - result.nG = nG; - else - result.perms.ap[1] = '1'; - result.perms.pxn = '0'; - result.nG = '0'; - result.GP = desc[50]; // Stage 1 block or pages might be guarded - result.perms.ap[0] = '1'; - result.addrdesc.memattrs = AArch64.S1AttrDecode(sh, memattr[2:0], acctype); - result.addrdesc.paddress.NS = memattr[3] OR ns_table; - else - result.perms.ap[2:1] = ap[2:1]; - result.perms.ap[0] = '1'; - result.perms.xn = xn; - if HaveExtendedExecuteNeverExt() then result.perms.xxn = desc[53]; - result.perms.pxn = '0'; - result.nG = '0'; - if s2fs1walk then - result.addrdesc.memattrs = S2AttrDecode(sh, memattr, AccType_PTW); - else - result.addrdesc.memattrs = S2AttrDecode(sh, memattr, acctype); - result.addrdesc.paddress.NS = nsaccess; - - result.addrdesc.paddress.address = outputaddress; - result.addrdesc.fault = AArch64.NoFault(); - result.contiguous = contiguousbit == '1'; - if HaveCommonNotPrivateTransExt() then result.CnP = baseregister[0]; - - return result; - -// AArch64.SecondStageTranslate() -// ============================== -// Perform a stage 2 translation walk. The function used by Address Translation operations is -// similar except it uses the translation regime specified for the instruction. - -AddressDescriptor AArch64.SecondStageTranslate(AddressDescriptor S1, bits(64) vaddress, - AccType acctype, boolean iswrite, boolean wasaligned, - boolean s2fs1walk, integer size, boolean hwupdatewalk) - assert HasS2Translation(); - - s2_enabled = HCR_EL2.VM == '1' || HCR_EL2.DC == '1'; - secondstage = TRUE; - - if s2_enabled then // Second stage enabled - ipaddress = S1.paddress.address[51:0]; - NS = S1.paddress.NS == '1'; - S2 = AArch64.TranslationTableWalk(ipaddress, NS, vaddress, acctype, iswrite, secondstage, - s2fs1walk, size); - - // Check for unaligned data accesses to Device memory - if ((!wasaligned && acctype != AccType_IFETCH) || (acctype == AccType_DCZVA)) - && S2.addrdesc.memattrs.memtype == MemType_Device && !IsFault(S2.addrdesc) then - S2.addrdesc.fault = AArch64.AlignmentFault(acctype, iswrite, secondstage); - - // Check for permissions on Stage2 translations - if !IsFault(S2.addrdesc) then - S2.addrdesc.fault = AArch64.CheckS2Permission(S2.perms, vaddress, ipaddress, S2.level, - acctype, iswrite, NS,s2fs1walk, hwupdatewalk); - - // Check for instruction fetches from Device memory not marked as execute-never. As there - // has not been a Permission Fault then the memory is not marked execute-never. - if (!s2fs1walk && !IsFault(S2.addrdesc) && S2.addrdesc.memattrs.memtype == MemType_Device && - acctype == AccType_IFETCH) then - S2.addrdesc = AArch64.InstructionDevice(S2.addrdesc, vaddress, ipaddress, S2.level, - acctype, iswrite, - secondstage, s2fs1walk); - - if (s2fs1walk && !IsFault(S2.addrdesc) && - S2.addrdesc.memattrs.memtype == MemType_Device) then - // Check for protected table walk. - if HCR_EL2.PTW == '1' then - S2.addrdesc.fault = AArch64.PermissionFault(ipaddress, - NS, S2.level, - acctype, iswrite, secondstage, s2fs1walk); - else - // Translation table walk occurs as Normal Non-cacheable memory. - S2.addrdesc.memattrs.memtype = MemType_Normal; - S2.addrdesc.memattrs.inner.attrs = MemAttr_NC; - S2.addrdesc.memattrs.outer.attrs = MemAttr_NC; - S2.addrdesc.memattrs.shareable = TRUE; - S2.addrdesc.memattrs.outershareable = TRUE; - - // Check and update translation table descriptor if required - S2.addrdesc.fault = AArch64.CheckAndUpdateDescriptor(S2.descupdate, S2.addrdesc.fault, - secondstage, vaddress, acctype, - iswrite, s2fs1walk, hwupdatewalk); - result = AArch64.CombineS1S2Desc(S1, S2.addrdesc); - else - result = S1; - - return result; - -// AArch32.SecondStageTranslate() -// ============================== -// Perform a stage 2 translation walk. The function used by Address Translation operations is -// similar except it uses the translation regime specified for the instruction. - -AddressDescriptor AArch32.SecondStageTranslate(AddressDescriptor S1, bits(32) vaddress, - AccType acctype, boolean iswrite, boolean wasaligned, - boolean s2fs1walk, integer size) - assert HasS2Translation(); - assert IsZero(S1.paddress.address[47:40]); - hwupdatewalk = FALSE; - if !ELUsingAArch32(EL2) then - return AArch64.SecondStageTranslate(S1, ZeroExtend(vaddress, 64), acctype, iswrite, - wasaligned, s2fs1walk, size, hwupdatewalk); - - s2_enabled = HCR.VM == '1' || HCR.DC == '1'; - secondstage = TRUE; - - if s2_enabled then // Second stage enabled - ipaddress = S1.paddress.address[39:0]; - S2 = AArch32.TranslationTableWalkLD(ipaddress, vaddress, acctype, iswrite, secondstage, - s2fs1walk, size); - - // Check for unaligned data accesses to Device memory - if ((!wasaligned && acctype != AccType_IFETCH) || (acctype == AccType_DCZVA)) - && S2.addrdesc.memattrs.memtype == MemType_Device && !IsFault(S2.addrdesc) then - S2.addrdesc.fault = AArch32.AlignmentFault(acctype, iswrite, secondstage); - - // Check for permissions on Stage2 translations - if !IsFault(S2.addrdesc) then - S2.addrdesc.fault = AArch32.CheckS2Permission(S2.perms, vaddress, ipaddress, S2.level, - acctype, iswrite, s2fs1walk); - - // Check for instruction fetches from Device memory not marked as execute-never. As there - // has not been a Permission Fault then the memory is not marked execute-never. - if (!s2fs1walk && !IsFault(S2.addrdesc) && S2.addrdesc.memattrs.memtype == MemType_Device && - acctype == AccType_IFETCH) then - domain = bits(4) UNKNOWN; - S2.addrdesc = AArch32.InstructionDevice(S2.addrdesc, vaddress, ipaddress, S2.level, - domain, acctype, iswrite, - secondstage, s2fs1walk); - - if (s2fs1walk && !IsFault(S2.addrdesc) && - S2.addrdesc.memattrs.memtype == MemType_Device) then - // Check for protected table walk. - if HCR.PTW == '1' then - domain = bits(4) UNKNOWN; - S2.addrdesc.fault = AArch32.PermissionFault(ipaddress, - domain, S2.level, - acctype, iswrite, secondstage, s2fs1walk); - else - // Translation table walk occurs as Normal Non-cacheable memory. - S2.addrdesc.memattrs.memtype = MemType_Normal; - S2.addrdesc.memattrs.inner.attrs = MemAttr_NC; - S2.addrdesc.memattrs.outer.attrs = MemAttr_NC; - S2.addrdesc.memattrs.shareable = TRUE; - S2.addrdesc.memattrs.outershareable = TRUE; - - result = AArch32.CombineS1S2Desc(S1, S2.addrdesc); - else - result = S1; - - return result; - -// AArch32.SecondStageWalk() -// ========================= -// Perform a stage 2 translation on a stage 1 translation page table walk access. - -AddressDescriptor AArch32.SecondStageWalk(AddressDescriptor S1, bits(32) vaddress, AccType acctype, - boolean iswrite, integer size) - - assert HasS2Translation(); - - s2fs1walk = TRUE; - wasaligned = TRUE; - return AArch32.SecondStageTranslate(S1, vaddress, acctype, iswrite, wasaligned, s2fs1walk, - size); - -// AArch32.TranslationFault() -// ========================== - -FaultRecord AArch32.TranslationFault(bits(40) ipaddress, bits(4) domain, integer level, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk) - - extflag = bit UNKNOWN; - debugmoe = bits(4) UNKNOWN; - errortype = bits(2) UNKNOWN; - return AArch32.CreateFaultRecord(Fault_Translation, ipaddress, domain, level, acctype, iswrite, - extflag, debugmoe, errortype, secondstage, s2fs1walk); - -// AArch32.TranslationTableWalkLD() -// ================================ -// Returns a result of a translation table walk using the Long-descriptor format -// -// Implementations might cache information from memory in any number of non-coherent TLB -// caching structures, and so avoid memory accesses that have been expressed in this -// pseudocode. The use of such TLBs is not expressed in this pseudocode. - -TLBRecord AArch32.TranslationTableWalkLD(bits(40) ipaddress, bits(32) vaddress, - AccType acctype, boolean iswrite, boolean secondstage, - boolean s2fs1walk, integer size) - if !secondstage then - assert ELUsingAArch32(S1TranslationRegime()); - else - assert HaveEL(EL2) && !IsSecure() && ELUsingAArch32(EL2) && HasS2Translation(); - - TLBRecord result; - AddressDescriptor descaddr; - bits(64) baseregister; - bits(40) inputaddr; // Input Address is 'vaddress' for stage 1, 'ipaddress' for stage 2 - bit nswalk; // Stage 2 translation table walks are to Secure or to Non-secure PA space - - domain = bits(4) UNKNOWN; - - descaddr.memattrs.memtype = MemType_Normal; - result.descupdate.AF = FALSE; - result.descupdate.AP = FALSE; - - // Fixed parameters for the page table walk: - // grainsize = Log2(Size of Table) - Size of Table is 4KB in AArch32 - // stride = Log2(Address per Level) - Bits of address consumed at each level - constant integer grainsize = 12; // Log2(4KB page size) - constant integer stride = grainsize - 3; // Log2(page size / 8 bytes) - - // Derived parameters for the page table walk: - // inputsize = Log2(Size of Input Address) - Input Address size in bits - // level = Level to start walk from - // This means that the number of levels after start level = 3-level - - if !secondstage then - // First stage translation - inputaddr = ZeroExtend(vaddress); - el = AArch32.AccessUsesEL(acctype); - if el == EL2 then - inputsize = 32 - UInt(HTCR.T0SZ); - basefound = inputsize == 32 || IsZero(inputaddr[31:inputsize]); - disabled = FALSE; - baseregister = HTTBR; - descaddr.memattrs = WalkAttrDecode(HTCR.SH0, HTCR.ORGN0, HTCR.IRGN0, secondstage); - reversedescriptors = HSCTLR.EE == '1'; - lookupsecure = FALSE; - singlepriv = TRUE; - hierattrsdisabled = AArch32.HaveHPDExt() && HTCR.HPD == '1'; - else - basefound = FALSE; - disabled = FALSE; - t0size = UInt(TTBCR.T0SZ); - if t0size == 0 || IsZero(inputaddr[31:(32-t0size)]) then - inputsize = 32 - t0size; - basefound = TRUE; - baseregister = TTBR0; - descaddr.memattrs = WalkAttrDecode(TTBCR.SH0, TTBCR.ORGN0, TTBCR.IRGN0, secondstage); - hierattrsdisabled = AArch32.HaveHPDExt() && TTBCR.T2E == '1' && TTBCR2.HPD0 == '1'; - t1size = UInt(TTBCR.T1SZ); - if (t1size == 0 && !basefound) || (t1size > 0 && IsOnes(inputaddr[31:(32-t1size)])) then - inputsize = 32 - t1size; - basefound = TRUE; - baseregister = TTBR1; - descaddr.memattrs = WalkAttrDecode(TTBCR.SH1, TTBCR.ORGN1, TTBCR.IRGN1, secondstage); - hierattrsdisabled = AArch32.HaveHPDExt() && TTBCR.T2E == '1' && TTBCR2.HPD1 == '1'; - reversedescriptors = SCTLR.EE == '1'; - lookupsecure = IsSecure(); - singlepriv = FALSE; - // The starting level is the number of strides needed to consume the input address - level = 4 - (1 + ((inputsize - grainsize - 1) DIV stride)); - - else - // Second stage translation - inputaddr = ipaddress; - inputsize = 32 - SInt(VTCR.T0SZ); - // VTCR.S must match VTCR.T0SZ[3] - if VTCR.S != VTCR.T0SZ[3] then - (-, inputsize) = ConstrainUnpredictableInteger(32-7, 32+8, Unpredictable_RESVTCRS); - basefound = inputsize == 40 || IsZero(inputaddr[39:inputsize]); - disabled = FALSE; - descaddr.memattrs = WalkAttrDecode(VTCR.SH0, VTCR.ORGN0, VTCR.IRGN0, secondstage); - reversedescriptors = HSCTLR.EE == '1'; - singlepriv = TRUE; - - lookupsecure = FALSE; - baseregister = VTTBR; - startlevel = UInt(VTCR.SL0); - level = 2 - startlevel; - if level <= 0 then basefound = FALSE; - - // Number of entries in the starting level table = - // (Size of Input Address)/((Address per level)^(Num levels remaining)*(Size of Table)) - startsizecheck = inputsize - ((3 - level)*stride + grainsize); // Log2(Num of entries) - - // Check for starting level table with fewer than 2 entries or longer than 16 pages. - // Lower bound check is: startsizecheck < Log2(2 entries) - // That is, VTCR.SL0 == '00' and SInt(VTCR.T0SZ) > 1, Size of Input Address < 2^31 bytes - // Upper bound check is: startsizecheck > Log2(pagesize/8*16) - // That is, VTCR.SL0 == '01' and SInt(VTCR.T0SZ) [ -2, Size of Input Address ] 2^34 bytes - if startsizecheck < 1 || startsizecheck > stride + 4 then basefound = FALSE; - if !basefound || disabled then - level = 1; // AArch64 reports this as a level 0 fault - result.addrdesc.fault = AArch32.TranslationFault(ipaddress, domain, level, acctype, iswrite, - secondstage, s2fs1walk); - return result; - - if !IsZero(baseregister[47:40]) then - level = 0; - result.addrdesc.fault = AArch32.AddressSizeFault(ipaddress, domain, level, acctype, iswrite, - secondstage, s2fs1walk); - return result; - - // Bottom bound of the Base address is: - // Log2(8 bytes per entry)+Log2(Number of entries in starting level table) - // Number of entries in starting level table = - // (Size of Input Address)/((Address per level)^(Num levels remaining)*(Size of Table)) - baselowerbound = 3 + inputsize - ((3-level)*stride + grainsize); // Log2(Num of entries*8) - baseaddress = baseregister[39:baselowerbound]:Zeros(baselowerbound); - - ns_table = if lookupsecure then '0' else '1'; - ap_table = '00'; - xn_table = '0'; - pxn_table = '0'; - - addrselecttop = inputsize - 1; - - repeat - addrselectbottom = (3-level)*stride + grainsize; - - bits(40) index = ZeroExtend(inputaddr[addrselecttop:addrselectbottom]:'000'); - descaddr.paddress.address = ZeroExtend(baseaddress OR index); - descaddr.paddress.NS = ns_table; - - // If there are two stages of translation, then the first stage table walk addresses - // are themselves subject to translation - if secondstage || !HasS2Translation() || (HaveNV2Ext() && acctype == AccType_NV2REGISTER) then - descaddr2 = descaddr; - else - descaddr2 = AArch32.SecondStageWalk(descaddr, vaddress, acctype, iswrite, 8); - // Check for a fault on the stage 2 walk - if IsFault(descaddr2) then - result.addrdesc.fault = descaddr2.fault; - return result; - - // Update virtual address for abort functions - descaddr2.vaddress = ZeroExtend(vaddress); - - accdesc = CreateAccessDescriptorPTW(acctype, secondstage, s2fs1walk, level); - desc = _Mem[descaddr2, 8, accdesc]; - - if reversedescriptors then desc = BigEndianReverse(desc); - - if desc[0] == '0' || (desc[1:0] == '01' && level == 3) then - // Fault (00), Reserved (10), or Block (01) at level 3. - result.addrdesc.fault = AArch32.TranslationFault(ipaddress, domain, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - // Valid Block, Page, or Table entry - if desc[1:0] == '01' || level == 3 then // Block (01) or Page (11) - blocktranslate = TRUE; - else // Table (11) - if !IsZero(desc[47:40]) then - result.addrdesc.fault = AArch32.AddressSizeFault(ipaddress, domain, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - baseaddress = desc[39:grainsize]:Zeros(grainsize); - if !secondstage then - // Unpack the upper and lower table attributes - ns_table = ns_table OR desc[63]; - if !secondstage && !hierattrsdisabled then - ap_table[1] = ap_table[1] OR desc[62]; // read-only - - xn_table = xn_table OR desc[60]; - // pxn_table and ap_table[0] apply only in EL1&0 translation regimes - if !singlepriv then - pxn_table = pxn_table OR desc[59]; - ap_table[0] = ap_table[0] OR desc[61]; // privileged - - level = level + 1; - addrselecttop = addrselectbottom - 1; - blocktranslate = FALSE; - until blocktranslate; - - // Unpack the descriptor into address and upper and lower block attributes - outputaddress = desc[39:addrselectbottom]:inputaddr[addrselectbottom-1:0]; - - // Check the output address is inside the supported range - if !IsZero(desc[47:40]) then - result.addrdesc.fault = AArch32.AddressSizeFault(ipaddress, domain, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - // Check the access flag - if desc[10] == '0' then - result.addrdesc.fault = AArch32.AccessFlagFault(ipaddress, domain, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - xn = desc[54]; // Bit[54] of the block/page descriptor holds UXN - pxn = desc[53]; // Bit[53] of the block/page descriptor holds PXN - ap = desc[7:6]:'1'; // Bits[7:6] of the block/page descriptor hold AP[2:1] - contiguousbit = desc[52]; - nG = desc[11]; - sh = desc[9:8]; - memattr = desc[5:2]; // AttrIndx and NS bit in stage 1 - - result.domain = bits(4) UNKNOWN; // Domains not used - result.level = level; - result.blocksize = 2^((3-level)*stride + grainsize); - - // Stage 1 translation regimes also inherit attributes from the tables - if !secondstage then - result.perms.xn = xn OR xn_table; - result.perms.ap[2] = ap[2] OR ap_table[1]; // Force read-only - // PXN, nG and AP[1] apply only in EL1&0 stage 1 translation regimes - if !singlepriv then - result.perms.ap[1] = ap[1] AND NOT(ap_table[0]); // Force privileged only - result.perms.pxn = pxn OR pxn_table; - // Pages from Non-secure tables are marked non-global in Secure EL1&0 - if IsSecure() then - result.nG = nG OR ns_table; - else - result.nG = nG; - else - result.perms.ap[1] = '1'; - result.perms.pxn = '0'; - result.nG = '0'; - result.GP = desc[50]; // Stage 1 block or pages might be guarded - result.perms.ap[0] = '1'; - result.addrdesc.memattrs = AArch32.S1AttrDecode(sh, memattr[2:0], acctype); - result.addrdesc.paddress.NS = memattr[3] OR ns_table; - else - result.perms.ap[2:1] = ap[2:1]; - result.perms.ap[0] = '1'; - result.perms.xn = xn; - if HaveExtendedExecuteNeverExt() then result.perms.xxn = desc[53]; - result.perms.pxn = '0'; - result.nG = '0'; - if s2fs1walk then - result.addrdesc.memattrs = S2AttrDecode(sh, memattr, AccType_PTW); - else - result.addrdesc.memattrs = S2AttrDecode(sh, memattr, acctype); - result.addrdesc.paddress.NS = '1'; - - result.addrdesc.paddress.address = ZeroExtend(outputaddress); - result.addrdesc.fault = AArch32.NoFault(); - result.contiguous = contiguousbit == '1'; - if HaveCommonNotPrivateTransExt() then result.CnP = baseregister[0]; - - return result; - -// AArch32.DefaultTEXDecode() -// ========================== - -MemoryAttributes AArch32.DefaultTEXDecode(bits(3) TEX, bit C, bit B, bit S, AccType acctype) - - MemoryAttributes memattrs; - - // Reserved values map to allocated values - if (TEX == '001' && C:B == '01') || (TEX == '010' && C:B != '00') || TEX == '011' then - bits(5) texcb; - (-, texcb) = ConstrainUnpredictableBits(Unpredictable_RESTEXCB); - TEX = texcb[4:2]; C = texcb[1]; B = texcb[0]; - - case TEX:C:B of - when '00000' - // Device-nGnRnE - memattrs.memtype = MemType_Device; - memattrs.device = DeviceType_nGnRnE; - when '00001', '01000' - // Device-nGnRE - memattrs.memtype = MemType_Device; - memattrs.device = DeviceType_nGnRE; - when '00010', '00011', '00100' - // Write-back or Write-through Read allocate, or Non-cacheable - memattrs.memtype = MemType_Normal; - memattrs.inner = ShortConvertAttrsHints(C:B, acctype, FALSE); - memattrs.outer = ShortConvertAttrsHints(C:B, acctype, FALSE); - memattrs.shareable = (S == '1'); - when '00110' - memattrs = MemoryAttributes IMPLEMENTATION_DEFINED; - when '00111' - // Write-back Read and Write allocate - memattrs.memtype = MemType_Normal; - memattrs.inner = ShortConvertAttrsHints('01', acctype, FALSE); - memattrs.outer = ShortConvertAttrsHints('01', acctype, FALSE); - memattrs.shareable = (S == '1'); - when '1xxxx' - // Cacheable, TEX[1:0] = Outer attrs, {C,B} = Inner attrs - memattrs.memtype = MemType_Normal; - memattrs.inner = ShortConvertAttrsHints(C:B, acctype, FALSE); - memattrs.outer = ShortConvertAttrsHints(TEX[1:0], acctype, FALSE); - memattrs.shareable = (S == '1'); - otherwise - // Reserved, handled above - Unreachable(); - - // transient bits are not supported in this format - memattrs.inner.transient = FALSE; - memattrs.outer.transient = FALSE; - - // distinction between inner and outer shareable is not supported in this format - memattrs.outershareable = memattrs.shareable; - memattrs.tagged = FALSE; - - return MemAttrDefaults(memattrs); - -// AArch32.RemappedTEXDecode() -// =========================== - -MemoryAttributes AArch32.RemappedTEXDecode(bits(3) TEX, bit C, bit B, bit S, AccType acctype) - - MemoryAttributes memattrs; - - region = UInt(TEX[0]:C:B); // TEX[2:1] are ignored in this mapping scheme - if region == 6 then - memattrs = MemoryAttributes IMPLEMENTATION_DEFINED; - else - base = 2 * region; - attrfield = PRRR[base+1:base]; - - if attrfield == '11' then // Reserved, maps to allocated value - (-, attrfield) = ConstrainUnpredictableBits(Unpredictable_RESPRRR); - - case attrfield of - when '00' // Device-nGnRnE - memattrs.memtype = MemType_Device; - memattrs.device = DeviceType_nGnRnE; - when '01' // Device-nGnRE - memattrs.memtype = MemType_Device; - memattrs.device = DeviceType_nGnRE; - when '10' - memattrs.memtype = MemType_Normal; - memattrs.inner = ShortConvertAttrsHints(NMRR[base+1:base], acctype, FALSE); - memattrs.outer = ShortConvertAttrsHints(NMRR[base+17:base+16], acctype, FALSE); - s_bit = if S == '0' then PRRR.NS0 else PRRR.NS1; - memattrs.shareable = (s_bit == '1'); - memattrs.outershareable = (s_bit == '1' && PRRR[region+24] == '0'); - when '11' - Unreachable(); - - // transient bits are not supported in this format - memattrs.inner.transient = FALSE; - memattrs.outer.transient = FALSE; - memattrs.tagged = FALSE; - - return MemAttrDefaults(memattrs); - -boolean RemapRegsHaveResetValues(); - -// AArch32.TranslationTableWalkSD() -// ================================ -// Returns a result of a translation table walk using the Short-descriptor format -// -// Implementations might cache information from memory in any number of non-coherent TLB -// caching structures, and so avoid memory accesses that have been expressed in this -// pseudocode. The use of such TLBs is not expressed in this pseudocode. - -TLBRecord AArch32.TranslationTableWalkSD(bits(32) vaddress, AccType acctype, boolean iswrite, - integer size) - assert ELUsingAArch32(S1TranslationRegime()); - - // This is only called when address translation is enabled - TLBRecord result; - AddressDescriptor l1descaddr; - AddressDescriptor l2descaddr; - bits(40) outputaddress; - - result.descupdate.AF = FALSE; - result.descupdate.AP = FALSE; - - // Variables for Abort functions - ipaddress = bits(40) UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - NS = bit UNKNOWN; - - // Default setting of the domain - domain = bits(4) UNKNOWN; - - // Determine correct Translation Table Base Register to use. - bits(64) ttbr; - n = UInt(TTBCR.N); - if n == 0 || IsZero(vaddress[31:(32-n)]) then - ttbr = TTBR0; - disabled = (TTBCR.PD0 == '1'); - else - ttbr = TTBR1; - disabled = (TTBCR.PD1 == '1'); - n = 0; // TTBR1 translation always works like N=0 TTBR0 translation - - // Check this Translation Table Base Register is not disabled. - if disabled then - level = 1; - result.addrdesc.fault = AArch32.TranslationFault(ipaddress, domain, level, acctype, iswrite, - secondstage, s2fs1walk); - return result; - - // Obtain descriptor from initial lookup. - l1descaddr.paddress.address = ZeroExtend(ttbr[31:14-n]:vaddress[31-n:20]:'00'); - l1descaddr.paddress.NS = if IsSecure() then '0' else '1'; - IRGN = ttbr[0]:ttbr[6]; // TTBR.IRGN - RGN = ttbr[4:3]; // TTBR.RGN - SH = ttbr[1]:ttbr[5]; // TTBR.S:TTBR.NOS - l1descaddr.memattrs = WalkAttrDecode(SH, RGN, IRGN, secondstage); - - if !HaveEL(EL2) || (IsSecure() && !IsSecureEL2Enabled()) then - // if only 1 stage of translation - l1descaddr2 = l1descaddr; - else - l1descaddr2 = AArch32.SecondStageWalk(l1descaddr, vaddress, acctype, iswrite, 4); - // Check for a fault on the stage 2 walk - if IsFault(l1descaddr2) then - result.addrdesc.fault = l1descaddr2.fault; - return result; - - // Update virtual address for abort functions - l1descaddr2.vaddress = ZeroExtend(vaddress); - - accdesc = CreateAccessDescriptorPTW(acctype, secondstage, s2fs1walk, level); - l1desc = _Mem[l1descaddr2, 4,accdesc]; - - if SCTLR.EE == '1' then l1desc = BigEndianReverse(l1desc); - - // Process descriptor from initial lookup. - case l1desc[1:0] of - when '00' // Fault, Reserved - level = 1; - result.addrdesc.fault = AArch32.TranslationFault(ipaddress, domain, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - when '01' // Large page or Small page - domain = l1desc[8:5]; - level = 2; - pxn = l1desc[2]; - NS = l1desc[3]; - - // Obtain descriptor from level 2 lookup. - l2descaddr.paddress.address = ZeroExtend(l1desc[31:10]:vaddress[19:12]:'00'); - l2descaddr.paddress.NS = if IsSecure() then '0' else '1'; - l2descaddr.memattrs = l1descaddr.memattrs; - - if !HaveEL(EL2) || (IsSecure() && !IsSecureEL2Enabled()) then - // if only 1 stage of translation - l2descaddr2 = l2descaddr; - else - l2descaddr2 = AArch32.SecondStageWalk(l2descaddr, vaddress, acctype, iswrite, 4); - // Check for a fault on the stage 2 walk - if IsFault(l2descaddr2) then - result.addrdesc.fault = l2descaddr2.fault; - return result; - - // Update virtual address for abort functions - l2descaddr2.vaddress = ZeroExtend(vaddress); - - accdesc = CreateAccessDescriptorPTW(acctype, secondstage, s2fs1walk, level); - l2desc = _Mem[l2descaddr2, 4, accdesc]; - - if SCTLR.EE == '1' then l2desc = BigEndianReverse(l2desc); - - // Process descriptor from level 2 lookup. - if l2desc[1:0] == '00' then - result.addrdesc.fault = AArch32.TranslationFault(ipaddress, domain, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - nG = l2desc[11]; - S = l2desc[10]; - ap = l2desc[9,5:4]; - - if SCTLR.AFE == '1' && l2desc[4] == '0' then - // Armv8 VMSAv8-32 does not support hardware management of the Access flag. - result.addrdesc.fault = AArch32.AccessFlagFault(ipaddress, domain, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - if l2desc[1] == '0' then // Large page - xn = l2desc[15]; - tex = l2desc[14:12]; - c = l2desc[3]; - b = l2desc[2]; - blocksize = 64; - outputaddress = ZeroExtend(l2desc[31:16]:vaddress[15:0]); - else // Small page - tex = l2desc[8:6]; - c = l2desc[3]; - b = l2desc[2]; - xn = l2desc[0]; - blocksize = 4; - outputaddress = ZeroExtend(l2desc[31:12]:vaddress[11:0]); - - when '1x' // Section or Supersection - NS = l1desc[19]; - nG = l1desc[17]; - S = l1desc[16]; - ap = l1desc[15,11:10]; - tex = l1desc[14:12]; - xn = l1desc[4]; - c = l1desc[3]; - b = l1desc[2]; - pxn = l1desc[0]; - level = 1; - - if SCTLR.AFE == '1' && l1desc[10] == '0' then - // Armv8 VMSAv8-32 does not support hardware management of the Access flag. - result.addrdesc.fault = AArch32.AccessFlagFault(ipaddress, domain, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - if l1desc[18] == '0' then // Section - domain = l1desc[8:5]; - blocksize = 1024; - outputaddress = ZeroExtend(l1desc[31:20]:vaddress[19:0]); - else // Supersection - domain = '0000'; - blocksize = 16384; - outputaddress = l1desc[8:5]:l1desc[23:20]:l1desc[31:24]:vaddress[23:0]; - - // Decode the TEX, C, B and S bits to produce the TLBRecord's memory attributes - if SCTLR.TRE == '0' then - if RemapRegsHaveResetValues() then - result.addrdesc.memattrs = AArch32.DefaultTEXDecode(tex, c, b, S, acctype); - else - result.addrdesc.memattrs = MemoryAttributes IMPLEMENTATION_DEFINED; - else - result.addrdesc.memattrs = AArch32.RemappedTEXDecode(tex, c, b, S, acctype); - - // Set the rest of the TLBRecord, try to add it to the TLB, and return it. - result.perms.ap = ap; - result.perms.xn = xn; - result.perms.pxn = pxn; - result.nG = nG; - result.domain = domain; - result.level = level; - result.blocksize = blocksize; - result.addrdesc.paddress.address = ZeroExtend(outputaddress); - result.addrdesc.paddress.NS = if IsSecure() then NS else '1'; - result.addrdesc.fault = AArch32.NoFault(); - - return result; - -// HaveTrapLoadStoreMultipleDeviceExt() -// ==================================== - -boolean HaveTrapLoadStoreMultipleDeviceExt() - return HasArchVersion(ARMv8p2); - -// AArch32.FirstStageTranslate() -// ============================= -// Perform a stage 1 translation walk. The function used by Address Translation operations is -// similar except it uses the translation regime specified for the instruction. - -AddressDescriptor AArch32.FirstStageTranslate(bits(32) vaddress, AccType acctype, boolean iswrite, - boolean wasaligned, integer size) - - if PSTATE.EL == EL2 then - s1_enabled = HSCTLR.M == '1'; - elsif EL2Enabled() then - tge = (if ELUsingAArch32(EL2) then HCR.TGE else HCR_EL2.TGE); - dc = (if ELUsingAArch32(EL2) then HCR.DC else HCR_EL2.DC); - s1_enabled = tge == '0' && dc == '0' && SCTLR.M == '1'; - else - s1_enabled = SCTLR.M == '1'; - - ipaddress = bits(40) UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - if s1_enabled then // First stage enabled - use_long_descriptor_format = PSTATE.EL == EL2 || TTBCR.EAE == '1'; - if use_long_descriptor_format then - S1 = AArch32.TranslationTableWalkLD(ipaddress, vaddress, acctype, iswrite, secondstage, - s2fs1walk, size); - permissioncheck = TRUE; domaincheck = FALSE; - else - S1 = AArch32.TranslationTableWalkSD(vaddress, acctype, iswrite, size); - permissioncheck = TRUE; domaincheck = TRUE; - else - S1 = AArch32.TranslateAddressS1Off(vaddress, acctype, iswrite); - permissioncheck = FALSE; domaincheck = FALSE; - - if !IsFault(S1.addrdesc) && UsingAArch32() && HaveTrapLoadStoreMultipleDeviceExt() && AArch32.ExecutingLSMInstr() then - if S1.addrdesc.memattrs.memtype == MemType_Device && S1.addrdesc.memattrs.device != DeviceType_GRE then - nTLSMD = if S1TranslationRegime() == EL2 then HSCTLR.nTLSMD else SCTLR.nTLSMD; - if nTLSMD == '0' then - S1.addrdesc.fault = AArch32.AlignmentFault(acctype, iswrite, secondstage); - - // Check for unaligned data accesses to Device memory - if ((!wasaligned && acctype != AccType_IFETCH) || (acctype == AccType_DCZVA)) - && !IsFault(S1.addrdesc) && S1.addrdesc.memattrs.memtype == MemType_Device then - S1.addrdesc.fault = AArch32.AlignmentFault(acctype, iswrite, secondstage); - if !IsFault(S1.addrdesc) && domaincheck then - (permissioncheck, abort) = AArch32.CheckDomain(S1.domain, vaddress, S1.level, acctype, - iswrite); - S1.addrdesc.fault = abort; - - if !IsFault(S1.addrdesc) && permissioncheck then - S1.addrdesc.fault = AArch32.CheckPermission(S1.perms, vaddress, S1.level, - S1.domain, S1.addrdesc.paddress.NS, - acctype, iswrite); - - // Check for instruction fetches from Device memory not marked as execute-never. If there has - // not been a Permission Fault then the memory is not marked execute-never. - if (!IsFault(S1.addrdesc) && S1.addrdesc.memattrs.memtype == MemType_Device && - acctype == AccType_IFETCH) then - S1.addrdesc = AArch32.InstructionDevice(S1.addrdesc, vaddress, ipaddress, S1.level, - S1.domain, acctype, iswrite, - secondstage, s2fs1walk); - - return S1.addrdesc; - -// AArch32.FullTranslate() -// ======================= -// Perform both stage 1 and stage 2 translation walks for the current translation regime. The -// function used by Address Translation operations is similar except it uses the translation -// regime specified for the instruction. - -AddressDescriptor AArch32.FullTranslate(bits(32) vaddress, AccType acctype, boolean iswrite, - boolean wasaligned, integer size) - - // First Stage Translation - S1 = AArch32.FirstStageTranslate(vaddress, acctype, iswrite, wasaligned, size); - if !IsFault(S1) && !(HaveNV2Ext() && acctype == AccType_NV2REGISTER) && HasS2Translation() then - s2fs1walk = FALSE; - result = AArch32.SecondStageTranslate(S1, vaddress, acctype, iswrite, wasaligned, s2fs1walk, - size); - else - result = S1; - - return result; - -// AArch64.BreakpointValueMatch() -// ============================== - -boolean AArch64.BreakpointValueMatch(integer n, bits(64) vaddress, boolean linked_to) - - // "n" is the identity of the breakpoint unit to match against. - // "vaddress" is the current instruction address, ignored if linked_to is TRUE and for Context - // matching breakpoints. - // "linked_to" is TRUE if this is a call from StateMatch for linking. - - // If a non-existent breakpoint then it is CONSTRAINED UNPREDICTABLE whether this gives - // no match or the breakpoint is mapped to another UNKNOWN implemented breakpoint. - if n > UInt(ID_AA64DFR0_EL1.BRPs) then - (c, n) = ConstrainUnpredictableInteger(0, UInt(ID_AA64DFR0_EL1.BRPs), Unpredictable_BPNOTIMPL); - assert c IN {Constraint_DISABLED, Constraint_UNKNOWN}; - if c == Constraint_DISABLED then return FALSE; - - // If this breakpoint is not enabled, it cannot generate a match. (This could also happen on a - // call from StateMatch for linking). - if DBGBCR_EL1[n].E == '0' then return FALSE; - - context_aware = (n >= UInt(ID_AA64DFR0_EL1.BRPs) - UInt(ID_AA64DFR0_EL1.CTX_CMPs)); - - // If BT is set to a reserved type1, behaves either as disabled or as a not-reserved type1. - dbgtype = DBGBCR_EL1[n].BT; - - if ((dbgtype IN {'011x','11xx'} && !HaveVirtHostExt()) || // Context matching - dbgtype == '010x' || // Reserved - (dbgtype != '0x0x' && !context_aware) || // Context matching - (dbgtype == '1xxx' && !HaveEL(EL2))) then // EL2 extension - (c, dbgtype) = ConstrainUnpredictableBits(Unpredictable_RESBPTYPE); - assert c IN {Constraint_DISABLED, Constraint_UNKNOWN}; - if c == Constraint_DISABLED then return FALSE; - // Otherwise the value returned by ConstrainUnpredictableBits must be a not-reserved value - - // Determine what to compare against. - match_addr = (dbgtype == '0x0x'); - match_vmid = (dbgtype == '10xx'); - match_cid = (dbgtype == '001x'); - match_cid1 = (dbgtype IN { '101x', 'x11x'}); - match_cid2 = (dbgtype == '11xx'); - linked = (dbgtype == 'xxx1'); - - // If this is a call from StateMatch, return FALSE if the breakpoint is not programmed for a - // VMID and/or context ID match, of if not context-aware. The above assertions mean that the - // code can just test for match_addr == TRUE to confirm all these things. - if linked_to && (!linked || match_addr) then return FALSE; - - // If called from BreakpointMatch return FALSE for Linked context ID and/or VMID matches. - if !linked_to && linked && !match_addr then return FALSE; - - // Do the comparison. - if match_addr then - byte = UInt(vaddress[1:0]); - if HaveAnyAArch32() then - // T32 instructions can be executed at EL0 in an AArch64 translation regime. - assert byte IN {0,2}; // "vaddress" is halfword aligned - byte_select_match = (DBGBCR_EL1[n].BAS[byte] == '1'); - else - assert byte == 0; // "vaddress" is word aligned - byte_select_match = TRUE; // DBGBCR_EL1[n].BAS[byte] is RES1 - top = AddrTop(vaddress, TRUE, PSTATE.EL); - BVR_match = vaddress[top:2] == DBGBVR_EL1[n][top:2] && byte_select_match; - elsif match_cid then - if IsInHost() then - BVR_match = (CONTEXTIDR_EL2 == DBGBVR_EL1[n][31:0]); - else - BVR_match = (PSTATE.EL IN {EL0, EL1} && CONTEXTIDR_EL1 == DBGBVR_EL1[n][31:0]); - elsif match_cid1 then - BVR_match = (PSTATE.EL IN {EL0, EL1} && !IsInHost() && CONTEXTIDR_EL1 == DBGBVR_EL1[n][31:0]); - if match_vmid then - if !Have16bitVMID() || VTCR_EL2.VS == '0' then - vmid = ZeroExtend(VTTBR_EL2.VMID[7:0], 16); - bvr_vmid = ZeroExtend(DBGBVR_EL1[n][39:32], 16); - else - vmid = VTTBR_EL2.VMID; - bvr_vmid = DBGBVR_EL1[n][47:32]; - BXVR_match = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - !IsInHost() && - vmid == bvr_vmid); - elsif match_cid2 then - BXVR_match = (!IsSecure() && HaveVirtHostExt() && - DBGBVR_EL1[n][63:32] == CONTEXTIDR_EL2); - - bvr_match_valid = (match_addr || match_cid || match_cid1); - bxvr_match_valid = (match_vmid || match_cid2); - - match = (!bxvr_match_valid || BXVR_match) && (!bvr_match_valid || BVR_match); - - return match; - -// AArch64.StateMatch() -// ==================== -// Determine whether a breakpoint or watchpoint is enabled in the current mode and state. - -boolean AArch64.StateMatch(bits(2) SSC, bit HMC, bits(2) PxC, boolean linked, bits(4) LBN, - boolean isbreakpnt, AccType acctype, boolean ispriv) - // "SSC", "HMC", "PxC" are the control fields from the DBGBCR[n] or DBGWCR[n] register. - // "linked" is TRUE if this is a linked breakpoint/watchpoint type1. - // "LBN" is the linked breakpoint number from the DBGBCR[n] or DBGWCR[n] register. - // "isbreakpnt" is TRUE for breakpoints, FALSE for watchpoints. - // "ispriv" is valid for watchpoints, and selects between privileged and unprivileged accesses. - - // If parameters are set to a reserved type1, behaves as either disabled or a defined type1 - (c, SSC, HMC, PxC) = CheckValidStateMatch(SSC, HMC, PxC, isbreakpnt); - if c == Constraint_DISABLED then return FALSE; - // Otherwise the HMC,SSC,PxC values are either valid or the values returned by - // CheckValidStateMatch are valid. - - EL3_match = HaveEL(EL3) && HMC == '1' && SSC[0] == '0'; - EL2_match = HaveEL(EL2) && ((HMC == '1' && (SSC:PxC != '1000')) || SSC == '11'); - EL1_match = PxC[0] == '1'; - EL0_match = PxC[1] == '1'; - - if HaveNV2Ext() && acctype == AccType_NV2REGISTER && !isbreakpnt then - priv_match = EL2_match; - elsif !ispriv && !isbreakpnt then - priv_match = EL0_match; - else - case PSTATE.EL of - when EL3 priv_match = EL3_match; - when EL2 priv_match = EL2_match; - when EL1 priv_match = EL1_match; - when EL0 priv_match = EL0_match; - - case SSC of - when '00' security_state_match = TRUE; // Both - when '01' security_state_match = !IsSecure(); // Non-secure only - when '10' security_state_match = IsSecure(); // Secure only - when '11' security_state_match = (HMC == '1' || IsSecure()); // HMC=1 -> Both, 0 -> Secure only - - if linked then - // "LBN" must be an enabled context-aware breakpoint unit. If it is not context-aware then - // it is CONSTRAINED UNPREDICTABLE whether this gives no match, or LBN is mapped to some - // UNKNOWN breakpoint that is context-aware. - lbn = UInt(LBN); - first_ctx_cmp = (UInt(ID_AA64DFR0_EL1.BRPs) - UInt(ID_AA64DFR0_EL1.CTX_CMPs)); - last_ctx_cmp = UInt(ID_AA64DFR0_EL1.BRPs); - if (lbn < first_ctx_cmp || lbn > last_ctx_cmp) then - (c, lbn) = ConstrainUnpredictableInteger(first_ctx_cmp, last_ctx_cmp, Unpredictable_BPNOTCTXCMP); - assert c IN {Constraint_DISABLED, Constraint_NONE, Constraint_UNKNOWN}; - case c of - when Constraint_DISABLED return FALSE; // Disabled - when Constraint_NONE linked = FALSE; // No linking - // Otherwise ConstrainUnpredictableInteger returned a context-aware breakpoint - - if linked then - vaddress = bits(64) UNKNOWN; - linked_to = TRUE; - linked_match = AArch64.BreakpointValueMatch(lbn, vaddress, linked_to); - - return priv_match && security_state_match && (!linked || linked_match); - -// AArch64.BreakpointMatch() -// ========================= -// Breakpoint matching in an AArch64 translation regime. - -boolean AArch64.BreakpointMatch(integer n, bits(64) vaddress, AccType acctype, integer size) - assert !ELUsingAArch32(S1TranslationRegime()); - assert n <= UInt(ID_AA64DFR0_EL1.BRPs); - - enabled = DBGBCR_EL1[n].E == '1'; - ispriv = PSTATE.EL != EL0; - linked = DBGBCR_EL1[n].BT == '0x01'; - isbreakpnt = TRUE; - linked_to = FALSE; - - state_match = AArch64.StateMatch(DBGBCR_EL1[n].SSC, DBGBCR_EL1[n].HMC, DBGBCR_EL1[n].PMC, - linked, DBGBCR_EL1[n].LBN, isbreakpnt, acctype, ispriv); - value_match = AArch64.BreakpointValueMatch(n, vaddress, linked_to); - - if HaveAnyAArch32() && size == 4 then // Check second halfword - // If the breakpoint address and BAS of an Address breakpoint match the address of the - // second halfword of an instruction, but not the address of the first halfword, it is - // CONSTRAINED UNPREDICTABLE whether or not this breakpoint generates a Breakpoint debug - // event. - match_i = AArch64.BreakpointValueMatch(n, vaddress + 2, linked_to); - if !value_match && match_i then - value_match = ConstrainUnpredictableBool(Unpredictable_BPMATCHHALF); - if vaddress[1] == '1' && DBGBCR_EL1[n].BAS == '1111' then - // The above notwithstanding, if DBGBCR_EL1[n].BAS == '1111', then it is CONSTRAINED - // UNPREDICTABLE whether or not a Breakpoint debug event is generated for an instruction - // at the address DBGBVR_EL1[n]+2. - if value_match then value_match = ConstrainUnpredictableBool(Unpredictable_BPMATCHHALF); - - match = value_match && state_match && enabled; - - return match; - -// AArch64.DebugFault() -// ==================== - -FaultRecord AArch64.DebugFault(AccType acctype, boolean iswrite) - - ipaddress = bits(52) UNKNOWN; - errortype = bits(2) UNKNOWN; - level = integer UNKNOWN; - extflag = bit UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - return AArch64.CreateFaultRecord(Fault_Debug, ipaddress, boolean UNKNOWN, level, acctype, iswrite, - extflag, errortype, secondstage, s2fs1walk); - -// AArch64.CheckBreakpoint() -// ========================= -// Called before executing the instruction of length "size" bytes at "vaddress" in an AArch64 -// translation regime, when either debug exceptions are enabled, or halting debug is enabled -// and halting is allowed. - -FaultRecord AArch64.CheckBreakpoint(bits(64) vaddress, AccType acctype, integer size) - assert !ELUsingAArch32(S1TranslationRegime()); - assert (UsingAArch32() && size IN {2,4}) || size == 4; - - match = FALSE; - - for i = 0 to UInt(ID_AA64DFR0_EL1.BRPs) - match_i = AArch64.BreakpointMatch(i, vaddress, acctype, size); - match = match || match_i; - - if match && HaltOnBreakpointOrWatchpoint() then - reason = DebugHalt_Breakpoint; - Halt(reason); - elsif match then - acctype = AccType_IFETCH; - iswrite = FALSE; - return AArch64.DebugFault(acctype, iswrite); - else - return AArch64.NoFault(); - -// AArch64.AccessIsPrivileged() -// ============================ - -boolean AArch64.AccessIsPrivileged(AccType acctype) - - el = AArch64.AccessUsesEL(acctype); - - if el == EL0 then - ispriv = FALSE; - elsif el == EL3 then - ispriv = TRUE; - elsif el == EL2 && (!IsInHost() || HCR_EL2.TGE == '0') then - ispriv = TRUE; - elsif HaveUAOExt() && PSTATE.UAO == '1' then - ispriv = TRUE; - else - ispriv = (acctype != AccType_UNPRIV); - - return ispriv; - -// AArch64.WatchpointByteMatch() -// ============================= - -boolean AArch64.WatchpointByteMatch(integer n, AccType acctype, bits(64) vaddress) - - el = if HaveNV2Ext() && acctype == AccType_NV2REGISTER then EL2 else PSTATE.EL; - top = AddrTop(vaddress, FALSE, el); - bottom = if DBGWVR_EL1[n][2] == '1' then 2 else 3; // Word or doubleword - byte_select_match = (DBGWCR_EL1[n].BAS[UInt(vaddress[bottom-1:0])] != '0'); - mask = UInt(DBGWCR_EL1[n].MASK); - - // If DBGWCR_EL1[n].MASK is non-zero value and DBGWCR_EL1[n].BAS is not set to '11111111', or - // DBGWCR_EL1[n].BAS specifies a non-contiguous set of bytes behavior is CONSTRAINED - // UNPREDICTABLE. - if mask > 0 && !IsOnes(DBGWCR_EL1[n].BAS) then - byte_select_match = ConstrainUnpredictableBool(Unpredictable_WPMASKANDBAS); - else - LSB = (DBGWCR_EL1[n].BAS AND NOT(DBGWCR_EL1[n].BAS - 1)); MSB = (DBGWCR_EL1[n].BAS + LSB); - if !IsZero(MSB AND (MSB - 1)) then // Not contiguous - byte_select_match = ConstrainUnpredictableBool(Unpredictable_WPBASCONTIGUOUS); - bottom = 3; // For the whole doubleword - - // If the address mask is set to a reserved value, the behavior is CONSTRAINED UNPREDICTABLE. - if mask > 0 && mask <= 2 then - (c, mask) = ConstrainUnpredictableInteger(3, 31, Unpredictable_RESWPMASK); - assert c IN {Constraint_DISABLED, Constraint_NONE, Constraint_UNKNOWN}; - case c of - when Constraint_DISABLED return FALSE; // Disabled - when Constraint_NONE mask = 0; // No masking - // Otherwise the value returned by ConstrainUnpredictableInteger is a not-reserved value - - if mask > bottom then - WVR_match = (vaddress[top:mask] == DBGWVR_EL1[n][top:mask]); - // If masked bits of DBGWVR_EL1[n] are not zero, the behavior is CONSTRAINED UNPREDICTABLE. - if WVR_match && !IsZero(DBGWVR_EL1[n][mask-1:bottom]) then - WVR_match = ConstrainUnpredictableBool(Unpredictable_WPMASKEDBITS); - else - WVR_match = vaddress[top:bottom] == DBGWVR_EL1[n][top:bottom]; - - return WVR_match && byte_select_match; - -// AArch64.WatchpointMatch() -// ========================= -// Watchpoint matching in an AArch64 translation regime. - -boolean AArch64.WatchpointMatch(integer n, bits(64) vaddress, integer size, boolean ispriv, - AccType acctype, boolean iswrite) - assert !ELUsingAArch32(S1TranslationRegime()); - assert n <= UInt(ID_AA64DFR0_EL1.WRPs); - - // "ispriv" is FALSE for LDTR/STTR instructions executed at EL1 and all - // load/stores at EL0, TRUE for all other load/stores. "iswrite" is TRUE for stores, FALSE for - // loads. - enabled = DBGWCR_EL1[n].E == '1'; - linked = DBGWCR_EL1[n].WT == '1'; - isbreakpnt = FALSE; - - state_match = AArch64.StateMatch(DBGWCR_EL1[n].SSC, DBGWCR_EL1[n].HMC, DBGWCR_EL1[n].PAC, - linked, DBGWCR_EL1[n].LBN, isbreakpnt, acctype, ispriv); - - ls_match = (DBGWCR_EL1[n].LSC[(if iswrite then 1 else 0)] == '1'); - - value_match = FALSE; - for byte = 0 to size - 1 - value_match = value_match || AArch64.WatchpointByteMatch(n, acctype, vaddress + byte); - - return value_match && state_match && ls_match && enabled; - -// AArch64.CheckWatchpoint() -// ========================= -// Called before accessing the memory location of "size" bytes at "address", -// when either debug exceptions are enabled for the access, or halting debug -// is enabled and halting is allowed. - -FaultRecord AArch64.CheckWatchpoint(bits(64) vaddress, AccType acctype, - boolean iswrite, integer size) - assert !ELUsingAArch32(S1TranslationRegime()); - - match = FALSE; - ispriv = AArch64.AccessIsPrivileged(acctype); - - for i = 0 to UInt(ID_AA64DFR0_EL1.WRPs) - match = match || AArch64.WatchpointMatch(i, vaddress, size, ispriv, acctype, iswrite); - - if match && HaltOnBreakpointOrWatchpoint() then - if acctype != AccType_NONFAULT && acctype != AccType_CNOTFIRST then - reason = DebugHalt_Watchpoint; - Halt(reason); - else - // Fault will be reported and cancelled - return AArch64.DebugFault(acctype, iswrite); - elsif match then - return AArch64.DebugFault(acctype, iswrite); - else - return AArch64.NoFault(); - -// AArch64.GenerateDebugExceptions() -// ================================= - -boolean AArch64.GenerateDebugExceptions() - return AArch64.GenerateDebugExceptionsFrom(PSTATE.EL, IsSecure(), PSTATE.D); - -// AArch64.CheckDebug() -// ==================== -// Called on each access to check for a debug exception or entry to Debug state. - -FaultRecord AArch64.CheckDebug(bits(64) vaddress, AccType acctype, boolean iswrite, integer size) - - FaultRecord fault = AArch64.NoFault(); - - d_side = (acctype != AccType_IFETCH); - if HaveNV2Ext() && acctype == AccType_NV2REGISTER then - mask = '0'; - generate_exception = AArch64.GenerateDebugExceptionsFrom(EL2, IsSecure(), mask) && MDSCR_EL1.MDE == '1'; - else - generate_exception = AArch64.GenerateDebugExceptions() && MDSCR_EL1.MDE == '1'; - halt = HaltOnBreakpointOrWatchpoint(); - - if generate_exception || halt then - if d_side then - fault = AArch64.CheckWatchpoint(vaddress, acctype, iswrite, size); - else - fault = AArch64.CheckBreakpoint(vaddress, acctype, size); - - return fault; - -// AArch64.ExecutingATS1xPInstr() -// ============================== -// Return TRUE if current instruction is AT S1E1R/WP - -boolean AArch64.ExecutingATS1xPInstr() - if !HavePrivATExt() then return FALSE; - - instr = ThisInstr(); - if instr[22+:10] == '1101010100' then - op1 = instr[16+:3]; - CRn = instr[12+:4]; - CRm = instr[8+:4]; - op2 = instr[5+:3]; - return op1 == '000' && CRn == '0111' && CRm == '1001' && op2 IN {'000','001'}; - else - return FALSE; - -// AArch64.CheckPermission() -// ========================= -// Function used for permission checking from AArch64 stage 1 translations - -FaultRecord AArch64.CheckPermission(Permissions perms, bits(64) vaddress, integer level, - bit NS, AccType acctype, boolean iswrite) - assert !ELUsingAArch32(S1TranslationRegime()); - - wxn = SCTLR[].WXN == '1'; - - if (PSTATE.EL == EL0 || - IsInHost() || - (PSTATE.EL == EL1 && !HaveNV2Ext()) || - (PSTATE.EL == EL1 && HaveNV2Ext() && (acctype != AccType_NV2REGISTER || !ELIsInHost(EL2)))) then - priv_r = TRUE; - priv_w = perms.ap[2] == '0'; - user_r = perms.ap[1] == '1'; - user_w = perms.ap[2:1] == '01'; - - ispriv = AArch64.AccessIsPrivileged(acctype); - - pan = if HavePANExt() then PSTATE.PAN else '0'; - if (EL2Enabled() && ((PSTATE.EL == EL1 && HaveNVExt() && HCR_EL2.[NV, NV1] == '11') || - (HaveNV2Ext() && acctype == AccType_NV2REGISTER && HCR_EL2.NV2 == '1'))) then - pan = '0'; - is_ldst = !(acctype IN {AccType_DC, AccType_DC_UNPRIV, AccType_AT, AccType_IFETCH}); - is_ats1xp = (acctype == AccType_AT && AArch64.ExecutingATS1xPInstr()); - if pan == '1' && user_r && ispriv && (is_ldst || is_ats1xp) then - priv_r = FALSE; - priv_w = FALSE; - - user_xn = perms.xn == '1' || (user_w && wxn); - priv_xn = perms.pxn == '1' || (priv_w && wxn) || user_w; - - if ispriv then - (r, w, xn) = (priv_r, priv_w, priv_xn); - else - (r, w, xn) = (user_r, user_w, user_xn); - else - // Access from EL2 or EL3 - r = TRUE; - w = perms.ap[2] == '0'; - xn = perms.xn == '1' || (w && wxn); - - // Restriction on Secure instruction fetch - if HaveEL(EL3) && IsSecure() && NS == '1' && SCR_EL3.SIF == '1' then - xn = TRUE; - - if acctype == AccType_IFETCH then - fail = xn; - failedread = TRUE; - elsif acctype IN { AccType_ATOMICRW, AccType_ORDEREDRW, AccType_ORDEREDATOMICRW } then - fail = !r || !w; - failedread = !r; - elsif iswrite then - fail = !w; - failedread = FALSE; - elsif acctype == AccType_DC && PSTATE.EL != EL0 then - // DC maintenance instructions operating by VA, cannot fault from stage 1 translation, - // other than DC IVAC, which requires write permission, and operations executed at EL0, - // which require read permission. - fail = FALSE; - else - fail = !r; - failedread = TRUE; - - if fail then - secondstage = FALSE; - s2fs1walk = FALSE; - ipaddress = bits(52) UNKNOWN; - return AArch64.PermissionFault(ipaddress,boolean UNKNOWN, level, acctype, - !failedread, secondstage, s2fs1walk); - else - return AArch64.NoFault(); - -// AArch64.TranslateAddressS1Off() -// =============================== -// Called for stage 1 translations when translation is disabled to supply a default translation. -// Note that there are additional constraints on instruction prefetching that are not described in -// this pseudocode. - -TLBRecord AArch64.TranslateAddressS1Off(bits(64) vaddress, AccType acctype, boolean iswrite) - assert !ELUsingAArch32(S1TranslationRegime()); - - TLBRecord result; - result.descupdate.AF = FALSE; - result.descupdate.AP = FALSE; - - Top = AddrTop(vaddress, (acctype == AccType_IFETCH), PSTATE.EL); - if !IsZero(vaddress[Top:PAMax()]) then - level = 0; - ipaddress = bits(52) UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - result.addrdesc.fault = AArch64.AddressSizeFault(ipaddress,boolean UNKNOWN, level, acctype, - iswrite, secondstage, s2fs1walk); - return result; - - default_cacheable = (HasS2Translation() && HCR_EL2.DC == '1'); - - if default_cacheable then - // Use default cacheable settings - result.addrdesc.memattrs.memtype = MemType_Normal; - result.addrdesc.memattrs.inner.attrs = MemAttr_WB; // Write-back - result.addrdesc.memattrs.inner.hints = MemHint_RWA; - result.addrdesc.memattrs.shareable = FALSE; - result.addrdesc.memattrs.outershareable = FALSE; - result.addrdesc.memattrs.tagged = HCR_EL2.DCT == '1'; - elsif acctype != AccType_IFETCH then - // Treat data as Device - result.addrdesc.memattrs.memtype = MemType_Device; - result.addrdesc.memattrs.device = DeviceType_nGnRnE; - result.addrdesc.memattrs.inner = MemAttrHints UNKNOWN; - result.addrdesc.memattrs.tagged = FALSE; - else - // Instruction cacheability controlled by SCTLR_ELx.I - cacheable = SCTLR[].I == '1'; - result.addrdesc.memattrs.memtype = MemType_Normal; - if cacheable then - result.addrdesc.memattrs.inner.attrs = MemAttr_WT; - result.addrdesc.memattrs.inner.hints = MemHint_RA; - else - result.addrdesc.memattrs.inner.attrs = MemAttr_NC; - result.addrdesc.memattrs.inner.hints = MemHint_No; - result.addrdesc.memattrs.shareable = TRUE; - result.addrdesc.memattrs.outershareable = TRUE; - result.addrdesc.memattrs.tagged = FALSE; - - result.addrdesc.memattrs.outer = result.addrdesc.memattrs.inner; - - result.addrdesc.memattrs = MemAttrDefaults(result.addrdesc.memattrs); - - result.perms.ap = bits(3) UNKNOWN; - result.perms.xn = '0'; - result.perms.pxn = '0'; - - result.nG = bit UNKNOWN; - result.contiguous = boolean UNKNOWN; - result.domain = bits(4) UNKNOWN; - result.level = integer UNKNOWN; - result.blocksize = integer UNKNOWN; - result.addrdesc.paddress.address = vaddress[51:0]; - result.addrdesc.paddress.NS = if IsSecure() then '0' else '1'; - result.addrdesc.fault = AArch64.NoFault(); - return result; - -boolean InGuardedPage; - -// AArch64.FirstStageTranslate() -// ============================= -// Perform a stage 1 translation walk. The function used by Address Translation operations is -// similar except it uses the translation regime specified for the instruction. - -AddressDescriptor AArch64.FirstStageTranslate(bits(64) vaddress, AccType acctype, boolean iswrite, - boolean wasaligned, integer size) - - if HaveNV2Ext() && acctype == AccType_NV2REGISTER then - s1_enabled = SCTLR_EL2.M == '1'; - elsif HasS2Translation() then - s1_enabled = HCR_EL2.TGE == '0' && HCR_EL2.DC == '0' && SCTLR_EL1.M == '1'; - else - s1_enabled = SCTLR[].M == '1'; - - ipaddress = bits(52) UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - if s1_enabled then // First stage enabled - S1 = AArch64.TranslationTableWalk(ipaddress, TRUE, vaddress, acctype, iswrite, secondstage, - s2fs1walk, size); - permissioncheck = TRUE; - if acctype == AccType_IFETCH then - InGuardedPage = S1.GP == '1'; // Global state updated on instruction fetch that denotes - // if the fetched instruction is from a guarded page. - else - S1 = AArch64.TranslateAddressS1Off(vaddress, acctype, iswrite); - permissioncheck = FALSE; - - if !IsFault(S1.addrdesc) && UsingAArch32() && HaveTrapLoadStoreMultipleDeviceExt() && AArch32.ExecutingLSMInstr() then - if S1.addrdesc.memattrs.memtype == MemType_Device && S1.addrdesc.memattrs.device != DeviceType_GRE then - nTLSMD = if S1TranslationRegime() == EL2 then SCTLR_EL2.nTLSMD else SCTLR_EL1.nTLSMD; - if nTLSMD == '0' then - S1.addrdesc.fault = AArch64.AlignmentFault(acctype, iswrite, secondstage); - - // Check for unaligned data accesses to Device memory - if ((!wasaligned && acctype != AccType_IFETCH) || (acctype == AccType_DCZVA)) - && !IsFault(S1.addrdesc) && S1.addrdesc.memattrs.memtype == MemType_Device then - S1.addrdesc.fault = AArch64.AlignmentFault(acctype, iswrite, secondstage); - if !IsFault(S1.addrdesc) && permissioncheck then - S1.addrdesc.fault = AArch64.CheckPermission(S1.perms, vaddress, S1.level, - S1.addrdesc.paddress.NS, - acctype, iswrite); - - // Check for instruction fetches from Device memory not marked as execute-never. If there has - // not been a Permission Fault then the memory is not marked execute-never. - if (!IsFault(S1.addrdesc) && S1.addrdesc.memattrs.memtype == MemType_Device && - acctype == AccType_IFETCH) then - S1.addrdesc = AArch64.InstructionDevice(S1.addrdesc, vaddress, ipaddress, S1.level, - acctype, iswrite, - secondstage, s2fs1walk); - // Check and update translation table descriptor if required - hwupdatewalk = FALSE; - s2fs1walk = FALSE; - S1.addrdesc.fault = AArch64.CheckAndUpdateDescriptor(S1.descupdate, S1.addrdesc.fault, - secondstage, vaddress, acctype, - iswrite, s2fs1walk, hwupdatewalk); - - return S1.addrdesc; - -// AArch64.FullTranslate() -// ======================= -// Perform both stage 1 and stage 2 translation walks for the current translation regime. The -// function used by Address Translation operations is similar except it uses the translation -// regime specified for the instruction. - -AddressDescriptor AArch64.FullTranslate(bits(64) vaddress, AccType acctype, boolean iswrite, - boolean wasaligned, integer size) - - // First Stage Translation - S1 = AArch64.FirstStageTranslate(vaddress, acctype, iswrite, wasaligned, size); - if !IsFault(S1) && !(HaveNV2Ext() && acctype == AccType_NV2REGISTER) && HasS2Translation() then - s2fs1walk = FALSE; - hwupdatewalk = FALSE; - result = AArch64.SecondStageTranslate(S1, vaddress, acctype, iswrite, wasaligned, s2fs1walk, - size, hwupdatewalk); - else - result = S1; - - return result; - -// AArch64.TranslateAddress() -// ========================== -// Main entry point for translating an address - -AddressDescriptor AArch64.TranslateAddress(bits(64) vaddress, AccType acctype, boolean iswrite, - boolean wasaligned, integer size) - - result = AArch64.FullTranslate(vaddress, acctype, iswrite, wasaligned, size); - - if !(acctype IN {AccType_PTW, AccType_IC, AccType_AT}) && !IsFault(result) then - result.fault = AArch64.CheckDebug(vaddress, acctype, iswrite, size); - - // Update virtual address for abort functions - result.vaddress = ZeroExtend(vaddress); - - return result; - -// AArch32.TranslateAddress() -// ========================== -// Main entry point for translating an address - -AddressDescriptor AArch32.TranslateAddress(bits(32) vaddress, AccType acctype, boolean iswrite, - boolean wasaligned, integer size) - - if !ELUsingAArch32(S1TranslationRegime()) then - return AArch64.TranslateAddress(ZeroExtend(vaddress, 64), acctype, iswrite, wasaligned, - size); - result = AArch32.FullTranslate(vaddress, acctype, iswrite, wasaligned, size); - - if !(acctype IN {AccType_PTW, AccType_IC, AccType_AT}) && !IsFault(result) then - result.fault = AArch32.CheckDebug(vaddress, acctype, iswrite, size); - - // Update virtual address for abort functions - result.vaddress = ZeroExtend(vaddress); - - return result; - -// AArch64.AllocationTagAccessIsEnabled() -// ====================================== -// Check whether access to Allocation Tags is enabled. - -boolean AArch64.AllocationTagAccessIsEnabled() - if SCR_EL3.ATA == '0' && PSTATE.EL IN {EL0, EL1, EL2} then - return FALSE; - elsif HCR_EL2.ATA == '0' && PSTATE.EL IN {EL0, EL1} && EL2Enabled() && HCR_EL2.[E2H,TGE] != '11' then - return FALSE; - elsif SCTLR_EL3.ATA == '0' && PSTATE.EL == EL3 then - return FALSE; - elsif SCTLR_EL2.ATA == '0' && PSTATE.EL == EL2 then - return FALSE; - elsif SCTLR_EL1.ATA == '0' && PSTATE.EL == EL1 then - return FALSE; - elsif SCTLR_EL2.ATA0 == '0' && PSTATE.EL == EL0 && EL2Enabled() && HCR_EL2.[E2H,TGE] == '11' then - return FALSE; - elsif SCTLR_EL1.ATA0 == '0' && PSTATE.EL == EL0 && !(EL2Enabled() && HCR_EL2.[E2H,TGE] == '11') then - return FALSE; - else - return TRUE; - -// EffectiveTBI() -// ============== -// Returns the effective TBI in the AArch64 stage 1 translation regime for "el". - -bit EffectiveTBI(bits(64) address, boolean IsInstr, bits(2) el) - assert HaveEL(el); - regime = S1TranslationRegime(el); - assert(!ELUsingAArch32(regime)); - - case regime of - when EL1 - tbi = if address[55] == '1' then TCR_EL1.TBI1 else TCR_EL1.TBI0; - if HavePACExt() then - tbid = if address[55] == '1' then TCR_EL1.TBID1 else TCR_EL1.TBID0; - when EL2 - if HaveVirtHostExt() && ELIsInHost(el) then - tbi = if address[55] == '1' then TCR_EL2.TBI1 else TCR_EL2.TBI0; - if HavePACExt() then - tbid = if address[55] == '1' then TCR_EL2.TBID1 else TCR_EL2.TBID0; - else - tbi = TCR_EL2.TBI; - if HavePACExt() then tbid = TCR_EL2.TBID; - when EL3 - tbi = TCR_EL3.TBI; - if HavePACExt() then tbid = TCR_EL3.TBID; - - return (if tbi == '1' && (!HavePACExt() || tbid == '0' || !IsInstr) then '1' else '0'); - -// EffectiveTCMA() -// =============== -// Returns the effective TCMA of a virtual address in the stage 1 translation regime for "el". - -bit EffectiveTCMA(bits(64) address, bits(2) el) - assert HaveEL(el); - regime = S1TranslationRegime(el); - assert(!ELUsingAArch32(regime)); - - case regime of - when EL1 - tcma = if address[55] == '1' then TCR_EL1.TCMA1 else TCR_EL1.TCMA0; - when EL2 - if HaveVirtHostExt() && ELIsInHost(el) then - tcma = if address[55] == '1' then TCR_EL2.TCMA1 else TCR_EL2.TCMA0; - else - tcma = TCR_EL2.TCMA; - when EL3 - tcma = TCR_EL3.TCMA; - - return tcma; - -// Returns True if the current instruction uses tag-checked memory access, -// False otherwise. -boolean IsTagCheckedInstruction(); - -// AArch64.AccessIsTagChecked() -// ============================ -// TRUE if a given access is tag-checked, FALSE otherwise. - -boolean AArch64.AccessIsTagChecked(bits(64) vaddr, AccType acctype) - if PSTATE.M[4] == '1' then return FALSE; - - if EffectiveTBI(vaddr, FALSE, PSTATE.EL) == '0' then - return FALSE; - - if EffectiveTCMA(vaddr, PSTATE.EL) == '1' && (vaddr[59:55] == '00000' || vaddr[59:55] == '11111') then - return FALSE; - - if !AArch64.AllocationTagAccessIsEnabled() then - return FALSE; - - if acctype IN {AccType_IFETCH, AccType_PTW} then - return FALSE; - - if acctype == AccType_NV2REGISTER then - return FALSE; - - if PSTATE.TCO=='1' then - return FALSE; - - if !IsTagCheckedInstruction() then - return FALSE; - - return TRUE; - -// This _MemTag[] accessor is the hardware operation which perform a single-copy atomic, -// Allocation Tag granule aligned, memory access from the tag in PA space. -// -// The function address the array using desc.paddress which supplies: -// * A 52-bit physical address -// * A single NS bit to select between Secure and Non-secure parts of the array. -// -// The accdesc descriptor describes the access type1: normal, exclusive, ordered, streaming, -// etc and other parameters required to access the physical memory or for setting syndrome -// register in the event of an external abort. -bits(4) _MemTag[AddressDescriptor desc, AccessDescriptor accdesc]; - -// This _MemTag[] accessor is the hardware operation which perform a single-copy atomic, -// Allocation Tag granule aligned, memory access to the tag in PA space. -// -// The functions address the array using desc.paddress which supplies: -// * A 52-bit physical address -// * A single NS bit to select between Secure and Non-secure parts of the array. -// -// The accdesc descriptor describes the access type1: normal, exclusive, ordered, streaming, -// etc and other parameters required to access the physical memory or for setting syndrome -// register in the event of an external abort. -_MemTag[AddressDescriptor desc, AccessDescriptor accdesc] = bits(4) value; - -// Workaround for type error in published spec. -// (Note that this will not work if MTE is enabled.) -bits(4) _MemTag[AddressDescriptor desc]; -_MemTag[AddressDescriptor desc] = bits(4) value; - -// AArch64.CheckTag() -// ================== -// Performs a Tag Check operation for a memory access and returns -// whether the check passed - -boolean AArch64.CheckTag(AddressDescriptor memaddrdesc, bits(4) ptag, boolean write) - if memaddrdesc.memattrs.tagged then - return ptag == _MemTag[memaddrdesc]; - else - return TRUE; - -// AArch64.PhysicalTag() -// ===================== -// Generate a Physical Tag from a Logical Tag in an address - -bits(4) AArch64.PhysicalTag(bits(64) vaddr) - return vaddr[59:56]; - -// AArch64.EffectiveTCF() -// ====================== -// Returns the TCF field applied to Tag Check Fails in the given Exception Level. - -bits(2) AArch64.EffectiveTCF(bits(2) el) - bits(2) tcf; - - if el == EL3 then - tcf = SCTLR_EL3.TCF; - elsif el == EL2 then - tcf = SCTLR_EL2.TCF; - elsif el == EL1 then - tcf = SCTLR_EL1.TCF; - elsif el == EL0 && HCR_EL2.[E2H,TGE] == '11' then - tcf = SCTLR_EL2.TCF0; - elsif el == EL0 && HCR_EL2.[E2H,TGE] != '11' then - tcf = SCTLR_EL1.TCF0; - - if tcf == '11' then - (-,tcf) = ConstrainUnpredictableBits(Unpredictable_RESTCF); - - return tcf; - -// AArch64.ReportTagCheckFail() -// ============================ -// Records a tag fail exception into the appropriate TCFR_ELx. - -AArch64.ReportTagCheckFail(bits(2) el, bit ttbr) - if el == EL3 then - assert ttbr == '0'; - TFSR_EL3.TF0 = '1'; - elsif el == EL2 then - if ttbr == '0' then - TFSR_EL2.TF0 = '1'; - else - TFSR_EL2.TF1 = '1'; - elsif el == EL1 then - if ttbr == '0' then - TFSR_EL1.TF0 = '1'; - else - TFSR_EL1.TF1 = '1'; - elsif el == EL0 then - if ttbr == '0' then - TFSRE0_EL1.TF0 = '1'; - else - TFSRE0_EL1.TF1 = '1'; - -// AArch64.TagCheckFault() -// ======================= -// Raise a tag check fail exception. - -AArch64.TagCheckFault(bits(64) va, boolean write) - bits(2) target_el; - bits(64) preferred_exception_return = ThisInstrAddr(); - integer vect_offset = 0x0; - - if PSTATE.EL == EL0 then - target_el = if HCR_EL2.TGE == '0' then EL1 else EL2; - else - target_el = PSTATE.EL; - - exception = ExceptionSyndrome(Exception_DataAbort); - exception.syndrome[5:0] = '010001'; - if write then - exception.syndrome[6] = '1'; - exception.vaddress = bits(4) UNKNOWN : va[59:0]; - - AArch64.TakeException(target_el, exception, preferred_exception_return, vect_offset); - -// AArch64.TagCheckFail() -// ====================== -// Handle a tag check fail condition. - -AArch64.TagCheckFail(bits(64) vaddress, boolean iswrite) - bits(2) tcf = AArch64.EffectiveTCF(PSTATE.EL); - if tcf == '01' then - AArch64.TagCheckFault(vaddress, iswrite); - elsif tcf == '10' then - AArch64.ReportTagCheckFail(PSTATE.EL, vaddress[55]); - -// Align() -// ======= - -integer Align(integer x, integer y) - return y * (x DIV y); - -// Align() -// ======= - -bits(N) Align(bits(N) x, integer y) - return Align(UInt(x), y)[N-1:0]; - -// Clear the global Exclusives monitors for all PEs EXCEPT processorid if they -// record any part of the physical address region of size bytes starting at paddress. -// It is IMPLEMENTATION DEFINED whether the global Exclusives monitor for processorid -// is also cleared if it records any part of the address region. -ClearExclusiveByAddress(FullAddress paddress, integer processorid, integer size); - -// Return the ID of the currently executing PE. -integer ProcessorID(); - -// AArch32.MemSingle[] - non-assignment (read) form -// ================================================ -// Perform an atomic, little-endian read of 'size' bytes. - -bits(size*8) AArch32.MemSingle[bits(32) address, integer size, AccType acctype, boolean wasaligned] - assert size IN {1, 2, 4, 8, 16}; - assert address == Align(address, size); - - AddressDescriptor memaddrdesc; - bits(size*8) value; - iswrite = FALSE; - - memaddrdesc = AArch32.TranslateAddress(address, acctype, iswrite, wasaligned, size); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch32.Abort(address, memaddrdesc.fault); - - // Memory array access - accdesc = CreateAccessDescriptor(acctype); - if HaveMTEExt() then - if AArch64.AccessIsTagChecked(ZeroExtend(address, 64), acctype) then - bits(4) ptag = AArch64.PhysicalTag(ZeroExtend(address, 64)); - if !AArch64.CheckTag(memaddrdesc, ptag, iswrite) then - AArch64.TagCheckFail(ZeroExtend(address, 64), iswrite); - value = _Mem[memaddrdesc, size, accdesc]; - return value; - -// AArch32.MemSingle[] - assignment (write) form -// ============================================= -// Perform an atomic, little-endian write of 'size' bytes. - -AArch32.MemSingle[bits(32) address, integer size, AccType acctype, boolean wasaligned] = bits(size*8) value - assert size IN {1, 2, 4, 8, 16}; - assert address == Align(address, size); - - AddressDescriptor memaddrdesc; - iswrite = TRUE; - - memaddrdesc = AArch32.TranslateAddress(address, acctype, iswrite, wasaligned, size); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch32.Abort(address, memaddrdesc.fault); - - // Effect on exclusives - if memaddrdesc.memattrs.shareable then - ClearExclusiveByAddress(memaddrdesc.paddress, ProcessorID(), size); - - // Memory array access - accdesc = CreateAccessDescriptor(acctype); - if HaveMTEExt() then - if AArch64.AccessIsTagChecked(ZeroExtend(address, 64), acctype) then - bits(4) ptag = AArch64.PhysicalTag(ZeroExtend(address, 64)); - if !AArch64.CheckTag(memaddrdesc, ptag, iswrite) then - AArch64.TagCheckFail(ZeroExtend(address, 64), iswrite); - _Mem[memaddrdesc, size, accdesc] = value; - return; - -// AArch32.CheckITEnabled() -// ======================== -// Check whether the T32 IT instruction is disabled. - -AArch32.CheckITEnabled(bits(4) mask) - if PSTATE.EL == EL2 then - it_disabled = HSCTLR.ITD; - else - it_disabled = (if ELUsingAArch32(EL1) then SCTLR.ITD else SCTLR[].ITD); - if it_disabled == '1' then - if mask != '1000' then UNDEFINED; - - // Otherwise whether the IT block is allowed depends on hw1 of the next instruction. - next_instr = AArch32.MemSingle[NextInstrAddr(), 2, AccType_IFETCH, TRUE]; - - if next_instr IN {'11xxxxxxxxxxxxxx', '1011xxxxxxxxxxxx', '10100xxxxxxxxxxx', - '01001xxxxxxxxxxx', '010001xxx1111xxx', '010001xx1xxxx111'} then - // It is IMPLEMENTATION DEFINED whether the Undefined Instruction exception is - // taken on the IT instruction or the next instruction. This is not reflected in - // the pseudocode, which always takes the exception on the IT instruction. This - // also does not take into account cases where the next instruction is UNPREDICTABLE. - UNDEFINED; - - return; - -// AArch64.CheckIllegalState() -// =========================== -// Check PSTATE.IL bit and generate Illegal Execution state exception if set. - -AArch64.CheckIllegalState() - if PSTATE.IL == '1' then - route_to_el2 = PSTATE.EL == EL0 && EL2Enabled() && HCR_EL2.TGE == '1'; - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_IllegalState); - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.CheckIllegalState() -// =========================== -// Check PSTATE.IL bit and generate Illegal Execution state exception if set. - -AArch32.CheckIllegalState() - if AArch32.GeneralExceptionsToAArch64() then - AArch64.CheckIllegalState(); - elsif PSTATE.IL == '1' then - route_to_hyp = PSTATE.EL == EL0 && EL2Enabled() && HCR.TGE == '1'; - - bits(32) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x04; - - if PSTATE.EL == EL2 || route_to_hyp then - exception = ExceptionSyndrome(Exception_IllegalState); - if PSTATE.EL == EL2 then - AArch32.EnterHypMode(exception, preferred_exception_return, vect_offset); - else - AArch32.EnterHypMode(exception, preferred_exception_return, 0x14); - else - AArch32.TakeUndefInstrException(); - -// AArch32.CheckSETENDEnabled() -// ============================ -// Check whether the AArch32 SETEND instruction is disabled. - -AArch32.CheckSETENDEnabled() - if PSTATE.EL == EL2 then - setend_disabled = HSCTLR.SED; - else - setend_disabled = (if ELUsingAArch32(EL1) then SCTLR.SED else SCTLR[].SED); - if setend_disabled == '1' then - UNDEFINED; - - return; - -// AArch64.UndefinedFault() -// ======================== - -AArch64.UndefinedFault() - - route_to_el2 = PSTATE.EL == EL0 && EL2Enabled() && HCR_EL2.TGE == '1'; - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_Uncategorized); - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// AArch32.UndefinedFault() -// ======================== - -AArch32.UndefinedFault() - - if AArch32.GeneralExceptionsToAArch64() then AArch64.UndefinedFault(); - AArch32.TakeUndefInstrException(); - -enumeration SRType {SRType_LSL, SRType_LSR, SRType_ASR, SRType_ROR, SRType_RRX}; - -// ASR_C() -// ======= - -(bits(N), bit) ASR_C(bits(N) x, integer shift) - assert shift > 0; - extended_x = SignExtend(x, shift+N); - result = extended_x[shift+N-1:shift]; - carry_out = extended_x[shift-1]; - return (result, carry_out); - -// LSR_C() -// ======= - -(bits(N), bit) LSR_C(bits(N) x, integer shift) - assert shift > 0; - extended_x = ZeroExtend(x, shift+N); - result = extended_x[shift+N-1:shift]; - carry_out = extended_x[shift-1]; - return (result, carry_out); - -// LSR() -// ===== - -bits(N) LSR(bits(N) x, integer shift) - assert shift >= 0; - if shift == 0 then - result = x; - else - (result, -) = LSR_C(x, shift); - return result; - -// ROR_C() -// ======= - -(bits(N), bit) ROR_C(bits(N) x, integer shift) - assert shift != 0; - m = shift MOD N; - result = LSR(x,m) OR LSL(x,N-m); - carry_out = result[N-1]; - return (result, carry_out); - -// RRX_C() -// ======= - -(bits(N), bit) RRX_C(bits(N) x, bit carry_in) - result = carry_in : x[N-1:1]; - carry_out = x[0]; - return (result, carry_out); - -// Shift_C() -// ========= - -(bits(N), bit) Shift_C(bits(N) value, SRType srtype, integer amount, bit carry_in) - assert !(srtype == SRType_RRX && amount != 1); - - if amount == 0 then - (result, carry_out) = (value, carry_in); - else - case srtype of - when SRType_LSL - (result, carry_out) = LSL_C(value, amount); - when SRType_LSR - (result, carry_out) = LSR_C(value, amount); - when SRType_ASR - (result, carry_out) = ASR_C(value, amount); - when SRType_ROR - (result, carry_out) = ROR_C(value, amount); - when SRType_RRX - (result, carry_out) = RRX_C(value, carry_in); - - return (result, carry_out); - -// A32ExpandImm_C() -// ================ - -(bits(32), bit) A32ExpandImm_C(bits(12) imm12, bit carry_in) - - unrotated_value = ZeroExtend(imm12[7:0], 32); - (imm32, carry_out) = Shift_C(unrotated_value, SRType_ROR, 2*UInt(imm12[11:8]), carry_in); - - return (imm32, carry_out); - -// A32ExpandImm() -// ============== - -bits(32) A32ExpandImm(bits(12) imm12) - - // PSTATE.C argument to following function call does not affect the imm32 result. - (imm32, -) = A32ExpandImm_C(imm12, PSTATE.C); - - return imm32; - -// DecodeImmShift() -// ================ - -(SRType, integer) DecodeImmShift(bits(2) srtype, bits(5) imm5) - - case srtype of - when '00' - shift_t = SRType_LSL; shift_n = UInt(imm5); - when '01' - shift_t = SRType_LSR; shift_n = if imm5 == '00000' then 32 else UInt(imm5); - when '10' - shift_t = SRType_ASR; shift_n = if imm5 == '00000' then 32 else UInt(imm5); - when '11' - if imm5 == '00000' then - shift_t = SRType_RRX; shift_n = 1; - else - shift_t = SRType_ROR; shift_n = UInt(imm5); - - return (shift_t, shift_n); - -// DecodeRegShift() -// ================ - -SRType DecodeRegShift(bits(2) srtype) - case srtype of - when '00' shift_t = SRType_LSL; - when '01' shift_t = SRType_LSR; - when '10' shift_t = SRType_ASR; - when '11' shift_t = SRType_ROR; - return shift_t; - -// RRX() -// ===== - -bits(N) RRX(bits(N) x, bit carry_in) - (result, -) = RRX_C(x, carry_in); - return result; - -// Shift() -// ======= - -bits(N) Shift(bits(N) value, SRType srtype, integer amount, bit carry_in) - (result, -) = Shift_C(value, srtype, amount, carry_in); - return result; - -// T32ExpandImm_C() -// ================ - -(bits(32), bit) T32ExpandImm_C(bits(12) imm12, bit carry_in) - - if imm12[11:10] == '00' then - case imm12[9:8] of - when '00' - imm32 = ZeroExtend(imm12[7:0], 32); - when '01' - imm32 = '00000000' : imm12[7:0] : '00000000' : imm12[7:0]; - when '10' - imm32 = imm12[7:0] : '00000000' : imm12[7:0] : '00000000'; - when '11' - imm32 = imm12[7:0] : imm12[7:0] : imm12[7:0] : imm12[7:0]; - carry_out = carry_in; - else - unrotated_value = ZeroExtend('1':imm12[6:0], 32); - (imm32, carry_out) = ROR_C(unrotated_value, UInt(imm12[11:7])); - - return (imm32, carry_out); - -// T32ExpandImm() -// ============== - -bits(32) T32ExpandImm(bits(12) imm12) - - // PSTATE.C argument to following function call does not affect the imm32 result. - (imm32, -) = T32ExpandImm_C(imm12, PSTATE.C); - - return imm32; - -// AArch64.CheckCP15InstrCoarseTraps() -// =================================== -// Check for coarse-grained AArch32 CP15 traps in HSTR_EL2 and HCR_EL2. - -boolean AArch64.CheckCP15InstrCoarseTraps(integer CRn, integer nreg, integer CRm) - - // Check for coarse-grained Hyp traps - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then - // Check for MCR, MRC, MCRR and MRRC disabled by HSTR_EL2 - major = if nreg == 1 then CRn else CRm; - if !IsInHost() && !(major IN {4,14}) && HSTR_EL2[major] == '1' then - return TRUE; - - // Check for MRC and MCR disabled by HCR_EL2.TIDCP - if (HCR_EL2.TIDCP == '1' && nreg == 1 && - ((CRn == 9 && CRm IN {0,1,2, 5,6,7,8 }) || - (CRn == 10 && CRm IN {0,1, 4, 8 }) || - (CRn == 11 && CRm IN {0,1,2,3,4,5,6,7,8,15}))) then - return TRUE; - - return FALSE; - -// AArch32.CheckCP15InstrCoarseTraps() -// =================================== -// Check for coarse-grained CP15 traps in HSTR and HCR. - -boolean AArch32.CheckCP15InstrCoarseTraps(integer CRn, integer nreg, integer CRm) - - // Check for coarse-grained Hyp traps - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then - if PSTATE.EL == EL0 && !ELUsingAArch32(EL2) then - return AArch64.CheckCP15InstrCoarseTraps(CRn, nreg, CRm); - // Check for MCR, MRC, MCRR and MRRC disabled by HSTR - major = if nreg == 1 then CRn else CRm; - if !(major IN {4,14}) && HSTR[major] == '1' then - return TRUE; - - // Check for MRC and MCR disabled by HCR.TIDCP - if (HCR.TIDCP == '1' && nreg == 1 && - ((CRn == 9 && CRm IN {0,1,2, 5,6,7,8 }) || - (CRn == 10 && CRm IN {0,1, 4, 8 }) || - (CRn == 11 && CRm IN {0,1,2,3,4,5,6,7,8,15}))) then - return TRUE; - - return FALSE; - -// AArch32.CheckAlignment() -// ======================== - -boolean AArch32.CheckAlignment(bits(32) address, integer alignment, AccType acctype, - boolean iswrite) - - if PSTATE.EL == EL0 && !ELUsingAArch32(S1TranslationRegime()) then - A = SCTLR[].A; //use AArch64 register, when higher Exception level is using AArch64 - elsif PSTATE.EL == EL2 then - A = HSCTLR.A; - else - A = SCTLR.A; - aligned = (address == Align(address, alignment)); - atomic = acctype IN { AccType_ATOMIC, AccType_ATOMICRW, AccType_ORDEREDATOMIC, AccType_ORDEREDATOMICRW }; - ordered = acctype IN { AccType_ORDERED, AccType_ORDEREDRW, AccType_LIMITEDORDERED, AccType_ORDEREDATOMIC, AccType_ORDEREDATOMICRW }; - vector = acctype == AccType_VEC; - - // AccType_VEC is used for SIMD element alignment checks only - check = (atomic || ordered || vector || A == '1'); - - if check && !aligned then - secondstage = FALSE; - AArch32.Abort(address, AArch32.AlignmentFault(acctype, iswrite, secondstage)); - - return aligned; - -// An optional IMPLEMENTATION DEFINED test for an exclusive access to a virtual -// address region of size bytes starting at address. -// -// It is permitted (but not required) for this function to return FALSE and -// cause a store exclusive to fail if the virtual address region is not -// totally included within the region recorded by MarkExclusiveVA(). -// -// It is always safe to return TRUE which will check the physical address only. -boolean AArch32.IsExclusiveVA(bits(32) address, integer processorid, integer size); - -// Clear the local Exclusives monitor for the specified processorid. -ClearExclusiveLocal(integer processorid); - -// Return TRUE if the global Exclusives monitor for processorid includes all of -// the physical address region of size bytes starting at paddress. -boolean IsExclusiveGlobal(FullAddress paddress, integer processorid, integer size); - -// Return TRUE if the local Exclusives monitor for processorid includes all of -// the physical address region of size bytes starting at paddress. -boolean IsExclusiveLocal(FullAddress paddress, integer processorid, integer size); - -// AArch32.ExclusiveMonitorsPass() -// =============================== - -// Return TRUE if the Exclusives monitors for the current PE include all of the addresses -// associated with the virtual address region of size bytes starting at address. -// The immediately following memory write must be to the same addresses. - -boolean AArch32.ExclusiveMonitorsPass(bits(32) address, integer size) - - // It is IMPLEMENTATION DEFINED whether the detection of memory aborts happens - // before or after the check on the local Exclusives monitor. As a result a failure - // of the local monitor can occur on some implementations even if the memory - // access would give an memory abort. - - acctype = AccType_ATOMIC; - iswrite = TRUE; - - aligned = AArch32.CheckAlignment(address, size, acctype, iswrite); - - passed = AArch32.IsExclusiveVA(address, ProcessorID(), size); - if !passed then - return FALSE; - - memaddrdesc = AArch32.TranslateAddress(address, acctype, iswrite, aligned, size); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch32.Abort(address, memaddrdesc.fault); - - passed = IsExclusiveLocal(memaddrdesc.paddress, ProcessorID(), size); - ClearExclusiveLocal(ProcessorID()); - - if passed then - if memaddrdesc.memattrs.shareable then - passed = IsExclusiveGlobal(memaddrdesc.paddress, ProcessorID(), size); - - return passed; - -// Optionally record an exclusive access to the virtual address region of size bytes -// starting at address for processorid. -AArch32.MarkExclusiveVA(bits(32) address, integer processorid, integer size); - -// Record the physical address region of size bytes starting at paddress in -// the global Exclusives monitor for processorid. -MarkExclusiveGlobal(FullAddress paddress, integer processorid, integer size); - -// Record the physical address region of size bytes starting at paddress in -// the local Exclusives monitor for processorid. -MarkExclusiveLocal(FullAddress paddress, integer processorid, integer size); - -// AArch32.SetExclusiveMonitors() -// ============================== - -// Sets the Exclusives monitors for the current PE to record the addresses associated -// with the virtual address region of size bytes starting at address. - -AArch32.SetExclusiveMonitors(bits(32) address, integer size) - - acctype = AccType_ATOMIC; - iswrite = FALSE; - aligned = (address == Align(address, size)); - - memaddrdesc = AArch32.TranslateAddress(address, acctype, iswrite, aligned, size); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - return; - - if memaddrdesc.memattrs.shareable then - MarkExclusiveGlobal(memaddrdesc.paddress, ProcessorID(), size); - - MarkExclusiveLocal(memaddrdesc.paddress, ProcessorID(), size); - - AArch32.MarkExclusiveVA(address, ProcessorID(), size); - -// D[] - non-assignment form -// ========================= - -bits(64) D[integer n] - assert n >= 0 && n <= 31; - base = (n MOD 2) * 64; - bits(128) vreg = V[n DIV 2]; - return vreg[base+63:base]; - -// D[] - assignment form -// ===================== - -D[integer n] = bits(64) value - assert n >= 0 && n <= 31; - base = (n MOD 2) * 64; - bits(128) vreg = V[n DIV 2]; - vreg[base+63:base] = value; - V[n DIV 2] = vreg; - return; - -array bits(64) _Dclone[0..31]; - -// CheckAdvSIMDEnabled() -// ===================== - -CheckAdvSIMDEnabled() - - fpexc_check = TRUE; - advsimd = TRUE; - - AArch32.CheckAdvSIMDOrFPEnabled(fpexc_check, advsimd); - // Return from CheckAdvSIMDOrFPEnabled() occurs only if Advanced SIMD access is permitted - - // Make temporary copy of D registers - // _Dclone[] is used as input data for instruction pseudocode - for i = 0 to 31 - _Dclone[i] = D[i]; - - return; - -// CheckAdvSIMDOrVFPEnabled() -// ========================== - -CheckAdvSIMDOrVFPEnabled(boolean include_fpexc_check, boolean advsimd) - AArch32.CheckAdvSIMDOrFPEnabled(include_fpexc_check, advsimd); - // Return from CheckAdvSIMDOrFPEnabled() occurs only if VFP access is permitted - return; - -// CheckCryptoEnabled32() -// ====================== - -CheckCryptoEnabled32() - CheckAdvSIMDEnabled(); - // Return from CheckAdvSIMDEnabled() occurs only if access is permitted - return; - -// CheckVFPEnabled() -// ================= - -CheckVFPEnabled(boolean include_fpexc_check) - advsimd = FALSE; - AArch32.CheckAdvSIMDOrFPEnabled(include_fpexc_check, advsimd); - // Return from CheckAdvSIMDOrFPEnabled() occurs only if VFP access is permitted - return; - -type FPCRType; - -// FPDefaultNaN() -// ============== - -bits(N) FPDefaultNaN() - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - sign = '0'; - bits(E) exp = Ones(E); - bits(F) frac = '1':Zeros(F-1); - return sign : exp : frac; - -enumeration FPExc {FPExc_InvalidOp, FPExc_DivideByZero, FPExc_Overflow, - FPExc_Underflow, FPExc_Inexact, FPExc_InputDenorm}; - -// FPInfinity() -// ============ - -bits(N) FPInfinity(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - bits(E) exp = Ones(E); - bits(F) frac = Zeros(F); - return sign : exp : frac; - -// FPProcessException() -// ==================== -// -// The 'fpcr' argument supplies FPCR control bits. Status information is -// updated directly in the FPSR where appropriate. - -FPProcessException(FPExc exception, FPCRType fpcr) - // Determine the cumulative exception bit number - case exception of - when FPExc_InvalidOp cumul = 0; - when FPExc_DivideByZero cumul = 1; - when FPExc_Overflow cumul = 2; - when FPExc_Underflow cumul = 3; - when FPExc_Inexact cumul = 4; - when FPExc_InputDenorm cumul = 7; - enable = cumul + 8; - if fpcr[enable] == '1' then - // Trapping of the exception enabled. - // It is IMPLEMENTATION DEFINED whether the enable bit may be set at all, and - // if so then how exceptions may be accumulated before calling FPTrappedException() - IMPLEMENTATION_DEFINED "floating-point trap handling"; - elsif UsingAArch32() then - // Set the cumulative exception bit - FPSCR[cumul] = '1'; - else - // Set the cumulative exception bit - FPSR[cumul] = '1'; - return; - -enumeration FPType {FPType_Nonzero, FPType_Zero, FPType_Infinity, - FPType_QNaN, FPType_SNaN}; - -// FPProcessNaN() -// ============== - -bits(N) FPProcessNaN(FPType fptype, bits(N) op, FPCRType fpcr) - assert N IN {16,32,64}; - assert fptype IN {FPType_QNaN, FPType_SNaN}; - - case N of - when 16 topfrac = 9; - when 32 topfrac = 22; - when 64 topfrac = 51; - - result = op; - if fptype == FPType_SNaN then - result[topfrac] = '1'; - FPProcessException(FPExc_InvalidOp, fpcr); - if fpcr.DN == '1' then // DefaultNaN requested - result = FPDefaultNaN(); - return result; - -// FPProcessNaNs() -// =============== -// -// The boolean part of the return value says whether a NaN has been found and -// processed. The bits(N) part is only relevant if it has and supplies the -// result of the operation. -// -// The 'fpcr' argument supplies FPCR control bits. Status information is -// updated directly in the FPSR where appropriate. - -(boolean, bits(N)) FPProcessNaNs(FPType type1, FPType type2, - bits(N) op1, bits(N) op2, - FPCRType fpcr) - assert N IN {16,32,64}; - if type1 == FPType_SNaN then - done = TRUE; result = FPProcessNaN(type1, op1, fpcr); - elsif type2 == FPType_SNaN then - done = TRUE; result = FPProcessNaN(type2, op2, fpcr); - elsif type1 == FPType_QNaN then - done = TRUE; result = FPProcessNaN(type1, op1, fpcr); - elsif type2 == FPType_QNaN then - done = TRUE; result = FPProcessNaN(type2, op2, fpcr); - else - done = FALSE; result = Zeros(); // 'Don't care' result - return (done, result); - -// FPMaxNormal() -// ============= - -bits(N) FPMaxNormal(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - exp = Ones(E-1):'0'; - frac = Ones(F); - return sign : exp : frac; - -enumeration FPRounding {FPRounding_TIEEVEN, FPRounding_POSINF, - FPRounding_NEGINF, FPRounding_ZERO, - FPRounding_TIEAWAY, FPRounding_ODD}; - -// FPDecodeRounding() -// ================== - -// Decode floating-point rounding mode and common AArch64 encoding. - -FPRounding FPDecodeRounding(bits(2) rmode) - case rmode of - when '00' return FPRounding_TIEEVEN; // N - when '01' return FPRounding_POSINF; // P - when '10' return FPRounding_NEGINF; // M - when '11' return FPRounding_ZERO; // Z - -// FPRoundingMode() -// ================ - -// Return the current floating-point rounding mode. - -FPRounding FPRoundingMode(FPCRType fpcr) - return FPDecodeRounding(fpcr.RMode); - -// FPZero() -// ======== - -bits(N) FPZero(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - exp = Zeros(E); - frac = Zeros(F); - return sign : exp : frac; - -// Max() -// ===== - -integer Max(integer a, integer b) - return if a >= b then a else b; - -// Max() -// ===== - -real Max(real a, real b) - return if a >= b then a else b; - -// FPRound() -// ========= -// Used by data processing and int/fixed [-] FP conversion instructions. -// For half-precision data it ignores AHP, and observes FZ16. - -bits(N) FPRound(real op, FPCRType fpcr, FPRounding rounding) - fpcr.AHP = '0'; - boolean isbfloat = FALSE; - return FPRoundBase(op, fpcr, rounding, isbfloat); - -// Convert a real number OP into an N-bit floating-point value using the -// supplied rounding mode RMODE. - -bits(N) FPRoundBase(real op, FPCRType fpcr, FPRounding rounding, boolean isbfloat) - assert N IN {16,32,64}; - assert op != 0.0; - assert rounding != FPRounding_TIEAWAY; - bits(N) result; - - // Obtain format parameters - minimum exponent, numbers of exponent and fraction bits. - if N == 16 then - minimum_exp = -14; E = 5; F = 10; - elsif N == 32 && isbfloat then - minimum_exp = -126; E = 8; F = 7; - elsif N == 32 then - minimum_exp = -126; E = 8; F = 23; - else // N == 64 - minimum_exp = -1022; E = 11; F = 52; - - // Split value into sign, unrounded mantissa and exponent. - if op < 0.0 then - sign = '1'; mantissa = -op; - else - sign = '0'; mantissa = op; - exponent = 0; - while mantissa < 1.0 do - mantissa = mantissa * 2.0; exponent = exponent - 1; - while mantissa >= 2.0 do - mantissa = mantissa / 2.0; exponent = exponent + 1; - - // Deal with flush-to-zero. - if ((fpcr.FZ == '1' && N != 16) || (fpcr.FZ16 == '1' && N == 16)) && exponent < minimum_exp then - // Flush-to-zero never generates a trapped exception - if UsingAArch32() then - FPSCR.UFC = '1'; - else - FPSR.UFC = '1'; - return FPZero(sign); - - // Start creating the exponent value for the result. Start by biasing the actual exponent - // so that the minimum exponent becomes 1, lower values 0 (indicating possible underflow). - biased_exp = Max(exponent - minimum_exp + 1, 0); - if biased_exp == 0 then mantissa = mantissa / 2.0^(minimum_exp - exponent); - - // Get the unrounded mantissa as an integer, and the "units in last place" rounding error. - int_mant = RoundDown(mantissa * 2.0^F); // < 2.0^F if biased_exp == 0, >= 2.0^F if not - error = mantissa * 2.0^F - Real(int_mant); - - // Underflow occurs if exponent is too small before rounding, and result is inexact or - // the Underflow exception is trapped. - if biased_exp == 0 && (error != 0.0 || fpcr.UFE == '1') then - FPProcessException(FPExc_Underflow, fpcr); - - // Round result according to rounding mode. - case rounding of - when FPRounding_TIEEVEN - round_up = (error > 0.5 || (error == 0.5 && int_mant[0] == '1')); - overflow_to_inf = TRUE; - when FPRounding_POSINF - round_up = (error != 0.0 && sign == '0'); - overflow_to_inf = (sign == '0'); - when FPRounding_NEGINF - round_up = (error != 0.0 && sign == '1'); - overflow_to_inf = (sign == '1'); - when FPRounding_ZERO, FPRounding_ODD - round_up = FALSE; - overflow_to_inf = FALSE; - - if round_up then - int_mant = int_mant + 1; - if int_mant == 2^F then // Rounded up from denormalized to normalized - biased_exp = 1; - if int_mant == 2^(F+1) then // Rounded up to next exponent - biased_exp = biased_exp + 1; int_mant = int_mant DIV 2; - - // Handle rounding to odd aka Von Neumann rounding - if error != 0.0 && rounding == FPRounding_ODD then - int_mant[0] = '1'; - - // Deal with overflow and generate result. - if N != 16 || fpcr.AHP == '0' then // Single, double or IEEE half precision - if biased_exp >= 2^E - 1 then - result = if overflow_to_inf then FPInfinity(sign) else FPMaxNormal(sign); - FPProcessException(FPExc_Overflow, fpcr); - error = 1.0; // Ensure that an Inexact exception occurs - else - result = sign : biased_exp[E-1:0] : int_mant[F-1:0] : Zeros(N-(E+F+1)); - else // Alternative half precision - if biased_exp >= 2^E then - result = sign : Ones(N-1); - FPProcessException(FPExc_InvalidOp, fpcr); - error = 0.0; // Ensure that an Inexact exception does not occur - else - result = sign : biased_exp[E-1:0] : int_mant[F-1:0] : Zeros(N-(E+F+1)); - - // Deal with Inexact exception. - if error != 0.0 then - FPProcessException(FPExc_Inexact, fpcr); - - return result; - -// FPRound() -// ========= - -bits(N) FPRound(real op, FPCRType fpcr) - return FPRound(op, fpcr, FPRoundingMode(fpcr)); - -// FPUnpackBase() -// ============== -// -// Unpack a floating-point number into its type1, sign bit and the real number -// that it represents. The real number result has the correct sign for numbers -// and infinities, is very large in magnitude for infinities, and is 0.0 for -// NaNs. (These values are chosen to simplify the description of comparisons -// and conversions.) -// -// The 'fpcr' argument supplies FPCR control bits. Status information is -// updated directly in the FPSR where appropriate. - -(FPType, bit, real) FPUnpackBase(bits(N) fpval, FPCRType fpcr) - assert N IN {16,32,64}; - - if N == 16 then - sign = fpval[15]; - exp16 = fpval[14:10]; - frac16 = fpval[9:0]; - if IsZero(exp16) then - // Produce zero if value is zero or flush-to-zero is selected - if IsZero(frac16) || fpcr.FZ16 == '1' then - fptype = FPType_Zero; value = 0.0; - else - fptype = FPType_Nonzero; value = 2.0^-14 * (Real(UInt(frac16)) * 2.0^-10); - elsif IsOnes(exp16) && fpcr.AHP == '0' then // Infinity or NaN in IEEE format - if IsZero(frac16) then - fptype = FPType_Infinity; value = 2.0^1000000; - else - fptype = if frac16[9] == '1' then FPType_QNaN else FPType_SNaN; - value = 0.0; - else - fptype = FPType_Nonzero; - value = 2.0^(UInt(exp16)-15) * (1.0 + Real(UInt(frac16)) * 2.0^-10); - - elsif N == 32 then - - sign = fpval[31]; - exp32 = fpval[30:23]; - frac32 = fpval[22:0]; - if IsZero(exp32) then - // Produce zero if value is zero or flush-to-zero is selected. - if IsZero(frac32) || fpcr.FZ == '1' then - fptype = FPType_Zero; value = 0.0; - if !IsZero(frac32) then // Denormalized input flushed to zero - FPProcessException(FPExc_InputDenorm, fpcr); - else - fptype = FPType_Nonzero; value = 2.0^-126 * (Real(UInt(frac32)) * 2.0^-23); - elsif IsOnes(exp32) then - if IsZero(frac32) then - fptype = FPType_Infinity; value = 2.0^1000000; - else - fptype = if frac32[22] == '1' then FPType_QNaN else FPType_SNaN; - value = 0.0; - else - fptype = FPType_Nonzero; - value = 2.0^(UInt(exp32)-127) * (1.0 + Real(UInt(frac32)) * 2.0^-23); - - else // N == 64 - - sign = fpval[63]; - exp64 = fpval[62:52]; - frac64 = fpval[51:0]; - if IsZero(exp64) then - // Produce zero if value is zero or flush-to-zero is selected. - if IsZero(frac64) || fpcr.FZ == '1' then - fptype = FPType_Zero; value = 0.0; - if !IsZero(frac64) then // Denormalized input flushed to zero - FPProcessException(FPExc_InputDenorm, fpcr); - else - fptype = FPType_Nonzero; value = 2.0^-1022 * (Real(UInt(frac64)) * 2.0^-52); - elsif IsOnes(exp64) then - if IsZero(frac64) then - fptype = FPType_Infinity; value = 2.0^1000000; - else - fptype = if frac64[51] == '1' then FPType_QNaN else FPType_SNaN; - value = 0.0; - else - fptype = FPType_Nonzero; - value = 2.0^(UInt(exp64)-1023) * (1.0 + Real(UInt(frac64)) * 2.0^-52); - - if sign == '1' then value = -value; - return (fptype, sign, value); - -// FPUnpack() -// ========== -// -// Used by data processing and int/fixed [-] FP conversion instructions. -// For half-precision data it ignores AHP, and observes FZ16. - -(FPType, bit, real) FPUnpack(bits(N) fpval, FPCRType fpcr) - fpcr.AHP = '0'; - (fp_type, sign, value) = FPUnpackBase(fpval, fpcr); - return (fp_type, sign, value); - -// FPHalvedSub() -// ============= - -bits(N) FPHalvedSub(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - rounding = FPRoundingMode(fpcr); - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - inf1 = (type1 == FPType_Infinity); inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); zero2 = (type2 == FPType_Zero); - if inf1 && inf2 && sign1 == sign2 then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - elsif (inf1 && sign1 == '0') || (inf2 && sign2 == '1') then - result = FPInfinity('0'); - elsif (inf1 && sign1 == '1') || (inf2 && sign2 == '0') then - result = FPInfinity('1'); - elsif zero1 && zero2 && sign1 != sign2 then - result = FPZero(sign1); - else - result_value = (value1 - value2) / 2.0; - if result_value == 0.0 then // Sign of exact zero result depends on rounding mode - result_sign = if rounding == FPRounding_NEGINF then '1' else '0'; - result = FPZero(result_sign); - else - result = FPRound(result_value, fpcr); - return result; - -// FPMul() -// ======= - -bits(N) FPMul(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - inf1 = (type1 == FPType_Infinity); - inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); - zero2 = (type2 == FPType_Zero); - if (inf1 && zero2) || (zero1 && inf2) then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - elsif inf1 || inf2 then - result = FPInfinity(sign1 EOR sign2); - elsif zero1 || zero2 then - result = FPZero(sign1 EOR sign2); - else - result = FPRound(value1*value2, fpcr); - return result; - -// FPThree() -// ========= - -bits(N) FPThree(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - exp = '1':Zeros(E-1); - frac = '1':Zeros(F-1); - return sign : exp : frac; - -// StandardFPSCRValue() -// ==================== - -FPCRType StandardFPSCRValue() - return '00000' : FPSCR.AHP : '110000' : FPSCR.FZ16 : '0000000000000000000'; - -// FPRSqrtStep() -// ============= - -bits(N) FPRSqrtStep(bits(N) op1, bits(N) op2) - assert N IN {16,32}; - FPCRType fpcr = StandardFPSCRValue(); - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - inf1 = (type1 == FPType_Infinity); inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); zero2 = (type2 == FPType_Zero); - bits(N) product; - if (inf1 && zero2) || (zero1 && inf2) then - product = FPZero('0'); - else - product = FPMul(op1, op2, fpcr); - bits(N) three = FPThree('0'); - result = FPHalvedSub(three, product, fpcr); - return result; - -// FPSub() -// ======= - -bits(N) FPSub(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - rounding = FPRoundingMode(fpcr); - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - inf1 = (type1 == FPType_Infinity); - inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); - zero2 = (type2 == FPType_Zero); - if inf1 && inf2 && sign1 == sign2 then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - elsif (inf1 && sign1 == '0') || (inf2 && sign2 == '1') then - result = FPInfinity('0'); - elsif (inf1 && sign1 == '1') || (inf2 && sign2 == '0') then - result = FPInfinity('1'); - elsif zero1 && zero2 && sign1 == NOT(sign2) then - result = FPZero(sign1); - else - result_value = value1 - value2; - if result_value == 0.0 then // Sign of exact zero result depends on rounding mode - result_sign = if rounding == FPRounding_NEGINF then '1' else '0'; - result = FPZero(result_sign); - else - result = FPRound(result_value, fpcr, rounding); - return result; - -// FPTwo() -// ======= - -bits(N) FPTwo(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - exp = '1':Zeros(E-1); - frac = Zeros(F); - return sign : exp : frac; - -// FPRecipStep() -// ============= - -bits(N) FPRecipStep(bits(N) op1, bits(N) op2) - assert N IN {16,32}; - FPCRType fpcr = StandardFPSCRValue(); - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - inf1 = (type1 == FPType_Infinity); inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); zero2 = (type2 == FPType_Zero); - bits(N) product; - if (inf1 && zero2) || (zero1 && inf2) then - product = FPZero('0'); - else - product = FPMul(op1, op2, fpcr); - bits(N) two = FPTwo('0'); - result = FPSub(two, product, fpcr); - return result; - -Hint_PreloadData(bits(32) address); - -Hint_PreloadDataForWrite(bits(32) address); - -Hint_PreloadInstr(bits(32) address); - -// BigEndian() -// =========== - -boolean BigEndian() - boolean bigend; - if UsingAArch32() then - bigend = (PSTATE.E != '0'); - elsif PSTATE.EL == EL0 then - bigend = (SCTLR[].E0E != '0'); - else - bigend = (SCTLR[].EE != '0'); - return bigend; - -// Mem_with_type[] - non-assignment (read) form -// ============================================ -// Perform a read of 'size' bytes. The access byte order is reversed for a big-endian access. -// Instruction fetches would call AArch32.MemSingle directly. - -bits(size*8) Mem_with_type[bits(32) address, integer size, AccType acctype] - assert size IN {1, 2, 4, 8, 16}; - bits(size*8) value; - boolean iswrite = FALSE; - - aligned = AArch32.CheckAlignment(address, size, acctype, iswrite); - if !aligned then - assert size > 1; - value[7:0] = AArch32.MemSingle[address, 1, acctype, aligned]; - - // For subsequent bytes it is CONSTRAINED UNPREDICTABLE whether an unaligned Device memory - // access will generate an Alignment Fault, as to get this far means the first byte did - // not, so we must be changing to a new translation page. - c = ConstrainUnpredictable(Unpredictable_DEVPAGE2); - assert c IN {Constraint_FAULT, Constraint_NONE}; - if c == Constraint_NONE then aligned = TRUE; - - for i = 1 to size-1 - value[8*i+7:8*i] = AArch32.MemSingle[address+i, 1, acctype, aligned]; - else - value = AArch32.MemSingle[address, size, acctype, aligned]; - - if BigEndian() then - value = BigEndianReverse(value); - return value; - -// Mem_with_type[] - assignment (write) form -// ========================================= -// Perform a write of 'size' bytes. The byte order is reversed for a big-endian access. - -Mem_with_type[bits(32) address, integer size, AccType acctype] = bits(size*8) value - boolean iswrite = TRUE; - - if BigEndian() then - value = BigEndianReverse(value); - - aligned = AArch32.CheckAlignment(address, size, acctype, iswrite); - - if !aligned then - assert size > 1; - AArch32.MemSingle[address, 1, acctype, aligned] = value[7:0]; - - // For subsequent bytes it is CONSTRAINED UNPREDICTABLE whether an unaligned Device memory - // access will generate an Alignment Fault, as to get this far means the first byte did - // not, so we must be changing to a new translation page. - c = ConstrainUnpredictable(Unpredictable_DEVPAGE2); - assert c IN {Constraint_FAULT, Constraint_NONE}; - if c == Constraint_NONE then aligned = TRUE; - - for i = 1 to size-1 - AArch32.MemSingle[address+i, 1, acctype, aligned] = value[8*i+7:8*i]; - else - AArch32.MemSingle[address, size, acctype, aligned] = value; - return; - -// MemA[] - non-assignment form -// ============================ - -bits(8*size) MemA[bits(32) address, integer size] - acctype = AccType_ATOMIC; - return Mem_with_type[address, size, acctype]; - -// MemA[] - assignment form -// ======================== - -MemA[bits(32) address, integer size] = bits(8*size) value - acctype = AccType_ATOMIC; - Mem_with_type[address, size, acctype] = value; - return; - -// MemO[] - non-assignment form -// ============================ - -bits(8*size) MemO[bits(32) address, integer size] - acctype = AccType_ORDERED; - return Mem_with_type[address, size, acctype]; - -// MemO[] - assignment form -// ======================== - -MemO[bits(32) address, integer size] = bits(8*size) value - acctype = AccType_ORDERED; - Mem_with_type[address, size, acctype] = value; - return; - -// MemU[] - non-assignment form -// ============================ - -bits(8*size) MemU[bits(32) address, integer size] - acctype = AccType_NORMAL; - return Mem_with_type[address, size, acctype]; - -// MemU[] - assignment form -// ======================== - -MemU[bits(32) address, integer size] = bits(8*size) value - acctype = AccType_NORMAL; - Mem_with_type[address, size, acctype] = value; - return; - -// MemU_unpriv[] - non-assignment form -// =================================== - -bits(8*size) MemU_unpriv[bits(32) address, integer size] - acctype = AccType_UNPRIV; - return Mem_with_type[address, size, acctype]; - -// MemU_unpriv[] - assignment form -// =============================== - -MemU_unpriv[bits(32) address, integer size] = bits(8*size) value - acctype = AccType_UNPRIV; - Mem_with_type[address, size, acctype] = value; - return; - -type AArch32.SErrorSyndrome is ( - bits(2) AET, - bit ExT -) - -// Return the SError syndrome -AArch32.SErrorSyndrome AArch32.PhysicalSErrorSyndrome(); - -// HaveAnyAArch64() -// ================ -// Return TRUE if AArch64 state is supported at any Exception level - -boolean HaveAnyAArch64() - return !HighestELUsingAArch32(); - -// AArch32.ReportDeferredSError() -// ============================== -// Return deferred SError syndrome - -bits(32) AArch32.ReportDeferredSError(bits(2) AET, bit ExT) - bits(32) target; - target[31] = '1'; // A - syndrome = Zeros(16); - if PSTATE.EL == EL2 then - syndrome[11:10] = AET; // AET - syndrome[9] = ExT; // EA - syndrome[5:0] = '010001'; // DFSC - else - syndrome[15:14] = AET; // AET - syndrome[12] = ExT; // ExT - syndrome[9] = TTBCR.EAE; // LPAE - if TTBCR.EAE == '1' then // Long-descriptor format - syndrome[5:0] = '010001'; // STATUS - else // Short-descriptor format - syndrome[10,3:0] = '10110'; // FS - if HaveAnyAArch64() then - target[24:0] = ZeroExtend(syndrome);// Any RES0 fields must be set to zero - else - target[15:0] = syndrome; - return target; - -// Return the SError syndrome -bits(25) AArch64.PhysicalSErrorSyndrome(boolean implicit_esb); - -// AArch64.ReportDeferredSError() -// ============================== -// Generate deferred SError syndrome - -bits(64) AArch64.ReportDeferredSError(bits(25) syndrome) - bits(64) target; - target[31] = '1'; // A - target[24] = syndrome[24]; // IDS - target[23:0] = syndrome[23:0]; // ISS - return target; - -// ExternalDebugInterruptsDisabled() -// ================================= -// Determine whether EDSCR disables interrupts routed to 'target' - -boolean ExternalDebugInterruptsDisabled(bits(2) target) - case target of - when EL3 - int_dis = EDSCR.INTdis == '11' && ExternalSecureInvasiveDebugEnabled(); - when EL2 - int_dis = EDSCR.INTdis == '1x' && ExternalInvasiveDebugEnabled(); - when EL1 - if IsSecure() then - int_dis = EDSCR.INTdis == '1x' && ExternalSecureInvasiveDebugEnabled(); - else - int_dis = EDSCR.INTdis != '00' && ExternalInvasiveDebugEnabled(); - return int_dis; - -// Return TRUE if a physical SError interrupt is pending -boolean IsPhysicalSErrorPending(); - -// AArch64.ESBOperation() -// ====================== -// Perform the AArch64 ESB operation, either for ESB executed in AArch64 state, or for -// ESB in AArch32 state when SError interrupts are routed to an Exception level using -// AArch64 - -AArch64.ESBOperation() - - route_to_el3 = HaveEL(EL3) && SCR_EL3.EA == '1'; - route_to_el2 = (EL2Enabled() && - (HCR_EL2.TGE == '1' || HCR_EL2.AMO == '1')); - - target = if route_to_el3 then EL3 elsif route_to_el2 then EL2 else EL1; - - if target == EL1 then - mask_active = PSTATE.EL IN {EL0, EL1}; - elsif HaveVirtHostExt() && target == EL2 && HCR_EL2.[E2H,TGE] == '11' then - mask_active = PSTATE.EL IN {EL0, EL2}; - else - mask_active = PSTATE.EL == target; - - mask_set = (PSTATE.A == '1' && (!HaveDoubleFaultExt() || SCR_EL3.EA == '0' || - PSTATE.EL != EL3 || SCR_EL3.NMEA == '0')); - intdis = Halted() || ExternalDebugInterruptsDisabled(target); - masked = (UInt(target) < UInt(PSTATE.EL)) || intdis || (mask_active && mask_set); - - // Check for a masked Physical SError pending - if IsPhysicalSErrorPending() && masked then - // This function might be called for an interworking case, and INTdis is masking - // the SError interrupt. - if ELUsingAArch32(S1TranslationRegime()) then - syndrome32 = AArch32.PhysicalSErrorSyndrome(); - DISR = AArch32.ReportDeferredSError(syndrome32.AET, syndrome32.ExT); - else - implicit_esb = FALSE; - syndrome64 = AArch64.PhysicalSErrorSyndrome(implicit_esb); - DISR_EL1 = AArch64.ReportDeferredSError(syndrome64); - ClearPendingPhysicalSError(); // Set ISR_EL1.A to 0 - - return; - -// AArch32.ESBOperation() -// ====================== -// Perform the AArch32 ESB operation for ESB executed in AArch32 state - -AArch32.ESBOperation() - - // Check if routed to AArch64 state - route_to_aarch64 = PSTATE.EL == EL0 && !ELUsingAArch32(EL1); - if !route_to_aarch64 && EL2Enabled() && !ELUsingAArch32(EL2) then - route_to_aarch64 = HCR_EL2.TGE == '1' || HCR_EL2.AMO == '1'; - if !route_to_aarch64 && HaveEL(EL3) && !ELUsingAArch32(EL3) then - route_to_aarch64 = SCR_EL3.EA == '1'; - - if route_to_aarch64 then - AArch64.ESBOperation(); - return; - - route_to_monitor = HaveEL(EL3) && ELUsingAArch32(EL3) && SCR.EA == '1'; - route_to_hyp = PSTATE.EL IN {EL0, EL1} && EL2Enabled() && (HCR.TGE == '1' || HCR.AMO == '1'); - - if route_to_monitor then - target = M32_Monitor; - elsif route_to_hyp || PSTATE.M == M32_Hyp then - target = M32_Hyp; - else - target = M32_Abort; - - if IsSecure() then - mask_active = TRUE; - elsif target == M32_Monitor then - mask_active = SCR.AW == '1' && (!HaveEL(EL2) || (HCR.TGE == '0' && HCR.AMO == '0')); - else - mask_active = target == M32_Abort || PSTATE.M == M32_Hyp; - - mask_set = PSTATE.A == '1'; - (-, el) = ELFromM32(target); - intdis = Halted() || ExternalDebugInterruptsDisabled(el); - masked = intdis || (mask_active && mask_set); - - // Check for a masked Physical SError pending - if IsPhysicalSErrorPending() && masked then - syndrome32 = AArch32.PhysicalSErrorSyndrome(); - DISR = AArch32.ReportDeferredSError(syndrome32.AET, syndrome32.ExT); - ClearPendingPhysicalSError(); - - return; - -// AArch64.vESBOperation() -// ======================= -// Perform the AArch64 ESB operation for virtual SError interrupts, either for ESB -// executed in AArch64 state, or for ESB in AArch32 state with EL2 using AArch64 state - -AArch64.vESBOperation() - assert PSTATE.EL IN {EL0, EL1} && EL2Enabled(); - - // If physical SError interrupts are routed to EL2, and TGE is not set, then a virtual - // SError interrupt might be pending - vSEI_enabled = HCR_EL2.TGE == '0' && HCR_EL2.AMO == '1'; - vSEI_pending = vSEI_enabled && HCR_EL2.VSE == '1'; - vintdis = Halted() || ExternalDebugInterruptsDisabled(EL1); - vmasked = vintdis || PSTATE.A == '1'; - - // Check for a masked virtual SError pending - if vSEI_pending && vmasked then - // This function might be called for the interworking case, and INTdis is masking - // the virtual SError interrupt. - if ELUsingAArch32(EL1) then - VDISR = AArch32.ReportDeferredSError(VDFSR[15:14], VDFSR[12]); - else - VDISR_EL2 = AArch64.ReportDeferredSError(VSESR_EL2[24:0]); - HCR_EL2.VSE = '0'; // Clear pending virtual SError - - return; - -// AArch32.vESBOperation() -// ======================= -// Perform the ESB operation for virtual SError interrupts executed in AArch32 state - -AArch32.vESBOperation() - assert PSTATE.EL IN {EL0, EL1} && EL2Enabled(); - - // Check for EL2 using AArch64 state - if !ELUsingAArch32(EL2) then - AArch64.vESBOperation(); - return; - - // If physical SError interrupts are routed to Hyp mode, and TGE is not set, then a - // virtual SError interrupt might be pending - vSEI_enabled = HCR.TGE == '0' && HCR.AMO == '1'; - vSEI_pending = vSEI_enabled && HCR.VA == '1'; - vintdis = Halted() || ExternalDebugInterruptsDisabled(EL1); - vmasked = vintdis || PSTATE.A == '1'; - - // Check for a masked virtual SError pending - if vSEI_pending && vmasked then - VDISR = AArch32.ReportDeferredSError(VDFSR[15:14], VDFSR[12]); - HCR.VA = '0'; // Clear pending virtual SError - - return; - -AArch32.ResetSystemRegisters(boolean cold_reset); - -bits(1) EventRegister; - -// SendEventLocal() -// ================ -// Set the local Event Register of this PE. -// When a PE executes the SEVL instruction, it causes this function to be executed - -SendEventLocal() - EventRegister = '1'; - return; - -// ELFromSPSR() -// ============ - -// Convert an SPSR value encoding to an Exception level. -// Returns (valid,EL): -// 'valid' is TRUE if 'spsr[4:0]' encodes a valid mode for the current state. -// 'EL' is the Exception level decoded from 'spsr'. - -(boolean,bits(2)) ELFromSPSR(bits(32) spsr) - if spsr[4] == '0' then // AArch64 state - el = spsr[3:2]; - if HighestELUsingAArch32() then // No AArch64 support - valid = FALSE; - elsif !HaveEL(el) then // Exception level not implemented - valid = FALSE; - elsif spsr[1] == '1' then // M[1] must be 0 - valid = FALSE; - elsif el == EL0 && spsr[0] == '1' then // for EL0, M[0] must be 0 - valid = FALSE; - elsif el == EL2 && HaveEL(EL3) && !IsSecureEL2Enabled() && SCR_EL3.NS == '0' then - valid = FALSE; // Unless Secure EL2 is enabled, EL2 only valid in Non-secure state - else - valid = TRUE; - elsif HaveAnyAArch32() then // AArch32 state - (valid, el) = ELFromM32(spsr[4:0]); - else - valid = FALSE; - - if !valid then el = bits(2) UNKNOWN; - return (valid,el); - -// ELUsingAArch32K() -// ================= - -(boolean,boolean) ELUsingAArch32K(bits(2) el) - return ELStateUsingAArch32K(el, IsSecureBelowEL3()); - -// IllegalExceptionReturn() -// ======================== - -boolean IllegalExceptionReturn(bits(32) spsr) - - // Check for illegal return: - // * To an unimplemented Exception level. - // * To EL2 in Secure state, when SecureEL2 is not enabled. - // * To EL0 using AArch64 state, with SPSR.M[0]==1. - // * To AArch64 state with SPSR.M[1]==1. - // * To AArch32 state with an illegal value of SPSR.M. - (valid, target) = ELFromSPSR(spsr); - if !valid then return TRUE; - - // Check for return to higher Exception level - if UInt(target) > UInt(PSTATE.EL) then return TRUE; - - spsr_mode_is_aarch32 = (spsr[4] == '1'); - - // Check for illegal return: - // * To EL1, EL2 or EL3 with register width specified in the SPSR different from the - // Execution state used in the Exception level being returned to, as determined by - // the SCR_EL3.RW or HCR_EL2.RW bits, or as configured from reset. - // * To EL0 using AArch64 state when EL1 is using AArch32 state as determined by the - // SCR_EL3.RW or HCR_EL2.RW bits or as configured from reset. - // * To AArch64 state from AArch32 state (should be caught by above) - (known, target_el_is_aarch32) = ELUsingAArch32K(target); - assert known || (target == EL0 && !ELUsingAArch32(EL1)); - if known && spsr_mode_is_aarch32 != target_el_is_aarch32 then return TRUE; - - // Check for illegal return from AArch32 to AArch64 - if UsingAArch32() && !spsr_mode_is_aarch32 then return TRUE; - - // Check for illegal return to EL1 when HCR.TGE is set and when either of - // * SecureEL2 is enabled. - // * SecureEL2 is not enabled and EL1 is in Non-secure state. - if HaveEL(EL2) && target == EL1 && HCR_EL2.TGE == '1' then - if (!IsSecureBelowEL3() || IsSecureEL2Enabled()) then return TRUE; - return FALSE; - -// Restarting() -// ============ - -boolean Restarting() - return EDSCR.STATUS == '000001'; // Restarting - -// DebugExceptionReturnSS() -// ======================== -// Returns value to write to PSTATE.SS on an exception return or Debug state exit. - -bit DebugExceptionReturnSS(bits(32) spsr) - assert Halted() || Restarting() || PSTATE.EL != EL0; - - SS_bit = '0'; - - if MDSCR_EL1.SS == '1' then - if Restarting() then - enabled_at_source = FALSE; - elsif UsingAArch32() then - enabled_at_source = AArch32.GenerateDebugExceptions(); - else - enabled_at_source = AArch64.GenerateDebugExceptions(); - - if IllegalExceptionReturn(spsr) then - dest = PSTATE.EL; - else - (valid, dest) = ELFromSPSR(spsr); assert valid; - - secure = IsSecureBelowEL3() || dest == EL3; - if ELUsingAArch32(dest) then - enabled_at_dest = AArch32.GenerateDebugExceptionsFrom(dest, secure); - else - mask = spsr[9]; - enabled_at_dest = AArch64.GenerateDebugExceptionsFrom(dest, secure, mask); - ELd = DebugTargetFrom(secure); - if !ELUsingAArch32(ELd) && !enabled_at_source && enabled_at_dest then - SS_bit = spsr[21]; - return SS_bit; - -// RestoredITBits() -// ================ -// Get the value of PSTATE.IT to be restored on this exception return. - -bits(8) RestoredITBits(bits(32) spsr) - it = spsr[15:10,26:25]; - - // When PSTATE.IL is set, it is CONSTRAINED UNPREDICTABLE whether the IT bits are each set - // to zero or copied from the SPSR. - if PSTATE.IL == '1' then - if ConstrainUnpredictableBool(Unpredictable_ILZEROIT) then return '00000000'; - else return it; - - // The IT bits are forced to zero when they are set to a reserved value. - if !IsZero(it[7:4]) && IsZero(it[3:0]) then - return '00000000'; - - // The IT bits are forced to zero when returning to A32 state, or when returning to an EL - // with the ITD bit set to 1, and the IT bits are describing a multi-instruction block. - itd = if PSTATE.EL == EL2 then HSCTLR.ITD else SCTLR.ITD; - if (spsr[5] == '0' && !IsZero(it)) || (itd == '1' && !IsZero(it[2:0])) then - return '00000000'; - else - return it; - -boolean ShouldAdvanceIT; - -// SetPSTATEFromPSR() -// ================== -// Set PSTATE based on a PSR value - -SetPSTATEFromPSR(bits(32) spsr) - PSTATE.SS = DebugExceptionReturnSS(spsr); - if IllegalExceptionReturn(spsr) then - PSTATE.IL = '1'; - if HaveSSBSExt() then PSTATE.SSBS = bit UNKNOWN; - else - // State that is reinstated only on a legal exception return - PSTATE.IL = spsr[20]; - if spsr[4] == '1' then // AArch32 state - AArch32.WriteMode(spsr[4:0]); // Sets PSTATE.EL correctly - if HaveSSBSExt() then PSTATE.SSBS = spsr[23]; - else // AArch64 state - PSTATE.nRW = '0'; - PSTATE.EL = spsr[3:2]; - PSTATE.SP = spsr[0]; - if HaveSSBSExt() then PSTATE.SSBS = spsr[12]; - - // If PSTATE.IL is set and returning to AArch32 state, it is CONSTRAINED UNPREDICTABLE whether - // the T bit is set to zero or copied from SPSR. - if PSTATE.IL == '1' && PSTATE.nRW == '1' then - if ConstrainUnpredictableBool(Unpredictable_ILZEROT) then spsr[5] = '0'; - - // State that is reinstated regardless of illegal exception return - PSTATE.[N,Z,C,V] = spsr[31:28]; - if HavePANExt() then PSTATE.PAN = spsr[22]; - if PSTATE.nRW == '1' then // AArch32 state - PSTATE.Q = spsr[27]; - PSTATE.IT = RestoredITBits(spsr); - ShouldAdvanceIT = FALSE; - if HaveDITExt() then PSTATE.DIT = (if Restarting() then spsr[24] else spsr[21]); - PSTATE.GE = spsr[19:16]; - PSTATE.E = spsr[9]; - PSTATE.[A,I,F] = spsr[8:6]; // No PSTATE.D in AArch32 state - PSTATE.T = spsr[5]; // PSTATE.J is RES0 - else // AArch64 state - if HaveMTEExt() then PSTATE.TCO = spsr[25]; - if HaveDITExt() then PSTATE.DIT = spsr[24]; - if HaveUAOExt() then PSTATE.UAO = spsr[23]; - if HaveBTIExt() then PSTATE.BTYPE = spsr[11:10]; - PSTATE.[D,A,I,F] = spsr[9:6]; // No PSTATE.[Q,IT,GE,E,T] in AArch64 state - return; - -// AArch32.ExceptionReturn() -// ========================= - -AArch32.ExceptionReturn(bits(32) new_pc, bits(32) spsr) - - SynchronizeContext(); - - // Attempts to change to an illegal mode or state will invoke the Illegal Execution state - // mechanism - SetPSTATEFromPSR(spsr); - ClearExclusiveLocal(ProcessorID()); - SendEventLocal(); - - if PSTATE.IL == '1' then - // If the exception return is illegal, PC[1:0] are UNKNOWN - new_pc[1:0] = bits(2) UNKNOWN; - else - // LR[1:0] or LR[0] are treated as being 0, depending on the target instruction set state - if PSTATE.T == '1' then - new_pc[0] = '0'; // T32 - else - new_pc[1:0] = '00'; // A32 - - BranchTo(new_pc, BranchType_ERET); - -// ALUExceptionReturn() -// ==================== - -ALUExceptionReturn(bits(32) address) - if PSTATE.EL == EL2 then - UNDEFINED; - elsif PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; // UNDEFINED or NOP - else - AArch32.ExceptionReturn(address, SPSR[]); - -// SelectInstrSet() -// ================ - -SelectInstrSet(InstrSet iset) - assert CurrentInstrSet() IN {InstrSet_A32, InstrSet_T32}; - assert iset IN {InstrSet_A32, InstrSet_T32}; - - PSTATE.T = if iset == InstrSet_A32 then '0' else '1'; - - return; - -// BXWritePC() -// =========== - -BXWritePC(bits(32) address, BranchType branch_type) - if address[0] == '1' then - SelectInstrSet(InstrSet_T32); - address[0] = '0'; - else - SelectInstrSet(InstrSet_A32); - // For branches to an unaligned PC counter in A32 state, the processor takes the branch - // and does one of: - // * Forces the address to be aligned - // * Leaves the PC unaligned, meaning the target generates a PC Alignment fault. - if address[1] == '1' && ConstrainUnpredictableBool(Unpredictable_A32FORCEALIGNPC) then - address[1] = '0'; - BranchTo(address, branch_type); - -// BranchWritePC() -// =============== - -BranchWritePC(bits(32) address, BranchType branch_type) - if CurrentInstrSet() == InstrSet_A32 then - address[1:0] = '00'; - else - address[0] = '0'; - BranchTo(address, branch_type); - -// ALUWritePC() -// ============ - -ALUWritePC(bits(32) address) - if CurrentInstrSet() == InstrSet_A32 then - BXWritePC(address, BranchType_INDIR); - else - BranchWritePC(address, BranchType_INDIR); - -// Din[] - non-assignment form -// =========================== - -bits(64) Din[integer n] - assert n >= 0 && n <= 31; - return _Dclone[n]; - -// LR - assignment form -// ==================== - -LR = bits(32) value - R[14] = value; - return; - -// LR - non-assignment form -// ======================== - -bits(32) LR - return R[14]; - -// LoadWritePC() -// ============= - -LoadWritePC(bits(32) address) - BXWritePC(address, BranchType_INDIR); - -// PC - non-assignment form -// ======================== - -bits(32) PC - return R[15]; // This includes the offset from AArch32 state - -// PCStoreValue() -// ============== - -bits(32) PCStoreValue() - // This function returns the PC value. On architecture versions before Armv7, it - // is permitted to instead return PC+4, provided it does so consistently. It is - // used only to describe A32 instructions, so it returns the address of the current - // instruction plus 8 (normally) or 12 (when the alternative is permitted). - return PC; - -// Qin[] - non-assignment form -// =========================== - -bits(128) Qin[integer n] - assert n >= 0 && n <= 15; - return Din[2*n+1]:Din[2*n]; - -// S[] - non-assignment form -// ========================= - -bits(32) S[integer n] - assert n >= 0 && n <= 31; - base = (n MOD 4) * 32; - bits(128) vreg = V[n DIV 4]; - return vreg[base+31:base]; - -// S[] - assignment form -// ===================== - -S[integer n] = bits(32) value - assert n >= 0 && n <= 31; - base = (n MOD 4) * 32; - bits(128) vreg = V[n DIV 4]; - vreg[base+31:base] = value; - V[n DIV 4] = vreg; - return; - -// AArch32.ExecutingCP10or11Instr() -// ================================ - -boolean AArch32.ExecutingCP10or11Instr() - instr = ThisInstr(); - instr_set = CurrentInstrSet(); - assert instr_set IN {InstrSet_A32, InstrSet_T32}; - - if instr_set == InstrSet_A32 then - return ((instr[27:24] == '1110' || instr[27:25] == '110') && instr[11:8] == '101x'); - else // InstrSet_T32 - return (instr[31:28] == '111x' && (instr[27:24] == '1110' || instr[27:25] == '110') && instr[11:8] == '101x'); - -// Read from a 32-bit AArch32 System register and return the register's contents. -bits(32) AArch32.SysRegRead(integer cp_num, bits(32) instr); - -// Read from a 64-bit AArch32 System register and return the register's contents. -bits(64) AArch32.SysRegRead64(integer cp_num, bits(32) instr); - -// AArch32.SysRegReadCanWriteAPSR() -// ================================ -// Determines whether the AArch32 System register read instruction can write to APSR flags. - -boolean AArch32.SysRegReadCanWriteAPSR(integer cp_num, bits(32) instr) - assert UsingAArch32(); - assert (cp_num IN {14,15}); - assert cp_num == UInt(instr[11:8]); - - opc1 = UInt(instr[23:21]); - opc2 = UInt(instr[7:5]); - CRn = UInt(instr[19:16]); - CRm = UInt(instr[3:0]); - - if cp_num == 14 && opc1 == 0 && CRn == 0 && CRm == 1 && opc2 == 0 then // DBGDSCRint - return TRUE; - - return FALSE; - -// Write to a 32-bit AArch32 System register. -AArch32.SysRegWrite(integer cp_num, bits(32) instr, bits(32) val); - -// Write to a 64-bit AArch32 System register. -AArch32.SysRegWrite64(integer cp_num, bits(32) instr, bits(64) val); - -// AArch32.WriteModeByInstr() -// ========================== -// Function for dealing with writes to PSTATE.M from an AArch32 instruction, and ensuring that -// illegal state changes are correctly flagged in PSTATE.IL. - -AArch32.WriteModeByInstr(bits(5) mode) - (valid,el) = ELFromM32(mode); - - // 'valid' is set to FALSE if' mode' is invalid for this implementation or the current value - // of SCR.NS/SCR_EL3.NS. Additionally, it is illegal for an instruction to write 'mode' to - // PSTATE.EL if it would result in any of: - // * A change to a mode that would cause entry to a higher Exception level. - if UInt(el) > UInt(PSTATE.EL) then - valid = FALSE; - - // * A change to or from Hyp mode. - if (PSTATE.M == M32_Hyp || mode == M32_Hyp) && PSTATE.M != mode then - valid = FALSE; - - // * When EL2 is implemented, the value of HCR.TGE is '1', a change to a Non-secure EL1 mode. - if PSTATE.M == M32_Monitor && HaveEL(EL2) && el == EL1 && SCR.NS == '1' && HCR.TGE == '1' then - valid = FALSE; - - if !valid then - PSTATE.IL = '1'; - else - AArch32.WriteMode(mode); - -// BankedRegisterAccessValid() -// =========================== -// Checks for MRS (Banked register) or MSR (Banked register) accesses to registers -// other than the SPSRs that are invalid. This includes ELR_hyp accesses. - -BankedRegisterAccessValid(bits(5) SYSm, bits(5) mode) - - case SYSm of - when '000xx', '00100' // R8_usr to R12_usr - if mode != M32_FIQ then UNPREDICTABLE; - when '00101' // SP_usr - if mode == M32_System then UNPREDICTABLE; - when '00110' // LR_usr - if mode IN {M32_Hyp,M32_System} then UNPREDICTABLE; - when '010xx', '0110x', '01110' // R8_fiq to R12_fiq, SP_fiq, LR_fiq - if mode == M32_FIQ then UNPREDICTABLE; - when '1000x' // LR_irq, SP_irq - if mode == M32_IRQ then UNPREDICTABLE; - when '1001x' // LR_svc, SP_svc - if mode == M32_Svc then UNPREDICTABLE; - when '1010x' // LR_abt, SP_abt - if mode == M32_Abort then UNPREDICTABLE; - when '1011x' // LR_und, SP_und - if mode == M32_Undef then UNPREDICTABLE; - when '1110x' // LR_mon, SP_mon - if !HaveEL(EL3) || !IsSecure() || mode == M32_Monitor then UNPREDICTABLE; - when '11110' // ELR_hyp, only from Monitor or Hyp mode - if !HaveEL(EL2) || !(mode IN {M32_Monitor,M32_Hyp}) then UNPREDICTABLE; - when '11111' // SP_hyp, only from Monitor mode - if !HaveEL(EL2) || mode != M32_Monitor then UNPREDICTABLE; - otherwise - UNPREDICTABLE; - - return; - -// CPSRWriteByInstr() -// ================== -// Update PSTATE.[N,Z,C,V,Q,GE,E,A,I,F,M] from a CPSR value written by an MSR instruction. - -CPSRWriteByInstr(bits(32) value, bits(4) bytemask) - privileged = PSTATE.EL != EL0; // PSTATE.[A,I,F,M] are not writable at EL0 - - // Write PSTATE from 'value', ignoring bytes masked by 'bytemask' - if bytemask[3] == '1' then - PSTATE.[N,Z,C,V,Q] = value[31:27]; - // Bits [26:24] are ignored - - if bytemask[2] == '1' then - // Bit [23] is RES0 - if privileged then - PSTATE.PAN = value[22]; - if HaveDITExt() then - PSTATE.DIT = value[21]; - // Bit [20] is RES0 - PSTATE.GE = value[19:16]; - - if bytemask[1] == '1' then - // Bits [15:10] are RES0 - PSTATE.E = value[9]; // PSTATE.E is writable at EL0 - if privileged then - PSTATE.A = value[8]; - - if bytemask[0] == '1' then - if privileged then - PSTATE.[I,F] = value[7:6]; - // Bit [5] is RES0 - // AArch32.WriteModeByInstr() sets PSTATE.IL to 1 if this is an illegal mode change. - AArch32.WriteModeByInstr(value[4:0]); - return; - -// ConditionPassed() -// ================= - -boolean ConditionPassed() - return ConditionHolds(AArch32.CurrentCond()); - -// InITBlock() -// =========== - -boolean InITBlock() - if CurrentInstrSet() == InstrSet_T32 then - return PSTATE.IT[3:0] != '0000'; - else - return FALSE; - -// LastInITBlock() -// =============== - -boolean LastInITBlock() - return (PSTATE.IT[3:0] == '1000'); - -// SPSRWriteByInstr() -// ================== - -SPSRWriteByInstr(bits(32) value, bits(4) bytemask) - - new_spsr = SPSR[]; - - if bytemask[3] == '1' then - new_spsr[31:24] = value[31:24]; // N,Z,C,V,Q flags, IT[1:0],J bits - - if bytemask[2] == '1' then - new_spsr[23:16] = value[23:16]; // IL bit, GE[3:0] flags - - if bytemask[1] == '1' then - new_spsr[15:8] = value[15:8]; // IT[7:2] bits, E bit, A interrupt mask - - if bytemask[0] == '1' then - new_spsr[7:0] = value[7:0]; // I,F interrupt masks, T bit, Mode bits - - SPSR[] = new_spsr; // UNPREDICTABLE if User or System mode - - return; - -// SPSRaccessValid() -// ================= -// Checks for MRS (Banked register) or MSR (Banked register) accesses to the SPSRs -// that are UNPREDICTABLE - -SPSRaccessValid(bits(5) SYSm, bits(5) mode) - case SYSm of - when '01110' // SPSR_fiq - if mode == M32_FIQ then UNPREDICTABLE; - when '10000' // SPSR_irq - if mode == M32_IRQ then UNPREDICTABLE; - when '10010' // SPSR_svc - if mode == M32_Svc then UNPREDICTABLE; - when '10100' // SPSR_abt - if mode == M32_Abort then UNPREDICTABLE; - when '10110' // SPSR_und - if mode == M32_Undef then UNPREDICTABLE; - when '11100' // SPSR_mon - if !HaveEL(EL3) || mode == M32_Monitor || !IsSecure() then UNPREDICTABLE; - when '11110' // SPSR_hyp - if !HaveEL(EL2) || mode != M32_Monitor then UNPREDICTABLE; - otherwise - UNPREDICTABLE; - - return; - -// SignedSatQ() -// ============ - -(bits(N), boolean) SignedSatQ(integer i, integer N) - if i > 2^(N-1) - 1 then - result = 2^(N-1) - 1; saturated = TRUE; - elsif i < -(2^(N-1)) then - result = -(2^(N-1)); saturated = TRUE; - else - result = i; saturated = FALSE; - return (result[N-1:0], saturated); - -// SignedSat() -// =========== - -bits(N) SignedSat(integer i, integer N) - (result, -) = SignedSatQ(i, N); - return result; - -// UnsignedSatQ() -// ============== - -(bits(N), boolean) UnsignedSatQ(integer i, integer N) - if i > 2^N - 1 then - result = 2^N - 1; saturated = TRUE; - elsif i < 0 then - result = 0; saturated = TRUE; - else - result = i; saturated = FALSE; - return (result[N-1:0], saturated); - -// UnsignedSat() -// ============= - -bits(N) UnsignedSat(integer i, integer N) - (result, -) = UnsignedSatQ(i, N); - return result; - -// Sat() -// ===== - -bits(N) Sat(integer i, integer N, boolean unsigned) - result = if unsigned then UnsignedSat(i, N) else SignedSat(i, N); - return result; - -// BranchToAddr() -// ============== - -// Set program counter to a new address, with a branch type1 -// In AArch64 state the address does not include a tag in the top eight bits. - -BranchToAddr(bits(N) target, BranchType branch_type) - Hint_Branch(branch_type); - if N == 32 then - assert UsingAArch32(); - _PC = ZeroExtend(target); - else - assert N == 64 && !UsingAArch32(); - _PC = target[63:0]; - return; - -// AArch64.ExceptionReturn() -// ========================= - -AArch64.ExceptionReturn(bits(64) new_pc, bits(32) spsr) - - SynchronizeContext(); - - sync_errors = HaveIESB() && SCTLR[].IESB == '1'; - if HaveDoubleFaultExt() then - sync_errors = sync_errors || (SCR_EL3.EA == '1' && SCR_EL3.NMEA == '1' && PSTATE.EL == EL3); - if sync_errors then - SynchronizeErrors(); - iesb_req = TRUE; - TakeUnmaskedPhysicalSErrorInterrupts(iesb_req); - // Attempts to change to an illegal state will invoke the Illegal Execution state mechanism - SetPSTATEFromPSR(spsr); - ClearExclusiveLocal(ProcessorID()); - SendEventLocal(); - - if PSTATE.IL == '1' && spsr[4] == '1' && spsr[20] == '0' then - // If the exception return is illegal, PC[63:32,1:0] are UNKNOWN - new_pc[63:32] = bits(32) UNKNOWN; - new_pc[1:0] = bits(2) UNKNOWN; - elsif UsingAArch32() then // Return to AArch32 - // ELR_ELx[1:0] or ELR_ELx[0] are treated as being 0, depending on the target instruction set state - if PSTATE.T == '1' then - new_pc[0] = '0'; // T32 - else - new_pc[1:0] = '00'; // A32 - else // Return to AArch64 - // ELR_ELx[63:56] might include a tag - new_pc = AArch64.BranchAddr(new_pc); - - if UsingAArch32() then - // 32 most significant bits are ignored. - BranchTo(new_pc[31:0], BranchType_ERET); - else - BranchToAddr(new_pc, BranchType_ERET); - -enumeration CountOp {CountOp_CLZ, CountOp_CLS, CountOp_CNT}; - -// HaveStatisticalProfiling() -// ========================== - -boolean HaveStatisticalProfiling() - return HasArchVersion(ARMv8p2); - -enumeration SysRegAccess { SysRegAccess_OK, - SysRegAccess_UNDEFINED, - SysRegAccess_TrapToEL1, - SysRegAccess_TrapToEL2, - SysRegAccess_TrapToEL3 }; - -// CheckProfilingBufferAccess() -// ============================ - -SysRegAccess CheckProfilingBufferAccess() - if !HaveStatisticalProfiling() || PSTATE.EL == EL0 || UsingAArch32() then - return SysRegAccess_UNDEFINED; - - if PSTATE.EL == EL1 && EL2Enabled() && MDCR_EL2.E2PB[0] != '1' then - return SysRegAccess_TrapToEL2; - - if HaveEL(EL3) && PSTATE.EL != EL3 && MDCR_EL3.NSPB != SCR_EL3.NS:'1' then - return SysRegAccess_TrapToEL3; - - return SysRegAccess_OK; - -// CheckStatisticalProfilingAccess() -// ================================= - -SysRegAccess CheckStatisticalProfilingAccess() - if !HaveStatisticalProfiling() || PSTATE.EL == EL0 || UsingAArch32() then - return SysRegAccess_UNDEFINED; - - if PSTATE.EL == EL1 && EL2Enabled() && MDCR_EL2.TPMS == '1' then - return SysRegAccess_TrapToEL2; - - if HaveEL(EL3) && PSTATE.EL != EL3 && MDCR_EL3.NSPB != SCR_EL3.NS:'1' then - return SysRegAccess_TrapToEL3; - - return SysRegAccess_OK; - -// ProfilingBufferOwner() -// ====================== - -(boolean, bits(2)) ProfilingBufferOwner() - secure = if HaveEL(EL3) then (MDCR_EL3.NSPB[1] == '0') else IsSecure(); - el = if !secure && HaveEL(EL2) && MDCR_EL2.E2PB == '00' then EL2 else EL1; - return (secure, el); - -// ProfilingBufferEnabled() -// ======================== - -boolean ProfilingBufferEnabled() - if !HaveStatisticalProfiling() then return FALSE; - (secure, el) = ProfilingBufferOwner(); - non_secure_bit = if secure then '0' else '1'; - return (!ELUsingAArch32(el) && non_secure_bit == SCR_EL3.NS && - PMBLIMITR_EL1.E == '1' && PMBSR_EL1.S == '0'); - -// StatisticalProfilingEnabled() -// ============================= - -boolean StatisticalProfilingEnabled() - if !HaveStatisticalProfiling() || UsingAArch32() || !ProfilingBufferEnabled() then - return FALSE; - - in_host = EL2Enabled() && HCR_EL2.TGE == '1'; - (secure, el) = ProfilingBufferOwner(); - if UInt(el) < UInt(PSTATE.EL) || secure != IsSecure() || (in_host && el == EL1) then - return FALSE; - - case PSTATE.EL of - when EL3 Unreachable(); - when EL2 spe_bit = PMSCR_EL2.E2SPE; - when EL1 spe_bit = PMSCR_EL1.E1SPE; - when EL0 spe_bit = (if in_host then PMSCR_EL2.E0HSPE else PMSCR_EL1.E0SPE); - - return spe_bit == '1'; - -// CollectContextIDR1() -// ==================== - -boolean CollectContextIDR1() - if !StatisticalProfilingEnabled() then return FALSE; - if PSTATE.EL == EL2 then return FALSE; - if EL2Enabled() && HCR_EL2.TGE == '1' then return FALSE; - return PMSCR_EL1.CX == '1'; - -// CollectContextIDR2() -// ==================== - -boolean CollectContextIDR2() - if !StatisticalProfilingEnabled() then return FALSE; - if EL2Enabled() then return FALSE; - return PMSCR_EL2.CX == '1'; - -// CollectPhysicalAddress() -// ======================== - -boolean CollectPhysicalAddress() - if !StatisticalProfilingEnabled() then return FALSE; - (secure, el) = ProfilingBufferOwner(); - if !secure && HaveEL(EL2) then - return PMSCR_EL2.PA == '1' && (el == EL2 || PMSCR_EL1.PA == '1'); - else - return PMSCR_EL1.PA == '1'; - -// HaveSVE() -// ========= - -boolean HaveSVE() - return HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Have SVE ISA"; - -enumeration OpType { - OpType_Load, // Any memory-read operation other than atomics, compare-and-swap, and swap - OpType_Store, // Any memory-write operation, including atomics without return - OpType_LoadAtomic, // Atomics with return, compare-and-swap and swap - OpType_Branch, // Software write to the PC - OpType_Other // Any other class of operation - }; - -// CollectRecord() -// =============== - -boolean CollectRecord(bits(64) events, integer total_latency, OpType optype) - assert StatisticalProfilingEnabled(); - - // Filtering by event - if PMSFCR_EL1.FE == '1' && !IsZero(PMSEVFR_EL1) then - bits(64) mask = 0xFFFF0000FF00F0AA[63:0]; // Bits [63:48,31:24,15:12,7,5,3,1] - if HaveStatisticalProfiling() then - mask[11] = '1'; // Alignment flag - if HaveSVE() then mask[18:17] = Ones(); // Predicate flags - e = events AND mask; - m = PMSEVFR_EL1 AND mask; - if !IsZero(NOT(e) AND m) then return FALSE; - - // Filtering by type1 - if PMSFCR_EL1.FT == '1' && !IsZero(PMSFCR_EL1.[B,LD,ST]) then - case optype of - when OpType_Branch - if PMSFCR_EL1.B == '0' then return FALSE; - when OpType_Load - if PMSFCR_EL1.LD == '0' then return FALSE; - when OpType_Store - if PMSFCR_EL1.ST == '0' then return FALSE; - when OpType_LoadAtomic - if PMSFCR_EL1.[LD,ST] == '00' then return FALSE; - otherwise - return FALSE; - - // Filtering by latency - if PMSFCR_EL1.FL == '1' && !IsZero(PMSLATFR_EL1.MINLAT) then - if total_latency < UInt(PMSLATFR_EL1.MINLAT) then - return FALSE; - - // Check for UNPREDICTABLE cases - if ((PMSFCR_EL1.FE == '1' && !IsZero(PMSEVFR_EL1)) || - (PMSFCR_EL1.FT == '1' && !IsZero(PMSFCR_EL1.[B,LD,ST])) || - (PMSFCR_EL1.FL == '1' && !IsZero(PMSLATFR_EL1.MINLAT))) then - return ConstrainUnpredictableBool(Unpredictable_BADPMSFCR); - - return TRUE; - -enumeration TimeStamp { - TimeStamp_None, // No timestamp - TimeStamp_CoreSight, // CoreSight time (IMPLEMENTATION DEFINED) - TimeStamp_Virtual, // Physical counter value minus CNTVOFF_EL2 - TimeStamp_Physical }; // Physical counter value with no offset - -// CollectTimeStamp() -// ================== - -TimeStamp CollectTimeStamp() - if !StatisticalProfilingEnabled() then return TimeStamp_None; - (secure, el) = ProfilingBufferOwner(); - if el == EL2 then - if PMSCR_EL2.TS == '0' then return TimeStamp_None; - else - if PMSCR_EL1.TS == '0' then return TimeStamp_None; - if EL2Enabled() then - pct = PMSCR_EL2.PCT == '01' && (el == EL2 || PMSCR_EL1.PCT == '01'); - else - pct = PMSCR_EL1.PCT == '01'; - return (if pct then TimeStamp_Physical else TimeStamp_Virtual); - -// Barrier to ensure that all existing profiling data has been formatted, and profiling buffer -// addresses have been translated such that writes to the profiling buffer have been initiated. -// A following DSB completes when writes to the profiling buffer have completed. -ProfilingSynchronizationBarrier(); - -// AArch64.TakeExceptionInDebugState() -// =================================== -// Take an exception in Debug state to an Exception Level using AArch64. - -AArch64.TakeExceptionInDebugState(bits(2) target_el, ExceptionRecord exception) - assert HaveEL(target_el) && !ELUsingAArch32(target_el) && UInt(target_el) >= UInt(PSTATE.EL); - - sync_errors = HaveIESB() && SCTLR[target_el].IESB == '1'; - if HaveDoubleFaultExt() then - sync_errors = sync_errors || (SCR_EL3.EA == '1' && SCR_EL3.NMEA == '1' && PSTATE.EL == EL3); - // SCTLR[].IESB might be ignored in Debug state. - if !ConstrainUnpredictableBool(Unpredictable_IESBinDebug) then - sync_errors = FALSE; - - SynchronizeContext(); - - // If coming from AArch32 state, the top parts of the X[] registers might be set to zero - from_32 = UsingAArch32(); - if from_32 then AArch64.MaybeZeroRegisterUppers(); - MaybeZeroSVEUppers(target_el); - - AArch64.ReportException(exception, target_el); - - PSTATE.EL = target_el; - PSTATE.nRW = '0'; - PSTATE.SP = '1'; - - SPSR[] = bits(32) UNKNOWN; - ELR[] = bits(64) UNKNOWN; - - // PSTATE.{SS,D,A,I,F} are not observable and ignored in Debug state, so behave as if UNKNOWN. - PSTATE.[SS,D,A,I,F] = bits(5) UNKNOWN; - PSTATE.IL = '0'; - if from_32 then // Coming from AArch32 - PSTATE.IT = '00000000'; - PSTATE.T = '0'; // PSTATE.J is RES0 - if (HavePANExt() && (PSTATE.EL == EL1 || (PSTATE.EL == EL2 && ELIsInHost(EL0))) && - SCTLR[].SPAN == '0') then - PSTATE.PAN = '1'; - if HaveUAOExt() then PSTATE.UAO = '0'; - if HaveBTIExt() then PSTATE.BTYPE = '00'; - if HaveSSBSExt() then PSTATE.SSBS = bit UNKNOWN; - if HaveMTEExt() then PSTATE.TCO = '1'; - - DLR_EL0 = bits(64) UNKNOWN; - DSPSR_EL0 = bits(32) UNKNOWN; - - EDSCR.ERR = '1'; - UpdateEDSCRFields(); // Update EDSCR processor state flags. - - if sync_errors then - SynchronizeErrors(); - - EndOfInstruction(); - -// AArch64.CheckPCAlignment() -// ========================== - -AArch64.CheckPCAlignment() - - bits(64) pc = ThisInstrAddr(); - if pc[1:0] != '00' then - AArch64.PCAlignmentFault(); - -// AArch64.SPAlignmentFault() -// ========================== -// Called on an unaligned stack pointer in AArch64 state. - -AArch64.SPAlignmentFault() - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_SPAlignment); - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif EL2Enabled() && HCR_EL2.TGE == '1' then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// BranchTargetException -// ===================== -// Raise branch target exception. - -AArch64.BranchTargetException(bits(52) vaddress) - - route_to_el2 = PSTATE.EL == EL0 && EL2Enabled() && HCR_EL2.TGE == '1'; - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_BranchTarget); - exception.syndrome[1:0] = PSTATE.BTYPE; - exception.syndrome[24:2] = Zeros(); // RES0 - - if UInt(PSTATE.EL) > UInt(EL1) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// Returns TRUE if the previously executed instruction was executed in the inactive state, that is, -// if it was not itself stepped. -// Might return TRUE or FALSE if the previously executed instruction was an ISB or ERET executed -// in the active-not-pending state, or if another exception was taken before the Software Step exception. -// Returns FALSE otherwise, indicating that the previously executed instruction was executed in the -// active-not-pending state, that is, the instruction was stepped. -boolean SoftwareStep_DidNotStep(); - -// Returns a value that describes the previously executed instruction. The result is valid only if -// SoftwareStep_DidNotStep() returns FALSE. -// Might return TRUE or FALSE if the instruction was an AArch32 LDREX that failed its condition code test. -// Otherwise returns TRUE if the instruction was a Load-Exclusive class instruction, and FALSE if the -// instruction was not a Load-Exclusive class instruction. -boolean SoftwareStep_SteppedEX(); - -// AArch64.SoftwareStepException() -// =============================== - -AArch64.SoftwareStepException() - assert PSTATE.EL != EL3; - - route_to_el2 = (PSTATE.EL IN {EL0, EL1} && EL2Enabled() && - (HCR_EL2.TGE == '1' || MDCR_EL2.TDE == '1')); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_SoftwareStep); - if SoftwareStep_DidNotStep() then - exception.syndrome[24] = '0'; - else - exception.syndrome[24] = '1'; - exception.syndrome[6] = if SoftwareStep_SteppedEX() then '1' else '0'; - - if PSTATE.EL == EL2 || route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// Resets System registers and memory-mapped control registers that have architecturally-defined -// reset values to those values. -AArch64.ResetControlRegisters(boolean cold_reset); - -// X[] - assignment form -// ===================== -// Write to general-purpose register from either a 32-bit or a 64-bit value. - -X[integer n] = bits(width) value - assert n >= 0 && n <= 31; - assert width IN {32,64}; - if n != 31 then - _R[n] = ZeroExtend(value); - return; - -// X[] - non-assignment form -// ========================= -// Read from general-purpose register with implicit slice of 8, 16, 32 or 64 bits. - -bits(width) X[integer n] - assert n >= 0 && n <= 31; - assert width IN {8,16,32,64}; - if n != 31 then - return _R[n][width-1:0]; - else - return Zeros(width); - -// AArch64.ResetGeneralRegisters() -// =============================== - -AArch64.ResetGeneralRegisters() - - for i = 0 to 30 - X[i] = bits(64) UNKNOWN; - - return; - -// V[] - assignment form -// ===================== -// Write to SIMD&FP register with implicit extension from -// 8, 16, 32, 64 or 128 bits. - -V[integer n] = bits(width) value - assert n >= 0 && n <= 31; - assert width IN {8,16,32,64,128}; - integer vlen = if IsSVEEnabled(PSTATE.EL) then VL else 128; - if ConstrainUnpredictableBool(Unpredictable_SVEZEROUPPER) then - _Z[n] = ZeroExtend(value); - else - _Z[n][vlen-1:0] = ZeroExtend(value); - -// V[] - non-assignment form -// ========================= -// Read from SIMD&FP register with implicit slice of 8, 16 -// 32, 64 or 128 bits. - -bits(width) V[integer n] - assert n >= 0 && n <= 31; - assert width IN {8,16,32,64,128}; - return _Z[n][width-1:0]; - -// AArch64.ResetSIMDFPRegisters() -// ============================== - -AArch64.ResetSIMDFPRegisters() - - for i = 0 to 31 - V[i] = bits(128) UNKNOWN; - - return; - -// AArch64.ResetSpecialRegisters() -// =============================== - -AArch64.ResetSpecialRegisters() - - // AArch64 special registers - SP_EL0 = bits(64) UNKNOWN; - SP_EL1 = bits(64) UNKNOWN; - SPSR_EL1 = bits(32) UNKNOWN; - ELR_EL1 = bits(64) UNKNOWN; - if HaveEL(EL2) then - SP_EL2 = bits(64) UNKNOWN; - SPSR_EL2 = bits(32) UNKNOWN; - ELR_EL2 = bits(64) UNKNOWN; - if HaveEL(EL3) then - SP_EL3 = bits(64) UNKNOWN; - SPSR_EL3 = bits(32) UNKNOWN; - ELR_EL3 = bits(64) UNKNOWN; - - // AArch32 special registers that are not architecturally mapped to AArch64 registers - if HaveAArch32EL(EL1) then - SPSR_fiq = bits(32) UNKNOWN; - SPSR_irq = bits(32) UNKNOWN; - SPSR_abt = bits(32) UNKNOWN; - SPSR_und = bits(32) UNKNOWN; - - // External debug special registers - DLR_EL0 = bits(64) UNKNOWN; - DSPSR_EL0 = bits(32) UNKNOWN; - - return; - -// AArch64.TakeReset() -// =================== -// Reset into AArch64 state - -AArch64.TakeReset(boolean cold_reset) - assert !HighestELUsingAArch32(); - - // Enter the highest implemented Exception level in AArch64 state - PSTATE.nRW = '0'; - if HaveEL(EL3) then - PSTATE.EL = EL3; - elsif HaveEL(EL2) then - PSTATE.EL = EL2; - else - PSTATE.EL = EL1; - - // Reset the system registers and other system components - AArch64.ResetControlRegisters(cold_reset); - - // Reset all other PSTATE fields - PSTATE.SP = '1'; // Select stack pointer - PSTATE.[D,A,I,F] = '1111'; // All asynchronous exceptions masked - PSTATE.SS = '0'; // Clear software step bit - PSTATE.DIT = '0'; // PSTATE.DIT is reset to 0 when resetting into AArch64 - PSTATE.IL = '0'; // Clear Illegal Execution state bit - - // All registers, bits and fields not reset by the above pseudocode or by the BranchTo() call - // below are UNKNOWN bitstrings after reset. In particular, the return information registers - // ELR_ELx and SPSR_ELx have UNKNOWN values, so that it - // is impossible to return from a reset in an architecturally defined way. - AArch64.ResetGeneralRegisters(); - AArch64.ResetSIMDFPRegisters(); - AArch64.ResetSpecialRegisters(); - ResetExternalDebugRegisters(cold_reset); - - bits(64) rv; // IMPLEMENTATION DEFINED reset vector - - if HaveEL(EL3) then - rv = RVBAR_EL3; - elsif HaveEL(EL2) then - rv = RVBAR_EL2; - else - rv = RVBAR_EL1; - - // The reset vector must be correctly aligned - assert IsZero(rv[63:PAMax()]) && IsZero(rv[1:0]); - - BranchTo(rv, BranchType_RESET); - -// AArch64.CallSecureMonitor() -// =========================== - -AArch64.CallSecureMonitor(bits(16) immediate) - assert HaveEL(EL3) && !ELUsingAArch32(EL3); - if UsingAArch32() then AArch32.ITAdvance(); - SSAdvance(); - bits(64) preferred_exception_return = NextInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_MonitorCall); - exception.syndrome[15:0] = immediate; - - AArch64.TakeException(EL3, exception, preferred_exception_return, vect_offset); - -// AArch64.CheckForERetTrap() -// ========================== -// Check for trap on ERET, ERETAA, ERETAB instruction - -AArch64.CheckForERetTrap(boolean eret_with_pac, boolean pac_uses_key_a) - - route_to_el2 = FALSE; - // Non-secure EL1 execution of ERET, ERETAA, ERETAB when either HCR_EL2.NV or HFGITR_EL2.ERET is set, - // is trapped to EL2 - route_to_el2 = PSTATE.EL == EL1 && EL2Enabled() && ( (HaveNVExt() && HCR_EL2.NV == '1') || (HaveFGTExt() && HCR_EL2.[E2H, TGE] != '11' && (!HaveEL(EL3) || SCR_EL3.FGTEn == '1') && HFGITR_EL2.ERET == '1') ); - if route_to_el2 then - ExceptionRecord exception; - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - exception = ExceptionSyndrome(Exception_ERetTrap); - if !eret_with_pac then // ERET - exception.syndrome[1] = '0'; - exception.syndrome[0] = '0'; // RES0 - else - exception.syndrome[1] = '1'; - if pac_uses_key_a then // ERETAA - exception.syndrome[0] = '0'; - else // ERETAB - exception.syndrome[0] = '1'; - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - -// AArch64.CheckForSVCTrap() -// ========================= -// Check for trap on SVC instruction - -AArch64.CheckForSVCTrap(bits(16) immediate) - if HaveFGTExt() then - route_to_el2 = FALSE; - if PSTATE.EL == EL0 then - route_to_el2 = !ELUsingAArch32(EL0) && !ELUsingAArch32(EL1) && EL2Enabled() && HFGITR_EL2.SVC_EL0 == '1' && (HCR_EL2.[E2H, TGE] != '11' && (!HaveEL(EL3) || SCR_EL3.FGTEn == '1')); - - elsif PSTATE.EL == EL1 then - route_to_el2 = !ELUsingAArch32(EL1) && EL2Enabled() && HFGITR_EL2.SVC_EL1 == '1' && (HCR_EL2.[E2H, TGE] != '11' && (!HaveEL(EL3) || SCR_EL3.FGTEn == '1')); - - if route_to_el2 then - exception = ExceptionSyndrome(Exception_SupervisorCall); - exception.syndrome[15:0] = immediate; - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - -// AArch64.MonitorModeTrap() -// ========================= -// Trapped use of Monitor mode features in a Secure EL1 AArch32 mode - -AArch64.MonitorModeTrap() - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_Uncategorized); - - if IsSecureEL2Enabled() then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - AArch64.TakeException(EL3, exception, preferred_exception_return, vect_offset); - -// AArch64.SystemAccessTrapSyndrome() -// ================================== -// Returns the syndrome information for traps on AArch64 MSR/MRS instructions. - -ExceptionRecord AArch64.SystemAccessTrapSyndrome(bits(32) instr, integer ec) - ExceptionRecord exception; - case ec of - when 0x0 // Trapped access due to unknown reason. - exception = ExceptionSyndrome(Exception_Uncategorized); - when 0x7 // Trapped access to SVE, Advance SIMD&FP system register. - exception = ExceptionSyndrome(Exception_AdvSIMDFPAccessTrap); - exception.syndrome[24:20] = ConditionSyndrome(); - when 0x18 // Trapped access to system register or system instruction. - exception = ExceptionSyndrome(Exception_SystemRegisterTrap); - instr = ThisInstr(); - exception.syndrome[21:20] = instr[20:19]; // Op0 - exception.syndrome[19:17] = instr[7:5]; // Op2 - exception.syndrome[16:14] = instr[18:16]; // Op1 - exception.syndrome[13:10] = instr[15:12]; // CRn - exception.syndrome[9:5] = instr[4:0]; // Rt - exception.syndrome[4:1] = instr[11:8]; // CRm - exception.syndrome[0] = instr[21]; // Direction - when 0x19 // Trapped access to SVE System register - exception = ExceptionSyndrome(Exception_SVEAccessTrap); - otherwise - Unreachable(); - - return exception; - -// AArch64.SystemAccessTrap() -// ========================== -// Trapped access to AArch64 system register or system instruction. - -AArch64.SystemAccessTrap(bits(2) target_el, integer ec) - assert HaveEL(target_el) && target_el != EL0 && UInt(target_el) >= UInt(PSTATE.EL); - - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = AArch64.SystemAccessTrapSyndrome(ThisInstr(), ec); - AArch64.TakeException(target_el, exception, preferred_exception_return, vect_offset); - -// CheckFPAdvSIMDEnabled64() -// ========================= -// AArch64 instruction wrapper - -CheckFPAdvSIMDEnabled64() - AArch64.CheckFPAdvSIMDEnabled(); - -enumeration ExtendType {ExtendType_SXTB, ExtendType_SXTH, ExtendType_SXTW, ExtendType_SXTX, - ExtendType_UXTB, ExtendType_UXTH, ExtendType_UXTW, ExtendType_UXTX}; - -// DecodeRegExtend() -// ================= -// Decode a register extension option - -ExtendType DecodeRegExtend(bits(3) op) - case op of - when '000' return ExtendType_UXTB; - when '001' return ExtendType_UXTH; - when '010' return ExtendType_UXTW; - when '011' return ExtendType_UXTX; - when '100' return ExtendType_SXTB; - when '101' return ExtendType_SXTH; - when '110' return ExtendType_SXTW; - when '111' return ExtendType_SXTX; - -// Extend() -// ======== - -bits(N) Extend(bits(M) x, integer N, boolean unsigned) - return if unsigned then ZeroExtend(x, N) else SignExtend(x, N); - -// Extend() -// ======== - -bits(N) Extend(bits(M) x, boolean unsigned) - return Extend(x, N, unsigned); - -// ExtendReg() -// =========== -// Perform a register extension and shift - -bits(N) ExtendReg(integer reg, ExtendType exttype, integer shift) - assert shift >= 0 && shift <= 4; - bits(N) val = X[reg]; - boolean unsigned; - integer len; - - case exttype of - when ExtendType_SXTB unsigned = FALSE; len = 8; - when ExtendType_SXTH unsigned = FALSE; len = 16; - when ExtendType_SXTW unsigned = FALSE; len = 32; - when ExtendType_SXTX unsigned = FALSE; len = 64; - when ExtendType_UXTB unsigned = TRUE; len = 8; - when ExtendType_UXTH unsigned = TRUE; len = 16; - when ExtendType_UXTW unsigned = TRUE; len = 32; - when ExtendType_UXTX unsigned = TRUE; len = 64; - - // Note the extended width of the intermediate value and - // that sign extension occurs from bit [len+shift-1], not - // from bit [len-1]. This is equivalent to the instruction - // [SU]BFIZ Rtmp, Rreg, #shift, #len - // It may also be seen as a sign/zero extend followed by a shift: - // LSL(Extend(val[len-1:0], N, unsigned), shift); - - len = Min(len, N - shift); - return Extend(val[len-1:0] : Zeros(shift), N, unsigned); - -enumeration FPMaxMinOp {FPMaxMinOp_MAX, FPMaxMinOp_MIN, - FPMaxMinOp_MAXNUM, FPMaxMinOp_MINNUM}; - -enumeration FPUnaryOp {FPUnaryOp_ABS, FPUnaryOp_MOV, - FPUnaryOp_NEG, FPUnaryOp_SQRT}; - -enumeration FPConvOp {FPConvOp_CVT_FtoI, FPConvOp_CVT_ItoF, - FPConvOp_MOV_FtoI, FPConvOp_MOV_ItoF - , FPConvOp_CVT_FtoI_JS -}; - -// HaveUA16Ext() -// ============= -// Returns TRUE if extended unaligned memory access support is implemented, and FALSE otherwise. - -boolean HaveUA16Ext() - return HasArchVersion(ARMv8p4); - -// AArch64.CheckAlignment() -// ======================== - -boolean AArch64.CheckAlignment(bits(64) address, integer alignment, AccType acctype, - boolean iswrite) - - aligned = (address == Align(address, alignment)); - atomic = acctype IN { AccType_ATOMIC, AccType_ATOMICRW, AccType_ORDEREDATOMIC, AccType_ORDEREDATOMICRW }; - ordered = acctype IN { AccType_ORDERED, AccType_ORDEREDRW, AccType_LIMITEDORDERED, AccType_ORDEREDATOMIC, AccType_ORDEREDATOMICRW }; - vector = acctype == AccType_VEC; - if SCTLR[].A == '1' then check = TRUE; - elsif HaveUA16Ext() then - check = (UInt(address[0+:4]) + alignment > 16) && ((ordered && SCTLR[].nAA == '0') || atomic); - else check = atomic || ordered; - - if check && !aligned then - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - - return aligned; - -// An optional IMPLEMENTATION DEFINED test for an exclusive access to a virtual -// address region of size bytes starting at address. -// -// It is permitted (but not required) for this function to return FALSE and -// cause a store exclusive to fail if the virtual address region is not -// totally included within the region recorded by MarkExclusiveVA(). -// -// It is always safe to return TRUE which will check the physical address only. -boolean AArch64.IsExclusiveVA(bits(64) address, integer processorid, integer size); - -// AArch64.ExclusiveMonitorsPass() -// =============================== - -// Return TRUE if the Exclusives monitors for the current PE include all of the addresses -// associated with the virtual address region of size bytes starting at address. -// The immediately following memory write must be to the same addresses. - -boolean AArch64.ExclusiveMonitorsPass(bits(64) address, integer size) - - // It is IMPLEMENTATION DEFINED whether the detection of memory aborts happens - // before or after the check on the local Exclusives monitor. As a result a failure - // of the local monitor can occur on some implementations even if the memory - // access would give an memory abort. - - acctype = AccType_ATOMIC; - iswrite = TRUE; - - aligned = AArch64.CheckAlignment(address, size, acctype, iswrite); - - passed = AArch64.IsExclusiveVA(address, ProcessorID(), size); - if !passed then - return FALSE; - - memaddrdesc = AArch64.TranslateAddress(address, acctype, iswrite, aligned, size); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch64.Abort(address, memaddrdesc.fault); - - passed = IsExclusiveLocal(memaddrdesc.paddress, ProcessorID(), size); - ClearExclusiveLocal(ProcessorID()); - - if passed then - if memaddrdesc.memattrs.shareable then - passed = IsExclusiveGlobal(memaddrdesc.paddress, ProcessorID(), size); - - return passed; - -// Optionally record an exclusive access to the virtual address region of size bytes -// starting at address for processorid. -AArch64.MarkExclusiveVA(bits(64) address, integer processorid, integer size); - -// AArch64.SetExclusiveMonitors() -// ============================== - -// Sets the Exclusives monitors for the current PE to record the addresses associated -// with the virtual address region of size bytes starting at address. - -AArch64.SetExclusiveMonitors(bits(64) address, integer size) - - acctype = AccType_ATOMIC; - iswrite = FALSE; - aligned = (address == Align(address, size)); - - memaddrdesc = AArch64.TranslateAddress(address, acctype, iswrite, aligned, size); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - return; - - if memaddrdesc.memattrs.shareable then - MarkExclusiveGlobal(memaddrdesc.paddress, ProcessorID(), size); - - MarkExclusiveLocal(memaddrdesc.paddress, ProcessorID(), size); - - AArch64.MarkExclusiveVA(address, ProcessorID(), size); - -// FPNeg() -// ======= - -bits(N) FPNeg(bits(N) op) - assert N IN {16,32,64}; - return NOT(op[N-1]) : op[N-2:0]; - -// FPOnePointFive() -// ================ - -bits(N) FPOnePointFive(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - exp = '0':Ones(E-1); - frac = '1':Zeros(F-1); - return sign : exp : frac; - -// FPRSqrtStepFused() -// ================== - -bits(N) FPRSqrtStepFused(bits(N) op1, bits(N) op2) - assert N IN {16, 32, 64}; - bits(N) result; - op1 = FPNeg(op1); - (type1,sign1,value1) = FPUnpack(op1, FPCR); - (type2,sign2,value2) = FPUnpack(op2, FPCR); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, FPCR); - if !done then - inf1 = (type1 == FPType_Infinity); - inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); - zero2 = (type2 == FPType_Zero); - if (inf1 && zero2) || (zero1 && inf2) then - result = FPOnePointFive('0'); - elsif inf1 || inf2 then - result = FPInfinity(sign1 EOR sign2); - else - // Fully fused multiply-add and halve - result_value = (3.0 + (value1 * value2)) / 2.0; - if result_value == 0.0 then - // Sign of exact zero result depends on rounding mode - sign = if FPRoundingMode(FPCR) == FPRounding_NEGINF then '1' else '0'; - result = FPZero(sign); - else - result = FPRound(result_value, FPCR); - return result; - -// FPRecipStepFused() -// ================== - -bits(N) FPRecipStepFused(bits(N) op1, bits(N) op2) - assert N IN {16, 32, 64}; - bits(N) result; - op1 = FPNeg(op1); - (type1,sign1,value1) = FPUnpack(op1, FPCR); - (type2,sign2,value2) = FPUnpack(op2, FPCR); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, FPCR); - if !done then - inf1 = (type1 == FPType_Infinity); - inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); - zero2 = (type2 == FPType_Zero); - if (inf1 && zero2) || (zero1 && inf2) then - result = FPTwo('0'); - elsif inf1 || inf2 then - result = FPInfinity(sign1 EOR sign2); - else - // Fully fused multiply-add - result_value = 2.0 + (value1 * value2); - if result_value == 0.0 then - // Sign of exact zero result depends on rounding mode - sign = if FPRoundingMode(FPCR) == FPRounding_NEGINF then '1' else '0'; - result = FPZero(sign); - else - result = FPRound(result_value, FPCR); - return result; - -// AArch64.AddressWithAllocationTag() -// ================================== -// Generate a 64-bit value containing a Logical Address Tag from a 64-bit -// virtual address and an Allocation Tag. -// If the extension is disabled, treats the Allocation Tag as '0000'. - -bits(64) AArch64.AddressWithAllocationTag(bits(64) address, bits(4) allocation_tag) - bits(64) result = address; - bits(4) tag; - if AArch64.AllocationTagAccessIsEnabled() then - tag = allocation_tag; - else - tag = '0000'; - result[59:56] = tag; - return result; - -// AArch64.AllocationTagFromAddress() -// ================================== -// Generate an ALlocation Tag from a 64-bit value containing a Logical Address Tag. - -bits(4) AArch64.AllocationTagFromAddress(bits(64) tagged_address) - return tagged_address[59:56]; - -// AArch64.MemSingle[] - non-assignment (read) form -// ================================================ -// Perform an atomic, little-endian read of 'size' bytes. - -bits(size*8) AArch64.MemSingle[bits(64) address, integer size, AccType acctype, boolean wasaligned] - assert size IN {1, 2, 4, 8, 16}; - assert address == Align(address, size); - - AddressDescriptor memaddrdesc; - bits(size*8) value; - iswrite = FALSE; - - memaddrdesc = AArch64.TranslateAddress(address, acctype, iswrite, wasaligned, size); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch64.Abort(address, memaddrdesc.fault); - - // Memory array access - accdesc = CreateAccessDescriptor(acctype); - if HaveMTEExt() then - if AArch64.AccessIsTagChecked(ZeroExtend(address, 64), acctype) then - bits(4) ptag = AArch64.PhysicalTag(ZeroExtend(address, 64)); - if !AArch64.CheckTag(memaddrdesc, ptag, iswrite) then - AArch64.TagCheckFail(ZeroExtend(address, 64), iswrite); - value = _Mem[memaddrdesc, size, accdesc]; - return value; - -// AArch64.MemSingle[] - assignment (write) form -// ============================================= -// Perform an atomic, little-endian write of 'size' bytes. - -AArch64.MemSingle[bits(64) address, integer size, AccType acctype, boolean wasaligned] = bits(size*8) value - assert size IN {1, 2, 4, 8, 16}; - assert address == Align(address, size); - - AddressDescriptor memaddrdesc; - iswrite = TRUE; - - memaddrdesc = AArch64.TranslateAddress(address, acctype, iswrite, wasaligned, size); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch64.Abort(address, memaddrdesc.fault); - - // Effect on exclusives - if memaddrdesc.memattrs.shareable then - ClearExclusiveByAddress(memaddrdesc.paddress, ProcessorID(), size); - - // Memory array access - accdesc = CreateAccessDescriptor(acctype); - if HaveMTEExt() then - if AArch64.AccessIsTagChecked(ZeroExtend(address, 64), acctype) then - bits(4) ptag = AArch64.PhysicalTag(ZeroExtend(address, 64)); - if !AArch64.CheckTag(memaddrdesc, ptag, iswrite) then - AArch64.TagCheckFail(ZeroExtend(address, 64), iswrite); - _Mem[memaddrdesc, size, accdesc] = value; - return; - -constant integer LOG2_TAG_GRANULE = 4; - -constant integer TAG_GRANULE = 1 << LOG2_TAG_GRANULE; - -// AArch64.MemTag[] - non-assignment (read) form -// ============================================= -// Load an Allocation Tag from memory. - -bits(4) AArch64.MemTag[bits(64) address, AccType acctype] - assert acctype == AccType_NORMAL; - AddressDescriptor memaddrdesc; - bits(4) value; - iswrite = FALSE; - - memaddrdesc = AArch64.TranslateAddress(address, acctype, iswrite, TRUE, TAG_GRANULE); - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch64.Abort(address, memaddrdesc.fault); - - // Return the granule tag if tagging is enabled... - if AArch64.AllocationTagAccessIsEnabled() && memaddrdesc.memattrs.tagged then - return _MemTag[memaddrdesc]; - else - // ...otherwise read tag as zero. - return '0000'; - -// AArch64.MemTag[] - assignment (write) form -// ========================================== -// Store an Allocation Tag to memory. - -AArch64.MemTag[bits(64) address, AccType acctype] = bits(4) value - assert acctype == AccType_NORMAL; - AddressDescriptor memaddrdesc; - iswrite = TRUE; - - // Stores of allocation tags must be aligned - if address != Align(address, TAG_GRANULE) then - boolean secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - - wasaligned = TRUE; - memaddrdesc = AArch64.TranslateAddress(address, acctype, iswrite, wasaligned, TAG_GRANULE); - - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch64.Abort(address, memaddrdesc.fault); - - // Memory array access - if AArch64.AllocationTagAccessIsEnabled() && memaddrdesc.memattrs.tagged then - _MemTag[memaddrdesc] = value; - -// AArch64.TranslateAddressForAtomicAccess() -// ========================================= -// Performs an alignment check for atomic memory operations. -// Also translates 64-bit Virtual Address into Physical Address. - -AddressDescriptor AArch64.TranslateAddressForAtomicAccess(bits(64) address, integer sizeinbits) - boolean iswrite = FALSE; - size = sizeinbits DIV 8; - - assert size IN {1, 2, 4, 8, 16}; - - aligned = AArch64.CheckAlignment(address, size, AccType_ATOMICRW, iswrite); - - // MMU or MPU lookup - memaddrdesc = AArch64.TranslateAddress(address, AccType_ATOMICRW, iswrite, aligned, size); - - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - AArch64.Abort(address, memaddrdesc.fault); - - // Effect on exclusives - if memaddrdesc.memattrs.shareable then - ClearExclusiveByAddress(memaddrdesc.paddress, ProcessorID(), size); - - if HaveMTEExt() && AArch64.AccessIsTagChecked(address, AccType_ATOMICRW) then - bits(4) ptag = AArch64.PhysicalTag(address); - if !AArch64.CheckTag(memaddrdesc, ptag, iswrite) then - AArch64.TagCheckFail(address, iswrite); - - return memaddrdesc; - -// SP[] - assignment form -// ====================== -// Write to stack pointer from either a 32-bit or a 64-bit value. - -SP[] = bits(width) value - assert width IN {32,64}; - if PSTATE.SP == '0' then - SP_EL0 = ZeroExtend(value); - else - case PSTATE.EL of - when EL0 SP_EL0 = ZeroExtend(value); - when EL1 SP_EL1 = ZeroExtend(value); - when EL2 SP_EL2 = ZeroExtend(value); - when EL3 SP_EL3 = ZeroExtend(value); - return; - -// SP[] - non-assignment form -// ========================== -// Read stack pointer with implicit slice of 8, 16, 32 or 64 bits. - -bits(width) SP[] - assert width IN {8,16,32,64}; - if PSTATE.SP == '0' then - return SP_EL0[width-1:0]; - else - case PSTATE.EL of - when EL0 return SP_EL0[width-1:0]; - when EL1 return SP_EL1[width-1:0]; - when EL2 return SP_EL2[width-1:0]; - when EL3 return SP_EL3[width-1:0]; - -// CheckSPAlignment() -// ================== -// Check correct stack pointer alignment for AArch64 state. - -CheckSPAlignment() - bits(64) sp = SP[]; - if PSTATE.EL == EL0 then - stack_align_check = (SCTLR[].SA0 != '0'); - else - stack_align_check = (SCTLR[].SA != '0'); - - if stack_align_check && sp != Align(sp, 16) then - AArch64.SPAlignmentFault(); - - return; - -// Mem[] - non-assignment (read) form -// ================================== -// Perform a read of 'size' bytes. The access byte order is reversed for a big-endian access. -// Instruction fetches would call AArch64.MemSingle directly. - -bits(size*8) Mem[bits(64) address, integer size, AccType acctype] - assert size IN {1, 2, 4, 8, 16}; - bits(size*8) value; - boolean iswrite = FALSE; - - aligned = AArch64.CheckAlignment(address, size, acctype, iswrite); - if size != 16 || !(acctype IN {AccType_VEC, AccType_VECSTREAM}) then - atomic = aligned; - else - // 128-bit SIMD&FP loads are treated as a pair of 64-bit single-copy atomic accesses - // 64-bit aligned. - atomic = address == Align(address, 8); - - if !atomic then - assert size > 1; - value[7:0] = AArch64.MemSingle[address, 1, acctype, aligned]; - - // For subsequent bytes it is CONSTRAINED UNPREDICTABLE whether an unaligned Device memory - // access will generate an Alignment Fault, as to get this far means the first byte did - // not, so we must be changing to a new translation page. - if !aligned then - c = ConstrainUnpredictable(Unpredictable_DEVPAGE2); - assert c IN {Constraint_FAULT, Constraint_NONE}; - if c == Constraint_NONE then aligned = TRUE; - - for i = 1 to size-1 - value[8*i+7:8*i] = AArch64.MemSingle[address+i, 1, acctype, aligned]; - elsif size == 16 && acctype IN {AccType_VEC, AccType_VECSTREAM} then - value[63:0] = AArch64.MemSingle[address, 8, acctype, aligned]; - value[127:64] = AArch64.MemSingle[address+8, 8, acctype, aligned]; - else - value = AArch64.MemSingle[address, size, acctype, aligned]; - - if (HaveNV2Ext() && acctype == AccType_NV2REGISTER && SCTLR_EL2.EE == '1') || BigEndian() then - value = BigEndianReverse(value); - return value; - -// Mem[] - assignment (write) form -// =============================== -// Perform a write of 'size' bytes. The byte order is reversed for a big-endian access. - -Mem[bits(64) address, integer size, AccType acctype] = bits(size*8) value - boolean iswrite = TRUE; - - if (HaveNV2Ext() && acctype == AccType_NV2REGISTER && SCTLR_EL2.EE == '1') || BigEndian() then - value = BigEndianReverse(value); - - aligned = AArch64.CheckAlignment(address, size, acctype, iswrite); - if size != 16 || !(acctype IN {AccType_VEC, AccType_VECSTREAM}) then - atomic = aligned; - else - // 128-bit SIMD&FP stores are treated as a pair of 64-bit single-copy atomic accesses - // 64-bit aligned. - atomic = address == Align(address, 8); - - if !atomic then - assert size > 1; - AArch64.MemSingle[address, 1, acctype, aligned] = value[7:0]; - - // For subsequent bytes it is CONSTRAINED UNPREDICTABLE whether an unaligned Device memory - // access will generate an Alignment Fault, as to get this far means the first byte did - // not, so we must be changing to a new translation page. - if !aligned then - c = ConstrainUnpredictable(Unpredictable_DEVPAGE2); - assert c IN {Constraint_FAULT, Constraint_NONE}; - if c == Constraint_NONE then aligned = TRUE; - - for i = 1 to size-1 - AArch64.MemSingle[address+i, 1, acctype, aligned] = value[8*i+7:8*i]; - elsif size == 16 && acctype IN {AccType_VEC, AccType_VECSTREAM} then - AArch64.MemSingle[address, 8, acctype, aligned] = value[63:0]; - AArch64.MemSingle[address+8, 8, acctype, aligned] = value[127:64]; - else - AArch64.MemSingle[address, size, acctype, aligned] = value; - return; - -enumeration MemAtomicOp {MemAtomicOp_ADD, - MemAtomicOp_BIC, - MemAtomicOp_EOR, - MemAtomicOp_ORR, - MemAtomicOp_SMAX, - MemAtomicOp_SMIN, - MemAtomicOp_UMAX, - MemAtomicOp_UMIN, - MemAtomicOp_SWP}; - -// MemAtomic() -// =========== -// Performs load and store memory operations for a given virtual address. - -bits(size) MemAtomic(bits(64) address, MemAtomicOp op, bits(size) value, AccType ldacctype, AccType stacctype) - bits(size) newvalue; - memaddrdesc = AArch64.TranslateAddressForAtomicAccess(address, size); - ldaccdesc = CreateAccessDescriptor(ldacctype); - staccdesc = CreateAccessDescriptor(stacctype); - - // All observers in the shareability domain observe the - // following load and store atomically. - oldvalue = _Mem[memaddrdesc, size DIV 8, ldaccdesc]; - if BigEndian() then - oldvalue = BigEndianReverse(oldvalue); - - case op of - when MemAtomicOp_ADD newvalue = oldvalue + value; - when MemAtomicOp_BIC newvalue = oldvalue AND NOT(value); - when MemAtomicOp_EOR newvalue = oldvalue EOR value; - when MemAtomicOp_ORR newvalue = oldvalue OR value; - when MemAtomicOp_SMAX newvalue = if SInt(oldvalue) > SInt(value) then oldvalue else value; - when MemAtomicOp_SMIN newvalue = if SInt(oldvalue) > SInt(value) then value else oldvalue; - when MemAtomicOp_UMAX newvalue = if UInt(oldvalue) > UInt(value) then oldvalue else value; - when MemAtomicOp_UMIN newvalue = if UInt(oldvalue) > UInt(value) then value else oldvalue; - when MemAtomicOp_SWP newvalue = value; - - if BigEndian() then - newvalue = BigEndianReverse(newvalue); - _Mem[memaddrdesc, size DIV 8, staccdesc] = newvalue; - - // Load operations return the old (pre-operation) value - return oldvalue; - -// MemAtomicCompareAndSwap() -// ========================= -// Compares the value stored at the passed-in memory address against the passed-in expected -// value. If the comparison is successful, the value at the passed-in memory address is swapped -// with the passed-in new_value. - -bits(size) MemAtomicCompareAndSwap(bits(64) address, bits(size) expectedvalue, - bits(size) newvalue, AccType ldacctype, AccType stacctype) - memaddrdesc = AArch64.TranslateAddressForAtomicAccess(address, size); - ldaccdesc = CreateAccessDescriptor(ldacctype); - staccdesc = CreateAccessDescriptor(stacctype); - - // All observers in the shareability domain observe the - // following load and store atomically. - oldvalue = _Mem[memaddrdesc, size DIV 8, ldaccdesc]; - if BigEndian() then - oldvalue = BigEndianReverse(oldvalue); - - if oldvalue == expectedvalue then - if BigEndian() then - newvalue = BigEndianReverse(newvalue); - _Mem[memaddrdesc, size DIV 8, staccdesc] = newvalue; - return oldvalue; - -// NVMem[] - non-assignment form -// ============================= -// This function is the load memory access for the transformed System register read access -// when Enhanced Nested Virtualisation is enabled with HCR_EL2.NV2 = 1. -// The address for the load memory access is calculated using -// the formula SignExtend(VNCR_EL2.BADDR : Offset[11:0], 64) where, -// * VNCR_EL2.BADDR holds the base address of the memory location, and -// * Offset is the unique offset value defined architecturally for each System register that -// supports transformation of register access to memory access. - -bits(64) NVMem[integer offset] - assert offset > 0; - bits(64) address = SignExtend(VNCR_EL2.BADDR:offset[11:0], 64); - return Mem[address, 8, AccType_NV2REGISTER]; - -// NVMem[] - assignment form -// ========================= -// This function is the store memory access for the transformed System register write access -// when Enhanced Nested Virtualisation is enabled with HCR_EL2.NV2 = 1. -// The address for the store memory access is calculated using -// the formula SignExtend(VNCR_EL2.BADDR : Offset[11:0], 64) where, -// * VNCR_EL2.BADDR holds the base address of the memory location, and -// * Offset is the unique offset value defined architecturally for each System register that -// supports transformation of register access to memory access. - -NVMem[integer offset] = bits(64) value - assert offset > 0; - bits(64) address = SignExtend(VNCR_EL2.BADDR:offset[11:0], 64); - Mem[address, 8, AccType_NV2REGISTER] = value; - return; - -// Flag the current instruction as using/not using memory tag checking. -SetTagCheckedInstruction(boolean checked); - -// PtrHasUpperAndLowerAddRanges() -// ============================== -// Returns TRUE if the pointer has upper and lower address ranges, FALSE otherwise. - -boolean PtrHasUpperAndLowerAddRanges() - return PSTATE.EL == EL1 || PSTATE.EL == EL0 || (PSTATE.EL == EL2 && HCR_EL2.E2H == '1'); - -// VAMax() -// ======= -// Returns the IMPLEMENTATION DEFINED upper limit on the virtual address -// size for this processor, as log2(). - -integer VAMax() - return integer IMPLEMENTATION_DEFINED "Maximum Virtual Address Size"; - -// CalculateBottomPACBit() -// ======================= - -integer CalculateBottomPACBit(bit top_bit) - integer tsz_field; - - if PtrHasUpperAndLowerAddRanges() then - assert S1TranslationRegime() IN {EL1, EL2}; - if S1TranslationRegime() == EL1 then - // EL1 translation regime registers - tsz_field = if top_bit == '1' then UInt(TCR_EL1.T1SZ) else UInt(TCR_EL1.T0SZ); - using64k = if top_bit == '1' then TCR_EL1.TG1 == '11' else TCR_EL1.TG0 == '01'; - else - // EL2 translation regime registers - assert HaveEL(EL2); - tsz_field = if top_bit == '1' then UInt(TCR_EL2.T1SZ) else UInt(TCR_EL2.T0SZ); - using64k = if top_bit == '1' then TCR_EL2.TG1 == '11' else TCR_EL2.TG0 == '01'; - else - tsz_field = if PSTATE.EL == EL2 then UInt(TCR_EL2.T0SZ) else UInt(TCR_EL3.T0SZ); - using64k = if PSTATE.EL == EL2 then TCR_EL2.TG0 == '01' else TCR_EL3.TG0 == '01'; - - max_limit_tsz_field = (if !HaveSmallPageTblExt() then 39 else if using64k then 47 else 48); - if tsz_field > max_limit_tsz_field then - // TCR_ELx.TySZ is out of range - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_NONE}; - if c == Constraint_FORCE then tsz_field = max_limit_tsz_field; - tszmin = if using64k && VAMax() == 52 then 12 else 16; - if tsz_field < tszmin then - c = ConstrainUnpredictable(Unpredictable_RESTnSZ); - assert c IN {Constraint_FORCE, Constraint_NONE}; - if c == Constraint_FORCE then tsz_field = tszmin; - return (64-tsz_field); - -// CalculateTBI() -// ============== - -boolean CalculateTBI(bits(64) ptr, boolean data) - boolean tbi = FALSE; - - if PtrHasUpperAndLowerAddRanges() then - assert S1TranslationRegime() IN {EL1, EL2}; - if S1TranslationRegime() == EL1 then - // EL1 translation regime registers - if data then - tbi = if ptr[55] == '1' then TCR_EL1.TBI1 == '1' else TCR_EL1.TBI0 == '1'; - else - if ptr[55] == '1' then - tbi = TCR_EL1.TBI1 == '1' && TCR_EL1.TBID1 == '0'; - else - tbi = TCR_EL1.TBI0 == '1' && TCR_EL1.TBID0 == '0'; - else - // EL2 translation regime registers - if data then - tbi = if ptr[55] == '1' then TCR_EL2.TBI1 == '1' else TCR_EL2.TBI0 == '1'; - else - if ptr[55] == '1' then - tbi = TCR_EL2.TBI1 == '1' && TCR_EL2.TBID1 == '0'; - else - tbi = TCR_EL2.TBI0 == '1' && TCR_EL2.TBID0 == '0'; - elsif PSTATE.EL == EL2 then - tbi = if data then TCR_EL2.TBI=='1' else TCR_EL2.TBI=='1' && TCR_EL2.TBID=='0'; - elsif PSTATE.EL == EL3 then - tbi = if data then TCR_EL3.TBI=='1' else TCR_EL3.TBI=='1' && TCR_EL3.TBID=='0'; - - return tbi; - -// PACCellInvShuffle() -// =================== - -bits(64) PACCellInvShuffle(bits(64) indata) - bits(64) outdata; - outdata[3:0] = indata[15:12]; - outdata[7:4] = indata[27:24]; - outdata[11:8] = indata[51:48]; - outdata[15:12] = indata[39:36]; - outdata[19:16] = indata[59:56]; - outdata[23:20] = indata[47:44]; - outdata[27:24] = indata[7:4]; - outdata[31:28] = indata[19:16]; - outdata[35:32] = indata[35:32]; - outdata[39:36] = indata[55:52]; - outdata[43:40] = indata[31:28]; - outdata[47:44] = indata[11:8]; - outdata[51:48] = indata[23:20]; - outdata[55:52] = indata[3:0]; - outdata[59:56] = indata[43:40]; - outdata[63:60] = indata[63:60]; - return outdata; - -// PACCellShuffle() -// ================ - -bits(64) PACCellShuffle(bits(64) indata) - bits(64) outdata; - outdata[3:0] = indata[55:52]; - outdata[7:4] = indata[27:24]; - outdata[11:8] = indata[47:44]; - outdata[15:12] = indata[3:0]; - outdata[19:16] = indata[31:28]; - outdata[23:20] = indata[51:48]; - outdata[27:24] = indata[7:4]; - outdata[31:28] = indata[43:40]; - outdata[35:32] = indata[35:32]; - outdata[39:36] = indata[15:12]; - outdata[43:40] = indata[59:56]; - outdata[47:44] = indata[23:20]; - outdata[51:48] = indata[11:8]; - outdata[55:52] = indata[39:36]; - outdata[59:56] = indata[19:16]; - outdata[63:60] = indata[63:60]; - return outdata; - -// PACInvSub() -// =========== - -bits(64) PACInvSub(bits(64) Tinput) - // This is a 4-bit substitution from the PRINCE-family cipher - - bits(64) Toutput; - for i = 0 to 15 - case Tinput[4*i+3:4*i] of - when '0000' Toutput[4*i+3:4*i] = '0101'; - when '0001' Toutput[4*i+3:4*i] = '1110'; - when '0010' Toutput[4*i+3:4*i] = '1101'; - when '0011' Toutput[4*i+3:4*i] = '1000'; - when '0100' Toutput[4*i+3:4*i] = '1010'; - when '0101' Toutput[4*i+3:4*i] = '1011'; - when '0110' Toutput[4*i+3:4*i] = '0001'; - when '0111' Toutput[4*i+3:4*i] = '1001'; - when '1000' Toutput[4*i+3:4*i] = '0010'; - when '1001' Toutput[4*i+3:4*i] = '0110'; - when '1010' Toutput[4*i+3:4*i] = '1111'; - when '1011' Toutput[4*i+3:4*i] = '0000'; - when '1100' Toutput[4*i+3:4*i] = '0100'; - when '1101' Toutput[4*i+3:4*i] = '1100'; - when '1110' Toutput[4*i+3:4*i] = '0111'; - when '1111' Toutput[4*i+3:4*i] = '0011'; - return Toutput; - -// RotCell() -// ========= - -bits(4) RotCell(bits(4) incell, integer amount) - bits(8) tmp; - bits(4) outcell; - - // assert amount>3 || amount<1; - tmp[7:0] = incell[3:0]:incell[3:0]; - outcell = tmp[7-amount:4-amount]; - return outcell; - -// PACMult() -// ========= - -bits(64) PACMult(bits(64) Sinput) - bits(4) t0; - bits(4) t1; - bits(4) t2; - bits(4) t3; - bits(64) Soutput; - - for i = 0 to 3 - t0[3:0] = RotCell(Sinput[4*(i+8)+3:4*(i+8)], 1) EOR RotCell(Sinput[4*(i+4)+3:4*(i+4)], 2); - t0[3:0] = t0[3:0] EOR RotCell(Sinput[4*(i)+3:4*(i)], 1); - t1[3:0] = RotCell(Sinput[4*(i+12)+3:4*(i+12)], 1) EOR RotCell(Sinput[4*(i+4)+3:4*(i+4)], 1); - t1[3:0] = t1[3:0] EOR RotCell(Sinput[4*(i)+3:4*(i)], 2); - t2[3:0] = RotCell(Sinput[4*(i+12)+3:4*(i+12)], 2) EOR RotCell(Sinput[4*(i+8)+3:4*(i+8)], 1); - t2[3:0] = t2[3:0] EOR RotCell(Sinput[4*(i)+3:4*(i)], 1); - t3[3:0] = RotCell(Sinput[4*(i+12)+3:4*(i+12)], 1) EOR RotCell(Sinput[4*(i+8)+3:4*(i+8)], 2); - t3[3:0] = t3[3:0] EOR RotCell(Sinput[4*(i+4)+3:4*(i+4)], 1); - Soutput[4*i+3:4*i] = t3[3:0]; - Soutput[4*(i+4)+3:4*(i+4)] = t2[3:0]; - Soutput[4*(i+8)+3:4*(i+8)] = t1[3:0]; - Soutput[4*(i+12)+3:4*(i+12)] = t0[3:0]; - return Soutput; - -// PACSub() -// ======== - -bits(64) PACSub(bits(64) Tinput) - // This is a 4-bit substitution from the PRINCE-family cipher - bits(64) Toutput; - for i = 0 to 15 - case Tinput[4*i+3:4*i] of - when '0000' Toutput[4*i+3:4*i] = '1011'; - when '0001' Toutput[4*i+3:4*i] = '0110'; - when '0010' Toutput[4*i+3:4*i] = '1000'; - when '0011' Toutput[4*i+3:4*i] = '1111'; - when '0100' Toutput[4*i+3:4*i] = '1100'; - when '0101' Toutput[4*i+3:4*i] = '0000'; - when '0110' Toutput[4*i+3:4*i] = '1001'; - when '0111' Toutput[4*i+3:4*i] = '1110'; - when '1000' Toutput[4*i+3:4*i] = '0011'; - when '1001' Toutput[4*i+3:4*i] = '0111'; - when '1010' Toutput[4*i+3:4*i] = '0100'; - when '1011' Toutput[4*i+3:4*i] = '0101'; - when '1100' Toutput[4*i+3:4*i] = '1101'; - when '1101' Toutput[4*i+3:4*i] = '0010'; - when '1110' Toutput[4*i+3:4*i] = '0001'; - when '1111' Toutput[4*i+3:4*i] = '1010'; - return Toutput; - -// TweakCellRot() -// ============== - -bits(4) TweakCellRot(bits(4) incell) - bits(4) outcell; - outcell[3] = incell[0] EOR incell[1]; - outcell[2] = incell[3]; - outcell[1] = incell[2]; - outcell[0] = incell[1]; - return outcell; - -// TweakShuffle() -// ============== - -bits(64) TweakShuffle(bits(64) indata) - bits(64) outdata; - outdata[3:0] = indata[19:16]; - outdata[7:4] = indata[23:20]; - outdata[11:8] = TweakCellRot(indata[27:24]); - outdata[15:12] = indata[31:28]; - outdata[19:16] = TweakCellRot(indata[47:44]); - outdata[23:20] = indata[11:8]; - outdata[27:24] = indata[15:12]; - outdata[31:28] = TweakCellRot(indata[35:32]); - outdata[35:32] = indata[51:48]; - outdata[39:36] = indata[55:52]; - outdata[43:40] = indata[59:56]; - outdata[47:44] = TweakCellRot(indata[63:60]); - outdata[51:48] = TweakCellRot(indata[3:0]); - outdata[55:52] = indata[7:4]; - outdata[59:56] = TweakCellRot(indata[43:40]); - outdata[63:60] = TweakCellRot(indata[39:36]); - return outdata; - -array bits(64) RC[0..4]; - -bits(64) ComputePAC(bits(64) data, bits(64) modifier, bits(64) key0, bits(64) key1) - bits(64) workingval; - bits(64) runningmod; - bits(64) roundkey; - bits(64) modk0; - constant bits(64) Alpha = 0xC0AC29B7C97C50DD[63:0]; - - RC[0] = 0x0000000000000000[63:0]; - RC[1] = 0x13198A2E03707344[63:0]; - RC[2] = 0xA4093822299F31D0[63:0]; - RC[3] = 0x082EFA98EC4E6C89[63:0]; - RC[4] = 0x452821E638D01377[63:0]; - - modk0 = key0[0]:key0[63:2]:(key0[63] EOR key0[1]); - runningmod = modifier; - workingval = data EOR key0; - for i = 0 to 4 - roundkey = key1 EOR runningmod; - workingval = workingval EOR roundkey; - workingval = workingval EOR RC[i]; - if i > 0 then - workingval = PACCellShuffle(workingval); - workingval = PACMult(workingval); - workingval = PACSub(workingval); - runningmod = TweakShuffle(runningmod[63:0]); - roundkey = modk0 EOR runningmod; - workingval = workingval EOR roundkey; - workingval = PACCellShuffle(workingval); - workingval = PACMult(workingval); - workingval = PACSub(workingval); - workingval = PACCellShuffle(workingval); - workingval = PACMult(workingval); - workingval = key1 EOR workingval; - workingval = PACCellInvShuffle(workingval); - workingval = PACInvSub(workingval); - workingval = PACMult(workingval); - workingval = PACCellInvShuffle(workingval); - workingval = workingval EOR key0; - workingval = workingval EOR runningmod; - for i = 0 to 4 - workingval = PACInvSub(workingval); - if i < 4 then - workingval = PACMult(workingval); - workingval = PACCellInvShuffle(workingval); - runningmod = TweakInvShuffle(runningmod[63:0]); - roundkey = key1 EOR runningmod; - workingval = workingval EOR RC[4-i]; - workingval = workingval EOR roundkey; - workingval = workingval EOR Alpha; - workingval = workingval EOR modk0; - - return workingval; - -// HaveEnhancedPAC() -// ================= -// Returns TRUE if support for EnhancedPAC is implemented, FALSE otherwise. - -boolean HaveEnhancedPAC() - return ( HavePACExt() - && boolean IMPLEMENTATION_DEFINED "Has enhanced PAC functionality" ); - -// HaveEnhancedPAC2() -// ================== -// Returns TRUE if support for EnhancedPAC2 is implemented, FALSE otherwise. - -boolean HaveEnhancedPAC2() - return HasArchVersion(ARMv8p6) || (HasArchVersion(ARMv8p3) && boolean IMPLEMENTATION_DEFINED "Has enhanced PAC 2 functionality"); - -// AddPAC() -// ======== -// Calculates the pointer authentication code for a 64-bit quantity and then -// inserts that into pointer authentication code field of that 64-bit quantity. - -bits(64) AddPAC(bits(64) ptr, bits(64) modifier, bits(128) K, boolean data) - bits(64) PAC; - bits(64) result; - bits(64) ext_ptr; - bits(64) extfield; - bit selbit; - boolean tbi = CalculateTBI(ptr, data); - integer top_bit = if tbi then 55 else 63; - - // If tagged pointers are in use for a regime with two TTBRs, use bit[55] of - // the pointer to select between upper and lower ranges, and preserve this. - // This handles the awkward case where there is apparently no correct choice between - // the upper and lower address range - ie an addr of 1xxxxxxx0... with TBI0=0 and TBI1=1 - // and 0xxxxxxx1 with TBI1=0 and TBI0=1: - if PtrHasUpperAndLowerAddRanges() then - assert S1TranslationRegime() IN {EL1, EL2}; - if S1TranslationRegime() == EL1 then - // EL1 translation regime registers - if data then - if TCR_EL1.TBI1 == '1' || TCR_EL1.TBI0 == '1' then - selbit = ptr[55]; - else - selbit = ptr[63]; - else - if ((TCR_EL1.TBI1 == '1' && TCR_EL1.TBID1 == '0') || - (TCR_EL1.TBI0 == '1' && TCR_EL1.TBID0 == '0')) then - selbit = ptr[55]; - else - selbit = ptr[63]; - else - // EL2 translation regime registers - if data then - if TCR_EL2.TBI1 == '1' || TCR_EL2.TBI0 == '1' then - selbit = ptr[55]; - else - selbit = ptr[63]; - else - if ((TCR_EL2.TBI1 == '1' && TCR_EL2.TBID1 == '0') || - (TCR_EL2.TBI0 == '1' && TCR_EL2.TBID0 == '0')) then - selbit = ptr[55]; - else - selbit = ptr[63]; - else selbit = if tbi then ptr[55] else ptr[63]; - - integer bottom_PAC_bit = CalculateBottomPACBit(selbit); - - // The pointer authentication code field takes all the available bits in between - extfield = Replicate(selbit, 64); - - // Compute the pointer authentication code for a ptr with good extension bits - if tbi then - ext_ptr = ptr[63:56]:extfield[(56-bottom_PAC_bit)-1:0]:ptr[bottom_PAC_bit-1:0]; - else - ext_ptr = extfield[(64-bottom_PAC_bit)-1:0]:ptr[bottom_PAC_bit-1:0]; - - PAC = ComputePAC(ext_ptr, modifier, K[127:64], K[63:0]); - - // Check if the ptr has good extension bits and corrupt the pointer authentication code if not - if !IsZero(ptr[top_bit:bottom_PAC_bit]) && !IsOnes(ptr[top_bit:bottom_PAC_bit]) then - if HaveEnhancedPAC() then - PAC = 0x0000000000000000[63:0]; - elsif !HaveEnhancedPAC2() then - PAC[top_bit-1] = NOT(PAC[top_bit-1]); - - // preserve the determination between upper and lower address at bit[55] and insert PAC - if !HaveEnhancedPAC2() then - if tbi then - result = ptr[63:56]:selbit:PAC[54:bottom_PAC_bit]:ptr[bottom_PAC_bit-1:0]; - else - result = PAC[63:56]:selbit:PAC[54:bottom_PAC_bit]:ptr[bottom_PAC_bit-1:0]; - else - if tbi then - result = ptr[63:56]:selbit:(ptr[54:bottom_PAC_bit] EOR PAC[54:bottom_PAC_bit]):ptr[bottom_PAC_bit-1:0]; - else - result = (ptr[63:56] EOR PAC[63:56]):selbit:(ptr[54:bottom_PAC_bit] EOR - PAC[54:bottom_PAC_bit]):ptr[bottom_PAC_bit-1:0]; - return result; - -// TrapPACUse() -// ============ -// Used for the trapping of the pointer authentication functions by higher exception -// levels. - -TrapPACUse(bits(2) target_el) - assert HaveEL(target_el) && target_el != EL0 && UInt(target_el) >= UInt(PSTATE.EL); - - bits(64) preferred_exception_return = ThisInstrAddr(); - ExceptionRecord exception; - vect_offset = 0; - exception = ExceptionSyndrome(Exception_PACTrap); - AArch64.TakeException(target_el, exception, preferred_exception_return, vect_offset); - -// AddPACDA() -// ========== -// Returns a 64-bit value containing X, but replacing the pointer authentication code -// field bits with a pointer authentication code, where the pointer authentication -// code is derived using a cryptographic algorithm as a combination of X, Y and the -// APDAKey_EL1. - -bits(64) AddPACDA(bits(64) X, bits(64) Y) - boolean TrapEL2; - boolean TrapEL3; - bits(1) Enable; - bits(128) APDAKey_EL1; - - APDAKey_EL1 = APDAKeyHi_EL1[63:0] : APDAKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - boolean IsEL1Regime = S1TranslationRegime() == EL1; - Enable = if IsEL1Regime then SCTLR_EL1.EnDA else SCTLR_EL2.EnDA; - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - Enable = SCTLR_EL1.EnDA; - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - Enable = SCTLR_EL2.EnDA; - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - Enable = SCTLR_EL3.EnDA; - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if Enable == '0' then return X; - elsif TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return AddPAC(X, Y, APDAKey_EL1, TRUE); - -// AddPACDB() -// ========== -// Returns a 64-bit value containing X, but replacing the pointer authentication code -// field bits with a pointer authentication code, where the pointer authentication -// code is derived using a cryptographic algorithm as a combination of X, Y and the -// APDBKey_EL1. - -bits(64) AddPACDB(bits(64) X, bits(64) Y) - boolean TrapEL2; - boolean TrapEL3; - bits(1) Enable; - bits(128) APDBKey_EL1; - - APDBKey_EL1 = APDBKeyHi_EL1[63:0] : APDBKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - boolean IsEL1Regime = S1TranslationRegime() == EL1; - Enable = if IsEL1Regime then SCTLR_EL1.EnDB else SCTLR_EL2.EnDB; - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - Enable = SCTLR_EL1.EnDB; - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - Enable = SCTLR_EL2.EnDB; - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - Enable = SCTLR_EL3.EnDB; - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if Enable == '0' then return X; - elsif TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return AddPAC(X, Y, APDBKey_EL1, TRUE); - -// AddPACGA() -// ========== -// Returns a 64-bit value where the lower 32 bits are 0, and the upper 32 bits contain -// a 32-bit pointer authentication code which is derived using a cryptographic -// algorithm as a combination of X, Y and the APGAKey_EL1. - -bits(64) AddPACGA(bits(64) X, bits(64) Y) - boolean TrapEL2; - boolean TrapEL3; - bits(128) APGAKey_EL1; - - APGAKey_EL1 = APGAKeyHi_EL1[63:0] : APGAKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return ComputePAC(X, Y, APGAKey_EL1[127:64], APGAKey_EL1[63:0])[63:32]:Zeros(32); - -// AddPACIA() -// ========== -// Returns a 64-bit value containing X, but replacing the pointer authentication code -// field bits with a pointer authentication code, where the pointer authentication -// code is derived using a cryptographic algorithm as a combination of X, Y, and the -// APIAKey_EL1. - -bits(64) AddPACIA(bits(64) X, bits(64) Y) - boolean TrapEL2; - boolean TrapEL3; - bits(1) Enable; - bits(128) APIAKey_EL1; - - APIAKey_EL1 = APIAKeyHi_EL1[63:0]:APIAKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - boolean IsEL1Regime = S1TranslationRegime() == EL1; - Enable = if IsEL1Regime then SCTLR_EL1.EnIA else SCTLR_EL2.EnIA; - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - Enable = SCTLR_EL1.EnIA; - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - Enable = SCTLR_EL2.EnIA; - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - Enable = SCTLR_EL3.EnIA; - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if Enable == '0' then return X; - elsif TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return AddPAC(X, Y, APIAKey_EL1, FALSE); - -// AddPACIB() -// ========== -// Returns a 64-bit value containing X, but replacing the pointer authentication code -// field bits with a pointer authentication code, where the pointer authentication -// code is derived using a cryptographic algorithm as a combination of X, Y and the -// APIBKey_EL1. - -bits(64) AddPACIB(bits(64) X, bits(64) Y) - boolean TrapEL2; - boolean TrapEL3; - bits(1) Enable; - bits(128) APIBKey_EL1; - - APIBKey_EL1 = APIBKeyHi_EL1[63:0] : APIBKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - boolean IsEL1Regime = S1TranslationRegime() == EL1; - Enable = if IsEL1Regime then SCTLR_EL1.EnIB else SCTLR_EL2.EnIB; - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - Enable = SCTLR_EL1.EnIB; - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - Enable = SCTLR_EL2.EnIB; - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - Enable = SCTLR_EL3.EnIB; - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if Enable == '0' then return X; - elsif TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return AddPAC(X, Y, APIBKey_EL1, FALSE); - -// AArch64.PACFailException() -// ========================== -// Generates a PAC Fail Exception - -AArch64.PACFailException(bits(2) syndrome) - route_to_el2 = PSTATE.EL == EL0 && EL2Enabled() && HCR_EL2.TGE == '1'; - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - exception = ExceptionSyndrome(Exception_PACFail); - exception.syndrome[1:0] = syndrome; - exception.syndrome[24:2] = Zeros(); // RES0 - - if UInt(PSTATE.EL) > UInt(EL0) then - AArch64.TakeException(PSTATE.EL, exception, preferred_exception_return, vect_offset); - elsif route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(EL1, exception, preferred_exception_return, vect_offset); - -// HaveFPAC() -// ========== -// Returns TRUE if support for FPAC is implemented, FALSE otherwise. - -boolean HaveFPAC() - return HaveEnhancedPAC2() && boolean IMPLEMENTATION_DEFINED "Has FPAC functionality"; - -// HaveFPACCombined() -// ================== -// Returns TRUE if support for FPACCombined is implemented, FALSE otherwise. - -boolean HaveFPACCombined() - return HaveFPAC() && boolean IMPLEMENTATION_DEFINED "Has FPAC Combined functionality"; - -// Auth() -// ====== -// Restores the upper bits of the address to be all zeros or all ones (based on the -// value of bit[55]) and computes and checks the pointer authentication code. If the -// check passes, then the restored address is returned. If the check fails, the -// second-top and third-top bits of the extension bits in the pointer authentication code -// field are corrupted to ensure that accessing the address will give a translation fault. - -bits(64) Auth(bits(64) ptr, bits(64) modifier, bits(128) K, boolean data, bit key_number, boolean is_combined) - bits(64) PAC; - bits(64) result; - bits(64) original_ptr; - bits(2) error_code; - bits(64) extfield; - - // Reconstruct the extension field used of adding the PAC to the pointer - boolean tbi = CalculateTBI(ptr, data); - integer bottom_PAC_bit = CalculateBottomPACBit(ptr[55]); - extfield = Replicate(ptr[55], 64); - - if tbi then - original_ptr = ptr[63:56]:extfield[56-bottom_PAC_bit-1:0]:ptr[bottom_PAC_bit-1:0]; - else - original_ptr = extfield[64-bottom_PAC_bit-1:0]:ptr[bottom_PAC_bit-1:0]; - - PAC = ComputePAC(original_ptr, modifier, K[127:64], K[63:0]); - // Check pointer authentication code - if tbi then - if !HaveEnhancedPAC2() then - if PAC[54:bottom_PAC_bit] == ptr[54:bottom_PAC_bit] then - result = original_ptr; - else - error_code = key_number:NOT(key_number); - result = original_ptr[63:55]:error_code:original_ptr[52:0]; - else - result = ptr; - result[54:bottom_PAC_bit] = result[54:bottom_PAC_bit] EOR PAC[54:bottom_PAC_bit]; - if HaveFPACCombined() || (HaveFPAC() && !is_combined) then - if result[54:bottom_PAC_bit] != Replicate(result[55], (55-bottom_PAC_bit)) then - error_code = (if data then '1' else '0'):key_number; - AArch64.PACFailException(error_code); - else - if !HaveEnhancedPAC2() then - if PAC[54:bottom_PAC_bit] == ptr[54:bottom_PAC_bit] && PAC[63:56] == ptr[63:56] then - result = original_ptr; - else - error_code = key_number:NOT(key_number); - result = original_ptr[63]:error_code:original_ptr[60:0]; - else - result = ptr; - result[54:bottom_PAC_bit] = result[54:bottom_PAC_bit] EOR PAC[54:bottom_PAC_bit]; - result[63:56] = result[63:56] EOR PAC[63:56]; - if HaveFPACCombined() || (HaveFPAC() && !is_combined) then - if result[63:bottom_PAC_bit] != Replicate(result[55], (64-bottom_PAC_bit)) then - error_code = (if data then '1' else '0'):key_number; - AArch64.PACFailException(error_code); - return result; - -// AuthDA() -// ======== -// Returns a 64-bit value containing X, but replacing the pointer authentication code -// field bits with the extension of the address bits. The instruction checks a pointer -// authentication code in the pointer authentication code field bits of X, using the same -// algorithm and key as AddPACDA(). - -bits(64) AuthDA(bits(64) X, bits(64) Y, boolean is_combined) - boolean TrapEL2; - boolean TrapEL3; - bits(1) Enable; - bits(128) APDAKey_EL1; - - APDAKey_EL1 = APDAKeyHi_EL1[63:0] : APDAKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - boolean IsEL1Regime = S1TranslationRegime() == EL1; - Enable = if IsEL1Regime then SCTLR_EL1.EnDA else SCTLR_EL2.EnDA; - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - Enable = SCTLR_EL1.EnDA; - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - Enable = SCTLR_EL2.EnDA; - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - Enable = SCTLR_EL3.EnDA; - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if Enable == '0' then return X; - elsif TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return Auth(X, Y, APDAKey_EL1, TRUE, '0', is_combined); - -// AuthDB() -// ======== -// Returns a 64-bit value containing X, but replacing the pointer authentication code -// field bits with the extension of the address bits. The instruction checks a -// pointer authentication code in the pointer authentication code field bits of X, using -// the same algorithm and key as AddPACDB(). - -bits(64) AuthDB(bits(64) X, bits(64) Y, boolean is_combined) - boolean TrapEL2; - boolean TrapEL3; - bits(1) Enable; - bits(128) APDBKey_EL1; - - APDBKey_EL1 = APDBKeyHi_EL1[63:0] : APDBKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - boolean IsEL1Regime = S1TranslationRegime() == EL1; - Enable = if IsEL1Regime then SCTLR_EL1.EnDB else SCTLR_EL2.EnDB; - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - Enable = SCTLR_EL1.EnDB; - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - Enable = SCTLR_EL2.EnDB; - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - Enable = SCTLR_EL3.EnDB; - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if Enable == '0' then return X; - elsif TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return Auth(X, Y, APDBKey_EL1, TRUE, '1', is_combined); - -// AuthIA() -// ======== -// Returns a 64-bit value containing X, but replacing the pointer authentication code -// field bits with the extension of the address bits. The instruction checks a pointer -// authentication code in the pointer authentication code field bits of X, using the same -// algorithm and key as AddPACIA(). - -bits(64) AuthIA(bits(64) X, bits(64) Y, boolean is_combined) - boolean TrapEL2; - boolean TrapEL3; - bits(1) Enable; - bits(128) APIAKey_EL1; - - APIAKey_EL1 = APIAKeyHi_EL1[63:0] : APIAKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - boolean IsEL1Regime = S1TranslationRegime() == EL1; - Enable = if IsEL1Regime then SCTLR_EL1.EnIA else SCTLR_EL2.EnIA; - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - Enable = SCTLR_EL1.EnIA; - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - Enable = SCTLR_EL2.EnIA; - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - Enable = SCTLR_EL3.EnIA; - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if Enable == '0' then return X; - elsif TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return Auth(X, Y, APIAKey_EL1, FALSE, '0', is_combined); - -// AuthIB() -// ======== -// Returns a 64-bit value containing X, but replacing the pointer authentication code -// field bits with the extension of the address bits. The instruction checks a pointer -// authentication code in the pointer authentication code field bits of X, using the same -// algorithm and key as AddPACIB(). - -bits(64) AuthIB(bits(64) X, bits(64) Y, boolean is_combined) - boolean TrapEL2; - boolean TrapEL3; - bits(1) Enable; - bits(128) APIBKey_EL1; - - APIBKey_EL1 = APIBKeyHi_EL1[63:0] : APIBKeyLo_EL1[63:0]; - case PSTATE.EL of - when EL0 - boolean IsEL1Regime = S1TranslationRegime() == EL1; - Enable = if IsEL1Regime then SCTLR_EL1.EnIB else SCTLR_EL2.EnIB; - TrapEL2 = (EL2Enabled() && HCR_EL2.API == '0' && - (HCR_EL2.TGE == '0' || HCR_EL2.E2H == '0')); - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL1 - Enable = SCTLR_EL1.EnIB; - TrapEL2 = EL2Enabled() && HCR_EL2.API == '0'; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL2 - Enable = SCTLR_EL2.EnIB; - TrapEL2 = FALSE; - TrapEL3 = HaveEL(EL3) && SCR_EL3.API == '0'; - when EL3 - Enable = SCTLR_EL3.EnIB; - TrapEL2 = FALSE; - TrapEL3 = FALSE; - - if Enable == '0' then return X; - elsif TrapEL2 then TrapPACUse(EL2); - elsif TrapEL3 then TrapPACUse(EL3); - else return Auth(X, Y, APIBKey_EL1, FALSE, '1', is_combined); - -// TweakCellInvRot() -// ================= - -bits(4) TweakCellInvRot(bits(4)incell) - bits(4) outcell; - outcell[3] = incell[2]; - outcell[2] = incell[1]; - outcell[1] = incell[0]; - outcell[0] = incell[0] EOR incell[3]; - return outcell; - -// TweakInvShuffle() -// ================= - -bits(64) TweakInvShuffle(bits(64)indata) - bits(64) outdata; - outdata[3:0] = TweakCellInvRot(indata[51:48]); - outdata[7:4] = indata[55:52]; - outdata[11:8] = indata[23:20]; - outdata[15:12] = indata[27:24]; - outdata[19:16] = indata[3:0]; - outdata[23:20] = indata[7:4]; - outdata[27:24] = TweakCellInvRot(indata[11:8]); - outdata[31:28] = indata[15:12]; - outdata[35:32] = TweakCellInvRot(indata[31:28]); - outdata[39:36] = TweakCellInvRot(indata[63:60]); - outdata[43:40] = TweakCellInvRot(indata[59:56]); - outdata[47:44] = TweakCellInvRot(indata[19:16]); - outdata[51:48] = indata[35:32]; - outdata[55:52] = indata[39:36]; - outdata[59:56] = indata[43:40]; - outdata[63:60] = TweakCellInvRot(indata[47:44]); - return outdata; - -// Strip() -// ======= -// Strip() returns a 64-bit value containing A, but replacing the pointer authentication -// code field bits with the extension of the address bits. This can apply to either -// instructions or data, where, as the use of tagged pointers is distinct, it might be -// handled differently. - -bits(64) Strip(bits(64) A, boolean data) - bits(64) original_ptr; - bits(64) extfield; - boolean tbi = CalculateTBI(A, data); - integer bottom_PAC_bit = CalculateBottomPACBit(A[55]); - extfield = Replicate(A[55], 64); - - if tbi then - original_ptr = A[63:56]:extfield[ 56-bottom_PAC_bit-1:0]:A[bottom_PAC_bit-1:0]; - else - original_ptr = extfield[ 64-bottom_PAC_bit-1:0]:A[bottom_PAC_bit-1:0]; - - return original_ptr; - -AArch64.ResetSystemRegisters(boolean cold_reset); - -// PC - non-assignment form -// ======================== -// Read program counter. - -bits(64) PC[] - return _PC; - -// Vpart[] - non-assignment form -// ============================= -// Reads a 128-bit SIMD&FP register in up to two parts: -// part 0 returns the bottom 8, 16, 32 or 64 bits of a value held in the register; -// part 1 returns the top half of the bottom 64 bits or the top half of the 128-bit -// value held in the register. - -bits(width) Vpart[integer n, integer part] - assert n >= 0 && n <= 31; - assert part IN {0, 1}; - if part == 0 then - assert width < 128; - return V[n]; - else - assert width IN {32,64}; - bits(128) vreg = V[n]; - return vreg[(width * 2)-1:width]; - -// Vpart[] - assignment form -// ========================= -// Writes a 128-bit SIMD&FP register in up to two parts: -// part 0 zero extends a 8, 16, 32, or 64-bit value to fill the whole register; -// part 1 inserts a 64-bit value into the top half of the register. - -Vpart[integer n, integer part] = bits(width) value - assert n >= 0 && n <= 31; - assert part IN {0, 1}; - if part == 0 then - assert width < 128; - V[n] = value; - else - assert width == 64; - bits(64) vreg = V[n]; - V[n] = value[63:0] : vreg; - -// FloorPow2() -// =========== -// For a positive integer X, return the largest power of 2 <= X - -integer FloorPow2(integer x) - assert x >= 0; - integer n = 1; - if x == 0 then return 0; - while x >= 2^n do - n = n + 1; - return 2^(n - 1); - -// CeilPow2() -// ========== - -// For a positive integer X, return the smallest power of 2 >= X - -integer CeilPow2(integer x) - if x == 0 then return 0; - if x == 1 then return 2; - return FloorPow2(x - 1) * 2; - -// SVEAccessTrap() -// =============== -// Trapped access to SVE registers due to CPACR_EL1, CPTR_EL2, or CPTR_EL3. - -SVEAccessTrap(bits(2) target_el) - assert UInt(target_el) >= UInt(PSTATE.EL) && target_el != EL0 && HaveEL(target_el); - route_to_el2 = target_el == EL1 && EL2Enabled() && HCR_EL2.TGE == '1'; - - exception = ExceptionSyndrome(Exception_SVEAccessTrap); - bits(64) preferred_exception_return = ThisInstrAddr(); - vect_offset = 0x0; - - if route_to_el2 then - AArch64.TakeException(EL2, exception, preferred_exception_return, vect_offset); - else - AArch64.TakeException(target_el, exception, preferred_exception_return, vect_offset); - -// CheckSVEEnabled() -// ================= -// Checks for traps on SVE instructions and instructions that -// access SVE System registers. - -CheckSVEEnabled() - // Check if access disabled in CPACR_EL1 - if PSTATE.EL IN {EL0, EL1} && !IsInHost() then - // Check SVE at EL0/EL1 - case CPACR_EL1.ZEN of - when 'x0' disabled = TRUE; - when '01' disabled = PSTATE.EL == EL0; - when '11' disabled = FALSE; - if disabled then SVEAccessTrap(EL1); - - // Check SIMD&FP at EL0/EL1 - case CPACR_EL1.FPEN of - when 'x0' disabled = TRUE; - when '01' disabled = PSTATE.EL == EL0; - when '11' disabled = FALSE; - if disabled then AArch64.AdvSIMDFPAccessTrap(EL1); - - // Check if access disabled in CPTR_EL2 - if PSTATE.EL IN {EL0, EL1, EL2} && EL2Enabled() then - if HaveVirtHostExt() && HCR_EL2.E2H == '1' then - // Check SVE at EL2 - case CPTR_EL2.ZEN of - when 'x0' disabled = TRUE; - when '01' disabled = PSTATE.EL == EL0 && HCR_EL2.TGE == '1'; - when '11' disabled = FALSE; - if disabled then SVEAccessTrap(EL2); - - // Check SIMD&FP at EL2 - case CPTR_EL2.FPEN of - when 'x0' disabled = TRUE; - when '01' disabled = PSTATE.EL == EL0 && HCR_EL2.TGE == '1'; - when '11' disabled = FALSE; - if disabled then AArch64.AdvSIMDFPAccessTrap(EL2); - else - if CPTR_EL2.TZ == '1' then SVEAccessTrap(EL2); - if CPTR_EL2.TFP == '1' then AArch64.AdvSIMDFPAccessTrap(EL2); - - // Check if access disabled in CPTR_EL3 - if HaveEL(EL3) then - if CPTR_EL3.EZ == '0' then SVEAccessTrap(EL3); - if CPTR_EL3.TFP == '1' then AArch64.AdvSIMDFPAccessTrap(EL3); - -// DecodePredCount() -// ================= - -integer DecodePredCount(bits(5) pattern, integer esize) - integer elements = VL DIV esize; - integer numElem; - case pattern of - when '00000' numElem = FloorPow2(elements); - when '00001' numElem = if elements >= 1 then 1 else 0; - when '00010' numElem = if elements >= 2 then 2 else 0; - when '00011' numElem = if elements >= 3 then 3 else 0; - when '00100' numElem = if elements >= 4 then 4 else 0; - when '00101' numElem = if elements >= 5 then 5 else 0; - when '00110' numElem = if elements >= 6 then 6 else 0; - when '00111' numElem = if elements >= 7 then 7 else 0; - when '01000' numElem = if elements >= 8 then 8 else 0; - when '01001' numElem = if elements >= 16 then 16 else 0; - when '01010' numElem = if elements >= 32 then 32 else 0; - when '01011' numElem = if elements >= 64 then 64 else 0; - when '01100' numElem = if elements >= 128 then 128 else 0; - when '01101' numElem = if elements >= 256 then 256 else 0; - when '11101' numElem = elements - (elements MOD 4); - when '11110' numElem = elements - (elements MOD 3); - when '11111' numElem = elements; - otherwise numElem = 0; - return numElem; - -// ElemP[] - non-assignment form -// ============================= - -bit ElemP[bits(N) pred, integer e, integer esize] - integer n = e * (esize DIV 8); - assert n >= 0 && n < N; - return pred[n]; - -// ElemP[] - assignment form -// ========================= - -ElemP[bits(N) &pred, integer e, integer esize] = bit value - integer psize = esize DIV 8; - integer n = e * psize; - assert n >= 0 && (n + psize) <= N; - pred[n+psize-1:n] = ZeroExtend(value, psize); - return; - -// PL - non-assignment form -// ======================== - -integer PL - return VL DIV 8; - -// ElemFFR[] - non-assignment form -// =============================== - -bit ElemFFR[integer e, integer esize] - return ElemP[_FFR, e, esize]; - -// ElemFFR[] - assignment form -// =========================== - -ElemFFR[integer e, integer esize] = bit value - integer psize = esize DIV 8; - integer n = e * psize; - assert n >= 0 && (n + psize) <= PL; - _FFR[n+psize-1:n] = ZeroExtend(value, psize); - return; - -// FFR[] - non-assignment form -// =========================== - -bits(width) FFR[] - assert width == PL; - return _FFR[width-1:0]; - -// FFR[] - assignment form -// ======================= - -FFR[] = bits(width) value - assert width == PL; - if ConstrainUnpredictableBool(Unpredictable_SVEZEROUPPER) then - _FFR = ZeroExtend(value); - else - _FFR[width-1:0] = value; - -// FPCompareNE() -// ============= - -boolean FPCompareNE(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - if type1==FPType_SNaN || type1==FPType_QNaN || type2==FPType_SNaN || type2==FPType_QNaN then - result = TRUE; - if type1==FPType_SNaN || type2==FPType_SNaN then - FPProcessException(FPExc_InvalidOp, fpcr); - else // All non-NaN cases can be evaluated on the values produced by FPUnpack() - result = (value1 != value2); - return result; - -// FPCompareUN() -// ============= - -boolean FPCompareUN(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - if type1==FPType_SNaN || type2==FPType_SNaN then - FPProcessException(FPExc_InvalidOp, fpcr); - return (type1==FPType_SNaN || type1==FPType_QNaN || type2==FPType_SNaN || type2==FPType_QNaN); - -// FPConvertNaN() -// ============== -// Converts a NaN of one floating-point type1 to another - -bits(M) FPConvertNaN(bits(N) op) - assert N IN {16,32,64}; - assert M IN {16,32,64}; - bits(M) result; - bits(51) frac; - - sign = op[N-1]; - - // Unpack payload from input NaN - case N of - when 64 frac = op[50:0]; - when 32 frac = op[21:0]:Zeros(29); - when 16 frac = op[8:0]:Zeros(42); - - // Repack payload into output NaN, while - // converting an SNaN to a QNaN. - case M of - when 64 result = sign:Ones(M-52):frac; - when 32 result = sign:Ones(M-23):frac[50:29]; - when 16 result = sign:Ones(M-10):frac[50:42]; - - return result; - -// FPRoundCV() -// =========== -// Used for FP [-] FP conversion instructions. -// For half-precision data ignores FZ16 and observes AHP. - -bits(N) FPRoundCV(real op, FPCRType fpcr, FPRounding rounding) - fpcr.FZ16 = '0'; - boolean isbfloat = FALSE; - return FPRoundBase(op, fpcr, rounding, isbfloat); - -// FPUnpackCV() -// ============ -// -// Used for FP [-] FP conversion instructions. -// For half-precision data ignores FZ16 and observes AHP. - -(FPType, bit, real) FPUnpackCV(bits(N) fpval, FPCRType fpcr) - fpcr.FZ16 = '0'; - (fp_type, sign, value) = FPUnpackBase(fpval, fpcr); - return (fp_type, sign, value); - -// FPConvert() -// =========== - -// Convert floating point OP with N-bit precision to M-bit precision, -// with rounding controlled by ROUNDING. -// This is used by the FP-to-FP conversion instructions and so for -// half-precision data ignores FZ16, but observes AHP. - -bits(M) FPConvert(bits(N) op, FPCRType fpcr, FPRounding rounding) - assert M IN {16,32,64}; - assert N IN {16,32,64}; - bits(M) result; - - // Unpack floating-point operand optionally with flush-to-zero. - (fptype,sign,value) = FPUnpackCV(op, fpcr); - - alt_hp = (M == 16) && (fpcr.AHP == '1'); - - if fptype == FPType_SNaN || fptype == FPType_QNaN then - if alt_hp then - result = FPZero(sign); - elsif fpcr.DN == '1' then - result = FPDefaultNaN(); - else - result = FPConvertNaN(op); - if fptype == FPType_SNaN || alt_hp then - FPProcessException(FPExc_InvalidOp,fpcr); - elsif fptype == FPType_Infinity then - if alt_hp then - result = sign:Ones(M-1); - FPProcessException(FPExc_InvalidOp, fpcr); - else - result = FPInfinity(sign); - elsif fptype == FPType_Zero then - result = FPZero(sign); - else - result = FPRoundCV(value, fpcr, rounding); - return result; - -// FPConvert() -// =========== - -bits(M) FPConvert(bits(N) op, FPCRType fpcr) - return FPConvert(op, fpcr, FPRoundingMode(fpcr)); - -// FPConvertSVE() -// ============== - -bits(M) FPConvertSVE(bits(N) op, FPCRType fpcr, FPRounding rounding) - fpcr.AHP = '0'; - return FPConvert(op, fpcr, rounding); - -// FPConvertSVE() -// ============== - -bits(M) FPConvertSVE(bits(N) op, FPCRType fpcr) - fpcr.AHP = '0'; - return FPConvert(op, fpcr, FPRoundingMode(fpcr)); - -// FPExpCoefficient() -// ================== - -bits(N) FPExpCoefficient[integer index] - assert N IN {16,32,64}; - integer result; - - if N == 16 then - case index of - when 0 result = 0x0000; - when 1 result = 0x0016; - when 2 result = 0x002d; - when 3 result = 0x0045; - when 4 result = 0x005d; - when 5 result = 0x0075; - when 6 result = 0x008e; - when 7 result = 0x00a8; - when 8 result = 0x00c2; - when 9 result = 0x00dc; - when 10 result = 0x00f8; - when 11 result = 0x0114; - when 12 result = 0x0130; - when 13 result = 0x014d; - when 14 result = 0x016b; - when 15 result = 0x0189; - when 16 result = 0x01a8; - when 17 result = 0x01c8; - when 18 result = 0x01e8; - when 19 result = 0x0209; - when 20 result = 0x022b; - when 21 result = 0x024e; - when 22 result = 0x0271; - when 23 result = 0x0295; - when 24 result = 0x02ba; - when 25 result = 0x02e0; - when 26 result = 0x0306; - when 27 result = 0x032e; - when 28 result = 0x0356; - when 29 result = 0x037f; - when 30 result = 0x03a9; - when 31 result = 0x03d4; - - elsif N == 32 then - case index of - when 0 result = 0x000000; - when 1 result = 0x0164d2; - when 2 result = 0x02cd87; - when 3 result = 0x043a29; - when 4 result = 0x05aac3; - when 5 result = 0x071f62; - when 6 result = 0x08980f; - when 7 result = 0x0a14d5; - when 8 result = 0x0b95c2; - when 9 result = 0x0d1adf; - when 10 result = 0x0ea43a; - when 11 result = 0x1031dc; - when 12 result = 0x11c3d3; - when 13 result = 0x135a2b; - when 14 result = 0x14f4f0; - when 15 result = 0x16942d; - when 16 result = 0x1837f0; - when 17 result = 0x19e046; - when 18 result = 0x1b8d3a; - when 19 result = 0x1d3eda; - when 20 result = 0x1ef532; - when 21 result = 0x20b051; - when 22 result = 0x227043; - when 23 result = 0x243516; - when 24 result = 0x25fed7; - when 25 result = 0x27cd94; - when 26 result = 0x29a15b; - when 27 result = 0x2b7a3a; - when 28 result = 0x2d583f; - when 29 result = 0x2f3b79; - when 30 result = 0x3123f6; - when 31 result = 0x3311c4; - when 32 result = 0x3504f3; - when 33 result = 0x36fd92; - when 34 result = 0x38fbaf; - when 35 result = 0x3aff5b; - when 36 result = 0x3d08a4; - when 37 result = 0x3f179a; - when 38 result = 0x412c4d; - when 39 result = 0x4346cd; - when 40 result = 0x45672a; - when 41 result = 0x478d75; - when 42 result = 0x49b9be; - when 43 result = 0x4bec15; - when 44 result = 0x4e248c; - when 45 result = 0x506334; - when 46 result = 0x52a81e; - when 47 result = 0x54f35b; - when 48 result = 0x5744fd; - when 49 result = 0x599d16; - when 50 result = 0x5bfbb8; - when 51 result = 0x5e60f5; - when 52 result = 0x60ccdf; - when 53 result = 0x633f89; - when 54 result = 0x65b907; - when 55 result = 0x68396a; - when 56 result = 0x6ac0c7; - when 57 result = 0x6d4f30; - when 58 result = 0x6fe4ba; - when 59 result = 0x728177; - when 60 result = 0x75257d; - when 61 result = 0x77d0df; - when 62 result = 0x7a83b3; - when 63 result = 0x7d3e0c; - - else // N == 64 - case index of - when 0 result = 0x0000000000000; - when 1 result = 0x02C9A3E778061; - when 2 result = 0x059B0D3158574; - when 3 result = 0x0874518759BC8; - when 4 result = 0x0B5586CF9890F; - when 5 result = 0x0E3EC32D3D1A2; - when 6 result = 0x11301D0125B51; - when 7 result = 0x1429AAEA92DE0; - when 8 result = 0x172B83C7D517B; - when 9 result = 0x1A35BEB6FCB75; - when 10 result = 0x1D4873168B9AA; - when 11 result = 0x2063B88628CD6; - when 12 result = 0x2387A6E756238; - when 13 result = 0x26B4565E27CDD; - when 14 result = 0x29E9DF51FDEE1; - when 15 result = 0x2D285A6E4030B; - when 16 result = 0x306FE0A31B715; - when 17 result = 0x33C08B26416FF; - when 18 result = 0x371A7373AA9CB; - when 19 result = 0x3A7DB34E59FF7; - when 20 result = 0x3DEA64C123422; - when 21 result = 0x4160A21F72E2A; - when 22 result = 0x44E086061892D; - when 23 result = 0x486A2B5C13CD0; - when 24 result = 0x4BFDAD5362A27; - when 25 result = 0x4F9B2769D2CA7; - when 26 result = 0x5342B569D4F82; - when 27 result = 0x56F4736B527DA; - when 28 result = 0x5AB07DD485429; - when 29 result = 0x5E76F15AD2148; - when 30 result = 0x6247EB03A5585; - when 31 result = 0x6623882552225; - when 32 result = 0x6A09E667F3BCD; - when 33 result = 0x6DFB23C651A2F; - when 34 result = 0x71F75E8EC5F74; - when 35 result = 0x75FEB564267C9; - when 36 result = 0x7A11473EB0187; - when 37 result = 0x7E2F336CF4E62; - when 38 result = 0x82589994CCE13; - when 39 result = 0x868D99B4492ED; - when 40 result = 0x8ACE5422AA0DB; - when 41 result = 0x8F1AE99157736; - when 42 result = 0x93737B0CDC5E5; - when 43 result = 0x97D829FDE4E50; - when 44 result = 0x9C49182A3F090; - when 45 result = 0xA0C667B5DE565; - when 46 result = 0xA5503B23E255D; - when 47 result = 0xA9E6B5579FDBF; - when 48 result = 0xAE89F995AD3AD; - when 49 result = 0xB33A2B84F15FB; - when 50 result = 0xB7F76F2FB5E47; - when 51 result = 0xBCC1E904BC1D2; - when 52 result = 0xC199BDD85529C; - when 53 result = 0xC67F12E57D14B; - when 54 result = 0xCB720DCEF9069; - when 55 result = 0xD072D4A07897C; - when 56 result = 0xD5818DCFBA487; - when 57 result = 0xDA9E603DB3285; - when 58 result = 0xDFC97337B9B5F; - when 59 result = 0xE502EE78B3FF6; - when 60 result = 0xEA4AFA2A490DA; - when 61 result = 0xEFA1BEE615A27; - when 62 result = 0xF50765B6E4540; - when 63 result = 0xFA7C1819E90D8; - - return result[N-1:0]; - -// FPExpA() -// ======== - -bits(N) FPExpA(bits(N) op) - assert N IN {16,32,64}; - bits(N) result; - bits(N) coeff; - integer idx = if N == 16 then UInt(op[4:0]) else UInt(op[5:0]); - coeff = FPExpCoefficient[idx]; - if N == 16 then - result[15:0] = '0':op[9:5]:coeff[9:0]; - elsif N == 32 then - result[31:0] = '0':op[13:6]:coeff[22:0]; - else // N == 64 - result[63:0] = '0':op[16:6]:coeff[51:0]; - - return result; - -// FPMinNormal() -// ============= - -bits(N) FPMinNormal(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - exp = Zeros(E-1):'1'; - frac = Zeros(F); - return sign : exp : frac; - -// FPOne() -// ======= - -bits(N) FPOne(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - exp = '0':Ones(E-1); - frac = Zeros(F); - return sign : exp : frac; - -// FPPointFive() -// ============= - -bits(N) FPPointFive(bit sign) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - (E + 1); - exp = '0':Ones(E-2):'0'; - frac = Zeros(F); - return sign : exp : frac; - -// FPProcess() -// =========== - -bits(N) FPProcess(bits(N) input) - bits(N) result; - assert N IN {16,32,64}; - (fptype,sign,value) = FPUnpack(input, FPCR); - if fptype == FPType_SNaN || fptype == FPType_QNaN then - result = FPProcessNaN(fptype, input, FPCR); - elsif fptype == FPType_Infinity then - result = FPInfinity(sign); - elsif fptype == FPType_Zero then - result = FPZero(sign); - else - result = FPRound(value, FPCR); - return result; - -// FPScale() -// ========= - -bits(N) FPScale(bits (N) op, integer scale, FPCRType fpcr) - assert N IN {16,32,64}; - (fptype,sign,value) = FPUnpack(op, fpcr); - if fptype == FPType_SNaN || fptype == FPType_QNaN then - result = FPProcessNaN(fptype, op, fpcr); - elsif fptype == FPType_Zero then - result = FPZero(sign); - elsif fptype == FPType_Infinity then - result = FPInfinity(sign); - else - result = FPRound(value * (2.0^scale), fpcr); - return result; - -// FPProcessNaNs3() -// ================ -// -// The boolean part of the return value says whether a NaN has been found and -// processed. The bits(N) part is only relevant if it has and supplies the -// result of the operation. -// -// The 'fpcr' argument supplies FPCR control bits. Status information is -// updated directly in the FPSR where appropriate. - -(boolean, bits(N)) FPProcessNaNs3(FPType type1, FPType type2, FPType type3, - bits(N) op1, bits(N) op2, bits(N) op3, - FPCRType fpcr) - assert N IN {16,32,64}; - if type1 == FPType_SNaN then - done = TRUE; result = FPProcessNaN(type1, op1, fpcr); - elsif type2 == FPType_SNaN then - done = TRUE; result = FPProcessNaN(type2, op2, fpcr); - elsif type3 == FPType_SNaN then - done = TRUE; result = FPProcessNaN(type3, op3, fpcr); - elsif type1 == FPType_QNaN then - done = TRUE; result = FPProcessNaN(type1, op1, fpcr); - elsif type2 == FPType_QNaN then - done = TRUE; result = FPProcessNaN(type2, op2, fpcr); - elsif type3 == FPType_QNaN then - done = TRUE; result = FPProcessNaN(type3, op3, fpcr); - else - done = FALSE; result = Zeros(); // 'Don't care' result - return (done, result); - -// FPMulAdd() -// ========== -// -// Calculates addend + op1*op2 with a single rounding. - -bits(N) FPMulAdd(bits(N) addend, bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - rounding = FPRoundingMode(fpcr); - (typeA,signA,valueA) = FPUnpack(addend, fpcr); - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - inf1 = (type1 == FPType_Infinity); zero1 = (type1 == FPType_Zero); - inf2 = (type2 == FPType_Infinity); zero2 = (type2 == FPType_Zero); - (done,result) = FPProcessNaNs3(typeA, type1, type2, addend, op1, op2, fpcr); - - if typeA == FPType_QNaN && ((inf1 && zero2) || (zero1 && inf2)) then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - - if !done then - infA = (typeA == FPType_Infinity); zeroA = (typeA == FPType_Zero); - - // Determine sign and type1 product will have if it does not cause an Invalid - // Operation. - signP = sign1 EOR sign2; - infP = inf1 || inf2; - zeroP = zero1 || zero2; - - // Non SNaN-generated Invalid Operation cases are multiplies of zero by infinity and - // additions of opposite-signed infinities. - if (inf1 && zero2) || (zero1 && inf2) || (infA && infP && signA != signP) then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - - // Other cases involving infinities produce an infinity of the same sign. - elsif (infA && signA == '0') || (infP && signP == '0') then - result = FPInfinity('0'); - elsif (infA && signA == '1') || (infP && signP == '1') then - result = FPInfinity('1'); - - // Cases where the result is exactly zero and its sign is not determined by the - // rounding mode are additions of same-signed zeros. - elsif zeroA && zeroP && signA == signP then - result = FPZero(signA); - - // Otherwise calculate numerical result and round it. - else - result_value = valueA + (value1 * value2); - if result_value == 0.0 then // Sign of exact zero result depends on rounding mode - result_sign = if rounding == FPRounding_NEGINF then '1' else '0'; - result = FPZero(result_sign); - else - result = FPRound(result_value, fpcr); - - return result; - -// FPTrigMAddCoefficient() -// ======================= - -bits(N) FPTrigMAddCoefficient[integer index] - assert N IN {16,32,64}; - integer result; - - if N == 16 then - case index of - when 0 result = 0x3c00; - when 1 result = 0xb155; - when 2 result = 0x2030; - when 3 result = 0x0000; - when 4 result = 0x0000; - when 5 result = 0x0000; - when 6 result = 0x0000; - when 7 result = 0x0000; - when 8 result = 0x3c00; - when 9 result = 0xb800; - when 10 result = 0x293a; - when 11 result = 0x0000; - when 12 result = 0x0000; - when 13 result = 0x0000; - when 14 result = 0x0000; - when 15 result = 0x0000; - elsif N == 32 then - case index of - when 0 result = 0x3f800000; - when 1 result = 0xbe2aaaab; - when 2 result = 0x3c088886; - when 3 result = 0xb95008b9; - when 4 result = 0x36369d6d; - when 5 result = 0x00000000; - when 6 result = 0x00000000; - when 7 result = 0x00000000; - when 8 result = 0x3f800000; - when 9 result = 0xbf000000; - when 10 result = 0x3d2aaaa6; - when 11 result = 0xbab60705; - when 12 result = 0x37cd37cc; - when 13 result = 0x00000000; - when 14 result = 0x00000000; - when 15 result = 0x00000000; - else // N == 64 - case index of - when 0 result = 0x3ff0000000000000; - when 1 result = 0xbfc5555555555543; - when 2 result = 0x3f8111111110f30c; - when 3 result = 0xbf2a01a019b92fc6; - when 4 result = 0x3ec71de351f3d22b; - when 5 result = 0xbe5ae5e2b60f7b91; - when 6 result = 0x3de5d8408868552f; - when 7 result = 0x0000000000000000; - when 8 result = 0x3ff0000000000000; - when 9 result = 0xbfe0000000000000; - when 10 result = 0x3fa5555555555536; - when 11 result = 0xbf56c16c16c13a0b; - when 12 result = 0x3efa01a019b1e8d8; - when 13 result = 0xbe927e4f7282f468; - when 14 result = 0x3e21ee96d2641b13; - when 15 result = 0xbda8f76380fbb401; - - return result[N-1:0]; - -// FPTrigMAdd() -// ============ - -bits(N) FPTrigMAdd(integer x, bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - assert x >= 0; - assert x < 8; - bits(N) coeff; - - if op2[N-1] == '1' then - x = x + 8; - op2[N-1] = '0'; - - coeff = FPTrigMAddCoefficient[x]; - result = FPMulAdd(coeff, op1, op2, fpcr); - - return result; - -// FPTrigSMul() -// ============ - -bits(N) FPTrigSMul(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - result = FPMul(op1, op1, fpcr); - (fptype, sign, value) = FPUnpack(result, fpcr); - if (fptype != FPType_QNaN) && (fptype != FPType_SNaN) then - result[N-1] = op2[0]; - - return result; - -// FPTrigSSel() -// ============ - -bits(N) FPTrigSSel(bits(N) op1, bits(N) op2) - assert N IN {16,32,64}; - bits(N) result; - - if op2[0] == '1' then - result = FPOne(op2[1]); - else - result = op1; - result[N-1] = result[N-1] EOR op2[1]; - - return result; - -// FirstActive() -// ============= - -bit FirstActive(bits(N) mask, bits(N) x, integer esize) - integer elements = N DIV (esize DIV 8); - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then return ElemP[x, e, esize]; - return '0'; - -// HaveSVEFP32MatMulExt() -// ====================== -// Returns TRUE if single-precision floating-point matrix multiply instruction support implemented and FALSE otherwise. - -boolean HaveSVEFP32MatMulExt() - return HaveSVE() && boolean IMPLEMENTATION_DEFINED "Have SVE FP32 Matrix Multiply extension"; - -// HaveSVEFP64MatMulExt() -// ====================== -// Returns TRUE if double-precision floating-point matrix multiply instruction support implemented and FALSE otherwise. - -boolean HaveSVEFP64MatMulExt() - return HaveSVE() && boolean IMPLEMENTATION_DEFINED "Have SVE FP64 Matrix Multiply extension"; - -// IsEven() -// ======== - -boolean IsEven(integer val) - return val MOD 2 == 0; - -// LastActive() -// ============ - -bit LastActive(bits(N) mask, bits(N) x, integer esize) - integer elements = N DIV (esize DIV 8); - for e = elements-1 downto 0 - if ElemP[mask, e, esize] == '1' then return ElemP[x, e, esize]; - return '0'; - -// LastActiveElement() -// =================== - -integer LastActiveElement(bits(N) mask, integer esize) - assert esize IN {8, 16, 32, 64}; - integer elements = VL DIV esize; - for e = elements-1 downto 0 - if ElemP[mask, e, esize] == '1' then return e; - return -1; - -// MemNF[] - non-assignment form -// ============================= - -(bits(8*size), boolean) MemNF[bits(64) address, integer size, AccType acctype] - assert size IN {1, 2, 4, 8, 16}; - bits(8*size) value; - - aligned = (address == Align(address, size)); - A = SCTLR[].A; - - if !aligned && (A == '1') then - return (bits(8*size) UNKNOWN, TRUE); - - atomic = aligned || size == 1; - - if !atomic then - (value[7:0], bad) = MemSingleNF[address, 1, acctype, aligned]; - - if bad then - return (bits(8*size) UNKNOWN, TRUE); - - // For subsequent bytes it is CONSTRAINED UNPREDICTABLE whether an unaligned Device memory - // access will generate an Alignment Fault, as to get this far means the first byte did - // not, so we must be changing to a new translation page. - if !aligned then - c = ConstrainUnpredictable(Unpredictable_DEVPAGE2); - assert c IN {Constraint_FAULT, Constraint_NONE}; - if c == Constraint_NONE then aligned = TRUE; - - for i = 1 to size-1 - (value[8*i+7:8*i], bad) = MemSingleNF[address+i, 1, acctype, aligned]; - - if bad then - return (bits(8*size) UNKNOWN, TRUE); - else - (value, bad) = MemSingleNF[address, size, acctype, aligned]; - if bad then - return (bits(8*size) UNKNOWN, TRUE); - - if BigEndian() then - value = BigEndianReverse(value); - - return (value, FALSE); - -// MemSingleNF[] - non-assignment form -// =================================== - -(bits(8*size), boolean) MemSingleNF[bits(64) address, integer size, AccType acctype, boolean wasaligned] - bits(8*size) value; - boolean iswrite = FALSE; - AddressDescriptor memaddrdesc; - - // Implementation may suppress NF load for any reason - if ConstrainUnpredictableBool(Unpredictable_NONFAULT) then - return (bits(8*size) UNKNOWN, TRUE); - - // MMU or MPU - memaddrdesc = AArch64.TranslateAddress(address, acctype, iswrite, wasaligned, size); - - // Non-fault load from Device memory must not be performed externally - if memaddrdesc.memattrs.memtype == MemType_Device then - return (bits(8*size) UNKNOWN, TRUE); - - // Check for aborts or debug exceptions - if IsFault(memaddrdesc) then - return (bits(8*size) UNKNOWN, TRUE); - - // Memory array access - accdesc = CreateAccessDescriptor(acctype); - if HaveMTEExt() then - if AArch64.AccessIsTagChecked(address, acctype) then - bits(4) ptag = AArch64.PhysicalTag(address); - if !AArch64.CheckTag(memaddrdesc, ptag, iswrite) then - return (bits(8*size) UNKNOWN, TRUE); - value = _Mem[memaddrdesc, size, accdesc]; - - return (value, FALSE); - -// NoneActive() -// ============ - -bit NoneActive(bits(N) mask, bits(N) x, integer esize) - integer elements = N DIV (esize DIV 8); - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' && ElemP[x, e, esize] == '1' then return '0'; - return '1'; - -// P[] - non-assignment form -// ========================= - -bits(width) P[integer n] - assert n >= 0 && n <= 31; - assert width == PL; - return _P[n][width-1:0]; - -// P[] - assignment form -// ===================== - -P[integer n] = bits(width) value - assert n >= 0 && n <= 31; - assert width == PL; - if ConstrainUnpredictableBool(Unpredictable_SVEZEROUPPER) then - _P[n] = ZeroExtend(value); - else - _P[n][width-1:0] = value; - -// PredTest() -// ========== - -bits(4) PredTest(bits(N) mask, bits(N) result, integer esize) - bit n = FirstActive(mask, result, esize); - bit z = NoneActive(mask, result, esize); - bit c = NOT LastActive(mask, result, esize); - bit v = '0'; - return n:z:c:v; - -// Elem[] - non-assignment form -// ============================ - -bits(size) Elem[bits(N) vector, integer e, integer size] - assert e >= 0 && (e+1)*size <= N; - return vector[e*size+size-1 : e*size]; - -// Elem[] - non-assignment form -// ============================ - -bits(size) Elem[bits(N) vector, integer e] - return Elem[vector, e, size]; - -// Elem[] - assignment form -// ======================== - -Elem[bits(N) &vector, integer e, integer size] = bits(size) value - assert e >= 0 && (e+1)*size <= N; - vector[(e+1)*size-1:e*size] = value; - return; - -// Elem[] - assignment form -// ======================== - -Elem[bits(N) &vector, integer e] = bits(size) value - Elem[vector, e, size] = value; - return; - -// FPAdd() -// ======= - -bits(N) FPAdd(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - rounding = FPRoundingMode(fpcr); - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - inf1 = (type1 == FPType_Infinity); inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); zero2 = (type2 == FPType_Zero); - if inf1 && inf2 && sign1 == NOT(sign2) then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - elsif (inf1 && sign1 == '0') || (inf2 && sign2 == '0') then - result = FPInfinity('0'); - elsif (inf1 && sign1 == '1') || (inf2 && sign2 == '1') then - result = FPInfinity('1'); - elsif zero1 && zero2 && sign1 == sign2 then - result = FPZero(sign1); - else - result_value = value1 + value2; - if result_value == 0.0 then // Sign of exact zero result depends on rounding mode - result_sign = if rounding == FPRounding_NEGINF then '1' else '0'; - result = FPZero(result_sign); - else - result = FPRound(result_value, fpcr, rounding); - return result; - -// FPMax() -// ======= - -bits(N) FPMax(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - if value1 > value2 then - (fptype,sign,value) = (type1,sign1,value1); - else - (fptype,sign,value) = (type2,sign2,value2); - if fptype == FPType_Infinity then - result = FPInfinity(sign); - elsif fptype == FPType_Zero then - sign = sign1 AND sign2; // Use most positive sign - result = FPZero(sign); - else - // The use of FPRound() covers the case where there is a trapped underflow exception - // for a denormalized number even though the result is exact. - result = FPRound(value, fpcr); - return result; - -// FPMaxNum() -// ========== - -bits(N) FPMaxNum(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,-,-) = FPUnpack(op1, fpcr); - (type2,-,-) = FPUnpack(op2, fpcr); - - // treat a single quiet-NaN as -Infinity - if type1 == FPType_QNaN && type2 != FPType_QNaN then - op1 = FPInfinity('1'); - elsif type1 != FPType_QNaN && type2 == FPType_QNaN then - op2 = FPInfinity('1'); - - return FPMax(op1, op2, fpcr); - -// FPMin() -// ======= - -bits(N) FPMin(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - if value1 < value2 then - (fptype,sign,value) = (type1,sign1,value1); - else - (fptype,sign,value) = (type2,sign2,value2); - if fptype == FPType_Infinity then - result = FPInfinity(sign); - elsif fptype == FPType_Zero then - sign = sign1 OR sign2; // Use most negative sign - result = FPZero(sign); - else - // The use of FPRound() covers the case where there is a trapped underflow exception - // for a denormalized number even though the result is exact. - result = FPRound(value, fpcr); - return result; - -// FPMinNum() -// ========== - -bits(N) FPMinNum(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,-,-) = FPUnpack(op1, fpcr); - (type2,-,-) = FPUnpack(op2, fpcr); - - // Treat a single quiet-NaN as +Infinity - if type1 == FPType_QNaN && type2 != FPType_QNaN then - op1 = FPInfinity('0'); - elsif type1 != FPType_QNaN && type2 == FPType_QNaN then - op2 = FPInfinity('0'); - - return FPMin(op1, op2, fpcr); - -enumeration ReduceOp {ReduceOp_FMINNUM, ReduceOp_FMAXNUM, - ReduceOp_FMIN, ReduceOp_FMAX, - ReduceOp_FADD, ReduceOp_ADD}; - -// Reduce() -// ======== - -bits(esize) Reduce(ReduceOp op, bits(N) input, integer esize) - integer half; - bits(esize) hi; - bits(esize) lo; - bits(esize) result; - - if N == esize then - return input[esize-1:0]; - - half = N DIV 2; - hi = Reduce(op, input[N-1:half], esize); - lo = Reduce(op, input[half-1:0], esize); - - case op of - when ReduceOp_FMINNUM - result = FPMinNum(lo, hi, FPCR); - when ReduceOp_FMAXNUM - result = FPMaxNum(lo, hi, FPCR); - when ReduceOp_FMIN - result = FPMin(lo, hi, FPCR); - when ReduceOp_FMAX - result = FPMax(lo, hi, FPCR); - when ReduceOp_FADD - result = FPAdd(lo, hi, FPCR); - when ReduceOp_ADD - result = lo + hi; - - return result; - -// ReducePredicated() -// ================== - -bits(esize) ReducePredicated(ReduceOp op, bits(N) input, bits(M) mask, bits(esize) identity) - assert(N == M * 8); - integer p2bits = CeilPow2(N); - bits(p2bits) operand; - integer elements = p2bits DIV esize; - - for e = 0 to elements-1 - if e * esize < N && ElemP[mask, e, esize] == '1' then - Elem[operand, e, esize] = Elem[input, e, esize]; - else - Elem[operand, e, esize] = identity; - - return Reduce(op, operand, esize); - -// Reverse() -// ========= -// Reverse subwords of M bits in an N-bit word - -bits(N) Reverse(bits(N) word, integer M) - bits(N) result; - integer sw = N DIV M; - assert N == sw * M; - for s = 0 to sw-1 - Elem[result, sw - 1 - s, M] = Elem[word, s, M]; - return result; - -enumeration SVECmp { Cmp_EQ, Cmp_NE, Cmp_GE, Cmp_GT, Cmp_LT, Cmp_LE, Cmp_UN }; - -// HighestSetBit() -// =============== - -integer HighestSetBit(bits(N) x) - for i = N-1 downto 0 - if x[i] == '1' then return i; - return -1; - -// DecodeBitMasks() -// ================ - -// Decode AArch64 bitfield and logical immediate masks which use a similar encoding structure - -(bits(M), bits(M)) DecodeBitMasks(bit immN, bits(6) imms, bits(6) immr, boolean immediate) - bits(64) tmask, wmask; - bits(6) tmask_and, wmask_and; - bits(6) tmask_or, wmask_or; - bits(6) levels; - - // Compute log2 of element size - // 2^len must be in range [2, M] - len = HighestSetBit(immN:NOT(imms)); - if len < 1 then UNDEFINED; - assert M >= (1 << len); - - // Determine S, R and S - R parameters - levels = ZeroExtend(Ones(len), 6); - - // For logical immediates an all-ones value of S is reserved - // since it would generate a useless all-ones result (many times) - if immediate && (imms AND levels) == levels then - UNDEFINED; - - S = UInt(imms AND levels); - R = UInt(immr AND levels); - diff = S - R; // 6-bit subtract with borrow - - // From a software perspective, the remaining code is equivalant to: - // esize = 1 << len; - // d = UInt(diff[len-1:0]); - // welem = ZeroExtend(Ones(S + 1), esize); - // telem = ZeroExtend(Ones(d + 1), esize); - // wmask = Replicate(ROR(welem, R)); - // tmask = Replicate(telem); - // return (wmask, tmask); - - // Compute "top mask" - tmask_and = diff[5:0] OR NOT(levels); - tmask_or = diff[5:0] AND levels; - - tmask = Ones(64); - tmask = ((tmask - AND Replicate(Replicate(tmask_and[0], 1) : Ones(1), 32)) - OR Replicate(Zeros(1) : Replicate(tmask_or[0], 1), 32)); - // optimization of first step: - // tmask = Replicate(tmask_and[0] : '1', 32); - tmask = ((tmask - AND Replicate(Replicate(tmask_and[1], 2) : Ones(2), 16)) - OR Replicate(Zeros(2) : Replicate(tmask_or[1], 2), 16)); - tmask = ((tmask - AND Replicate(Replicate(tmask_and[2], 4) : Ones(4), 8)) - OR Replicate(Zeros(4) : Replicate(tmask_or[2], 4), 8)); - tmask = ((tmask - AND Replicate(Replicate(tmask_and[3], 8) : Ones(8), 4)) - OR Replicate(Zeros(8) : Replicate(tmask_or[3], 8), 4)); - tmask = ((tmask - AND Replicate(Replicate(tmask_and[4], 16) : Ones(16), 2)) - OR Replicate(Zeros(16) : Replicate(tmask_or[4], 16), 2)); - tmask = ((tmask - AND Replicate(Replicate(tmask_and[5], 32) : Ones(32), 1)) - OR Replicate(Zeros(32) : Replicate(tmask_or[5], 32), 1)); - - // Compute "wraparound mask" - wmask_and = immr OR NOT(levels); - wmask_or = immr AND levels; - - wmask = Zeros(64); - wmask = ((wmask - AND Replicate(Ones(1) : Replicate(wmask_and[0], 1), 32)) - OR Replicate(Replicate(wmask_or[0], 1) : Zeros(1), 32)); - // optimization of first step: - // wmask = Replicate(wmask_or[0] : '0', 32); - wmask = ((wmask - AND Replicate(Ones(2) : Replicate(wmask_and[1], 2), 16)) - OR Replicate(Replicate(wmask_or[1], 2) : Zeros(2), 16)); - wmask = ((wmask - AND Replicate(Ones(4) : Replicate(wmask_and[2], 4), 8)) - OR Replicate(Replicate(wmask_or[2], 4) : Zeros(4), 8)); - wmask = ((wmask - AND Replicate(Ones(8) : Replicate(wmask_and[3], 8), 4)) - OR Replicate(Replicate(wmask_or[3], 8) : Zeros(8), 4)); - wmask = ((wmask - AND Replicate(Ones(16) : Replicate(wmask_and[4], 16), 2)) - OR Replicate(Replicate(wmask_or[4], 16) : Zeros(16), 2)); - wmask = ((wmask - AND Replicate(Ones(32) : Replicate(wmask_and[5], 32), 1)) - OR Replicate(Replicate(wmask_or[5], 32) : Zeros(32), 1)); - - if diff[6] != '0' then // borrow from S - R - wmask = wmask AND tmask; - else - wmask = wmask OR tmask; - - return (wmask[M-1:0], tmask[M-1:0]); - -// SVEMoveMaskPreferred() -// ====================== -// Return FALSE if a bitmask immediate encoding would generate an immediate -// value that could also be represented by a single DUP instruction. -// Used as a condition for the preferred MOV<-DUPM alias. - -boolean SVEMoveMaskPreferred(bits(13) imm13) - bits(64) imm; - (imm, -) = DecodeBitMasks(imm13[12], imm13[5:0], imm13[11:6], TRUE); - - // Check for 8 bit immediates - if !IsZero(imm[7:0]) then - // Check for 'ffffffffffffffxy' or '00000000000000xy' - if IsZero(imm[63:7]) || IsOnes(imm[63:7]) then - return FALSE; - - // Check for 'ffffffxyffffffxy' or '000000xy000000xy' - if imm[63:32] == imm[31:0] && (IsZero(imm[31:7]) || IsOnes(imm[31:7])) then - return FALSE; - - // Check for 'ffxyffxyffxyffxy' or '00xy00xy00xy00xy' - if imm[63:32] == imm[31:0] && imm[31:16] == imm[15:0] && (IsZero(imm[15:7]) || IsOnes(imm[15:7])) then - return FALSE; - - // Check for 'xyxyxyxyxyxyxyxy' - if imm[63:32] == imm[31:0] && imm[31:16] == imm[15:0] && (imm[15:8] == imm[7:0]) then - return FALSE; - - // Check for 16 bit immediates - else - // Check for 'ffffffffffffxy00' or '000000000000xy00' - if IsZero(imm[63:15]) || IsOnes(imm[63:15]) then - return FALSE; - - // Check for 'ffffxy00ffffxy00' or '0000xy000000xy00' - if imm[63:32] == imm[31:0] && (IsZero(imm[31:7]) || IsOnes(imm[31:7])) then - return FALSE; - - // Check for 'xy00xy00xy00xy00' - if imm[63:32] == imm[31:0] && imm[31:16] == imm[15:0] then - return FALSE; - - return TRUE; - -// Z[] - non-assignment form -// ========================= - -bits(width) Z[integer n] - assert n >= 0 && n <= 31; - assert width == VL; - return _Z[n][width-1:0]; - -// Z[] - assignment form -// ===================== - -Z[integer n] = bits(width) value - assert n >= 0 && n <= 31; - assert width == VL; - if ConstrainUnpredictableBool(Unpredictable_SVEZEROUPPER) then - _Z[n] = ZeroExtend(value); - else - _Z[n][width-1:0] = value; - -type CNTKCTLType; - -// CNTKCTL[] - non-assignment form -// =============================== - -CNTKCTLType CNTKCTL[] - bits(32) r; - if IsInHost() then - r = CNTHCTL_EL2; - return r; - r = CNTKCTL_EL1; - return r; - -type CPACRType; - -// CPACR[] - non-assignment form -// ============================= - -CPACRType CPACR[] - bits(32) r; - if IsInHost() then - r = CPTR_EL2; - return r; - r = CPACR_EL1; - return r; - -// AArch64.CheckSystemAccess() -// =========================== -// Checks for traps by NV access. - -AArch64.CheckSystemAccess(bits(2) op0, bits(3) op1, bits(4) crn, - bits(4) crm, bits(3) op2, bits(5) rt, bit read) - - return; - -// AArch64.ChooseNonExcludedTag() -// ============================== -// Return a tag derived from the start and the offset values, excluding -// any tags in the given mask. - -bits(4) AArch64.ChooseNonExcludedTag(bits(4) tag, bits(4) offset, bits(16) exclude) - if IsOnes(exclude) then - return '0000'; - - if offset == '0000' then - while exclude[UInt(tag)] == '1' do - tag = tag + '0001'; - - while offset != '0000' do - offset = offset - '0001'; - tag = tag + '0001'; - while exclude[UInt(tag)] == '1' do - tag = tag + '0001'; - - return tag; - -// AArch64.ExecutingBROrBLROrRetInstr() -// ==================================== -// Returns TRUE if current instruction is a BR, BLR, RET, B[L]RA[B][Z], or RETA[B]. - -boolean AArch64.ExecutingBROrBLROrRetInstr() - if !HaveBTIExt() then return FALSE; - - instr = ThisInstr(); - if instr[31:25] == '1101011' && instr[20:16] == '11111' then - opc = instr[24:21]; - return opc != '0101'; - else - return FALSE; - -// AArch64.ExecutingBTIInstr() -// =========================== -// Returns TRUE if current instruction is a BTI. - -boolean AArch64.ExecutingBTIInstr() - if !HaveBTIExt() then return FALSE; - - instr = ThisInstr(); - if instr[31:22] == '1101010100' && instr[21:12] == '0000110010' && instr[4:0] == '11111' then - CRm = instr[11:8]; - op2 = instr[7:5]; - return (CRm == '0100' && op2[0] == '0'); - else - return FALSE; - -// AArch64.ExecutingERETInstr() -// ============================ -// Returns TRUE if current instruction is ERET. - -boolean AArch64.ExecutingERETInstr() - instr = ThisInstr(); - return instr[31:12] == '11010110100111110000'; - -// AArch64.GetMinELSecurityState() -// =============================== -// Return the minimum exception level and security state required. - -(bits(2), boolean) AArch64.GetMinELSecurityState(bits(3) op1) - boolean need_secure = FALSE; - bits(2) min_EL; - - case op1 of - when '00x', '010' - min_EL = EL1; - when '011' - min_EL = EL0; - when '100' - min_EL = EL2; - when '101' - if !HaveVirtHostExt() then - UNDEFINED; - min_EL = EL2; - when '110' - min_EL = EL3; - when '111' - min_EL = EL1; - need_secure = TRUE; - return (min_EL, need_secure); - -// AArch64.NextRandomTagBit() -// ========================== -// Generate a random bit suitable for generating a random Allocation Tag. - -bit AArch64.NextRandomTagBit() - bits(16) lfsr = RGSR_EL1.SEED; - bit top = lfsr[5] EOR lfsr[3] EOR lfsr[2] EOR lfsr[0]; - RGSR_EL1.SEED = top:lfsr[15:1]; - return top; - -// AArch64.RandomTag() -// =================== -// Generate a random Allocation Tag. - -bits(4) AArch64.RandomTag() - bits(4) tag; - for i = 0 to 3 - tag[i] = AArch64.NextRandomTagBit(); - return tag; - -// Execute a system instruction with write (source operand). -AArch64.SysInstr(integer op0, integer op1, integer crn, integer crm, integer op2, bits(64) val); - -// Execute a system instruction with read (result operand). -// Returns the result of the instruction. -bits(64) AArch64.SysInstrWithResult(integer op0, integer op1, integer crn, integer crm, integer op2); - -// Read from a system register and return the contents of the register. -bits(64) AArch64.SysRegRead(integer op0, integer op1, integer crn, integer crm, integer op2); - -// Write to a system register. -AArch64.SysRegWrite(integer op0, integer op1, integer crn, integer crm, integer op2, bits(64) val); - -boolean BTypeCompatible; - -// BTypeCompatible_BTI -// =================== -// This function determines whether a given hint encoding is compatible with the current value of -// PSTATE.BTYPE. A value of TRUE here indicates a valid Branch Target Identification instruction. - -boolean BTypeCompatible_BTI(bits(2) hintcode) - case hintcode of - when '00' - return FALSE; - when '01' - return PSTATE.BTYPE != '11'; - when '10' - return PSTATE.BTYPE != '10'; - when '11' - return TRUE; - -// BTypeCompatible_PACIXSP() -// ========================= -// Returns TRUE if PACIASP, PACIBSP instruction is implicit compatible with PSTATE.BTYPE, -// FALSE otherwise. - -boolean BTypeCompatible_PACIXSP() - if PSTATE.BTYPE IN {'01', '10'} then - return TRUE; - elsif PSTATE.BTYPE == '11' then - index = if PSTATE.EL == EL0 then 35 else 36; - return SCTLR[][index] == '0'; - else - return FALSE; - -bits(2) BTypeNext; - -// SetBTypeCompatible() -// ==================== -// Sets the value of BTypeCompatible global variable used by BTI - -SetBTypeCompatible(boolean x) - BTypeCompatible = x; - -// SetBTypeNext() -// ============== -// Set the value of BTypeNext global variable used by BTI - -SetBTypeNext(bits(2) x) - BTypeNext = x; - -// The _ChooseRandomNonExcludedTag function is used when GCR_EL1.RRND == '1' to generate random -// Allocation Tags. -// -// The resulting Allocation Tag is selected from the set [0,15], excluding any Allocation Tag where -// exclude[tag_value] == 1. If 'exclude' is all ones, the returned Allocation Tag is '0000'. -// -// This function is expected to generate a non-deterministic selection from the set of non-excluded -// Allocation Tags. A reasonable implementation is described by the Pseudocode used when -// GCR_EL1.RRND is 0, but with a non-deterministic implementation of NextRandomTagBit(). -bits(4) _ChooseRandomNonExcludedTag(bits(16) exclude); - -// BFXPreferred() -// ============== -// -// Return TRUE if UBFX or SBFX is the preferred disassembly of a -// UBFM or SBFM bitfield instruction. Must exclude more specific -// aliases UBFIZ, SBFIZ, UXT[BH], SXT[BHW], LSL, LSR and ASR. - -boolean BFXPreferred(bit sf, bit uns, bits(6) imms, bits(6) immr) - integer S = UInt(imms); - integer R = UInt(immr); - - // must not match UBFIZ/SBFIX alias - if UInt(imms) < UInt(immr) then - return FALSE; - - // must not match LSR/ASR/LSL alias (imms == 31 or 63) - if imms == sf:'11111' then - return FALSE; - - // must not match UXTx/SXTx alias - if immr == '000000' then - // must not match 32-bit UXT[BH] or SXT[BH] - if sf == '0' && imms IN {'000111', '001111'} then - return FALSE; - // must not match 64-bit SXT[BHW] - if sf:uns == '10' && imms IN {'000111', '001111', '011111'} then - return FALSE; - - // must be UBFX/SBFX alias - return TRUE; - -enumeration MoveWideOp {MoveWideOp_N, MoveWideOp_Z, MoveWideOp_K}; - -// MoveWidePreferred() -// =================== -// -// Return TRUE if a bitmask immediate encoding would generate an immediate -// value that could also be represented by a single MOVZ or MOVN instruction. -// Used as a condition for the preferred MOV<-ORR alias. - -boolean MoveWidePreferred(bit sf, bit immN, bits(6) imms, bits(6) immr) - integer S = UInt(imms); - integer R = UInt(immr); - integer width = if sf == '1' then 64 else 32; - - // element size must equal total immediate size - if sf == '1' && immN:imms != '1xxxxxx' then - return FALSE; - if sf == '0' && immN:imms != '00xxxxx' then - return FALSE; - - // for MOVZ must contain no more than 16 ones - if S < 16 then - // ones must not span halfword boundary when rotated - return (-R MOD 16) <= (15 - S); - - // for MOVN must contain no more than 16 zeros - if S >= width - 15 then - // zeros must not span halfword boundary when rotated - return (R MOD 16) <= (S - (width - 15)); - - return FALSE; - -enumeration ShiftType {ShiftType_LSL, ShiftType_LSR, ShiftType_ASR, ShiftType_ROR}; - -// DecodeShift() -// ============= -// Decode shift encodings - -ShiftType DecodeShift(bits(2) op) - case op of - when '00' return ShiftType_LSL; - when '01' return ShiftType_LSR; - when '10' return ShiftType_ASR; - when '11' return ShiftType_ROR; - -// ASR() -// ===== - -bits(N) ASR(bits(N) x, integer shift) - assert shift >= 0; - if shift == 0 then - result = x; - else - (result, -) = ASR_C(x, shift); - return result; - -// ROR() -// ===== - -bits(N) ROR(bits(N) x, integer shift) - assert shift >= 0; - if shift == 0 then - result = x; - else - (result, -) = ROR_C(x, shift); - return result; - -// ShiftReg() -// ========== -// Perform shift of a register operand - -bits(N) ShiftReg(integer reg, ShiftType shiftype, integer amount) - bits(N) result = X[reg]; - case shiftype of - when ShiftType_LSL result = LSL(result, amount); - when ShiftType_LSR result = LSR(result, amount); - when ShiftType_ASR result = ASR(result, amount); - when ShiftType_ROR result = ROR(result, amount); - return result; - -enumeration LogicalOp {LogicalOp_AND, LogicalOp_EOR, LogicalOp_ORR}; - -enumeration MemOp {MemOp_LOAD, MemOp_STORE, MemOp_PREFETCH}; - -enumeration PrefetchHint {Prefetch_READ, Prefetch_WRITE, Prefetch_EXEC}; - -// Signals the memory system that memory accesses of type1 HINT to or from the specified address are -// likely in the near future. The memory system may take some action to speed up the memory -// accesses when they do occur, such as pre-loading the the specified address into one or more -// caches as indicated by the innermost cache level target (0=L1, 1=L2, etc) and non-temporal hint -// stream. Any or all prefetch hints may be treated as a NOP. A prefetch hint must not cause a -// synchronous abort due to Alignment or Translation faults and the like. Its only effect on -// software-visible state should be on caches and TLBs associated with address, which must be -// accessible by reads, writes or execution, as defined in the translation regime of the current -// Exception level. It is guaranteed not to access Device memory. -// A Prefetch_EXEC hint must not result in an access that could not be performed by a speculative -// instruction fetch, therefore if all associated MMUs are disabled, then it cannot access any -// memory location that cannot be accessed by instruction fetches. -Hint_Prefetch(bits(64) address, PrefetchHint hint, integer target, boolean stream); - -// Prefetch() -// ========== - -// Decode and execute the prefetch hint on ADDRESS specified by PRFOP - -Prefetch(bits(64) address, bits(5) prfop) - PrefetchHint hint; - integer target; - boolean stream; - - case prfop[4:3] of - when '00' hint = Prefetch_READ; // PLD: prefetch for load - when '01' hint = Prefetch_EXEC; // PLI: preload instructions - when '10' hint = Prefetch_WRITE; // PST: prepare for store - when '11' return; // unallocated hint - target = UInt(prfop[2:1]); // target cache level - stream = (prfop[0] != '0'); // streaming (non-temporal) - Hint_Prefetch(address, hint, target, stream); - return; - -enumeration MemBarrierOp { MemBarrierOp_DSB // Data Synchronization Barrier - , MemBarrierOp_DMB // Data Memory Barrier - , MemBarrierOp_ISB // Instruction Synchronization Barrier - , MemBarrierOp_SSBB // Speculative Synchronization Barrier to VA - , MemBarrierOp_PSSBB // Speculative Synchronization Barrier to PA - , MemBarrierOp_SB // Speculation Barrier - }; - -enumeration SystemHintOp { - SystemHintOp_NOP, - SystemHintOp_YIELD, - SystemHintOp_WFE, - SystemHintOp_WFI, - SystemHintOp_SEV, - SystemHintOp_SEVL, - SystemHintOp_DGH, - SystemHintOp_ESB, - SystemHintOp_PSB, - SystemHintOp_TSB, - SystemHintOp_BTI, - SystemHintOp_CSDB -}; - -enumeration PSTATEField {PSTATEField_DAIFSet, PSTATEField_DAIFClr, - PSTATEField_PAN, // Armv8.1 - PSTATEField_UAO, // Armv8.2 - PSTATEField_DIT, // Armv8.4 - PSTATEField_SSBS, - PSTATEField_TCO, // Armv8.5 - PSTATEField_SP - }; - -enumeration SystemOp {Sys_AT, Sys_DC, Sys_IC, Sys_TLBI, Sys_SYS}; - -// SysOp() -// ======= - -SystemOp SysOp(bits(3) op1, bits(4) CRn, bits(4) CRm, bits(3) op2) - case op1:CRn:CRm:op2 of - when '000 0111 1000 000' return Sys_AT; // S1E1R - when '100 0111 1000 000' return Sys_AT; // S1E2R - when '110 0111 1000 000' return Sys_AT; // S1E3R - when '000 0111 1000 001' return Sys_AT; // S1E1W - when '100 0111 1000 001' return Sys_AT; // S1E2W - when '110 0111 1000 001' return Sys_AT; // S1E3W - when '000 0111 1000 010' return Sys_AT; // S1E0R - when '000 0111 1000 011' return Sys_AT; // S1E0W - when '100 0111 1000 100' return Sys_AT; // S12E1R - when '100 0111 1000 101' return Sys_AT; // S12E1W - when '100 0111 1000 110' return Sys_AT; // S12E0R - when '100 0111 1000 111' return Sys_AT; // S12E0W - when '011 0111 0100 001' return Sys_DC; // ZVA - when '000 0111 0110 001' return Sys_DC; // IVAC - when '000 0111 0110 010' return Sys_DC; // ISW - when '011 0111 1010 001' return Sys_DC; // CVAC - when '000 0111 1010 010' return Sys_DC; // CSW - when '011 0111 1011 001' return Sys_DC; // CVAU - when '011 0111 1110 001' return Sys_DC; // CIVAC - when '000 0111 1110 010' return Sys_DC; // CISW - when '011 0111 1101 001' return Sys_DC; // CVADP - when '000 0111 0001 000' return Sys_IC; // IALLUIS - when '000 0111 0101 000' return Sys_IC; // IALLU - when '011 0111 0101 001' return Sys_IC; // IVAU - when '100 1000 0000 001' return Sys_TLBI; // IPAS2E1IS - when '100 1000 0000 101' return Sys_TLBI; // IPAS2LE1IS - when '000 1000 0011 000' return Sys_TLBI; // VMALLE1IS - when '100 1000 0011 000' return Sys_TLBI; // ALLE2IS - when '110 1000 0011 000' return Sys_TLBI; // ALLE3IS - when '000 1000 0011 001' return Sys_TLBI; // VAE1IS - when '100 1000 0011 001' return Sys_TLBI; // VAE2IS - when '110 1000 0011 001' return Sys_TLBI; // VAE3IS - when '000 1000 0011 010' return Sys_TLBI; // ASIDE1IS - when '000 1000 0011 011' return Sys_TLBI; // VAAE1IS - when '100 1000 0011 100' return Sys_TLBI; // ALLE1IS - when '000 1000 0011 101' return Sys_TLBI; // VALE1IS - when '100 1000 0011 101' return Sys_TLBI; // VALE2IS - when '110 1000 0011 101' return Sys_TLBI; // VALE3IS - when '100 1000 0011 110' return Sys_TLBI; // VMALLS12E1IS - when '000 1000 0011 111' return Sys_TLBI; // VAALE1IS - when '100 1000 0100 001' return Sys_TLBI; // IPAS2E1 - when '100 1000 0100 101' return Sys_TLBI; // IPAS2LE1 - when '000 1000 0111 000' return Sys_TLBI; // VMALLE1 - when '100 1000 0111 000' return Sys_TLBI; // ALLE2 - when '110 1000 0111 000' return Sys_TLBI; // ALLE3 - when '000 1000 0111 001' return Sys_TLBI; // VAE1 - when '100 1000 0111 001' return Sys_TLBI; // VAE2 - when '110 1000 0111 001' return Sys_TLBI; // VAE3 - when '000 1000 0111 010' return Sys_TLBI; // ASIDE1 - when '000 1000 0111 011' return Sys_TLBI; // VAAE1 - when '100 1000 0111 100' return Sys_TLBI; // ALLE1 - when '000 1000 0111 101' return Sys_TLBI; // VALE1 - when '100 1000 0111 101' return Sys_TLBI; // VALE2 - when '110 1000 0111 101' return Sys_TLBI; // VALE3 - when '100 1000 0111 110' return Sys_TLBI; // VMALLS12E1 - when '000 1000 0111 111' return Sys_TLBI; // VAALE1 - return Sys_SYS; - -// AArch64.AsynchExternalAbort() -// ============================= -// Wrapper function for asynchronous external aborts - -FaultRecord AArch64.AsynchExternalAbort(boolean parity, bits(2) errortype, bit extflag) - - faulttype = if parity then Fault_AsyncParity else Fault_AsyncExternal; - ipaddress = bits(52) UNKNOWN; - level = integer UNKNOWN; - acctype = AccType_NORMAL; - iswrite = boolean UNKNOWN; - secondstage = FALSE; - s2fs1walk = FALSE; - - return AArch64.CreateFaultRecord(faulttype, ipaddress, boolean UNKNOWN, level, acctype, iswrite, extflag, - errortype, secondstage, s2fs1walk); - -enumeration VBitOp {VBitOp_VBIF, VBitOp_VBIT, VBitOp_VBSL, VBitOp_VEOR}; - -enumeration CompareOp {CompareOp_GT, CompareOp_GE, CompareOp_EQ, - CompareOp_LE, CompareOp_LT}; - -enumeration ImmediateOp {ImmediateOp_MOVI, ImmediateOp_MVNI, - ImmediateOp_ORR, ImmediateOp_BIC}; - -// ClearStickyErrors() -// =================== - -ClearStickyErrors() - EDSCR.TXU = '0'; // Clear TX underrun flag - EDSCR.RXO = '0'; // Clear RX overrun flag - - if Halted() then // in Debug state - EDSCR.ITO = '0'; // Clear ITR overrun flag - - // If halted and the ITR is not empty then it is UNPREDICTABLE whether the EDSCR.ERR is cleared. - // The UNPREDICTABLE behavior also affects the instructions in flight, but this is not described - // in the pseudocode. - if Halted() && EDSCR.ITE == '0' && ConstrainUnpredictableBool(Unpredictable_CLEARERRITEZERO) then - return; - EDSCR.ERR = '0'; // Clear cumulative error flag - - return; - -// HaveSecureExtDebugView() -// ======================== -// Returns TRUE if support for Secure and Non-secure views of debug peripherals is implemented. - -boolean HaveSecureExtDebugView() - return HasArchVersion(ARMv8p4); - -// Returns TRUE when an access is Secure -boolean IsAccessSecure(); - -// AllowExternalDebugAccess() -// ========================== -// Returns TRUE if an external debug interface access to the External debug registers -// is allowed, FALSE otherwise. - -boolean AllowExternalDebugAccess() - // The access may also be subject to OS Lock, power-down, etc. - if HaveSecureExtDebugView() then - return AllowExternalDebugAccess(IsAccessSecure()); - else - return AllowExternalDebugAccess(ExternalSecureInvasiveDebugEnabled()); - -// AllowExternalDebugAccess() -// ========================== -// Returns TRUE if an external debug interface access to the External debug registers -// is allowed for the given Security state, FALSE otherwise. - -boolean AllowExternalDebugAccess(boolean allow_secure) - // The access may also be subject to OS Lock, power-down, etc. - if HaveSecureExtDebugView() || ExternalInvasiveDebugEnabled() then - if allow_secure then - return TRUE; - elsif HaveEL(EL3) then - if ELUsingAArch32(EL3) then - return SDCR.EDAD == '0'; - else - return MDCR_EL3.EDAD == '0'; - else - return !IsSecure(); - else - return FALSE; - -// AllowExternalPMUAccess() -// ======================== -// Returns TRUE if an external debug interface access to the PMU registers is allowed, FALSE otherwise. - -boolean AllowExternalPMUAccess() - // The access may also be subject to OS Lock, power-down, etc. - if HaveSecureExtDebugView() then - return AllowExternalPMUAccess(IsAccessSecure()); - else - return AllowExternalPMUAccess(ExternalSecureNoninvasiveDebugEnabled()); - -// AllowExternalPMUAccess() -// ======================== -// Returns TRUE if an external debug interface access to the PMU registers is allowed for the given -// Security state, FALSE otherwise. - -boolean AllowExternalPMUAccess(boolean allow_secure) - // The access may also be subject to OS Lock, power-down, etc. - if HaveSecureExtDebugView() || ExternalNoninvasiveDebugEnabled() then - if allow_secure then - return TRUE; - elsif HaveEL(EL3) then - if ELUsingAArch32(EL3) then - return SDCR.EPMAD == '0'; - else - return MDCR_EL3.EPMAD == '0'; - else - return !IsSecure(); - else - return FALSE; - -// ExternalNoninvasiveDebugAllowed() -// ================================= -// Returns TRUE if Trace and PC Sample-based Profiling are allowed - -boolean ExternalNoninvasiveDebugAllowed() - return (ExternalNoninvasiveDebugEnabled() && - (!IsSecure() || ExternalSecureNoninvasiveDebugEnabled() || - (ELUsingAArch32(EL1) && PSTATE.EL == EL0 && SDER.SUNIDEN == '1'))); - -// Returns TRUE if the Core power domain is powered on, FALSE otherwise. -boolean IsCorePowered(); - -// Set a Cross Trigger multi-cycle input event trigger to the specified level. -CTI_SetEventLevel(CrossTriggerIn id, signal level); - -// CheckForDCCInterrupts() -// ======================= - -CheckForDCCInterrupts() - commrx = (EDSCR.RXfull == '1'); - commtx = (EDSCR.TXfull == '0'); - - // COMMRX and COMMTX support is optional and not recommended for new designs. - // SetInterruptRequestLevel(InterruptID_COMMRX, if commrx then HIGH else LOW); - // SetInterruptRequestLevel(InterruptID_COMMTX, if commtx then HIGH else LOW); - - // The value to be driven onto the common COMMIRQ signal. - if ELUsingAArch32(EL1) then - commirq = ((commrx && DBGDCCINT.RX == '1') || - (commtx && DBGDCCINT.TX == '1')); - else - commirq = ((commrx && MDCCINT_EL1.RX == '1') || - (commtx && MDCCINT_EL1.TX == '1')); - SetInterruptRequestLevel(InterruptID_COMMIRQ, if commirq then HIGH else LOW); - - return; - -bits(32) DTRRX; -bits(32) DTRTX; - -// Execute an A64 instruction in Debug state. -ExecuteA64(bits(32) instr); - -// Execute a T32 instruction in Debug state. -ExecuteT32(bits(16) hw1, bits(16) hw2); - -// DBGDTRRX_EL0[] (external write) -// =============================== -// Called on writes to debug register 0x08C. - -DBGDTRRX_EL0[boolean memory_mapped] = bits(32) value - - if EDPRSR[6:5,0] != '001' then // Check DLK, OSLK and PU bits - IMPLEMENTATION_DEFINED "signal slave-generated error"; - return; - - if EDSCR.ERR == '1' then return; // Error flag set: ignore write - - // The Software lock is OPTIONAL. - if memory_mapped && EDLSR.SLK == '1' then return; // Software lock locked: ignore write - - if EDSCR.RXfull == '1' || (Halted() && EDSCR.MA == '1' && EDSCR.ITE == '0') then - EDSCR.RXO = '1'; EDSCR.ERR = '1'; // Overrun condition: ignore write - return; - - EDSCR.RXfull = '1'; - DTRRX = value; - - if Halted() && EDSCR.MA == '1' then - EDSCR.ITE = '0'; // See comments in EDITR[] (external write) - if !UsingAArch32() then - ExecuteA64(0xD5330501[31:0]); // A64 "MRS X1,DBGDTRRX_EL0" - ExecuteA64(0xB8004401[31:0]); // A64 "STR W1,[X0],#4" - X[1] = bits(64) UNKNOWN; - else - ExecuteT32(0xEE10[15:0] /*hw1*/, 0x1E15[15:0] /*hw2*/); // T32 "MRS R1,DBGDTRRXint" - ExecuteT32(0xF840[15:0] /*hw1*/, 0x1B04[15:0] /*hw2*/); // T32 "STR R1,[R0],#4" - R[1] = bits(32) UNKNOWN; - // If the store aborts, the Data Abort exception is taken and EDSCR.ERR is set to 1 - if EDSCR.ERR == '1' then - EDSCR.RXfull = bit UNKNOWN; - DBGDTRRX_EL0 = bits(32) UNKNOWN; - else - // "MRS X1,DBGDTRRX_EL0" calls DBGDTR_EL0[] (read) which clears RXfull. - assert EDSCR.RXfull == '0'; - - EDSCR.ITE = '1'; // See comments in EDITR[] (external write) - return; - -// DBGDTRRX_EL0[] (external read) -// ============================== - -bits(32) DBGDTRRX_EL0[boolean memory_mapped] - return DTRRX; - -// DBGDTRTX_EL0[] (external read) -// ============================== -// Called on reads of debug register 0x080. - -bits(32) DBGDTRTX_EL0[boolean memory_mapped] - - if EDPRSR[6:5,0] != '001' then // Check DLK, OSLK and PU bits - IMPLEMENTATION_DEFINED "signal slave-generated error"; - return bits(32) UNKNOWN; - - underrun = EDSCR.TXfull == '0' || (Halted() && EDSCR.MA == '1' && EDSCR.ITE == '0'); - value = if underrun then bits(32) UNKNOWN else DTRTX; - - if EDSCR.ERR == '1' then return value; // Error flag set: no side-effects - - // The Software lock is OPTIONAL. - if memory_mapped && EDLSR.SLK == '1' then // Software lock locked: no side-effects - return value; - - if underrun then - EDSCR.TXU = '1'; EDSCR.ERR = '1'; // Underrun condition: block side-effects - return value; // Return UNKNOWN - - EDSCR.TXfull = '0'; - if Halted() && EDSCR.MA == '1' then - EDSCR.ITE = '0'; // See comments in EDITR[] (external write) - - if !UsingAArch32() then - ExecuteA64(0xB8404401[31:0]); // A64 "LDR W1,[X0],#4" - else - ExecuteT32(0xF850[15:0] /*hw1*/, 0x1B04[15:0] /*hw2*/); // T32 "LDR R1,[R0],#4" - // If the load aborts, the Data Abort exception is taken and EDSCR.ERR is set to 1 - if EDSCR.ERR == '1' then - EDSCR.TXfull = bit UNKNOWN; - DBGDTRTX_EL0 = bits(32) UNKNOWN; - else - if !UsingAArch32() then - ExecuteA64(0xD5130501[31:0]); // A64 "MSR DBGDTRTX_EL0,X1" - else - ExecuteT32(0xEE00[15:0] /*hw1*/, 0x1E15[15:0] /*hw2*/); // T32 "MSR DBGDTRTXint,R1" - // "MSR DBGDTRTX_EL0,X1" calls DBGDTR_EL0[] (write) which sets TXfull. - assert EDSCR.TXfull == '1'; - if !UsingAArch32() then - X[1] = bits(64) UNKNOWN; - else - R[1] = bits(32) UNKNOWN; - EDSCR.ITE = '1'; // See comments in EDITR[] (external write) - - return value; - -// DBGDTRTX_EL0[] (external write) -// =============================== - -DBGDTRTX_EL0[boolean memory_mapped] = bits(32) value - // The Software lock is OPTIONAL. - if memory_mapped && EDLSR.SLK == '1' then return; // Software lock locked: ignore write - DTRTX = value; - return; - -// DBGDTR_EL0[] (write) -// ==================== -// System register writes to DBGDTR_EL0, DBGDTRTX_EL0 (AArch64) and DBGDTRTXint (AArch32) - -DBGDTR_EL0[] = bits(N) value - // For MSR DBGDTRTX_EL0,[Rt] N=32, value=X[t][31:0], X[t][63:32] is ignored - // For MSR DBGDTR_EL0,[Xt] N=64, value=X[t][63:0] - assert N IN {32,64}; - if EDSCR.TXfull == '1' then - value = bits(N) UNKNOWN; - // On a 64-bit write, implement a half-duplex channel - if N == 64 then DTRRX = value[63:32]; - DTRTX = value[31:0]; // 32-bit or 64-bit write - EDSCR.TXfull = '1'; - return; - -// DBGDTR_EL0[] (read) -// =================== -// System register reads of DBGDTR_EL0, DBGDTRRX_EL0 (AArch64) and DBGDTRRXint (AArch32) - -bits(N) DBGDTR_EL0[] - // For MRS [Rt],DBGDTRTX_EL0 N=32, X[t]=Zeros(32):result - // For MRS [Xt],DBGDTR_EL0 N=64, X[t]=result - assert N IN {32,64}; - bits(N) result; - if EDSCR.RXfull == '0' then - result = bits(N) UNKNOWN; - else - // On a 64-bit read, implement a half-duplex channel - // NOTE: the word order is reversed on reads with regards to writes - if N == 64 then result[63:32] = DTRTX; - result[31:0] = DTRRX; - EDSCR.RXfull = '0'; - return result; - -// EDITR[] (external write) -// ======================== -// Called on writes to debug register 0x084. - -EDITR[boolean memory_mapped] = bits(32) value - if EDPRSR[6:5,0] != '001' then // Check DLK, OSLK and PU bits - IMPLEMENTATION_DEFINED "signal slave-generated error"; - return; - - if EDSCR.ERR == '1' then return; // Error flag set: ignore write - - // The Software lock is OPTIONAL. - if memory_mapped && EDLSR.SLK == '1' then return; // Software lock locked: ignore write - - if !Halted() then return; // Non-debug state: ignore write - - if EDSCR.ITE == '0' || EDSCR.MA == '1' then - EDSCR.ITO = '1'; EDSCR.ERR = '1'; // Overrun condition: block write - return; - - // ITE indicates whether the processor is ready to accept another instruction; the processor - // may support multiple outstanding instructions. Unlike the "InstrCompl" flag in [v7A] there - // is no indication that the pipeline is empty (all instructions have completed). In this - // pseudocode, the assumption is that only one instruction can be executed at a time, - // meaning ITE acts like "InstrCompl". - EDSCR.ITE = '0'; - - if !UsingAArch32() then - ExecuteA64(value); - else - ExecuteT32(value[15:0]/*hw1*/, value[31:16] /*hw2*/); - - EDSCR.ITE = '1'; - - return; - -// DCPSInstruction() -// ================= -// Operation of the DCPS instruction in Debug state - -DCPSInstruction(bits(2) target_el) - - SynchronizeContext(); - - case target_el of - when EL1 - if PSTATE.EL == EL2 || (PSTATE.EL == EL3 && !UsingAArch32()) then handle_el = PSTATE.EL; - elsif EL2Enabled() && HCR_EL2.TGE == '1' then UNDEFINED; - else handle_el = EL1; - - when EL2 - if !HaveEL(EL2) then UNDEFINED; - elsif PSTATE.EL == EL3 && !UsingAArch32() then handle_el = EL3; - elsif !IsSecureEL2Enabled() && IsSecure() then UNDEFINED; - else handle_el = EL2; - when EL3 - if EDSCR.SDD == '1' || !HaveEL(EL3) then UNDEFINED; - handle_el = EL3; - otherwise - Unreachable(); - - from_secure = IsSecure(); - if ELUsingAArch32(handle_el) then - if PSTATE.M == M32_Monitor then SCR.NS = '0'; - assert UsingAArch32(); // Cannot move from AArch64 to AArch32 - case handle_el of - when EL1 - AArch32.WriteMode(M32_Svc); - if HavePANExt() && SCTLR.SPAN == '0' then - PSTATE.PAN = '1'; - when EL2 AArch32.WriteMode(M32_Hyp); - when EL3 - AArch32.WriteMode(M32_Monitor); - if HavePANExt() then - if !from_secure then - PSTATE.PAN = '0'; - elsif SCTLR.SPAN == '0' then - PSTATE.PAN = '1'; - if handle_el == EL2 then - ELR_hyp = bits(32) UNKNOWN; HSR = bits(32) UNKNOWN; - else - LR = bits(32) UNKNOWN; - SPSR[] = bits(32) UNKNOWN; - PSTATE.E = SCTLR[].EE; - DLR = bits(32) UNKNOWN; DSPSR = bits(32) UNKNOWN; - - else // Targeting AArch64 - if UsingAArch32() then - AArch64.MaybeZeroRegisterUppers(); - MaybeZeroSVEUppers(target_el); - PSTATE.nRW = '0'; PSTATE.SP = '1'; PSTATE.EL = handle_el; - if HavePANExt() && ((handle_el == EL1 && SCTLR_EL1.SPAN == '0') || - (handle_el == EL2 && HCR_EL2.E2H == '1' && - HCR_EL2.TGE == '1' && SCTLR_EL2.SPAN == '0')) then - PSTATE.PAN = '1'; - ELR[] = bits(64) UNKNOWN; SPSR[] = bits(32) UNKNOWN; ESR[] = bits(32) UNKNOWN; - DLR_EL0 = bits(64) UNKNOWN; DSPSR_EL0 = bits(32) UNKNOWN; - if HaveUAOExt() then PSTATE.UAO = '0'; - if HaveMTEExt() then PSTATE.TCO = '1'; - - UpdateEDSCRFields(); // Update EDSCR PE state flags - sync_errors = HaveIESB() && SCTLR[].IESB == '1'; - if HaveDoubleFaultExt() && !UsingAArch32() then - sync_errors = sync_errors || (SCR_EL3.EA == '1' && SCR_EL3.NMEA == '1' && PSTATE.EL == EL3); - // SCTLR[].IESB might be ignored in Debug state. - if !ConstrainUnpredictableBool(Unpredictable_IESBinDebug) then - sync_errors = FALSE; - if sync_errors then - SynchronizeErrors(); - return; - -// DRPSInstruction() -// ================= -// Operation of the A64 DRPS and T32 ERET instructions in Debug state - -DRPSInstruction() - - SynchronizeContext(); - - sync_errors = HaveIESB() && SCTLR[].IESB == '1'; - if HaveDoubleFaultExt() && !UsingAArch32() then - sync_errors = sync_errors || (SCR_EL3.EA == '1' && SCR_EL3.NMEA == '1' && PSTATE.EL == EL3); - // SCTLR[].IESB might be ignored in Debug state. - if !ConstrainUnpredictableBool(Unpredictable_IESBinDebug) then - sync_errors = FALSE; - if sync_errors then - SynchronizeErrors(); - - SetPSTATEFromPSR(SPSR[]); - - // PSTATE.{N,Z,C,V,Q,GE,SS,D,A,I,F} are not observable and ignored in Debug state, so - // behave as if UNKNOWN. - if UsingAArch32() then - PSTATE.[N,Z,C,V,Q,GE,SS,A,I,F] = bits(13) UNKNOWN; - // In AArch32, all instructions are T32 and unconditional. - PSTATE.IT = '00000000'; PSTATE.T = '1'; // PSTATE.J is RES0 - DLR = bits(32) UNKNOWN; DSPSR = bits(32) UNKNOWN; - else - PSTATE.[N,Z,C,V,SS,D,A,I,F] = bits(9) UNKNOWN; - DLR_EL0 = bits(64) UNKNOWN; DSPSR_EL0 = bits(32) UNKNOWN; - - UpdateEDSCRFields(); // Update EDSCR PE state flags - - return; - -DisableITRAndResumeInstructionPrefetch(); - -// ExitDebugState() -// ================ - -ExitDebugState() - assert Halted(); - SynchronizeContext(); - - // Although EDSCR.STATUS signals that the PE is restarting, debuggers must use EDPRSR.SDR to - // detect that the PE has restarted. - EDSCR.STATUS = '000001'; // Signal restarting - EDESR[2:0] = '000'; // Clear any pending Halting debug events - - bits(64) new_pc; - bits(32) spsr; - - if UsingAArch32() then - new_pc = ZeroExtend(DLR); - spsr = DSPSR; - else - new_pc = DLR_EL0; - spsr = DSPSR_EL0; - // If this is an illegal return, SetPSTATEFromPSR() will set PSTATE.IL. - SetPSTATEFromPSR(spsr); // Can update privileged bits, even at EL0 - - if UsingAArch32() then - if ConstrainUnpredictableBool(Unpredictable_RESTARTALIGNPC) then new_pc[0] = '0'; - BranchTo(new_pc[31:0], BranchType_DBGEXIT); // AArch32 branch - else - // If targeting AArch32 then possibly zero the 32 most significant bits of the target PC - if spsr[4] == '1' && ConstrainUnpredictableBool(Unpredictable_RESTARTZEROUPPERPC) then - new_pc[63:32] = Zeros(); - BranchTo(new_pc, BranchType_DBGEXIT); // A type1 of branch that is never predicted - - (EDSCR.STATUS,EDPRSR.SDR) = ('000010','1'); // Atomically signal restarted - UpdateEDSCRFields(); // Stop signalling PE state - DisableITRAndResumeInstructionPrefetch(); - - return; - -// HaveExtendedECDebugEvents() -// =========================== - -boolean HaveExtendedECDebugEvents() - return HasArchVersion(ARMv8p2); - -// CheckExceptionCatch() -// ===================== -// Check whether an Exception Catch debug event is set on the current Exception level - -CheckExceptionCatch(boolean exception_entry) - // Called after an exception entry or exit, that is, such that IsSecure() and PSTATE.EL are correct - // for the exception target. - base = if IsSecure() then 0 else 4; - if HaltingAllowed() then - if HaveExtendedECDebugEvents() then - exception_exit = !exception_entry; - ctrl = EDECCR[UInt(PSTATE.EL) + base + 8]:EDECCR[UInt(PSTATE.EL) + base]; - case ctrl of - when '00' halt = FALSE; - when '01' halt = TRUE; - when '10' halt = (exception_exit == TRUE); - when '11' halt = (exception_entry == TRUE); - else - halt = (EDECCR[UInt(PSTATE.EL) + base] == '1'); - if halt then Halt(DebugHalt_ExceptionCatch); - -// Returns TRUE if the previously executed instruction was executed in the inactive state, that is, -// if it was not itself stepped. -boolean HaltingStep_DidNotStep(); - -// Returns TRUE if the previously executed instruction was a Load-Exclusive class instruction -// executed in the active-not-pending state. -boolean HaltingStep_SteppedEX(); - -// CheckHaltingStep() -// ================== -// Check whether EDESR.SS has been set by Halting Step - -CheckHaltingStep() - if HaltingAllowed() && EDESR.SS == '1' then - // The STATUS code depends on how we arrived at the state where EDESR.SS == 1. - if HaltingStep_DidNotStep() then - Halt(DebugHalt_Step_NoSyndrome); - elsif HaltingStep_SteppedEX() then - Halt(DebugHalt_Step_Exclusive); - else - Halt(DebugHalt_Step_Normal); - -// HaveDoPD() -// ========== -// Returns TRUE if Debug Over Power Down extension -// support is implemented and FALSE otherwise. - -boolean HaveDoPD() - return HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Has DoPD extension"; - -// CheckOSUnlockCatch() -// ==================== -// Called on unlocking the OS Lock to pend an OS Unlock Catch debug event - -CheckOSUnlockCatch() - - if (HaveDoPD() && CTIDEVCTL.OSUCE == '1') - || (!HaveDoPD() && EDECR.OSUCE == '1') - then - if !Halted() then EDESR.OSUC = '1'; - -// CheckPendingOSUnlockCatch() -// =========================== -// Check whether EDESR.OSUC has been set by an OS Unlock Catch debug event - -CheckPendingOSUnlockCatch() - if HaltingAllowed() && EDESR.OSUC == '1' then - Halt(DebugHalt_OSUnlockCatch); - -// CheckPendingResetCatch() -// ======================== -// Check whether EDESR.RC has been set by a Reset Catch debug event - -CheckPendingResetCatch() - if HaltingAllowed() && EDESR.RC == '1' then - Halt(DebugHalt_ResetCatch); - -// CheckResetCatch() -// ================= -// Called after reset - -CheckResetCatch() - if (HaveDoPD() && CTIDEVCTL.RCE == '1') || (!HaveDoPD() && EDECR.RCE == '1') then - EDESR.RC = '1'; - // If halting is allowed then halt immediately - if HaltingAllowed() then Halt(DebugHalt_ResetCatch); - -// CheckSoftwareAccessToDebugRegisters() -// ===================================== -// Check for access to Breakpoint and Watchpoint registers. - -CheckSoftwareAccessToDebugRegisters() - os_lock = (if ELUsingAArch32(EL1) then DBGOSLSR.OSLK else OSLSR_EL1.OSLK); - if HaltingAllowed() && EDSCR.TDA == '1' && os_lock == '0' then - Halt(DebugHalt_SoftwareAccess); - -// ExternalDebugRequest() -// ====================== - -ExternalDebugRequest() - if HaltingAllowed() then - Halt(DebugHalt_EDBGRQ); - // Otherwise the CTI continues to assert the debug request until it is taken. - -// RunHaltingStep() -// ================ - -RunHaltingStep(boolean exception_generated, bits(2) exception_target, boolean syscall, - boolean reset) - // "exception_generated" is TRUE if the previous instruction generated a synchronous exception - // or was cancelled by an asynchronous exception. - // - // if "exception_generated" is TRUE then "exception_target" is the target of the exception, and - // "syscall" is TRUE if the exception is a synchronous exception where the preferred return - // address is the instruction following that which generated the exception. - // - // "reset" is TRUE if exiting reset state into the highest EL. - - if reset then assert !Halted(); // Cannot come out of reset halted - active = EDECR.SS == '1' && !Halted(); - - if active && reset then // Coming out of reset with EDECR.SS set - EDESR.SS = '1'; - elsif active && HaltingAllowed() then - if exception_generated && exception_target == EL3 then - advance = syscall || ExternalSecureInvasiveDebugEnabled(); - else - advance = TRUE; - if advance then EDESR.SS = '1'; - - return; - -// Set a level-sensitive interrupt to the specified level. -SetInterruptRequestLevel(InterruptID id, signal level); - -// CreatePCSample() -// ================ - -CreatePCSample() - // In a simple sequential execution of the program, CreatePCSample is executed each time the PE - // executes an instruction that can be sampled. An implementation is not constrained such that - // reads of EDPCSRlo return the current values of PC, etc. - - pc_sample.valid = ExternalNoninvasiveDebugAllowed() && !Halted(); - pc_sample.pc = ThisInstrAddr(); - pc_sample.el = PSTATE.EL; - pc_sample.rw = if UsingAArch32() then '0' else '1'; - pc_sample.ns = if IsSecure() then '0' else '1'; - pc_sample.contextidr = if ELUsingAArch32(EL1) then CONTEXTIDR else CONTEXTIDR_EL1; - pc_sample.has_el2 = EL2Enabled(); - - if EL2Enabled() then - if ELUsingAArch32(EL2) then - pc_sample.vmid = ZeroExtend(VTTBR.VMID, 16); - elsif !Have16bitVMID() || VTCR_EL2.VS == '0' then - pc_sample.vmid = ZeroExtend(VTTBR_EL2.VMID[7:0], 16); - else - pc_sample.vmid = VTTBR_EL2.VMID; - if HaveVirtHostExt() && !ELUsingAArch32(EL2) then - pc_sample.contextidr_el2 = CONTEXTIDR_EL2; - else - pc_sample.contextidr_el2 = bits(32) UNKNOWN; - pc_sample.el0h = PSTATE.EL == EL0 && IsInHost(); - return; - -// EDPCSRlo[] (read) -// ================= - -bits(32) EDPCSRlo[boolean memory_mapped] - - if EDPRSR[6:5,0] != '001' then // Check DLK, OSLK and PU bits - IMPLEMENTATION_DEFINED "signal slave-generated error"; - return bits(32) UNKNOWN; - - // The Software lock is OPTIONAL. - update = !memory_mapped || EDLSR.SLK == '0'; // Software locked: no side-effects - - if pc_sample.valid then - sample = pc_sample.pc[31:0]; - if update then - if HaveVirtHostExt() && EDSCR.SC2 == '1' then - EDPCSRhi.PC = (if pc_sample.rw == '0' then Zeros(24) else pc_sample.pc[55:32]); - EDPCSRhi.EL = pc_sample.el; - EDPCSRhi.NS = pc_sample.ns; - else - EDPCSRhi = (if pc_sample.rw == '0' then Zeros(32) else pc_sample.pc[63:32]); - EDCIDSR = pc_sample.contextidr; - if HaveVirtHostExt() && EDSCR.SC2 == '1' then - EDVIDSR = (if HaveEL(EL2) && pc_sample.ns == '1' then pc_sample.contextidr_el2 - else bits(32) UNKNOWN); - else - if HaveEL(EL2) && pc_sample.ns == '1' && pc_sample.el IN {EL1,EL0} then - EDVIDSR.VMID = pc_sample.vmid; - else - EDVIDSR.VMID = Zeros(); - EDVIDSR.NS = pc_sample.ns; - EDVIDSR.E2 = (if pc_sample.el == EL2 then '1' else '0'); - EDVIDSR.E3 = (if pc_sample.el == EL3 then '1' else '0') AND pc_sample.rw; - // The conditions for setting HV are not specified if PCSRhi is zero. - // An example implementation may be "pc_sample.rw". - EDVIDSR.HV = (if !IsZero(EDPCSRhi) then '1' else bit IMPLEMENTATION_DEFINED "0 or 1"); - else - sample = Ones(32); - if update then - EDPCSRhi = bits(32) UNKNOWN; - EDCIDSR = bits(32) UNKNOWN; - EDVIDSR = bits(32) UNKNOWN; - - return sample; - -type PCSample is ( - boolean valid, - bits(64) pc, - bits(2) el, - bit rw, - bit ns, - boolean has_el2, - bits(32) contextidr, - bits(32) contextidr_el2, - boolean el0h, - bits(16) vmid -) - -PCSample pc_sample; - -// PMPCSR[] (read) -// =============== - -bits(32) PMPCSR[boolean memory_mapped] - - if EDPRSR[6:5,0] != '001' then // Check DLK, OSLK and PU bits - IMPLEMENTATION_DEFINED "signal slave-generated error"; - return bits(32) UNKNOWN; - - // The Software lock is OPTIONAL. - update = !memory_mapped || PMLSR.SLK == '0'; // Software locked: no side-effects - - if pc_sample.valid then - sample = pc_sample.pc[31:0]; - if update then - PMPCSR[55:32] = (if pc_sample.rw == '0' then Zeros(24) else pc_sample.pc[55:32]); - PMPCSR.EL = pc_sample.el; - PMPCSR.NS = pc_sample.ns; - - PMCID1SR = pc_sample.contextidr; - PMCID2SR = if pc_sample.has_el2 then pc_sample.contextidr_el2 else bits(32) UNKNOWN; - - PMVIDSR.VMID = (if pc_sample.has_el2 && pc_sample.el IN {EL1,EL0} && !pc_sample.el0h - then pc_sample.vmid else bits(16) UNKNOWN); - else - sample = Ones(32); - if update then - PMPCSR[55:32] = bits(24) UNKNOWN; - PMPCSR.EL = bits(2) UNKNOWN; - PMPCSR.NS = bit UNKNOWN; - - PMCID1SR = bits(32) UNKNOWN; - PMCID2SR = bits(32) UNKNOWN; - - PMVIDSR.VMID = bits(16) UNKNOWN; - - return sample; - -// CheckSoftwareStep() -// =================== -// Take a Software Step exception if in the active-pending state - -CheckSoftwareStep() - - // Other self-hosted debug functions will call AArch32.GenerateDebugExceptions() if called from - // AArch32 state. However, because Software Step is only active when the debug target Exception - // level is using AArch64, CheckSoftwareStep only calls AArch64.GenerateDebugExceptions(). - if !ELUsingAArch32(DebugTarget()) && AArch64.GenerateDebugExceptions() then - if MDSCR_EL1.SS == '1' && PSTATE.SS == '0' then - AArch64.SoftwareStepException(); - -// ReservedValue() -// =============== - -ReservedValue() - if UsingAArch32() && !AArch32.GeneralExceptionsToAArch64() then - AArch32.TakeUndefInstrException(); - else - AArch64.UndefinedFault(); - -// UnallocatedEncoding() -// ===================== - -UnallocatedEncoding() - if UsingAArch32() && AArch32.ExecutingCP10or11Instr() then - FPEXC.DEX = '0'; - if UsingAArch32() && !AArch32.GeneralExceptionsToAArch64() then - AArch32.TakeUndefInstrException(); - else - AArch64.UndefinedFault(); - -// Abs() -// ===== - -integer Abs(integer x) - return if x >= 0 then x else -x; - -// Abs() -// ===== - -real Abs(real x) - return if x >= 0.0 then x else -x; - -// BitCount() -// ========== - -integer BitCount(bits(N) x) - integer result = 0; - for i = 0 to N-1 - if x[i] == '1' then - result = result + 1; - return result; - -// CountLeadingZeroBits() -// ====================== - -integer CountLeadingZeroBits(bits(N) x) - return N - (HighestSetBit(x) + 1); - -// CountLeadingSignBits() -// ====================== - -integer CountLeadingSignBits(bits(N) x) - return CountLeadingZeroBits(x[N-1:1] EOR x[N-2:0]); - -// Int() -// ===== - -integer Int(bits(N) x, boolean unsigned) - result = if unsigned then UInt(x) else SInt(x); - return result; - -// IsZeroBit() -// =========== - -bit IsZeroBit(bits(N) x) - return if IsZero(x) then '1' else '0'; - -// LowestSetBit() -// ============== - -integer LowestSetBit(bits(N) x) - for i = 0 to N-1 - if x[i] == '1' then return i; - return N; - -// BitReverse() -// ============ - -bits(N) BitReverse(bits(N) data) - bits(N) result; - for i = 0 to N-1 - result[N-i-1] = data[i]; - return result; - -// HaveCRCExt() -// ============ - -boolean HaveCRCExt() - return HasArchVersion(ARMv8p1) || boolean IMPLEMENTATION_DEFINED "Have CRC extension"; - -// Poly32Mod2() -// ============ - -// Poly32Mod2 on a bitstring does a polynomial Modulus over {0,1} operation - -bits(32) Poly32Mod2(bits(N) data, bits(32) poly) - assert N > 32; - for i = N-1 downto 32 - if data[i] == '1' then - data[i-1:0] = data[i-1:0] EOR (poly:Zeros(i-32)); - return data[31:0]; - -// FFmul09() -// ========= - -bits(8) FFmul09(bits(8) b) - bits(256*8) FFmul_09 = ( - /* F E D C B A 9 8 7 6 5 4 3 2 1 0 */ - /*F*/ 0x464F545D626B70790E071C152A233831[127:0] : - /*E*/ 0xD6DFC4CDF2FBE0E99E978C85BAB3A8A1[127:0] : - /*D*/ 0x7D746F6659504B42353C272E1118030A[127:0] : - /*C*/ 0xEDE4FFF6C9C0DBD2A5ACB7BE8188939A[127:0] : - /*B*/ 0x3039222B141D060F78716A635C554E47[127:0] : - /*A*/ 0xA0A9B2BB848D969FE8E1FAF3CCC5DED7[127:0] : - /*9*/ 0x0B0219102F263D34434A5158676E757C[127:0] : - /*8*/ 0x9B928980BFB6ADA4D3DAC1C8F7FEE5EC[127:0] : - /*7*/ 0xAAA3B8B18E879C95E2EBF0F9C6CFD4DD[127:0] : - /*6*/ 0x3A3328211E170C05727B6069565F444D[127:0] : - /*5*/ 0x9198838AB5BCA7AED9D0CBC2FDF4EFE6[127:0] : - /*4*/ 0x0108131A252C373E49405B526D647F76[127:0] : - /*3*/ 0xDCD5CEC7F8F1EAE3949D868FB0B9A2AB[127:0] : - /*2*/ 0x4C455E5768617A73040D161F2029323B[127:0] : - /*1*/ 0xE7EEF5FCC3CAD1D8AFA6BDB48B829990[127:0] : - /*0*/ 0x777E656C535A41483F362D241B120900[127:0] - ); - return FFmul_09[UInt(b)*8+:8]; - -// FFmul0B() -// ========= - -bits(8) FFmul0B(bits(8) b) - bits(256*8) FFmul_0B = ( - /* F E D C B A 9 8 7 6 5 4 3 2 1 0 */ - /*F*/ 0xA3A8B5BE8F849992FBF0EDE6D7DCC1CA[127:0] : - /*E*/ 0x1318050E3F3429224B405D56676C717A[127:0] : - /*D*/ 0xD8D3CEC5F4FFE2E9808B969DACA7BAB1[127:0] : - /*C*/ 0x68637E75444F5259303B262D1C170A01[127:0] : - /*B*/ 0x555E434879726F640D061B10212A373C[127:0] : - /*A*/ 0xE5EEF3F8C9C2DFD4BDB6ABA0919A878C[127:0] : - /*9*/ 0x2E2538330209141F767D606B5A514C47[127:0] : - /*8*/ 0x9E958883B2B9A4AFC6CDD0DBEAE1FCF7[127:0] : - /*7*/ 0x545F424978736E650C071A11202B363D[127:0] : - /*6*/ 0xE4EFF2F9C8C3DED5BCB7AAA1909B868D[127:0] : - /*5*/ 0x2F2439320308151E777C616A5B504D46[127:0] : - /*4*/ 0x9F948982B3B8A5AEC7CCD1DAEBE0FDF6[127:0] : - /*3*/ 0xA2A9B4BF8E859893FAF1ECE7D6DDC0CB[127:0] : - /*2*/ 0x1219040F3E3528234A415C57666D707B[127:0] : - /*1*/ 0xD9D2CFC4F5FEE3E8818A979CADA6BBB0[127:0] : - /*0*/ 0x69627F74454E5358313A272C1D160B00[127:0] - ); - return FFmul_0B[UInt(b)*8+:8]; - -// FFmul0D() -// ========= - -bits(8) FFmul0D(bits(8) b) - bits(256*8) FFmul_0D = ( - /* F E D C B A 9 8 7 6 5 4 3 2 1 0 */ - /*F*/ 0x979A8D80A3AEB9B4FFF2E5E8CBC6D1DC[127:0] : - /*E*/ 0x474A5D50737E69642F2235381B16010C[127:0] : - /*D*/ 0x2C21363B1815020F44495E53707D6A67[127:0] : - /*C*/ 0xFCF1E6EBC8C5D2DF94998E83A0ADBAB7[127:0] : - /*B*/ 0xFAF7E0EDCEC3D4D9929F8885A6ABBCB1[127:0] : - /*A*/ 0x2A27303D1E130409424F5855767B6C61[127:0] : - /*9*/ 0x414C5B5675786F622924333E1D10070A[127:0] : - /*8*/ 0x919C8B86A5A8BFB2F9F4E3EECDC0D7DA[127:0] : - /*7*/ 0x4D40575A7974636E25283F32111C0B06[127:0] : - /*6*/ 0x9D90878AA9A4B3BEF5F8EFE2C1CCDBD6[127:0] : - /*5*/ 0xF6FBECE1C2CFD8D59E938489AAA7B0BD[127:0] : - /*4*/ 0x262B3C31121F08054E4354597A77606D[127:0] : - /*3*/ 0x202D3A3714190E034845525F7C71666B[127:0] : - /*2*/ 0xF0FDEAE7C4C9DED39895828FACA1B6BB[127:0] : - /*1*/ 0x9B96818CAFA2B5B8F3FEE9E4C7CADDD0[127:0] : - /*0*/ 0x4B46515C7F726568232E3934171A0D00[127:0] - ); - return FFmul_0D[UInt(b)*8+:8]; - -// FFmul0E() -// ========= - -bits(8) FFmul0E(bits(8) b) - bits(256*8) FFmul_0E = ( - /* F E D C B A 9 8 7 6 5 4 3 2 1 0 */ - /*F*/ 0x8D83919FB5BBA9A7FDF3E1EFC5CBD9D7[127:0] : - /*E*/ 0x6D63717F555B49471D13010F252B3937[127:0] : - /*D*/ 0x56584A446E60727C26283A341E10020C[127:0] : - /*C*/ 0xB6B8AAA48E80929CC6C8DAD4FEF0E2EC[127:0] : - /*B*/ 0x202E3C321816040A505E4C426866747A[127:0] : - /*A*/ 0xC0CEDCD2F8F6E4EAB0BEACA28886949A[127:0] : - /*9*/ 0xFBF5E7E9C3CDDFD18B859799B3BDAFA1[127:0] : - /*8*/ 0x1B150709232D3F316B657779535D4F41[127:0] : - /*7*/ 0xCCC2D0DEF4FAE8E6BCB2A0AE848A9896[127:0] : - /*6*/ 0x2C22303E141A08065C52404E646A7876[127:0] : - /*5*/ 0x17190B052F21333D67697B755F51434D[127:0] : - /*4*/ 0xF7F9EBE5CFC1D3DD87899B95BFB1A3AD[127:0] : - /*3*/ 0x616F7D735957454B111F0D032927353B[127:0] : - /*2*/ 0x818F9D93B9B7A5ABF1FFEDE3C9C7D5DB[127:0] : - /*1*/ 0xBAB4A6A8828C9E90CAC4D6D8F2FCEEE0[127:0] : - /*0*/ 0x5A544648626C7E702A243638121C0E00[127:0] - ); - return FFmul_0E[UInt(b)*8+:8]; - -// AESInvMixColumns() -// ================== -// Transformation in the Inverse Cipher that is the inverse of AESMixColumns. - -bits(128) AESInvMixColumns(bits (128) op) - bits(4*8) in0 = op[ 96+:8] : op[ 64+:8] : op[ 32+:8] : op[ 0+:8]; - bits(4*8) in1 = op[104+:8] : op[ 72+:8] : op[ 40+:8] : op[ 8+:8]; - bits(4*8) in2 = op[112+:8] : op[ 80+:8] : op[ 48+:8] : op[ 16+:8]; - bits(4*8) in3 = op[120+:8] : op[ 88+:8] : op[ 56+:8] : op[ 24+:8]; - - bits(4*8) out0; - bits(4*8) out1; - bits(4*8) out2; - bits(4*8) out3; - - for c = 0 to 3 - out0[c*8+:8] = FFmul0E(in0[c*8+:8]) EOR FFmul0B(in1[c*8+:8]) EOR FFmul0D(in2[c*8+:8]) EOR FFmul09(in3[c*8+:8]); - out1[c*8+:8] = FFmul09(in0[c*8+:8]) EOR FFmul0E(in1[c*8+:8]) EOR FFmul0B(in2[c*8+:8]) EOR FFmul0D(in3[c*8+:8]); - out2[c*8+:8] = FFmul0D(in0[c*8+:8]) EOR FFmul09(in1[c*8+:8]) EOR FFmul0E(in2[c*8+:8]) EOR FFmul0B(in3[c*8+:8]); - out3[c*8+:8] = FFmul0B(in0[c*8+:8]) EOR FFmul0D(in1[c*8+:8]) EOR FFmul09(in2[c*8+:8]) EOR FFmul0E(in3[c*8+:8]); - - return ( - out3[3*8+:8] : out2[3*8+:8] : out1[3*8+:8] : out0[3*8+:8] : - out3[2*8+:8] : out2[2*8+:8] : out1[2*8+:8] : out0[2*8+:8] : - out3[1*8+:8] : out2[1*8+:8] : out1[1*8+:8] : out0[1*8+:8] : - out3[0*8+:8] : out2[0*8+:8] : out1[0*8+:8] : out0[0*8+:8] - ); - -// AESInvShiftRows() -// ================= -// Transformation in the Inverse Cipher that is inverse of AESShiftRows. - -bits(128) AESInvShiftRows(bits(128) op) - return ( - op[ 24+:8] : op[ 48+:8] : op[ 72+:8] : op[ 96+:8] : - op[120+:8] : op[ 16+:8] : op[ 40+:8] : op[ 64+:8] : - op[ 88+:8] : op[112+:8] : op[ 8+:8] : op[ 32+:8] : - op[ 56+:8] : op[ 80+:8] : op[104+:8] : op[ 0+:8] - ); - -// AESInvSubBytes() -// ================ -// Transformation in the Inverse Cipher that is the inverse of AESSubBytes. - -bits(128) AESInvSubBytes(bits(128) op) - // Inverse S-box values - bits(16*16*8) GF2_inv = ( - /* F E D C B A 9 8 7 6 5 4 3 2 1 0 */ - /*F*/ 0x7d0c2155631469e126d677ba7e042b17[127:0] : - /*E*/ 0x619953833cbbebc8b0f52aae4d3be0a0[127:0] : - /*D*/ 0xef9cc9939f7ae52d0d4ab519a97f5160[127:0] : - /*C*/ 0x5fec8027591012b131c7078833a8dd1f[127:0] : - /*B*/ 0xf45acd78fec0db9a2079d2c64b3e56fc[127:0] : - /*A*/ 0x1bbe18aa0e62b76f89c5291d711af147[127:0] : - /*9*/ 0x6edf751ce837f9e28535ade72274ac96[127:0] : - /*8*/ 0x73e6b4f0cecff297eadc674f4111913a[127:0] : - /*7*/ 0x6b8a130103bdafc1020f3fca8f1e2cd0[127:0] : - /*6*/ 0x0645b3b80558e4f70ad3bc8c00abd890[127:0] : - /*5*/ 0x849d8da75746155edab9edfd5048706c[127:0] : - /*4*/ 0x92b6655dcc5ca4d41698688664f6f872[127:0] : - /*3*/ 0x25d18b6d49a25b76b224d92866a12e08[127:0] : - /*2*/ 0x4ec3fa420b954cee3d23c2a632947b54[127:0] : - /*1*/ 0xcbe9dec444438e3487ff2f9b8239e37c[127:0] : - /*0*/ 0xfbd7f3819ea340bf38a53630d56a0952[127:0] - ); - bits(128) out; - for i = 0 to 15 - out[i*8+:8] = GF2_inv[UInt(op[i*8+:8])*8+:8]; - return out; - -// FFmul02() -// ========= - -bits(8) FFmul02(bits(8) b) - bits(256*8) FFmul_02 = ( - /* F E D C B A 9 8 7 6 5 4 3 2 1 0 */ - /*F*/ 0xE5E7E1E3EDEFE9EBF5F7F1F3FDFFF9FB[127:0] : - /*E*/ 0xC5C7C1C3CDCFC9CBD5D7D1D3DDDFD9DB[127:0] : - /*D*/ 0xA5A7A1A3ADAFA9ABB5B7B1B3BDBFB9BB[127:0] : - /*C*/ 0x858781838D8F898B959791939D9F999B[127:0] : - /*B*/ 0x656761636D6F696B757771737D7F797B[127:0] : - /*A*/ 0x454741434D4F494B555751535D5F595B[127:0] : - /*9*/ 0x252721232D2F292B353731333D3F393B[127:0] : - /*8*/ 0x050701030D0F090B151711131D1F191B[127:0] : - /*7*/ 0xFEFCFAF8F6F4F2F0EEECEAE8E6E4E2E0[127:0] : - /*6*/ 0xDEDCDAD8D6D4D2D0CECCCAC8C6C4C2C0[127:0] : - /*5*/ 0xBEBCBAB8B6B4B2B0AEACAAA8A6A4A2A0[127:0] : - /*4*/ 0x9E9C9A98969492908E8C8A8886848280[127:0] : - /*3*/ 0x7E7C7A78767472706E6C6A6866646260[127:0] : - /*2*/ 0x5E5C5A58565452504E4C4A4846444240[127:0] : - /*1*/ 0x3E3C3A38363432302E2C2A2826242220[127:0] : - /*0*/ 0x1E1C1A18161412100E0C0A0806040200[127:0] - ); - return FFmul_02[UInt(b)*8+:8]; - -// FFmul03() -// ========= - -bits(8) FFmul03(bits(8) b) - bits(256*8) FFmul_03 = ( - /* F E D C B A 9 8 7 6 5 4 3 2 1 0 */ - /*F*/ 0x1A191C1F16151013020104070E0D080B[127:0] : - /*E*/ 0x2A292C2F26252023323134373E3D383B[127:0] : - /*D*/ 0x7A797C7F76757073626164676E6D686B[127:0] : - /*C*/ 0x4A494C4F46454043525154575E5D585B[127:0] : - /*B*/ 0xDAD9DCDFD6D5D0D3C2C1C4C7CECDC8CB[127:0] : - /*A*/ 0xEAE9ECEFE6E5E0E3F2F1F4F7FEFDF8FB[127:0] : - /*9*/ 0xBAB9BCBFB6B5B0B3A2A1A4A7AEADA8AB[127:0] : - /*8*/ 0x8A898C8F86858083929194979E9D989B[127:0] : - /*7*/ 0x818287848D8E8B88999A9F9C95969390[127:0] : - /*6*/ 0xB1B2B7B4BDBEBBB8A9AAAFACA5A6A3A0[127:0] : - /*5*/ 0xE1E2E7E4EDEEEBE8F9FAFFFCF5F6F3F0[127:0] : - /*4*/ 0xD1D2D7D4DDDEDBD8C9CACFCCC5C6C3C0[127:0] : - /*3*/ 0x414247444D4E4B48595A5F5C55565350[127:0] : - /*2*/ 0x717277747D7E7B78696A6F6C65666360[127:0] : - /*1*/ 0x212227242D2E2B28393A3F3C35363330[127:0] : - /*0*/ 0x111217141D1E1B18090A0F0C05060300[127:0] - ); - return FFmul_03[UInt(b)*8+:8]; - -// AESMixColumns() -// =============== -// Transformation in the Cipher that takes all of the columns of the -// State and mixes their data (independently of one another) to -// produce new columns. - -bits(128) AESMixColumns(bits (128) op) - bits(4*8) in0 = op[ 96+:8] : op[ 64+:8] : op[ 32+:8] : op[ 0+:8]; - bits(4*8) in1 = op[104+:8] : op[ 72+:8] : op[ 40+:8] : op[ 8+:8]; - bits(4*8) in2 = op[112+:8] : op[ 80+:8] : op[ 48+:8] : op[ 16+:8]; - bits(4*8) in3 = op[120+:8] : op[ 88+:8] : op[ 56+:8] : op[ 24+:8]; - - bits(4*8) out0; - bits(4*8) out1; - bits(4*8) out2; - bits(4*8) out3; - - for c = 0 to 3 - out0[c*8+:8] = FFmul02(in0[c*8+:8]) EOR FFmul03(in1[c*8+:8]) EOR in2[c*8+:8] EOR in3[c*8+:8]; - out1[c*8+:8] = in0[c*8+:8] EOR FFmul02(in1[c*8+:8]) EOR FFmul03(in2[c*8+:8]) EOR in3[c*8+:8]; - out2[c*8+:8] = in0[c*8+:8] EOR in1[c*8+:8] EOR FFmul02(in2[c*8+:8]) EOR FFmul03(in3[c*8+:8]); - out3[c*8+:8] = FFmul03(in0[c*8+:8]) EOR in1[c*8+:8] EOR in2[c*8+:8] EOR FFmul02(in3[c*8+:8]); - - return ( - out3[3*8+:8] : out2[3*8+:8] : out1[3*8+:8] : out0[3*8+:8] : - out3[2*8+:8] : out2[2*8+:8] : out1[2*8+:8] : out0[2*8+:8] : - out3[1*8+:8] : out2[1*8+:8] : out1[1*8+:8] : out0[1*8+:8] : - out3[0*8+:8] : out2[0*8+:8] : out1[0*8+:8] : out0[0*8+:8] - ); - -// AESShiftRows() -// ============== -// Transformation in the Cipher that processes the State by cyclically -// shifting the last three rows of the State by different offsets. - -bits(128) AESShiftRows(bits(128) op) - return ( - op[ 88+:8] : op[ 48+:8] : op[ 8+:8] : op[ 96+:8] : - op[ 56+:8] : op[ 16+:8] : op[104+:8] : op[ 64+:8] : - op[ 24+:8] : op[112+:8] : op[ 72+:8] : op[ 32+:8] : - op[120+:8] : op[ 80+:8] : op[ 40+:8] : op[ 0+:8] - ); - -// AESSubBytes() -// ============= -// Transformation in the Cipher that processes the State using a nonlinear -// byte substitution table (S-box) that operates on each of the State bytes -// independently. - -bits(128) AESSubBytes(bits(128) op) - // S-box values - bits(16*16*8) GF2 = ( - /* F E D C B A 9 8 7 6 5 4 3 2 1 0 */ - /*F*/ 0x16bb54b00f2d99416842e6bf0d89a18c[127:0] : - /*E*/ 0xdf2855cee9871e9b948ed9691198f8e1[127:0] : - /*D*/ 0x9e1dc186b95735610ef6034866b53e70[127:0] : - /*C*/ 0x8a8bbd4b1f74dde8c6b4a61c2e2578ba[127:0] : - /*B*/ 0x08ae7a65eaf4566ca94ed58d6d37c8e7[127:0] : - /*A*/ 0x79e4959162acd3c25c2406490a3a32e0[127:0] : - /*9*/ 0xdb0b5ede14b8ee4688902a22dc4f8160[127:0] : - /*8*/ 0x73195d643d7ea7c41744975fec130ccd[127:0] : - /*7*/ 0xd2f3ff1021dab6bcf5389d928f40a351[127:0] : - /*6*/ 0xa89f3c507f02f94585334d43fbaaefd0[127:0] : - /*5*/ 0xcf584c4a39becb6a5bb1fc20ed00d153[127:0] : - /*4*/ 0x842fe329b3d63b52a05a6e1b1a2c8309[127:0] : - /*3*/ 0x75b227ebe28012079a059618c323c704[127:0] : - /*2*/ 0x1531d871f1e5a534ccf73f362693fdb7[127:0] : - /*1*/ 0xc072a49cafa2d4adf04759fa7dc982ca[127:0] : - /*0*/ 0x76abd7fe2b670130c56f6bf27b777c63[127:0] - ); - bits(128) out; - for i = 0 to 15 - out[i*8+:8] = GF2[UInt(op[i*8+:8])*8+:8]; - return out; - -// HaveAESExt() -// ============ -// TRUE if AES cryptographic instructions support is implemented, -// FALSE otherwise. - -boolean HaveAESExt() - return boolean IMPLEMENTATION_DEFINED "Has AES Crypto instructions"; - -// HaveBit128PMULLExt() -// ==================== -// TRUE if 128 bit form of PMULL instructions support is implemented, -// FALSE otherwise. - -boolean HaveBit128PMULLExt() - return boolean IMPLEMENTATION_DEFINED "Has 128-bit form of PMULL instructions"; - -// HaveSHA1Ext() -// ============= -// TRUE if SHA1 cryptographic instructions support is implemented, -// FALSE otherwise. - -boolean HaveSHA1Ext() - return boolean IMPLEMENTATION_DEFINED "Has SHA1 Crypto instructions"; - -// HaveSHA256Ext() -// =============== -// TRUE if SHA256 cryptographic instructions support is implemented, -// FALSE otherwise. - -boolean HaveSHA256Ext() - return boolean IMPLEMENTATION_DEFINED "Has SHA256 Crypto instructions"; - -// HaveSHA3Ext() -// ============= -// TRUE if SHA3 cryptographic instructions support is implemented, -// and when SHA1 and SHA2 basic cryptographic instructions support is implemented, -// FALSE otherwise. - -boolean HaveSHA3Ext() - if !HasArchVersion(ARMv8p2) || !(HaveSHA1Ext() && HaveSHA256Ext()) then - return FALSE; - return boolean IMPLEMENTATION_DEFINED "Has SHA3 Crypto instructions"; - -// HaveSHA512Ext() -// =============== -// TRUE if SHA512 cryptographic instructions support is implemented, -// and when SHA1 and SHA2 basic cryptographic instructions support is implemented, -// FALSE otherwise. - -boolean HaveSHA512Ext() - if !HasArchVersion(ARMv8p2) || !(HaveSHA1Ext() && HaveSHA256Ext()) then - return FALSE; - return boolean IMPLEMENTATION_DEFINED "Has SHA512 Crypto instructions"; - -// HaveSM3Ext() -// ============ -// TRUE if SM3 cryptographic instructions support is implemented, -// FALSE otherwise. - -boolean HaveSM3Ext() - if !HasArchVersion(ARMv8p2) then - return FALSE; - return boolean IMPLEMENTATION_DEFINED "Has SM3 Crypto instructions"; - -// HaveSM4Ext() -// ============ -// TRUE if SM4 cryptographic instructions support is implemented, -// FALSE otherwise. - -boolean HaveSM4Ext() - if !HasArchVersion(ARMv8p2) then - return FALSE; - return boolean IMPLEMENTATION_DEFINED "Has SM4 Crypto instructions"; - -// ROL() -// ===== - -bits(N) ROL(bits(N) x, integer shift) - assert shift >= 0 && shift <= N; - if (shift == 0) then - return x; - return ROR(x, N-shift); - -// SHAchoose() -// =========== - -bits(32) SHAchoose(bits(32) x, bits(32) y, bits(32) z) - return (((y EOR z) AND x) EOR z); - -// SHAhashSIGMA0() -// =============== - -bits(32) SHAhashSIGMA0(bits(32) x) - return ROR(x, 2) EOR ROR(x, 13) EOR ROR(x, 22); - -// SHAhashSIGMA1() -// =============== - -bits(32) SHAhashSIGMA1(bits(32) x) - return ROR(x, 6) EOR ROR(x, 11) EOR ROR(x, 25); - -// SHAmajority() -// ============= - -bits(32) SHAmajority(bits(32) x, bits(32) y, bits(32) z) - return ((x AND y) OR ((x OR y) AND z)); - -// SHA256hash() -// ============ - -bits(128) SHA256hash(bits (128) X, bits(128) Y, bits(128) W, boolean part1) - bits(32) chs, maj, t; - - for e = 0 to 3 - chs = SHAchoose(Y[31:0], Y[63:32], Y[95:64]); - maj = SHAmajority(X[31:0], X[63:32], X[95:64]); - t = Y[127:96] + SHAhashSIGMA1(Y[31:0]) + chs + Elem[W, e, 32]; - X[127:96] = t + X[127:96]; - Y[127:96] = t + SHAhashSIGMA0(X[31:0]) + maj; - [Y, X] = ROL(Y : X, 32); - return (if part1 then X else Y); - -// SHAparity() -// =========== - -bits(32) SHAparity(bits(32) x, bits(32) y, bits(32) z) - return (x EOR y EOR z); - -// Sbox() -// ====== -// Used in SM4E crypto instruction - -bits(8) Sbox(bits(8) sboxin) - bits(8) sboxout; - bits(2048) sboxstring = 0xd690e9fecce13db716b614c228fb2c052b679a762abe04c3aa441326498606999c4250f491ef987a33540b43edcfac62e4b31ca9c908e89580df94fa758f3fa64707a7fcf37317ba83593c19e6854fa8686b81b27164da8bf8eb0f4b70569d351e240e5e6358d1a225227c3b01217887d40046579fd327524c3602e7a0c4c89eeabf8ad240c738b5a3f7f2cef96115a1e0ae5da49b341a55ad933230f58cb1e31df6e22e8266ca60c02923ab0d534e6fd5db3745defd8e2f03ff6a726d6c5b518d1baf92bbddbc7f11d95c411f105ad80ac13188a5cd7bbd2d74d012b8e5b4b08969974a0c96777e65b9f109c56ec68418f07dec3adc4d2079ee5f3ed7cb3948[2047:0]; - - sboxout = sboxstring[(255-UInt(sboxin))*8+7:(255-UInt(sboxin))*8]; - return sboxout; - -// ClearExclusiveMonitors() -// ======================== - -// Clear the local Exclusives monitor for the executing PE. - -ClearExclusiveMonitors() - ClearExclusiveLocal(ProcessorID()); - -// Returns '0' to indicate success if the last memory write by this PE was to -// the same physical address region endorsed by ExclusiveMonitorsPass(). -// Returns '1' to indicate failure if address translation resulted in a different -// physical address. -bit ExclusiveMonitorsStatus(); - -// HaveAArch32BF16Ext() -// ==================== -// Returns TRUE if AArch32 BFloat16 instruction support is implemented, and FALSE otherwise. - -boolean HaveAArch32BF16Ext() - return HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Has AArch32 BFloat16 extension"; - -// HaveAArch32Int8MatMulExt() -// ========================== -// Returns TRUE if AArch32 8-bit integer matrix multiply instruction support -// implemented, and FALSE otherwise. - -boolean HaveAArch32Int8MatMulExt() - return HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Has AArch32 Int8 Mat Mul extension"; - -// HaveAtomicExt() -// =============== - -boolean HaveAtomicExt() - return HasArchVersion(ARMv8p1); - -// HaveBF16Ext() -// ============= -// Returns TRUE if AArch64 BFloat16 instruction support is implemented, and FALSE otherwise. - -boolean HaveBF16Ext() - return HasArchVersion(ARMv8p6) || (HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Has AArch64 BFloat16 extension"); - -// HaveDGHExt() -// ============ -// Returns TRUE if Data Gathering Hint instruction support is implemented, and FALSE otherwise. - -boolean HaveDGHExt() - return boolean IMPLEMENTATION_DEFINED "Has AArch64 DGH extension"; - -// HaveDOTPExt() -// ============= -// Returns TRUE if Dot Product feature support is implemented, and FALSE otherwise. - -boolean HaveDOTPExt() - return HasArchVersion(ARMv8p4) || (HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Has Dot Product extension"); - -// HaveMPAMExt() -// ============= -// Returns TRUE if MPAM is implemented, and FALSE otherwise. - -boolean HaveMPAMExt() - return (HasArchVersion(ARMv8p2) && - boolean IMPLEMENTATION_DEFINED "Has MPAM extension"); - -// HaveEMPAMExt() -// ============== -// Returns TRUE if Enhanced MPAM is implemented, and FALSE otherwise. - -boolean HaveEMPAMExt() - return (HasArchVersion(ARMv8p6) && - HaveMPAMExt() && - boolean IMPLEMENTATION_DEFINED "Has enhanced MPAM extension"); - -// HaveExtendedCacheSets() -// ======================= - -boolean HaveExtendedCacheSets() - return HasArchVersion(ARMv8p3); - -// HaveFCADDExt() -// ============== - -boolean HaveFCADDExt() - return HasArchVersion(ARMv8p3); - -// HaveFJCVTZSExt() -// ================ - -boolean HaveFJCVTZSExt() - return HasArchVersion(ARMv8p3); - -// HaveFP16Ext() -// ============= -// Return TRUE if FP16 extension is supported - -boolean HaveFP16Ext() - return boolean IMPLEMENTATION_DEFINED; - -// HaveFP16MulNoRoundingToFP32Ext() -// ================================ -// Returns TRUE if has FP16 multiply with no intermediate rounding accumulate to FP32 instructions, -// and FALSE otherwise - -boolean HaveFP16MulNoRoundingToFP32Ext() - if !HaveFP16Ext() then return FALSE; - if HasArchVersion(ARMv8p4) then return TRUE; - return (HasArchVersion(ARMv8p2) && - boolean IMPLEMENTATION_DEFINED "Has accumulate FP16 product into FP32 extension"); - -// HaveFlagFormatExt() -// =================== -// Returns TRUE if flag format conversion instructions implemented. - -boolean HaveFlagFormatExt() - return HasArchVersion(ARMv8p5); - -// HaveFlagManipulateExt() -// ======================= -// Returns TRUE if flag manipulate instructions are implemented. - -boolean HaveFlagManipulateExt() - return HasArchVersion(ARMv8p4); - -// HaveFrintExt() -// ============== -// Returns TRUE if FRINT instructions are implemented. - -boolean HaveFrintExt() - return HasArchVersion(ARMv8p5); - -// HaveIDSExt() -// ============ -// Returns TRUE if ID register handling feature is implemented. - -boolean HaveIDSExt() - return HasArchVersion(ARMv8p4); - -// HaveInt8MatMulExt() -// =================== -// Returns TRUE if AArch64 8-bit integer matrix multiply instruction support -// implemented, and FALSE otherwise. - -boolean HaveInt8MatMulExt() - return HasArchVersion(ARMv8p6) || (HasArchVersion(ARMv8p2) && boolean IMPLEMENTATION_DEFINED "Has AArch64 Int8 Mat Mul extension"); - -// HavePageBasedHardwareAttributes() -// ================================= - -boolean HavePageBasedHardwareAttributes() - return HasArchVersion(ARMv8p2); - -// HaveRNG() -// ========= -// Returns TRUE if Random Number Generator extension -// support is implemented and FALSE otherwise. - -boolean HaveRNG() - return HasArchVersion(ARMv8p5) && boolean IMPLEMENTATION_DEFINED "Has RNG extension"; - -// HaveSBExt() -// =========== -// Returns TRUE if support for SB is implemented, and FALSE otherwise. - -boolean HaveSBExt() - return HasArchVersion(ARMv8p5) || boolean IMPLEMENTATION_DEFINED "Has SB extension"; - -// HaveSelfHostedTrace() -// ===================== - -boolean HaveSelfHostedTrace() - return HasArchVersion(ARMv8p4); - -// HaveTraceExt() -// ============== -// Returns TRUE if Trace functionality as described by the Trace Architecture -// is implemented. - -boolean HaveTraceExt() - return boolean IMPLEMENTATION_DEFINED "Has Trace Architecture functionality"; - -// BFRound() -// ========= -// Converts a real number OP into a single-precision value using the -// Round to Odd rounding mode and following BFloat16 computation behaviors. - -bits(32) BFRound(real op) - assert op != 0.0; - bits(32) result; - - // Format parameters - minimum exponent, numbers of exponent and fraction bits. - minimum_exp = -126; E = 8; F = 23; - - // Split value into sign, unrounded mantissa and exponent. - if op < 0.0 then - sign = '1'; mantissa = -op; - else - sign = '0'; mantissa = op; - exponent = 0; - while mantissa < 1.0 do - mantissa = mantissa * 2.0; exponent = exponent - 1; - while mantissa >= 2.0 do - mantissa = mantissa / 2.0; exponent = exponent + 1; - - // Fixed Flush-to-zero. - if exponent < minimum_exp then - return FPZero(sign); - - // Start creating the exponent value for the result. Start by biasing the actual exponent - // so that the minimum exponent becomes 1, lower values 0 (indicating possible underflow). - biased_exp = Max(exponent - minimum_exp + 1, 0); - if biased_exp == 0 then mantissa = mantissa / 2.0^(minimum_exp - exponent); - - // Get the unrounded mantissa as an integer, and the "units in last place" rounding error. - int_mant = RoundDown(mantissa * 2.0^F); // < 2.0^F if biased_exp == 0, >= 2.0^F if not - error = mantissa * 2.0^F - Real(int_mant); - - // Round to Odd - if error != 0.0 then - int_mant[0] = '1'; - - // Deal with overflow and generate result. - if biased_exp >= 2^E - 1 then - result = FPInfinity(sign); // Overflows generate appropriately-signed Infinity - else - result = sign : biased_exp[30-F:0] : int_mant[F-1:0]; - - return result; - -// BFUnpack() -// ========== -// Unpacks a BFloat16 or single-precision value into its type1, -// sign bit and real number that it represents. -// The real number result has the correct sign for numbers and infinities, -// is very large in magnitude for infinities, and is 0.0 for NaNs. -// (These values are chosen to simplify the description of -// comparisons and conversions.) - -(FPType, bit, real) BFUnpack(bits(N) fpval) - assert N IN {16,32}; - - if N == 16 then - sign = fpval[15]; - exp = fpval[14:7]; - frac = fpval[6:0] : Zeros(16); - else // N == 32 - sign = fpval[31]; - exp = fpval[30:23]; - frac = fpval[22:0]; - - if IsZero(exp) then - fptype = FPType_Zero; value = 0.0; // Fixed Flush to Zero - elsif IsOnes(exp) then - if IsZero(frac) then - fptype = FPType_Infinity; value = 2.0^1000000; - else // no SNaN for BF16 arithmetic - fptype = FPType_QNaN; value = 0.0; - else - fptype = FPType_Nonzero; - value = 2.0^(UInt(exp)-127) * (1.0 + Real(UInt(frac)) * 2.0^-23); - - if sign == '1' then value = -value; - - return (fptype, sign, value); - -// BFAdd() -// ======= -// Single-precision add following BFloat16 computation behaviors. - -bits(32) BFAdd(bits(32) op1, bits(32) op2) - bits(32) result; - - (type1,sign1,value1) = BFUnpack(op1); - (type2,sign2,value2) = BFUnpack(op2); - if type1 == FPType_QNaN || type2 == FPType_QNaN then - result = FPDefaultNaN(); - else - inf1 = (type1 == FPType_Infinity); - inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); - zero2 = (type2 == FPType_Zero); - if inf1 && inf2 && sign1 == NOT(sign2) then - result = FPDefaultNaN(); - elsif (inf1 && sign1 == '0') || (inf2 && sign2 == '0') then - result = FPInfinity('0'); - elsif (inf1 && sign1 == '1') || (inf2 && sign2 == '1') then - result = FPInfinity('1'); - elsif zero1 && zero2 && sign1 == sign2 then - result = FPZero(sign1); - else - result_value = value1 + value2; - if result_value == 0.0 then - result = FPZero('0'); // Positive sign when Round to Odd - else - result = BFRound(result_value); - - return result; - -// BFMul() -// ======= -// BFloat16 widening multiply to single-precision following BFloat16 -// computation behaviors. - -bits(32) BFMul(bits(16) op1, bits(16) op2) - bits(32) result; - - (type1,sign1,value1) = BFUnpack(op1); - (type2,sign2,value2) = BFUnpack(op2); - if type1 == FPType_QNaN || type2 == FPType_QNaN then - result = FPDefaultNaN(); - else - inf1 = (type1 == FPType_Infinity); - inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); - zero2 = (type2 == FPType_Zero); - if (inf1 && zero2) || (zero1 && inf2) then - result = FPDefaultNaN(); - elsif inf1 || inf2 then - result = FPInfinity(sign1 EOR sign2); - elsif zero1 || zero2 then - result = FPZero(sign1 EOR sign2); - else - result = BFRound(value1*value2); - - return result; - -// BFMatMulAdd() -// ============= -// BFloat16 matrix multiply and add to single-precision matrix -// result[2, 2] = addend[2, 2] + (op1[2, 4] * op2[4, 2]) - -bits(N) BFMatMulAdd(bits(N) addend, bits(N) op1, bits(N) op2) - assert N == 128; - - bits(N) result; - bits(32) sum, prod0, prod1; - - for i = 0 to 1 - for j = 0 to 1 - sum = Elem[addend, 2*i + j, 32]; - for k = 0 to 1 - prod0 = BFMul(Elem[op1, 4*i + 2*k + 0, 16], Elem[op2, 4*j + 2*k + 0, 16]); - prod1 = BFMul(Elem[op1, 4*i + 2*k + 1, 16], Elem[op2, 4*j + 2*k + 1, 16]); - sum = BFAdd(sum, BFAdd(prod0, prod1)); - Elem[result, 2*i + j, 32] = sum; - - return result; - -// FPRoundCVBF() -// ============= -// Converts a real number OP into a BFloat16 value using the supplied rounding mode RMODE. - -bits(32) FPRoundCVBF(real op, FPCRType fpcr, FPRounding rounding) - boolean isbfloat = TRUE; - return FPRoundBase(op, fpcr, rounding, isbfloat); - -// FPConvertBF() -// ============= -// Converts a single-precision OP to BFloat16 value with rounding controlled by ROUNDING. - -bits(16) FPConvertBF(bits(32) op, FPCRType fpcr, FPRounding rounding) - bits(32) result; // BF16 value in top 16 bits - - // Unpack floating-point operand optionally with flush-to-zero. - (fptype,sign,value) = FPUnpack(op, fpcr); - - if fptype == FPType_SNaN || fptype == FPType_QNaN then - if fpcr.DN == '1' then - result = FPDefaultNaN(); - else - result = FPConvertNaN(op); - if fptype == FPType_SNaN then - FPProcessException(FPExc_InvalidOp, fpcr); - elsif fptype == FPType_Infinity then - result = FPInfinity(sign); - elsif fptype == FPType_Zero then - result = FPZero(sign); - else - result = FPRoundCVBF(value, fpcr, rounding); - - // Returns correctly rounded BF16 value from top 16 bits - return result[31:16]; - -// FPConvertBF() -// ============= -// Converts a single-precision operand to BFloat16 value. - -bits(16) FPConvertBF(bits(32) op, FPCRType fpcr) - return FPConvertBF(op, fpcr, FPRoundingMode(fpcr)); - -// FixedToFP() -// =========== - -// Convert M-bit fixed point OP with FBITS fractional bits to -// N-bit precision floating point, controlled by UNSIGNED and ROUNDING. - -bits(N) FixedToFP(bits(M) op, integer fbits, boolean unsigned, FPCRType fpcr, FPRounding rounding) - assert N IN {16,32,64}; - assert M IN {16,32,64}; - bits(N) result; - assert fbits >= 0; - assert rounding != FPRounding_ODD; - - // Correct signed-ness - int_operand = Int(op, unsigned); - - // Scale by fractional bits and generate a real value - real_operand = Real(int_operand) / 2.0^fbits; - - if real_operand == 0.0 then - result = FPZero('0'); - else - result = FPRound(real_operand, fpcr, rounding); - - return result; - -// FPAbs() -// ======= - -bits(N) FPAbs(bits(N) op) - assert N IN {16,32,64}; - return '0' : op[N-2:0]; - -// FPCompare() -// =========== - -bits(4) FPCompare(bits(N) op1, bits(N) op2, boolean signal_nans, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - if type1==FPType_SNaN || type1==FPType_QNaN || type2==FPType_SNaN || type2==FPType_QNaN then - result = '0011'; - if type1==FPType_SNaN || type2==FPType_SNaN || signal_nans then - FPProcessException(FPExc_InvalidOp, fpcr); - else - // All non-NaN cases can be evaluated on the values produced by FPUnpack() - if value1 == value2 then - result = '0110'; - elsif value1 < value2 then - result = '1000'; - else // value1 > value2 - result = '0010'; - return result; - -// FPCompareEQ() -// ============= - -boolean FPCompareEQ(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - if type1==FPType_SNaN || type1==FPType_QNaN || type2==FPType_SNaN || type2==FPType_QNaN then - result = FALSE; - if type1==FPType_SNaN || type2==FPType_SNaN then - FPProcessException(FPExc_InvalidOp, fpcr); - else - // All non-NaN cases can be evaluated on the values produced by FPUnpack() - result = (value1 == value2); - return result; - -// FPCompareGE() -// ============= - -boolean FPCompareGE(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - if type1==FPType_SNaN || type1==FPType_QNaN || type2==FPType_SNaN || type2==FPType_QNaN then - result = FALSE; - FPProcessException(FPExc_InvalidOp, fpcr); - else - // All non-NaN cases can be evaluated on the values produced by FPUnpack() - result = (value1 >= value2); - return result; - -// FPCompareGT() -// ============= - -boolean FPCompareGT(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - if type1==FPType_SNaN || type1==FPType_QNaN || type2==FPType_SNaN || type2==FPType_QNaN then - result = FALSE; - FPProcessException(FPExc_InvalidOp, fpcr); - else - // All non-NaN cases can be evaluated on the values produced by FPUnpack() - result = (value1 > value2); - return result; - -// FPDecodeRM() -// ============ - -// Decode most common AArch32 floating-point rounding encoding. - -FPRounding FPDecodeRM(bits(2) rm) - case rm of - when '00' return FPRounding_TIEAWAY; // A - when '01' return FPRounding_TIEEVEN; // N - when '10' return FPRounding_POSINF; // P - when '11' return FPRounding_NEGINF; // M - -// FPDiv() -// ======= - -bits(N) FPDiv(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - inf1 = (type1 == FPType_Infinity); - inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); - zero2 = (type2 == FPType_Zero); - if (inf1 && inf2) || (zero1 && zero2) then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - elsif inf1 || zero2 then - result = FPInfinity(sign1 EOR sign2); - if !inf1 then FPProcessException(FPExc_DivideByZero, fpcr); - elsif zero1 || inf2 then - result = FPZero(sign1 EOR sign2); - else - result = FPRound(value1/value2, fpcr); - return result; - -// FPMatMulAdd() -// ============= -// -// Floating point matrix multiply and add to same precision matrix -// result[2, 2] = addend[2, 2] + (op1[2, 2] * op2[2, 2]) - -bits(N) FPMatMulAdd(bits(N) addend, bits(N) op1, bits(N) op2, integer esize, FPCRType fpcr) - assert N == esize * 2 * 2; - bits(N) result; - bits(esize) prod0, prod1, sum; - - for i = 0 to 1 - for j = 0 to 1 - sum = Elem[addend, 2*i + j, esize]; - prod0 = FPMul(Elem[op1, 2*i + 0, esize], - Elem[op2, 2*j + 0, esize], fpcr); - prod1 = FPMul(Elem[op1, 2*i + 1, esize], - Elem[op2, 2*j + 1, esize], fpcr); - sum = FPAdd(sum, FPAdd(prod0, prod1, fpcr), fpcr); - Elem[result, 2*i + j, esize] = sum; - - return result; - -// FPMulAddH() -// =========== - -bits(N) FPMulAddH(bits(N) addend, bits(N DIV 2) op1, bits(N DIV 2) op2, FPCRType fpcr) - assert N IN {32,64}; - rounding = FPRoundingMode(fpcr); - (typeA,signA,valueA) = FPUnpack(addend, fpcr); - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - inf1 = (type1 == FPType_Infinity); zero1 = (type1 == FPType_Zero); - inf2 = (type2 == FPType_Infinity); zero2 = (type2 == FPType_Zero); - (done,result) = FPProcessNaNs3H(typeA, type1, type2, addend, op1, op2, fpcr); - if typeA == FPType_QNaN && ((inf1 && zero2) || (zero1 && inf2)) then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - if !done then - infA = (typeA == FPType_Infinity); zeroA = (typeA == FPType_Zero); - // Determine sign and type1 product will have if it does not cause an Invalid - // Operation. - signP = sign1 EOR sign2; - infP = inf1 || inf2; - zeroP = zero1 || zero2; - // Non SNaN-generated Invalid Operation cases are multiplies of zero by infinity and - // additions of opposite-signed infinities. - if (inf1 && zero2) || (zero1 && inf2) || (infA && infP && signA != signP) then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - // Other cases involving infinities produce an infinity of the same sign. - elsif (infA && signA == '0') || (infP && signP == '0') then - result = FPInfinity('0'); - elsif (infA && signA == '1') || (infP && signP == '1') then - result = FPInfinity('1'); - // Cases where the result is exactly zero and its sign is not determined by the - // rounding mode are additions of same-signed zeros. - elsif zeroA && zeroP && signA == signP then - result = FPZero(signA); - // Otherwise calculate numerical result and round it. - else - result_value = valueA + (value1 * value2); - if result_value == 0.0 then // Sign of exact zero result depends on rounding mode - result_sign = if rounding == FPRounding_NEGINF then '1' else '0'; - result = FPZero(result_sign); - else - result = FPRound(result_value, fpcr); - return result; - -// FPProcessNaNs3H() -// ================= - -(boolean, bits(N)) FPProcessNaNs3H(FPType type1, FPType type2, FPType type3, bits(N) op1, bits(N DIV 2) op2, bits(N DIV 2) op3, FPCRType fpcr) - assert N IN {32,64}; - bits(N) result; - if type1 == FPType_SNaN then - done = TRUE; result = FPProcessNaN(type1, op1, fpcr); - elsif type2 == FPType_SNaN then - done = TRUE; result = FPConvertNaN(FPProcessNaN(type2, op2, fpcr)); - elsif type3 == FPType_SNaN then - done = TRUE; result = FPConvertNaN(FPProcessNaN(type3, op3, fpcr)); - elsif type1 == FPType_QNaN then - done = TRUE; result = FPProcessNaN(type1, op1, fpcr); - elsif type2 == FPType_QNaN then - done = TRUE; result = FPConvertNaN(FPProcessNaN(type2, op2, fpcr)); - elsif type3 == FPType_QNaN then - done = TRUE; result = FPConvertNaN(FPProcessNaN(type3, op3, fpcr)); - else - done = FALSE; result = Zeros(); // 'Don't care' result - return (done, result); - -// FPMulX() -// ======== - -bits(N) FPMulX(bits(N) op1, bits(N) op2, FPCRType fpcr) - assert N IN {16,32,64}; - bits(N) result; - (type1,sign1,value1) = FPUnpack(op1, fpcr); - (type2,sign2,value2) = FPUnpack(op2, fpcr); - (done,result) = FPProcessNaNs(type1, type2, op1, op2, fpcr); - if !done then - inf1 = (type1 == FPType_Infinity); - inf2 = (type2 == FPType_Infinity); - zero1 = (type1 == FPType_Zero); - zero2 = (type2 == FPType_Zero); - if (inf1 && zero2) || (zero1 && inf2) then - result = FPTwo(sign1 EOR sign2); - elsif inf1 || inf2 then - result = FPInfinity(sign1 EOR sign2); - elsif zero1 || zero2 then - result = FPZero(sign1 EOR sign2); - else - result = FPRound(value1*value2, fpcr); - return result; - -// Compute estimate of reciprocal of 9-bit fixed-point number -// -// a is in range 256 .. 511 representing a number in the range 0.5 <= x < 1.0. -// result is in the range 256 .. 511 representing a number in the range in the range 1.0 to 511/256. - -integer RecipEstimate(integer a) - assert 256 <= a && a < 512; - a = a*2+1; // round to nearest - integer b = (2 ^ 19) DIV a; - r = (b+1) DIV 2; // round to nearest - assert 256 <= r && r < 512; - return r; - -// FPRecipEstimate() -// ================= - -bits(N) FPRecipEstimate(bits(N) operand, FPCRType fpcr) - assert N IN {16,32,64}; - (fptype,sign,value) = FPUnpack(operand, fpcr); - if fptype == FPType_SNaN || fptype == FPType_QNaN then - result = FPProcessNaN(fptype, operand, fpcr); - elsif fptype == FPType_Infinity then - result = FPZero(sign); - elsif fptype == FPType_Zero then - result = FPInfinity(sign); - FPProcessException(FPExc_DivideByZero, fpcr); - elsif ( - (N == 16 && Abs(value) < 2.0^-16) || - (N == 32 && Abs(value) < 2.0^-128) || - (N == 64 && Abs(value) < 2.0^-1024) - ) then - case FPRoundingMode(fpcr) of - when FPRounding_TIEEVEN - overflow_to_inf = TRUE; - when FPRounding_POSINF - overflow_to_inf = (sign == '0'); - when FPRounding_NEGINF - overflow_to_inf = (sign == '1'); - when FPRounding_ZERO - overflow_to_inf = FALSE; - result = if overflow_to_inf then FPInfinity(sign) else FPMaxNormal(sign); - FPProcessException(FPExc_Overflow, fpcr); - FPProcessException(FPExc_Inexact, fpcr); - elsif ((fpcr.FZ == '1' && N != 16) || (fpcr.FZ16 == '1' && N == 16)) - && ( - (N == 16 && Abs(value) >= 2.0^14) || - (N == 32 && Abs(value) >= 2.0^126) || - (N == 64 && Abs(value) >= 2.0^1022) - ) then - // Result flushed to zero of correct sign - result = FPZero(sign); - if UsingAArch32() then - FPSCR.UFC = '1'; - else - FPSR.UFC = '1'; - else - // Scale to a fixed point value in the range 0.5 <= x < 1.0 in steps of 1/512, and - // calculate result exponent. Scaled value has copied sign bit, - // exponent = 1022 = double-precision biased version of -1, - // fraction = original fraction - case N of - when 16 - fraction = operand[9:0] : Zeros(42); - exp = UInt(operand[14:10]); - when 32 - fraction = operand[22:0] : Zeros(29); - exp = UInt(operand[30:23]); - when 64 - fraction = operand[51:0]; - exp = UInt(operand[62:52]); - - if exp == 0 then - if fraction[51] == '0' then - exp = -1; - fraction = fraction[49:0]:'00'; - else - fraction = fraction[50:0]:'0'; - - integer scaled = UInt('1':fraction[51:44]); - - case N of - when 16 result_exp = 29 - exp; // In range 29-30 = -1 to 29+1 = 30 - when 32 result_exp = 253 - exp; // In range 253-254 = -1 to 253+1 = 254 - when 64 result_exp = 2045 - exp; // In range 2045-2046 = -1 to 2045+1 = 2046 - - // scaled is in range 256..511 representing a fixed-point number in range [0.5..1.0) - estimate = RecipEstimate(scaled); - - // estimate is in the range 256..511 representing a fixed point result in the range [1.0..2.0) - // Convert to scaled floating point result with copied sign bit, - // high-order bits from estimate, and exponent calculated above. - - fraction = estimate[7:0] : Zeros(44); - if result_exp == 0 then - fraction = '1' : fraction[51:1]; - elsif result_exp == -1 then - fraction = '01' : fraction[51:2]; - result_exp = 0; - - case N of - when 16 result = sign : result_exp[N-12:0] : fraction[51:42]; - when 32 result = sign : result_exp[N-25:0] : fraction[51:29]; - when 64 result = sign : result_exp[N-54:0] : fraction[51:0]; - - return result; - -// FPRecpX() -// ========= - -bits(N) FPRecpX(bits(N) op, FPCRType fpcr) - assert N IN {16,32,64}; - - case N of - when 16 esize = 5; - when 32 esize = 8; - when 64 esize = 11; - - bits(N) result; - bits(esize) exp; - bits(esize) max_exp; - bits(N-(esize+1)) frac = Zeros(); - - case N of - when 16 exp = op[10+esize-1:10]; - when 32 exp = op[23+esize-1:23]; - when 64 exp = op[52+esize-1:52]; - - max_exp = Ones(esize) - 1; - - (fptype,sign,value) = FPUnpack(op, fpcr); - if fptype == FPType_SNaN || fptype == FPType_QNaN then - result = FPProcessNaN(fptype, op, fpcr); - else - if IsZero(exp) then // Zero and denormals - result = sign:max_exp:frac; - else // Infinities and normals - result = sign:NOT(exp):frac; - - return result; - -// FPRoundInt() -// ============ - -// Round OP to nearest integral floating point value using rounding mode ROUNDING. -// If EXACT is TRUE, set FPSR.IXC if result is not numerically equal to OP. - -bits(N) FPRoundInt(bits(N) op, FPCRType fpcr, FPRounding rounding, boolean exact) - assert rounding != FPRounding_ODD; - assert N IN {16,32,64}; - - // Unpack using FPCR to determine if subnormals are flushed-to-zero - (fptype,sign,value) = FPUnpack(op, fpcr); - - if fptype == FPType_SNaN || fptype == FPType_QNaN then - result = FPProcessNaN(fptype, op, fpcr); - elsif fptype == FPType_Infinity then - result = FPInfinity(sign); - elsif fptype == FPType_Zero then - result = FPZero(sign); - else - // extract integer component - int_result = RoundDown(value); - error = value - Real(int_result); - - // Determine whether supplied rounding mode requires an increment - case rounding of - when FPRounding_TIEEVEN - round_up = (error > 0.5 || (error == 0.5 && int_result[0] == '1')); - when FPRounding_POSINF - round_up = (error != 0.0); - when FPRounding_NEGINF - round_up = FALSE; - when FPRounding_ZERO - round_up = (error != 0.0 && int_result < 0); - when FPRounding_TIEAWAY - round_up = (error > 0.5 || (error == 0.5 && int_result >= 0)); - - if round_up then int_result = int_result + 1; - - // Convert integer value into an equivalent real value - real_result = Real(int_result); - - // Re-encode as a floating-point value, result is always exact - if real_result == 0.0 then - result = FPZero(sign); - else - result = FPRound(real_result, fpcr, FPRounding_ZERO); - - // Generate inexact exceptions - if error != 0.0 && exact then - FPProcessException(FPExc_Inexact, fpcr); - - return result; - -// FPRoundIntN() -// ============= - -bits(N) FPRoundIntN(bits(N) op, FPCRType fpcr, FPRounding rounding, integer intsize) - assert rounding != FPRounding_ODD; - assert N IN {32,64}; - assert intsize IN {32, 64}; - integer exp; - constant integer E = (if N == 32 then 8 else 11); - constant integer F = N - (E + 1); - - // Unpack using FPCR to determine if subnormals are flushed-to-zero - (fptype,sign,value) = FPUnpack(op, fpcr); - - if fptype IN {FPType_SNaN, FPType_QNaN, FPType_Infinity} then - if N == 32 then - exp = 126 + intsize; - result = '1':exp[(E-1):0]:Zeros(F); - else - exp = 1022+intsize; - result = '1':exp[(E-1):0]:Zeros(F); - FPProcessException(FPExc_InvalidOp, fpcr); - elsif fptype == FPType_Zero then - result = FPZero(sign); - else - // Extract integer component - int_result = RoundDown(value); - error = value - Real(int_result); - - // Determine whether supplied rounding mode requires an increment - case rounding of - when FPRounding_TIEEVEN - round_up = error > 0.5 || (error == 0.5 && int_result[0] == '1'); - when FPRounding_POSINF - round_up = error != 0.0; - when FPRounding_NEGINF - round_up = FALSE; - when FPRounding_ZERO - round_up = error != 0.0 && int_result < 0; - when FPRounding_TIEAWAY - round_up = error > 0.5 || (error == 0.5 && int_result >= 0); - - if round_up then int_result = int_result + 1; - - if int_result > 2^(intsize-1)-1 || int_result < -1*2^(intsize-1) then - if N == 32 then - exp = 126 + intsize; - result = '1':exp[(E-1):0]:Zeros(F); - else - exp = 1022 + intsize; - result = '1':exp[(E-1):0]:Zeros(F); - FPProcessException(FPExc_InvalidOp, fpcr); - // this case shouldn't set Inexact - error = 0.0; - - else - // Convert integer value into an equivalent real value - real_result = Real(int_result); - - // Re-encode as a floating-point value, result is always exact - if real_result == 0.0 then - result = FPZero(sign); - else - result = FPRound(real_result, fpcr, FPRounding_ZERO); - - // Generate inexact exceptions - if error != 0.0 then - FPProcessException(FPExc_Inexact, fpcr); - - return result; - -// Compute estimate of reciprocal square root of 9-bit fixed-point number -// -// a is in range 128 .. 511 representing a number in the range 0.25 <= x < 1.0. -// result is in the range 256 .. 511 representing a number in the range in the range 1.0 to 511/256. - -integer RecipSqrtEstimate(integer a) - assert 128 <= a && a < 512; - if a < 256 then // 0.25 .. 0.5 - a = a*2+1; // a in units of 1/512 rounded to nearest - else // 0.5 .. 1.0 - a = (a >> 1) << 1; // discard bottom bit - a = (a+1)*2; // a in units of 1/256 rounded to nearest - integer b = 512; - while a*(b+1)*(b+1) < 2^28 do - b = b+1; - // b = largest b such that b < 2^14 / sqrt(a) do - r = (b+1) DIV 2; // round to nearest - assert 256 <= r && r < 512; - return r; - -// FPRSqrtEstimate() -// ================= - -bits(N) FPRSqrtEstimate(bits(N) operand, FPCRType fpcr) - assert N IN {16,32,64}; - (fptype,sign,value) = FPUnpack(operand, fpcr); - if fptype == FPType_SNaN || fptype == FPType_QNaN then - result = FPProcessNaN(fptype, operand, fpcr); - elsif fptype == FPType_Zero then - result = FPInfinity(sign); - FPProcessException(FPExc_DivideByZero, fpcr); - elsif sign == '1' then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - elsif fptype == FPType_Infinity then - result = FPZero('0'); - else - // Scale to a fixed-point value in the range 0.25 <= x < 1.0 in steps of 512, with the - // evenness or oddness of the exponent unchanged, and calculate result exponent. - // Scaled value has copied sign bit, exponent = 1022 or 1021 = double-precision - // biased version of -1 or -2, fraction = original fraction extended with zeros. - - case N of - when 16 - fraction = operand[9:0] : Zeros(42); - exp = UInt(operand[14:10]); - when 32 - fraction = operand[22:0] : Zeros(29); - exp = UInt(operand[30:23]); - when 64 - fraction = operand[51:0]; - exp = UInt(operand[62:52]); - - if exp == 0 then - while fraction[51] == '0' do - fraction = fraction[50:0] : '0'; - exp = exp - 1; - fraction = fraction[50:0] : '0'; - - if exp[0] == '0' then - scaled = UInt('1':fraction[51:44]); - else - scaled = UInt('01':fraction[51:45]); - - case N of - when 16 result_exp = ( 44 - exp) DIV 2; - when 32 result_exp = ( 380 - exp) DIV 2; - when 64 result_exp = (3068 - exp) DIV 2; - - estimate = RecipSqrtEstimate(scaled); - - // estimate is in the range 256..511 representing a fixed point result in the range [1.0..2.0) - // Convert to scaled floating point result with copied sign bit and high-order - // fraction bits, and exponent calculated above. - case N of - when 16 result = '0' : result_exp[N-12:0] : estimate[7:0]:Zeros( 2); - when 32 result = '0' : result_exp[N-25:0] : estimate[7:0]:Zeros(15); - when 64 result = '0' : result_exp[N-54:0] : estimate[7:0]:Zeros(44); - return result; - -// FPSqrt() -// ======== - -bits(N) FPSqrt(bits(N) op, FPCRType fpcr) - assert N IN {16,32,64}; - (fptype,sign,value) = FPUnpack(op, fpcr); - if fptype == FPType_SNaN || fptype == FPType_QNaN then - result = FPProcessNaN(fptype, op, fpcr); - elsif fptype == FPType_Zero then - result = FPZero(sign); - elsif fptype == FPType_Infinity && sign == '0' then - result = FPInfinity(sign); - elsif sign == '1' then - result = FPDefaultNaN(); - FPProcessException(FPExc_InvalidOp, fpcr); - else - result = FPRound(Sqrt(value), fpcr); - return result; - -// SatQ() -// ====== - -(bits(N), boolean) SatQ(integer i, integer N, boolean unsigned) - (result, sat) = if unsigned then UnsignedSatQ(i, N) else SignedSatQ(i, N); - return (result, sat); - -// FPToFixed() -// =========== - -// Convert N-bit precision floating point OP to M-bit fixed point with -// FBITS fractional bits, controlled by UNSIGNED and ROUNDING. - -bits(M) FPToFixed(bits(N) op, integer fbits, boolean unsigned, FPCRType fpcr, FPRounding rounding) - assert N IN {16,32,64}; - assert M IN {16,32,64}; - assert fbits >= 0; - assert rounding != FPRounding_ODD; - - // Unpack using fpcr to determine if subnormals are flushed-to-zero - (fptype,sign,value) = FPUnpack(op, fpcr); - - // If NaN, set cumulative flag or take exception - if fptype == FPType_SNaN || fptype == FPType_QNaN then - FPProcessException(FPExc_InvalidOp, fpcr); - - // Scale by fractional bits and produce integer rounded towards minus-infinity - value = value * 2.0^fbits; - int_result = RoundDown(value); - error = value - Real(int_result); - - // Determine whether supplied rounding mode requires an increment - case rounding of - when FPRounding_TIEEVEN - round_up = (error > 0.5 || (error == 0.5 && int_result[0] == '1')); - when FPRounding_POSINF - round_up = (error != 0.0); - when FPRounding_NEGINF - round_up = FALSE; - when FPRounding_ZERO - round_up = (error != 0.0 && int_result < 0); - when FPRounding_TIEAWAY - round_up = (error > 0.5 || (error == 0.5 && int_result >= 0)); - - if round_up then int_result = int_result + 1; - - // Generate saturated result and exceptions - (result, overflow) = SatQ(int_result, M, unsigned); - if overflow then - FPProcessException(FPExc_InvalidOp, fpcr); - elsif error != 0.0 then - FPProcessException(FPExc_Inexact, fpcr); - - return result; - -// FPToFixedJS() -// ============= - -// Converts a double precision floating point input value -// to a signed integer, with rounding to zero. - -(bits(N), bit) FPToFixedJS(bits(M) op, FPCRType fpcr, boolean Is64) - - assert M == 64 && N == 32; - - // Unpack using fpcr to determine if subnormals are flushed-to-zero - (fptype,sign,value) = FPUnpack(op, fpcr); - - Z = '1'; - // If NaN, set cumulative flag or take exception - if fptype == FPType_SNaN || fptype == FPType_QNaN then - FPProcessException(FPExc_InvalidOp, fpcr); - Z = '0'; - - int_result = RoundDown(value); - error = value - Real(int_result); - - // Determine whether supplied rounding mode requires an increment - - round_it_up = (error != 0.0 && int_result < 0); - if round_it_up then int_result = int_result + 1; - - if int_result < 0 then - result = int_result - 2^32*RoundUp(Real(int_result)/Real(2^32)); - else - result = int_result - 2^32*RoundDown(Real(int_result)/Real(2^32)); - - // Generate exceptions - if int_result < -(2^31) || int_result > (2^31)-1 then - FPProcessException(FPExc_InvalidOp, fpcr); - Z = '0'; - elsif error != 0.0 then - FPProcessException(FPExc_Inexact, fpcr); - Z = '0'; - elsif sign == '1' && value == 0.0 then - Z = '0'; - elsif sign == '0' && value == 0.0 && !IsZero(op[51:0]) then - Z = '0'; - - if fptype == FPType_Infinity then result = 0; - - return (result[N-1:0], Z); - -// VFPExpandImm() -// ============== - -bits(N) VFPExpandImm(bits(8) imm8) - assert N IN {16,32,64}; - constant integer E = (if N == 16 then 5 elsif N == 32 then 8 else 11); - constant integer F = N - E - 1; - sign = imm8[7]; - exp = NOT(imm8[6]):Replicate(imm8[6],E-3):imm8[5:4]; - frac = imm8[3:0]:Zeros(F-4); - return sign : exp : frac; - -// AddWithCarry() -// ============== -// Integer addition with carry input, returning result and NZCV flags - -(bits(N), bits(4)) AddWithCarry(bits(N) x, bits(N) y, bit carry_in) - integer unsigned_sum = UInt(x) + UInt(y) + UInt(carry_in); - integer signed_sum = SInt(x) + SInt(y) + UInt(carry_in); - bits(N) result = unsigned_sum[N-1:0]; // same value as signed_sum[N-1:0] - bit n = result[N-1]; - bit z = if IsZero(result) then '1' else '0'; - bit c = if UInt(result) == unsigned_sum then '0' else '1'; - bit v = if SInt(result) == signed_sum then '0' else '1'; - - return (result, n:z:c:v); - -enumeration MBReqDomain {MBReqDomain_Nonshareable, MBReqDomain_InnerShareable, - MBReqDomain_OuterShareable, MBReqDomain_FullSystem}; - -enumeration MBReqTypes {MBReqTypes_Reads, MBReqTypes_Writes, MBReqTypes_All}; - -DataMemoryBarrier(MBReqDomain domain, MBReqTypes types); - -DataSynchronizationBarrier(MBReqDomain domain, MBReqTypes types); - -SpeculativeStoreBypassBarrierToPA(); - -SpeculativeStoreBypassBarrierToVA(); - -constant PARTIDtype DefaultPARTID = 0[15:0]; - -constant PMGtype DefaultPMG = 0[7:0]; - -// DefaultMPAMinfo -// =============== -// Returns default MPAM info. If secure is TRUE return default Secure -// MPAMinfo, otherwise return default Non-secure MPAMinfo. - -MPAMinfo DefaultMPAMinfo(boolean secure) - MPAMinfo DefaultInfo; - DefaultInfo.mpam_ns = if secure then '0' else '1'; - DefaultInfo.partid = DefaultPARTID; - DefaultInfo.pmg = DefaultPMG; - return DefaultInfo; - -// MPAMisEnabled -// ============= -// Returns TRUE if MPAMisEnabled. - -boolean MPAMisEnabled() - el = HighestEL(); - case el of - when EL3 return MPAM3_EL3.MPAMEN == '1'; - when EL2 return MPAM2_EL2.MPAMEN == '1'; - when EL1 return MPAM1_EL1.MPAMEN == '1'; - -// mapvpmw -// ======= -// Map a virtual PARTID into a physical PARTID using -// the MPAMVPMn_EL2 registers. -// vpartid is now assumed in-range and valid (checked by caller) -// returns physical PARTID from mapping entry. - -PARTIDtype mapvpmw(integer vpartid) - bits(64) vpmw; - integer wd = vpartid DIV 4; - case wd of - when 0 vpmw = MPAMVPM0_EL2; - when 1 vpmw = MPAMVPM1_EL2; - when 2 vpmw = MPAMVPM2_EL2; - when 3 vpmw = MPAMVPM3_EL2; - when 4 vpmw = MPAMVPM4_EL2; - when 5 vpmw = MPAMVPM5_EL2; - when 6 vpmw = MPAMVPM6_EL2; - when 7 vpmw = MPAMVPM7_EL2; - otherwise vpmw = Zeros(64); - // vpme_lsb selects LSB of field within register - integer vpme_lsb = (vpartid MOD 4) * 16; - return vpmw[vpme_lsb +: 16]; - -// MAP_vPARTID -// =========== -// Performs conversion of virtual PARTID into physical PARTID -// Contains all of the error checking and implementation -// choices for the conversion. - -(PARTIDtype, boolean) MAP_vPARTID(PARTIDtype vpartid) - // should not ever be called if EL2 is not implemented - // or is implemented but not enabled in the current - // security state. - PARTIDtype ret; - boolean err; - integer virt = UInt( vpartid ); - integer vpmrmax = UInt( MPAMIDR_EL1.VPMR_MAX ); - - // vpartid_max is largest vpartid supported - integer vpartid_max = (4 * vpmrmax) + 3; - - // One of many ways to reduce vpartid to value less than vpartid_max. - if virt > vpartid_max then - virt = virt MOD (vpartid_max+1); - - // Check for valid mapping entry. - if MPAMVPMV_EL2[virt] == '1' then - // vpartid has a valid mapping so access the map. - ret = mapvpmw(virt); - err = FALSE; - - // Is the default virtual PARTID valid? - elsif MPAMVPMV_EL2[0] == '1' then - // Yes, so use default mapping for vpartid == 0. - ret = MPAMVPM0_EL2[0 +: 16]; - err = FALSE; - - // Neither is valid so use default physical PARTID. - else - ret = DefaultPARTID; - err = TRUE; - - // Check that the physical PARTID is in-range. - // This physical PARTID came from a virtual mapping entry. - integer partid_max = UInt( MPAMIDR_EL1.PARTID_MAX ); - if UInt(ret) > partid_max then - // Out of range, so return default physical PARTID - ret = DefaultPARTID; - err = TRUE; - return (ret, err); - -// MPAMisVirtual -// ============= -// Returns TRUE if MPAM is configured to be virtual at EL. - -boolean MPAMisVirtual(integer el) - return ( MPAMIDR_EL1.HAS_HCR == '1' && EL2Enabled() && - ( HCR_EL2.E2H == '0' || HCR_EL2.TGE == '0' ) && - (( el == 0 && MPAMHCR_EL2.EL0_VPMEN == '1' ) || - ( el == 1 && MPAMHCR_EL2.EL1_VPMEN == '1'))); - -// getMPAM_PARTID -// ============== -// Returns a PARTID from one of the MPAMn_ELx registers. -// MPAMn selects the MPAMn_ELx register used. -// If InD is TRUE, selects the PARTID_I field of that -// register. Otherwise, selects the PARTID_D field. - -PARTIDtype getMPAM_PARTID(integer MPAMn, boolean InD) - PARTIDtype partid; - boolean el2avail = EL2Enabled(); - - if InD then - case MPAMn of - when 3 partid = MPAM3_EL3.PARTID_I; - when 2 partid = if el2avail then MPAM2_EL2.PARTID_I else Zeros(); - when 1 partid = MPAM1_EL1.PARTID_I; - when 0 partid = MPAM0_EL1.PARTID_I; - otherwise partid = PARTIDtype UNKNOWN; - else - case MPAMn of - when 3 partid = MPAM3_EL3.PARTID_D; - when 2 partid = if el2avail then MPAM2_EL2.PARTID_D else Zeros(); - when 1 partid = MPAM1_EL1.PARTID_D; - when 0 partid = MPAM0_EL1.PARTID_D; - otherwise partid = PARTIDtype UNKNOWN; - return partid; - -// genPARTID -// ========= -// Returns physical PARTID and error boolean for exception level el. -// If InD is TRUE then PARTID is from MPAMel_ELx.PARTID_I and -// otherwise from MPAMel_ELx.PARTID_D. - -(PARTIDtype, boolean) genPARTID(integer el, boolean InD) - PARTIDtype partidel = getMPAM_PARTID(el, InD); - - integer partid_max = UInt(MPAMIDR_EL1.PARTID_MAX); - if UInt(partidel) > partid_max then - return (DefaultPARTID, TRUE); - - if MPAMisVirtual(el) then - return MAP_vPARTID(partidel); - else - return (partidel, FALSE); - -// getMPAM_PMG -// =========== -// Returns a PMG from one of the MPAMn_ELx registers. -// MPAMn selects the MPAMn_ELx register used. -// If InD is TRUE, selects the PMG_I field of that -// register. Otherwise, selects the PMG_D field. - -PMGtype getMPAM_PMG(integer MPAMn, boolean InD) - PMGtype pmg; - boolean el2avail = EL2Enabled(); - - if InD then - case MPAMn of - when 3 pmg = MPAM3_EL3.PMG_I; - when 2 pmg = if el2avail then MPAM2_EL2.PMG_I else Zeros(); - when 1 pmg = MPAM1_EL1.PMG_I; - when 0 pmg = MPAM0_EL1.PMG_I; - otherwise pmg = PMGtype UNKNOWN; - else - case MPAMn of - when 3 pmg = MPAM3_EL3.PMG_D; - when 2 pmg = if el2avail then MPAM2_EL2.PMG_D else Zeros(); - when 1 pmg = MPAM1_EL1.PMG_D; - when 0 pmg = MPAM0_EL1.PMG_D; - otherwise pmg = PMGtype UNKNOWN; - return pmg; - -// genPMG -// ====== -// Returns PMG for exception level el and I- or D-side (InD). -// If PARTID generation (genPARTID) encountered an error, genPMG() should be -// called with partid_err as TRUE. - -PMGtype genPMG(integer el, boolean InD, boolean partid_err) - integer pmg_max = UInt(MPAMIDR_EL1.PMG_MAX); - - // It is CONSTRAINED UNPREDICTABLE whether partid_err forces PMG to - // use the default or if it uses the PMG from getMPAM_PMG. - if partid_err then - return DefaultPMG; - PMGtype groupel = getMPAM_PMG(el, InD); - if UInt(groupel) <= pmg_max then - return groupel; - return DefaultPMG; - -// genMPAM -// ======= -// Returns MPAMinfo for exception level el. -// If InD is TRUE returns MPAM information using PARTID_I and PMG_I fields -// of MPAMel_ELx register and otherwise using PARTID_D and PMG_D fields. -// Produces a Secure PARTID if Secure is TRUE and a Non-secure PARTID otherwise. - -MPAMinfo genMPAM(integer el, boolean InD, boolean secure) - MPAMinfo returnInfo; - PARTIDtype partidel; - boolean perr; - boolean gstplk = (el == 0 && EL2Enabled() && - MPAMHCR_EL2.GSTAPP_PLK == '1' && HCR_EL2.TGE == '0'); - integer eff_el = if gstplk then 1 else el; - (partidel, perr) = genPARTID(eff_el, InD); - PMGtype groupel = genPMG(eff_el, InD, perr); - returnInfo.mpam_ns = if secure then '0' else '1'; - returnInfo.partid = partidel; - returnInfo.pmg = groupel; - return returnInfo; - -// GenMPAMcurEL -// ============ -// Returns MPAMinfo for the current EL and security state. -// InD is TRUE instruction access and FALSE otherwise. -// May be called if MPAM is not implemented (but in an version that supports -// MPAM), MPAM is disabled, or in AArch32. In AArch32, convert the mode to -// EL if can and use that to drive MPAM information generation. If mode -// cannot be converted, MPAM is not implemented, or MPAM is disabled return -// default MPAM information for the current security state. - -MPAMinfo GenMPAMcurEL(boolean InD) - bits(2) mpamel; - boolean validEL; - boolean securempam; - if HaveEMPAMExt() then - boolean secure = IsSecure(); - securempam = MPAM3_EL3.FORCE_NS == '0' && secure; - if MPAMisEnabled() && (!secure || MPAM3_EL3.SDEFLT == '0') then - if UsingAArch32() then - (validEL, mpamel) = ELFromM32(PSTATE.M); - else - validEL = TRUE; - mpamel = PSTATE.EL; - if validEL then - return genMPAM(UInt(mpamel), InD, securempam); - else - securempam = IsSecure(); - if HaveMPAMExt() && MPAMisEnabled() then - if UsingAArch32() then - (validEL, mpamel) = ELFromM32(PSTATE.M); - else - validEL = TRUE; - mpamel = PSTATE.EL; - if validEL then - return genMPAM(UInt(mpamel), InD, securempam); - return DefaultMPAMinfo(securempam); - -// genMPAMel -// ========= -// Returns MPAMinfo for specified EL in the current security state. -// InD is TRUE for instruction access and FALSE otherwise. - -MPAMinfo genMPAMel(bits(2) el, boolean InD) - boolean secure = IsSecure(); - boolean securempam = secure; - if HaveEMPAMExt() then - securempam = MPAM3_EL3.FORCE_NS == '0' && secure; - if HaveMPAMExt() && MPAMisEnabled() && (!secure || MPAM3_EL3.SDEFLT == '0') then - return genMPAM(UInt(el), InD, securempam); - else - if HaveMPAMExt() && MPAMisEnabled() then - return genMPAM(UInt(el), InD, securempam); - return DefaultMPAMinfo(securempam); - -// BranchTargetCheck() -// =================== -// This function is executed checks if the current instruction is a valid target for a branch -// taken into, or inside, a guarded page. It is executed on every cycle once the current -// instruction has been decoded and the values of InGuardedPage and BTypeCompatible have been -// determined for the current instruction. - -BranchTargetCheck() - assert HaveBTIExt() && !UsingAArch32(); - - // The branch target check considers two state variables: - // * InGuardedPage, which is evaluated during instruction fetch. - // * BTypeCompatible, which is evaluated during instruction decode. - if InGuardedPage && PSTATE.BTYPE != '00' && !BTypeCompatible && !Halted() then - bits(64) pc = ThisInstrAddr(); - AArch64.BranchTargetException(pc[51:0]); - - boolean branch_instr = AArch64.ExecutingBROrBLROrRetInstr(); - boolean bti_instr = AArch64.ExecutingBTIInstr(); - - // PSTATE.BTYPE defaults to 00 for instructions that do not explictly set BTYPE. - if !(branch_instr || bti_instr) then - BTypeNext = '00'; - -// ClearEventRegister() -// ==================== -// Clear the Event Register of this PE - -ClearEventRegister() - EventRegister = '0'; - return; - -ConsumptionOfSpeculativeDataBarrier(); - -enumeration PrivilegeLevel {PL3, PL2, PL1, PL0}; - -// PLOfEL() -// ======== - -PrivilegeLevel PLOfEL(bits(2) el) - case el of - when EL3 return if HighestELUsingAArch32() then PL1 else PL3; - when EL2 return PL2; - when EL1 return PL1; - when EL0 return PL0; - -// CurrentPL() -// =========== - -PrivilegeLevel CurrentPL() - return PLOfEL(PSTATE.EL); - -// PE enters a low-power state -EnterLowPowerState(); - -// HaveELUsingSecurityState() -// ========================== -// Returns TRUE if Exception level 'el' with Security state 'secure' is supported, -// FALSE otherwise. - -boolean HaveELUsingSecurityState(bits(2) el, boolean secure) - - case el of - when EL3 - assert secure; - return HaveEL(EL3); - when EL2 - if secure then - return HaveEL(EL2) && HaveSecureEL2Ext(); - else - return HaveEL(EL2); - otherwise - return (HaveEL(EL3) || - (secure == boolean IMPLEMENTATION_DEFINED "Secure-only implementation")); - -// Provides a hint to close any gathering occurring within the micro-architecture. -Hint_DGH(); - -// Provides a hint that the task performed by a thread is of low -// importance so that it could yield to improve overall performance. -Hint_Yield(); - -InstructionSynchronizationBarrier(); - -// InterruptPending() -// ================== -// Return TRUE if there are any pending physical or virtual -// interrupts, and FALSE otherwise. - -boolean InterruptPending() - pending_physical_interrupt = (IRQPending() || FIQPending() || - IsPhysicalSErrorPending()); - pending_virtual_interrupt = !IsInHost() && ((HCR_EL2.[VSE,VI,VF] AND - HCR_EL2.[AMO,IMO,FMO]) != '000'); - return pending_physical_interrupt || pending_virtual_interrupt; - -// IsEventRegisterSet() -// ==================== -// Return TRUE if the Event Register of this PE is set, and FALSE otherwise - -boolean IsEventRegisterSet() - return EventRegister == '1'; - -// IsHighestEL() -// ============= -// Returns TRUE if given exception level is the highest exception level implemented - -boolean IsHighestEL(bits(2) el) - return HighestEL() == el; - -// Return TRUE if a virtual SError interrupt is pending -boolean IsVirtualSErrorPending(); - -// Signal an event to all PEs in a multiprocessor system to set their Event Registers. -// When a PE executes the SEV instruction, it causes this function to be executed -SendEvent(); - -SpeculationBarrier(); - -// Take any pending unmasked physical SError interrupt or unmasked virtual SError -// interrupt. -TakeUnmaskedSErrorInterrupts(); - -// WaitForEvent() -// ============== -// PE suspends its operation and enters a low-power state -// if the Event Register is clear when the WFE is executed - -WaitForEvent() - if EventRegister == '0' then - EnterLowPowerState(); - return; - -// WaitForInterrupt() -// ================== -// PE suspends its operation to enter a low-power state -// until a WFI wake-up event occurs or the PE is reset - -WaitForInterrupt() - EnterLowPowerState(); - return; - -// AdvSIMDExpandImm() -// ================== - -bits(64) AdvSIMDExpandImm(bit op, bits(4) cmode, bits(8) imm8) - case cmode[3:1] of - when '000' - imm64 = Replicate(Zeros(24):imm8, 2); - when '001' - imm64 = Replicate(Zeros(16):imm8:Zeros(8), 2); - when '010' - imm64 = Replicate(Zeros(8):imm8:Zeros(16), 2); - when '011' - imm64 = Replicate(imm8:Zeros(24), 2); - when '100' - imm64 = Replicate(Zeros(8):imm8, 4); - when '101' - imm64 = Replicate(imm8:Zeros(8), 4); - when '110' - if cmode[0] == '0' then - imm64 = Replicate(Zeros(16):imm8:Ones(8), 2); - else - imm64 = Replicate(Zeros(8):imm8:Ones(16), 2); - when '111' - if cmode[0] == '0' && op == '0' then - imm64 = Replicate(imm8, 8); - if cmode[0] == '0' && op == '1' then - imm8a = Replicate(imm8[7], 8); imm8b = Replicate(imm8[6], 8); - imm8c = Replicate(imm8[5], 8); imm8d = Replicate(imm8[4], 8); - imm8e = Replicate(imm8[3], 8); imm8f = Replicate(imm8[2], 8); - imm8g = Replicate(imm8[1], 8); imm8h = Replicate(imm8[0], 8); - imm64 = imm8a:imm8b:imm8c:imm8d:imm8e:imm8f:imm8g:imm8h; - if cmode[0] == '1' && op == '0' then - imm32 = imm8[7]:NOT(imm8[6]):Replicate(imm8[6],5):imm8[5:0]:Zeros(19); - imm64 = Replicate(imm32, 2); - if cmode[0] == '1' && op == '1' then - if UsingAArch32() then ReservedEncoding(); - imm64 = imm8[7]:NOT(imm8[6]):Replicate(imm8[6],8):imm8[5:0]:Zeros(48); - - return imm64; - -// MatMulAdd() -// =========== -// -// Signed or unsigned 8-bit integer matrix multiply and add to 32-bit integer matrix -// result[2, 2] = addend[2, 2] + (op1[2, 8] * op2[8, 2]) - -bits(N) MatMulAdd(bits(N) addend, bits(N) op1, bits(N) op2, boolean op1_unsigned, boolean op2_unsigned) - assert N == 128; - - bits(N) result; - bits(32) sum; - integer prod; - - for i = 0 to 1 - for j = 0 to 1 - sum = Elem[addend, 2*i + j, 32]; - for k = 0 to 7 - prod = Int(Elem[op1, 8*i + k, 8], op1_unsigned) * Int(Elem[op2, 8*j + k, 8], op2_unsigned); - sum = sum + prod; - Elem[result, 2*i + j, 32] = sum; - - return result; - -// PolynomialMult() -// ================ - -bits(M+N) PolynomialMult(bits(M) op1, bits(N) op2) - result = Zeros(M+N); - extended_op2 = ZeroExtend(op2, M+N); - for i=0 to M-1 - if op1[i] == '1' then - result = result EOR LSL(extended_op2, i); - return result; - -// UnsignedRSqrtEstimate() -// ======================= - -bits(N) UnsignedRSqrtEstimate(bits(N) operand) - assert N IN {16,32}; - if operand[N-1:N-2] == '00' then // Operands <= 0x3FFFFFFF produce 0xFFFFFFFF - result = Ones(N); - else - // input is in the range 0x40000000 .. 0xffffffff representing [0.25 .. 1.0) - - // estimate is in the range 256 .. 511 representing [1.0 .. 2.0) - case N of - when 16 estimate = RecipSqrtEstimate(UInt(operand[15:7])); - when 32 estimate = RecipSqrtEstimate(UInt(operand[31:23])); - - // result is in the range 0x80000000 .. 0xff800000 representing [1.0 .. 2.0) - result = estimate[8:0] : Zeros(N-9); - - return result; - -// UnsignedRecipEstimate() -// ======================= - -bits(N) UnsignedRecipEstimate(bits(N) operand) - assert N IN {16,32}; - if operand[N-1] == '0' then // Operands <= 0x7FFFFFFF produce 0xFFFFFFFF - result = Ones(N); - else - // input is in the range 0x80000000 .. 0xffffffff representing [0.5 .. 1.0) - - // estimate is in the range 256 to 511 representing [1.0 .. 2.0) - case N of - when 16 estimate = RecipEstimate(UInt(operand[15:7])); - when 32 estimate = RecipEstimate(UInt(operand[31:23])); - - // result is in the range 0x80000000 .. 0xff800000 representing [1.0 .. 2.0) - result = estimate[8:0] : Zeros(N-9); - - return result; - -// SelfHostedTraceEnabled() -// ======================== -// Returns TRUE if Self-hosted Trace is enabled. - -boolean SelfHostedTraceEnabled() - if !HaveTraceExt() || !HaveSelfHostedTrace() then return FALSE; - if HaveEL(EL3) then - secure_trace_enable = (if ELUsingAArch32(EL3) then SDCR.STE else MDCR_EL3.STE); - niden = (secure_trace_enable == '0' || ExternalSecureNoninvasiveDebugEnabled()); - else - // If no EL3, IsSecure() returns the Effective value of (SCR_EL3.NS == '0') - niden = (!IsSecure() || ExternalSecureNoninvasiveDebugEnabled()); - return (EDSCR.TFO == '0' || !niden); - -// TraceAllowed() -// ============== -// Returns TRUE if Self-hosted Trace is allowed in the current Security state and Exception Level - -boolean TraceAllowed() - if !HaveTraceExt() then return FALSE; - if SelfHostedTraceEnabled() then - if IsSecure() && HaveEL(EL3) then - secure_trace_enable = (if ELUsingAArch32(EL3) then SDCR.STE else MDCR_EL3.STE); - if secure_trace_enable == '0' then return FALSE; - TGE_bit = if EL2Enabled() then HCR_EL2.TGE else '0'; - case PSTATE.EL of - when EL3 TRE_bit = if HighestELUsingAArch32() then TRFCR.E1TRE else '0'; - when EL2 TRE_bit = TRFCR_EL2.E2TRE; - when EL1 TRE_bit = TRFCR_EL1.E1TRE; - when EL0 TRE_bit = if TGE_bit == '1' then TRFCR_EL2.E0HTRE else TRFCR_EL1.E0TRE; - return TRE_bit == '1'; - else - return (!IsSecure() || ExternalSecureNoninvasiveDebugEnabled()); - -// TraceContextIDR2() -// ================== - -boolean TraceContextIDR2() - if !TraceAllowed()|| !HaveEL(EL2) then return FALSE; - return (!SelfHostedTraceEnabled() || TRFCR_EL2.CX == '1'); - -// Memory barrier instruction that preserves the relative order of memory accesses to System -// registers due to trace operations and other memory accesses to the same registers -TraceSynchronizationBarrier(); - -// TraceTimeStamp() -// ================ - -TimeStamp TraceTimeStamp() - if SelfHostedTraceEnabled() then - if HaveEL(EL2) then - TS_el2 = TRFCR_EL2.TS; - if TS_el2 == '10' then (-, TS_el2) = ConstrainUnpredictableBits(Unpredictable_EL2TIMESTAMP); // Reserved value - case TS_el2 of - when '00' /* falls through to check TRFCR_EL1.TS */ - when '01' return TimeStamp_Virtual; - when '11' return TimeStamp_Physical; - otherwise Unreachable(); // ConstrainUnpredictableBits removes this case - TS_el1 = TRFCR_EL1.TS; - if TS_el1 == 'x0' then (-, TS_el1) = ConstrainUnpredictableBits(Unpredictable_EL1TIMESTAMP); // Reserved values - case TS_el1 of - when '01' return TimeStamp_Virtual; - when '11' return TimeStamp_Physical; - otherwise Unreachable(); // ConstrainUnpredictableBits removes this case - else - return TimeStamp_CoreSight; - -//////////////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////////////// diff --git a/mra_tools/arch/arch_decode.asl b/mra_tools/arch/arch_decode.asl deleted file mode 100644 index a48ba4c0..00000000 --- a/mra_tools/arch/arch_decode.asl +++ /dev/null @@ -1,8951 +0,0 @@ -__decode A64 - // A64 - case (29 +: 3, 24 +: 5, 0 +: 24) of - when (_, '0000x', _) => - // reserved - case (29 +: 3, 25 +: 4, 16 +: 9, 0 +: 16) of - when ('000', _, '000000000', _) => // perm_undef - __field imm16 0 +: 16 - case () of - when () => __encoding aarch64_udf // UDF_only_perm_undef - when (_, _, !'000000000', _) => __UNPREDICTABLE - when (!'000', _, _, _) => __UNPREDICTABLE - when (_, '00011', _) => __UNPREDICTABLE - when (_, '0010x', _) => - // sve - case (29 +: 3, 25 +: 4, 23 +: 2, 22 +: 1, 17 +: 5, 16 +: 1, 10 +: 6, 0 +: 10) of - when ('000', _, '0x', _, '0xxxx', _, 'x1xxxx', _) => - // sve_int_muladd_pred - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 15 +: 1, 14 +: 1, 0 +: 14) of - when (_, _, _, _, '0', _, _) => // sve_int_mlas_vvv_pred - __field size 22 +: 2 - __field Zm 16 +: 5 - __field op 13 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (op) of - when ('0') => __encoding MLA_Z_P_ZZZ__ // mla_z_p_zzz_ - when ('1') => __encoding MLS_Z_P_ZZZ__ // mls_z_p_zzz_ - when (_, _, _, _, '1', _, _) => // sve_int_mladdsub_vvv_pred - __field size 22 +: 2 - __field Zm 16 +: 5 - __field op 13 +: 1 - __field Pg 10 +: 3 - __field Za 5 +: 5 - __field Zdn 0 +: 5 - case (op) of - when ('0') => __encoding MAD_Z_P_ZZZ__ // mad_z_p_zzz_ - when ('1') => __encoding MSB_Z_P_ZZZ__ // msb_z_p_zzz_ - when ('000', _, '0x', _, '0xxxx', _, '000xxx', _) => - // sve_int_pred_bin - case (24 +: 8, 22 +: 2, 21 +: 1, 18 +: 3, 16 +: 2, 13 +: 3, 0 +: 13) of - when (_, _, _, '00x', _, _, _) => // sve_int_bin_pred_arit_0 - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (opc) of - when ('000') => __encoding ADD_Z_P_ZZ__ // add_z_p_zz_ - when ('001') => __encoding SUB_Z_P_ZZ__ // sub_z_p_zz_ - when ('010') => __UNALLOCATED - when ('011') => __encoding SUBR_Z_P_ZZ__ // subr_z_p_zz_ - when ('1xx') => __UNALLOCATED - when (_, _, _, '01x', _, _, _) => // sve_int_bin_pred_arit_1 - __field size 22 +: 2 - __field opc 17 +: 2 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (opc, U) of - when ('00', '0') => __encoding SMAX_Z_P_ZZ__ // smax_z_p_zz_ - when ('00', '1') => __encoding UMAX_Z_P_ZZ__ // umax_z_p_zz_ - when ('01', '0') => __encoding SMIN_Z_P_ZZ__ // smin_z_p_zz_ - when ('01', '1') => __encoding UMIN_Z_P_ZZ__ // umin_z_p_zz_ - when ('10', '0') => __encoding SABD_Z_P_ZZ__ // sabd_z_p_zz_ - when ('10', '1') => __encoding UABD_Z_P_ZZ__ // uabd_z_p_zz_ - when ('11', _) => __UNALLOCATED - when (_, _, _, '100', _, _, _) => // sve_int_bin_pred_arit_2 - __field size 22 +: 2 - __field H 17 +: 1 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (H, U) of - when ('0', '0') => __encoding MUL_Z_P_ZZ__ // mul_z_p_zz_ - when ('0', '1') => __UNALLOCATED - when ('1', '0') => __encoding SMULH_Z_P_ZZ__ // smulh_z_p_zz_ - when ('1', '1') => __encoding UMULH_Z_P_ZZ__ // umulh_z_p_zz_ - when (_, _, _, '101', _, _, _) => // sve_int_bin_pred_div - __field size 22 +: 2 - __field R 17 +: 1 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (R, U) of - when ('0', '0') => __encoding SDIV_Z_P_ZZ__ // sdiv_z_p_zz_ - when ('0', '1') => __encoding UDIV_Z_P_ZZ__ // udiv_z_p_zz_ - when ('1', '0') => __encoding SDIVR_Z_P_ZZ__ // sdivr_z_p_zz_ - when ('1', '1') => __encoding UDIVR_Z_P_ZZ__ // udivr_z_p_zz_ - when (_, _, _, '11x', _, _, _) => // sve_int_bin_pred_log - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (opc) of - when ('000') => __encoding ORR_Z_P_ZZ__ // orr_z_p_zz_ - when ('001') => __encoding EOR_Z_P_ZZ__ // eor_z_p_zz_ - when ('010') => __encoding AND_Z_P_ZZ__ // and_z_p_zz_ - when ('011') => __encoding BIC_Z_P_ZZ__ // bic_z_p_zz_ - when ('1xx') => __UNALLOCATED - when ('000', _, '0x', _, '0xxxx', _, '001xxx', _) => - // sve_int_pred_red - case (24 +: 8, 22 +: 2, 21 +: 1, 19 +: 2, 16 +: 3, 13 +: 3, 0 +: 13) of - when (_, _, _, '00', _, _, _) => // sve_int_reduce_0 - __field size 22 +: 2 - __field opc 17 +: 2 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - case (opc, U) of - when ('00', '0') => __encoding SADDV_R_P_Z__ // saddv_r_p_z_ - when ('00', '1') => __encoding UADDV_R_P_Z__ // uaddv_r_p_z_ - when ('01', _) => __UNALLOCATED - when ('1x', _) => __UNALLOCATED - when (_, _, _, '01', _, _, _) => // sve_int_reduce_1 - __field size 22 +: 2 - __field opc 17 +: 2 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - case (opc, U) of - when ('00', '0') => __encoding SMAXV_R_P_Z__ // smaxv_r_p_z_ - when ('00', '1') => __encoding UMAXV_R_P_Z__ // umaxv_r_p_z_ - when ('01', '0') => __encoding SMINV_R_P_Z__ // sminv_r_p_z_ - when ('01', '1') => __encoding UMINV_R_P_Z__ // uminv_r_p_z_ - when ('1x', _) => __UNALLOCATED - when (_, _, _, '10', _, _, _) => // sve_int_movprfx_pred - __field size 22 +: 2 - __field opc 17 +: 2 - __field M 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('00') => __encoding MOVPRFX_Z_P_Z__ // movprfx_z_p_z_ - when ('01') => __UNALLOCATED - when ('1x') => __UNALLOCATED - when (_, _, _, '11', _, _, _) => // sve_int_reduce_2 - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - case (opc) of - when ('000') => __encoding ORV_R_P_Z__ // orv_r_p_z_ - when ('001') => __encoding EORV_R_P_Z__ // eorv_r_p_z_ - when ('010') => __encoding ANDV_R_P_Z__ // andv_r_p_z_ - when ('011') => __UNALLOCATED - when ('1xx') => __UNALLOCATED - when ('000', _, '0x', _, '0xxxx', _, '100xxx', _) => - // sve_int_pred_shift - case (24 +: 8, 22 +: 2, 21 +: 1, 19 +: 2, 16 +: 3, 13 +: 3, 0 +: 13) of - when (_, _, _, '0x', _, _, _) => // sve_int_bin_pred_shift_0 - __field tszh 22 +: 2 - __field opc 18 +: 2 - __field L 17 +: 1 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field tszl 8 +: 2 - __field imm3 5 +: 3 - __field Zdn 0 +: 5 - case (opc, L, U) of - when ('00', '0', '0') => __encoding ASR_Z_P_ZI__ // asr_z_p_zi_ - when ('00', '0', '1') => __encoding LSR_Z_P_ZI__ // lsr_z_p_zi_ - when ('00', '1', '0') => __UNALLOCATED - when ('00', '1', '1') => __encoding LSL_Z_P_ZI__ // lsl_z_p_zi_ - when ('01', '0', '0') => __encoding ASRD_Z_P_ZI__ // asrd_z_p_zi_ - when ('01', '0', '1') => __UNALLOCATED - when ('01', '1', _) => __UNALLOCATED - when ('1x', _, _) => __UNALLOCATED - when (_, _, _, '10', _, _, _) => // sve_int_bin_pred_shift_1 - __field size 22 +: 2 - __field R 18 +: 1 - __field L 17 +: 1 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (R, L, U) of - when (_, '1', '0') => __UNALLOCATED - when ('0', '0', '0') => __encoding ASR_Z_P_ZZ__ // asr_z_p_zz_ - when ('0', '0', '1') => __encoding LSR_Z_P_ZZ__ // lsr_z_p_zz_ - when ('0', '1', '1') => __encoding LSL_Z_P_ZZ__ // lsl_z_p_zz_ - when ('1', '0', '0') => __encoding ASRR_Z_P_ZZ__ // asrr_z_p_zz_ - when ('1', '0', '1') => __encoding LSRR_Z_P_ZZ__ // lsrr_z_p_zz_ - when ('1', '1', '1') => __encoding LSLR_Z_P_ZZ__ // lslr_z_p_zz_ - when (_, _, _, '11', _, _, _) => // sve_int_bin_pred_shift_2 - __field size 22 +: 2 - __field R 18 +: 1 - __field L 17 +: 1 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (R, L, U) of - when ('0', '0', '0') => __encoding ASR_Z_P_ZW__ // asr_z_p_zw_ - when ('0', '0', '1') => __encoding LSR_Z_P_ZW__ // lsr_z_p_zw_ - when ('0', '1', '0') => __UNALLOCATED - when ('0', '1', '1') => __encoding LSL_Z_P_ZW__ // lsl_z_p_zw_ - when ('1', _, _) => __UNALLOCATED - when ('000', _, '0x', _, '0xxxx', _, '101xxx', _) => - // sve_int_pred_un - case (24 +: 8, 22 +: 2, 21 +: 1, 19 +: 2, 16 +: 3, 13 +: 3, 0 +: 13) of - when (_, _, _, '0x', _, _, _) => __UNPREDICTABLE - when (_, _, _, '10', _, _, _) => // sve_int_un_pred_arit_0 - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('000') => __encoding SXTB_Z_P_Z__ // sxtb_z_p_z_ - when ('001') => __encoding UXTB_Z_P_Z__ // uxtb_z_p_z_ - when ('010') => __encoding SXTH_Z_P_Z__ // sxth_z_p_z_ - when ('011') => __encoding UXTH_Z_P_Z__ // uxth_z_p_z_ - when ('100') => __encoding SXTW_Z_P_Z__ // sxtw_z_p_z_ - when ('101') => __encoding UXTW_Z_P_Z__ // uxtw_z_p_z_ - when ('110') => __encoding ABS_Z_P_Z__ // abs_z_p_z_ - when ('111') => __encoding NEG_Z_P_Z__ // neg_z_p_z_ - when (_, _, _, '11', _, _, _) => // sve_int_un_pred_arit_1 - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('000') => __encoding CLS_Z_P_Z__ // cls_z_p_z_ - when ('001') => __encoding CLZ_Z_P_Z__ // clz_z_p_z_ - when ('010') => __encoding CNT_Z_P_Z__ // cnt_z_p_z_ - when ('011') => __encoding CNOT_Z_P_Z__ // cnot_z_p_z_ - when ('100') => __encoding FABS_Z_P_Z__ // fabs_z_p_z_ - when ('101') => __encoding FNEG_Z_P_Z__ // fneg_z_p_z_ - when ('110') => __encoding NOT_Z_P_Z__ // not_z_p_z_ - when ('111') => __UNALLOCATED - when ('000', _, '0x', _, '1xxxx', _, '000xxx', _) => // sve_int_bin_cons_arit_0 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field opc 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('000') => __encoding ADD_Z_ZZ__ // add_z_zz_ - when ('001') => __encoding SUB_Z_ZZ__ // sub_z_zz_ - when ('01x') => __UNALLOCATED - when ('100') => __encoding SQADD_Z_ZZ__ // sqadd_z_zz_ - when ('101') => __encoding UQADD_Z_ZZ__ // uqadd_z_zz_ - when ('110') => __encoding SQSUB_Z_ZZ__ // sqsub_z_zz_ - when ('111') => __encoding UQSUB_Z_ZZ__ // uqsub_z_zz_ - when ('000', _, '0x', _, '1xxxx', _, '001xxx', _) => - // sve_int_unpred_logical - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 13 +: 3, 12 +: 1, 10 +: 2, 0 +: 10) of - when (_, _, _, _, _, '0', _, _) => __UNPREDICTABLE - when (_, _, _, _, _, '1', '00', _) => // sve_int_bin_cons_log - __field opc 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('00') => __encoding AND_Z_ZZ__ // and_z_zz_ - when ('01') => __encoding ORR_Z_ZZ__ // orr_z_zz_ - when ('10') => __encoding EOR_Z_ZZ__ // eor_z_zz_ - when ('11') => __encoding BIC_Z_ZZ__ // bic_z_zz_ - when (_, _, _, _, _, '1', !'00', _) => __UNPREDICTABLE - when ('000', _, '0x', _, '1xxxx', _, '0100xx', _) => - // sve_index - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 12 +: 4, 10 +: 2, 0 +: 10) of - when (_, _, _, _, _, '00', _) => // sve_int_index_ii - __field size 22 +: 2 - __field imm5b 16 +: 5 - __field imm5 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding INDEX_Z_II__ // index_z_ii_ - when (_, _, _, _, _, '01', _) => // sve_int_index_ri - __field size 22 +: 2 - __field imm5 16 +: 5 - __field Rn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding INDEX_Z_RI__ // index_z_ri_ - when (_, _, _, _, _, '10', _) => // sve_int_index_ir - __field size 22 +: 2 - __field Rm 16 +: 5 - __field imm5 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding INDEX_Z_IR__ // index_z_ir_ - when (_, _, _, _, _, '11', _) => // sve_int_index_rr - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding INDEX_Z_RR__ // index_z_rr_ - when ('000', _, '0x', _, '1xxxx', _, '0101xx', _) => - // sve_alloca - case (24 +: 8, 23 +: 1, 22 +: 1, 21 +: 1, 16 +: 5, 12 +: 4, 11 +: 1, 0 +: 11) of - when (_, '0', _, _, _, _, '0', _) => // sve_int_arith_vl - __field op 22 +: 1 - __field Rn 16 +: 5 - __field imm6 5 +: 6 - __field Rd 0 +: 5 - case (op) of - when ('0') => __encoding ADDVL_R_RI__ // addvl_r_ri_ - when ('1') => __encoding ADDPL_R_RI__ // addpl_r_ri_ - when (_, '1', _, _, _, _, '0', _) => // sve_int_read_vl_a - __field op 22 +: 1 - __field opc2 16 +: 5 - __field imm6 5 +: 6 - __field Rd 0 +: 5 - case (op, opc2) of - when ('0', '0xxxx') => __UNALLOCATED - when ('0', '10xxx') => __UNALLOCATED - when ('0', '110xx') => __UNALLOCATED - when ('0', '1110x') => __UNALLOCATED - when ('0', '11110') => __UNALLOCATED - when ('0', '11111') => __encoding RDVL_R_I__ // rdvl_r_i_ - when ('1', _) => __UNALLOCATED - when (_, _, _, _, _, _, '1', _) => __UNPREDICTABLE - when ('000', _, '0x', _, '1xxxx', _, '011xxx', _) => __UNPREDICTABLE - when ('000', _, '0x', _, '1xxxx', _, '100xxx', _) => - // sve_int_unpred_shift - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 13 +: 3, 12 +: 1, 0 +: 12) of - when (_, _, _, _, _, '0', _) => // sve_int_bin_cons_shift_a - __field size 22 +: 2 - __field Zm 16 +: 5 - __field opc 10 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('00') => __encoding ASR_Z_ZW__ // asr_z_zw_ - when ('01') => __encoding LSR_Z_ZW__ // lsr_z_zw_ - when ('10') => __UNALLOCATED - when ('11') => __encoding LSL_Z_ZW__ // lsl_z_zw_ - when (_, _, _, _, _, '1', _) => // sve_int_bin_cons_shift_b - __field tszh 22 +: 2 - __field tszl 19 +: 2 - __field imm3 16 +: 3 - __field opc 10 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('00') => __encoding ASR_Z_ZI__ // asr_z_zi_ - when ('01') => __encoding LSR_Z_ZI__ // lsr_z_zi_ - when ('10') => __UNALLOCATED - when ('11') => __encoding LSL_Z_ZI__ // lsl_z_zi_ - when ('000', _, '0x', _, '1xxxx', _, '1010xx', _) => // sve_int_bin_cons_misc_0_a - __field opc 22 +: 2 - __field Zm 16 +: 5 - __field msz 10 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('00') => __encoding ADR_Z_AZ_D_s32_scaled // adr_z_az_d_s32_scaled - when ('01') => __encoding ADR_Z_AZ_D_u32_scaled // adr_z_az_d_u32_scaled - when ('1x') => __encoding ADR_Z_AZ_SD_same_scaled // adr_z_az_sd_same_scaled - when ('000', _, '0x', _, '1xxxx', _, '1011xx', _) => - // sve_int_unpred_misc - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 12 +: 4, 10 +: 2, 0 +: 10) of - when (_, _, _, _, _, '0x', _) => // sve_int_bin_cons_misc_0_b - __field size 22 +: 2 - __field Zm 16 +: 5 - __field op 10 +: 1 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (op) of - when ('0') => __encoding FTSSEL_Z_ZZ__ // ftssel_z_zz_ - when ('1') => __UNALLOCATED - when (_, _, _, _, _, '10', _) => // sve_int_bin_cons_misc_0_c - __field size 22 +: 2 - __field opc 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('00000') => __encoding FEXPA_Z_Z__ // fexpa_z_z_ - when ('00001') => __UNALLOCATED - when ('0001x') => __UNALLOCATED - when ('001xx') => __UNALLOCATED - when ('01xxx') => __UNALLOCATED - when ('1xxxx') => __UNALLOCATED - when (_, _, _, _, _, '11', _) => // sve_int_bin_cons_misc_0_d - __field opc 22 +: 2 - __field opc2 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc, opc2) of - when ('00', '00000') => __encoding MOVPRFX_Z_Z__ // movprfx_z_z_ - when ('00', '00001') => __UNALLOCATED - when ('00', '0001x') => __UNALLOCATED - when ('00', '001xx') => __UNALLOCATED - when ('00', '01xxx') => __UNALLOCATED - when ('00', '1xxxx') => __UNALLOCATED - when ('01', _) => __UNALLOCATED - when ('1x', _) => __UNALLOCATED - when ('000', _, '0x', _, '1xxxx', _, '11xxxx', _) => - // sve_countelt - case (24 +: 8, 22 +: 2, 21 +: 1, 20 +: 1, 16 +: 4, 14 +: 2, 11 +: 3, 0 +: 11) of - when (_, _, _, '0', _, _, '00x', _) => // sve_int_countvlv0 - __field size 22 +: 2 - __field imm4 16 +: 4 - __field D 11 +: 1 - __field U 10 +: 1 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - case (size, D, U) of - when ('00', _, _) => __UNALLOCATED - when ('01', '0', '0') => __encoding SQINCH_Z_ZS__ // sqinch_z_zs_ - when ('01', '0', '1') => __encoding UQINCH_Z_ZS__ // uqinch_z_zs_ - when ('01', '1', '0') => __encoding SQDECH_Z_ZS__ // sqdech_z_zs_ - when ('01', '1', '1') => __encoding UQDECH_Z_ZS__ // uqdech_z_zs_ - when ('10', '0', '0') => __encoding SQINCW_Z_ZS__ // sqincw_z_zs_ - when ('10', '0', '1') => __encoding UQINCW_Z_ZS__ // uqincw_z_zs_ - when ('10', '1', '0') => __encoding SQDECW_Z_ZS__ // sqdecw_z_zs_ - when ('10', '1', '1') => __encoding UQDECW_Z_ZS__ // uqdecw_z_zs_ - when ('11', '0', '0') => __encoding SQINCD_Z_ZS__ // sqincd_z_zs_ - when ('11', '0', '1') => __encoding UQINCD_Z_ZS__ // uqincd_z_zs_ - when ('11', '1', '0') => __encoding SQDECD_Z_ZS__ // sqdecd_z_zs_ - when ('11', '1', '1') => __encoding UQDECD_Z_ZS__ // uqdecd_z_zs_ - when (_, _, _, '0', _, _, '100', _) => // sve_int_count - __field size 22 +: 2 - __field imm4 16 +: 4 - __field op 10 +: 1 - __field pattern 5 +: 5 - __field Rd 0 +: 5 - case (size, op) of - when (_, '1') => __UNALLOCATED - when ('00', '0') => __encoding CNTB_R_S__ // cntb_r_s_ - when ('01', '0') => __encoding CNTH_R_S__ // cnth_r_s_ - when ('10', '0') => __encoding CNTW_R_S__ // cntw_r_s_ - when ('11', '0') => __encoding CNTD_R_S__ // cntd_r_s_ - when (_, _, _, '0', _, _, '101', _) => __UNPREDICTABLE - when (_, _, _, '1', _, _, '000', _) => // sve_int_countvlv1 - __field size 22 +: 2 - __field imm4 16 +: 4 - __field D 10 +: 1 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - case (size, D) of - when ('00', _) => __UNALLOCATED - when ('01', '0') => __encoding INCH_Z_ZS__ // inch_z_zs_ - when ('01', '1') => __encoding DECH_Z_ZS__ // dech_z_zs_ - when ('10', '0') => __encoding INCW_Z_ZS__ // incw_z_zs_ - when ('10', '1') => __encoding DECW_Z_ZS__ // decw_z_zs_ - when ('11', '0') => __encoding INCD_Z_ZS__ // incd_z_zs_ - when ('11', '1') => __encoding DECD_Z_ZS__ // decd_z_zs_ - when (_, _, _, '1', _, _, '100', _) => // sve_int_pred_pattern_a - __field size 22 +: 2 - __field imm4 16 +: 4 - __field D 10 +: 1 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - case (size, D) of - when ('00', '0') => __encoding INCB_R_RS__ // incb_r_rs_ - when ('00', '1') => __encoding DECB_R_RS__ // decb_r_rs_ - when ('01', '0') => __encoding INCH_R_RS__ // inch_r_rs_ - when ('01', '1') => __encoding DECH_R_RS__ // dech_r_rs_ - when ('10', '0') => __encoding INCW_R_RS__ // incw_r_rs_ - when ('10', '1') => __encoding DECW_R_RS__ // decw_r_rs_ - when ('11', '0') => __encoding INCD_R_RS__ // incd_r_rs_ - when ('11', '1') => __encoding DECD_R_RS__ // decd_r_rs_ - when (_, _, _, '1', _, _, 'x01', _) => __UNPREDICTABLE - when (_, _, _, _, _, _, '01x', _) => __UNPREDICTABLE - when (_, _, _, _, _, _, '11x', _) => // sve_int_pred_pattern_b - __field size 22 +: 2 - __field sf 20 +: 1 - __field imm4 16 +: 4 - __field D 11 +: 1 - __field U 10 +: 1 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - case (size, sf, D, U) of - when ('00', '0', '0', '0') => __encoding SQINCB_R_RS_SX // sqincb_r_rs_sx - when ('00', '0', '0', '1') => __encoding UQINCB_R_RS_UW // uqincb_r_rs_uw - when ('00', '0', '1', '0') => __encoding SQDECB_R_RS_SX // sqdecb_r_rs_sx - when ('00', '0', '1', '1') => __encoding UQDECB_R_RS_UW // uqdecb_r_rs_uw - when ('00', '1', '0', '0') => __encoding SQINCB_R_RS_X // sqincb_r_rs_x - when ('00', '1', '0', '1') => __encoding UQINCB_R_RS_X // uqincb_r_rs_x - when ('00', '1', '1', '0') => __encoding SQDECB_R_RS_X // sqdecb_r_rs_x - when ('00', '1', '1', '1') => __encoding UQDECB_R_RS_X // uqdecb_r_rs_x - when ('01', '0', '0', '0') => __encoding SQINCH_R_RS_SX // sqinch_r_rs_sx - when ('01', '0', '0', '1') => __encoding UQINCH_R_RS_UW // uqinch_r_rs_uw - when ('01', '0', '1', '0') => __encoding SQDECH_R_RS_SX // sqdech_r_rs_sx - when ('01', '0', '1', '1') => __encoding UQDECH_R_RS_UW // uqdech_r_rs_uw - when ('01', '1', '0', '0') => __encoding SQINCH_R_RS_X // sqinch_r_rs_x - when ('01', '1', '0', '1') => __encoding UQINCH_R_RS_X // uqinch_r_rs_x - when ('01', '1', '1', '0') => __encoding SQDECH_R_RS_X // sqdech_r_rs_x - when ('01', '1', '1', '1') => __encoding UQDECH_R_RS_X // uqdech_r_rs_x - when ('10', '0', '0', '0') => __encoding SQINCW_R_RS_SX // sqincw_r_rs_sx - when ('10', '0', '0', '1') => __encoding UQINCW_R_RS_UW // uqincw_r_rs_uw - when ('10', '0', '1', '0') => __encoding SQDECW_R_RS_SX // sqdecw_r_rs_sx - when ('10', '0', '1', '1') => __encoding UQDECW_R_RS_UW // uqdecw_r_rs_uw - when ('10', '1', '0', '0') => __encoding SQINCW_R_RS_X // sqincw_r_rs_x - when ('10', '1', '0', '1') => __encoding UQINCW_R_RS_X // uqincw_r_rs_x - when ('10', '1', '1', '0') => __encoding SQDECW_R_RS_X // sqdecw_r_rs_x - when ('10', '1', '1', '1') => __encoding UQDECW_R_RS_X // uqdecw_r_rs_x - when ('11', '0', '0', '0') => __encoding SQINCD_R_RS_SX // sqincd_r_rs_sx - when ('11', '0', '0', '1') => __encoding UQINCD_R_RS_UW // uqincd_r_rs_uw - when ('11', '0', '1', '0') => __encoding SQDECD_R_RS_SX // sqdecd_r_rs_sx - when ('11', '0', '1', '1') => __encoding UQDECD_R_RS_UW // uqdecd_r_rs_uw - when ('11', '1', '0', '0') => __encoding SQINCD_R_RS_X // sqincd_r_rs_x - when ('11', '1', '0', '1') => __encoding UQINCD_R_RS_X // uqincd_r_rs_x - when ('11', '1', '1', '0') => __encoding SQDECD_R_RS_X // sqdecd_r_rs_x - when ('11', '1', '1', '1') => __encoding UQDECD_R_RS_X // uqdecd_r_rs_x - when ('000', _, '1x', _, '00xxx', _, _, _) => - // sve_maskimm - case (24 +: 8, 22 +: 2, 20 +: 2, 18 +: 2, 0 +: 18) of - when (_, '11', _, '00', _) => // sve_int_dup_mask_imm - __field imm13 5 +: 13 - __field Zd 0 +: 5 - case () of - when () => __encoding DUPM_Z_I__ // dupm_z_i_ - when (_, !'11', _, '00', _) => // sve_int_log_imm - __field opc 22 +: 2 - __field imm13 5 +: 13 - __field Zdn 0 +: 5 - case (opc) of - when ('00') => __encoding ORR_Z_ZI__ // orr_z_zi_ - when ('01') => __encoding EOR_Z_ZI__ // eor_z_zi_ - when ('10') => __encoding AND_Z_ZI__ // and_z_zi_ - when (_, _, _, !'00', _) => __UNPREDICTABLE - when ('000', _, '1x', _, '01xxx', _, _, _) => - // sve_wideimm_pred - case (24 +: 8, 22 +: 2, 20 +: 2, 16 +: 4, 13 +: 3, 0 +: 13) of - when (_, _, _, _, '0xx', _) => // sve_int_dup_imm_pred - __field size 22 +: 2 - __field Pg 16 +: 4 - __field M 14 +: 1 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - case (M) of - when ('0') => __encoding CPY_Z_O_I__ // cpy_z_o_i_ - when ('1') => __encoding CPY_Z_P_I__ // cpy_z_p_i_ - when (_, _, _, _, '10x', _) => __UNPREDICTABLE - when (_, _, _, _, '110', _) => // sve_int_dup_fpimm_pred - __field size 22 +: 2 - __field Pg 16 +: 4 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - case () of - when () => __encoding FCPY_Z_P_I__ // fcpy_z_p_i_ - when (_, _, _, _, '111', _) => __UNPREDICTABLE - when ('000', _, '1x', _, '1xxxx', _, '001xxx', _) => - // sve_perm_unpred - case (24 +: 8, 22 +: 2, 21 +: 1, 19 +: 2, 17 +: 2, 16 +: 1, 13 +: 3, 12 +: 1, 10 +: 2, 0 +: 10) of - when (_, _, _, '00', '00', '0', _, '1', '10', _) => // sve_int_perm_dup_r - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding DUP_Z_R__ // dup_z_r_ - when (_, _, _, '00', '10', '0', _, '1', '10', _) => // sve_int_perm_insrs - __field size 22 +: 2 - __field Rm 5 +: 5 - __field Zdn 0 +: 5 - case () of - when () => __encoding INSR_Z_R__ // insr_z_r_ - when (_, _, _, '00', 'x0', '0', _, '0', '01', _) => __UNPREDICTABLE - when (_, _, _, '00', 'x0', '0', _, '1', 'x1', _) => __UNPREDICTABLE - when (_, _, _, '00', 'x1', _, _, '1', '1x', _) => __UNPREDICTABLE - when (_, _, _, '00', 'x1', _, _, _, '01', _) => __UNPREDICTABLE - when (_, _, _, '00', _, '1', _, '1', '1x', _) => __UNPREDICTABLE - when (_, _, _, '00', _, '1', _, _, '01', _) => __UNPREDICTABLE - when (_, _, _, '00', _, _, _, '0', '1x', _) => __UNPREDICTABLE - when (_, _, _, '01', _, _, _, _, !'00', _) => __UNPREDICTABLE - when (_, _, _, '10', '0x', _, _, '0', '01', _) => __UNPREDICTABLE - when (_, _, _, '10', '0x', _, _, '1', '10', _) => // sve_int_perm_unpk - __field size 22 +: 2 - __field U 17 +: 1 - __field H 16 +: 1 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (U, H) of - when ('0', '0') => __encoding SUNPKLO_Z_Z__ // sunpklo_z_z_ - when ('0', '1') => __encoding SUNPKHI_Z_Z__ // sunpkhi_z_z_ - when ('1', '0') => __encoding UUNPKLO_Z_Z__ // uunpklo_z_z_ - when ('1', '1') => __encoding UUNPKHI_Z_Z__ // uunpkhi_z_z_ - when (_, _, _, '10', '0x', _, _, '1', 'x1', _) => __UNPREDICTABLE - when (_, _, _, '10', '10', '0', _, '0', '01', _) => __UNPREDICTABLE - when (_, _, _, '10', '10', '0', _, '1', '10', _) => // sve_int_perm_insrv - __field size 22 +: 2 - __field Vm 5 +: 5 - __field Zdn 0 +: 5 - case () of - when () => __encoding INSR_Z_V__ // insr_z_v_ - when (_, _, _, '10', '10', '0', _, '1', 'x1', _) => __UNPREDICTABLE - when (_, _, _, '10', '11', _, _, '1', '1x', _) => __UNPREDICTABLE - when (_, _, _, '10', '11', _, _, _, '01', _) => __UNPREDICTABLE - when (_, _, _, '10', '1x', '1', _, '1', '1x', _) => __UNPREDICTABLE - when (_, _, _, '10', '1x', '1', _, _, '01', _) => __UNPREDICTABLE - when (_, _, _, '11', '00', '0', _, '0', '01', _) => __UNPREDICTABLE - when (_, _, _, '11', '00', '0', _, '1', '10', _) => // sve_int_perm_reverse_z - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding REV_Z_Z__ // rev_z_z_ - when (_, _, _, '11', '00', '0', _, '1', 'x1', _) => __UNPREDICTABLE - when (_, _, _, '11', '0x', '1', _, '1', '1x', _) => __UNPREDICTABLE - when (_, _, _, '11', '0x', '1', _, _, '01', _) => __UNPREDICTABLE - when (_, _, _, '11', !'00', _, _, '1', '1x', _) => __UNPREDICTABLE - when (_, _, _, '11', !'00', _, _, _, '01', _) => __UNPREDICTABLE - when (_, _, _, '1x', _, _, _, '0', '1x', _) => __UNPREDICTABLE - when (_, _, _, _, _, _, _, '0', '00', _) => // sve_int_perm_dup_i - __field imm2 22 +: 2 - __field tsz 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding DUP_Z_Zi__ // dup_z_zi_ - when (_, _, _, _, _, _, _, '1', '00', _) => // sve_int_perm_tbl - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding TBL_Z_ZZ_1 // tbl_z_zz_1 - when ('000', _, '1x', _, '1xxxx', _, '010xxx', _) => - // sve_perm_predicates - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 13 +: 3, 9 +: 4, 5 +: 4, 4 +: 1, 0 +: 4) of - when (_, '00', _, '1000x', _, '0000', _, '0', _) => // sve_int_perm_punpk - __field H 16 +: 1 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - case (H) of - when ('0') => __encoding PUNPKLO_P_P__ // punpklo_p_p_ - when ('1') => __encoding PUNPKHI_P_P__ // punpkhi_p_p_ - when (_, '01', _, '1000x', _, '0000', _, '0', _) => __UNPREDICTABLE - when (_, '10', _, '1000x', _, '0000', _, '0', _) => __UNPREDICTABLE - when (_, '11', _, '1000x', _, '0000', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '0xxxx', _, 'xxx0', _, '0', _) => // sve_int_perm_bin_perm_pp - __field size 22 +: 2 - __field Pm 16 +: 4 - __field opc 11 +: 2 - __field H 10 +: 1 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - case (opc, H) of - when ('00', '0') => __encoding ZIP1_P_PP__ // zip1_p_pp_ - when ('00', '1') => __encoding ZIP2_P_PP__ // zip2_p_pp_ - when ('01', '0') => __encoding UZP1_P_PP__ // uzp1_p_pp_ - when ('01', '1') => __encoding UZP2_P_PP__ // uzp2_p_pp_ - when ('10', '0') => __encoding TRN1_P_PP__ // trn1_p_pp_ - when ('10', '1') => __encoding TRN2_P_PP__ // trn2_p_pp_ - when ('11', _) => __UNALLOCATED - when (_, _, _, '0xxxx', _, 'xxx1', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '10100', _, '0000', _, '0', _) => // sve_int_perm_reverse_p - __field size 22 +: 2 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - case () of - when () => __encoding REV_P_P__ // rev_p_p_ - when (_, _, _, '10101', _, '0000', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '10x0x', _, '1000', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '10x0x', _, 'x100', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '10x0x', _, 'xx10', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '10x0x', _, 'xxx1', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '10x1x', _, _, _, '0', _) => __UNPREDICTABLE - when (_, _, _, '11xxx', _, _, _, '0', _) => __UNPREDICTABLE - when (_, _, _, _, _, _, _, '1', _) => __UNPREDICTABLE - when ('000', _, '1x', _, '1xxxx', _, '011xxx', _) => // sve_int_perm_bin_perm_zz - __field size 22 +: 2 - __field Zm 16 +: 5 - __field opc 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('000') => __encoding ZIP1_Z_ZZ__ // zip1_z_zz_ - when ('001') => __encoding ZIP2_Z_ZZ__ // zip2_z_zz_ - when ('010') => __encoding UZP1_Z_ZZ__ // uzp1_z_zz_ - when ('011') => __encoding UZP2_Z_ZZ__ // uzp2_z_zz_ - when ('100') => __encoding TRN1_Z_ZZ__ // trn1_z_zz_ - when ('101') => __encoding TRN2_Z_ZZ__ // trn2_z_zz_ - when ('11x') => __UNALLOCATED - when ('000', _, '1x', _, '1xxxx', _, '10xxxx', _) => - // sve_perm_pred - case (24 +: 8, 22 +: 2, 21 +: 1, 20 +: 1, 17 +: 3, 16 +: 1, 14 +: 2, 13 +: 1, 0 +: 13) of - when (_, _, _, '0', '000', '0', _, '0', _) => // sve_int_perm_cpy_v - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Vn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding CPY_Z_P_V__ // cpy_z_p_v_ - when (_, _, _, '0', '000', '1', _, '0', _) => // sve_int_perm_compact - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding COMPACT_Z_P_Z__ // compact_z_p_z_ - when (_, _, _, '0', '000', _, _, '1', _) => // sve_int_perm_last_r - __field size 22 +: 2 - __field B 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Rd 0 +: 5 - case (B) of - when ('0') => __encoding LASTA_R_P_Z__ // lasta_r_p_z_ - when ('1') => __encoding LASTB_R_P_Z__ // lastb_r_p_z_ - when (_, _, _, '0', '001', _, _, '0', _) => // sve_int_perm_last_v - __field size 22 +: 2 - __field B 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - case (B) of - when ('0') => __encoding LASTA_V_P_Z__ // lasta_v_p_z_ - when ('1') => __encoding LASTB_V_P_Z__ // lastb_v_p_z_ - when (_, _, _, '0', '01x', _, _, '0', _) => // sve_int_perm_rev - __field size 22 +: 2 - __field opc 16 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('00') => __encoding REVB_Z_Z__ // revb_z_z_ - when ('01') => __encoding REVH_Z_Z__ // revh_z_z_ - when ('10') => __encoding REVW_Z_Z__ // revw_z_z_ - when ('11') => __encoding RBIT_Z_P_Z__ // rbit_z_p_z_ - when (_, _, _, '0', '01x', _, _, '1', _) => __UNPREDICTABLE - when (_, _, _, '0', '100', '0', _, '1', _) => // sve_int_perm_cpy_r - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding CPY_Z_P_R__ // cpy_z_p_r_ - when (_, _, _, '0', '100', '1', _, '1', _) => __UNPREDICTABLE - when (_, _, _, '0', '100', _, _, '0', _) => // sve_int_perm_clast_zz - __field size 22 +: 2 - __field B 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (B) of - when ('0') => __encoding CLASTA_Z_P_ZZ__ // clasta_z_p_zz_ - when ('1') => __encoding CLASTB_Z_P_ZZ__ // clastb_z_p_zz_ - when (_, _, _, '0', '101', _, _, '0', _) => // sve_int_perm_clast_vz - __field size 22 +: 2 - __field B 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Vdn 0 +: 5 - case (B) of - when ('0') => __encoding CLASTA_V_P_Z__ // clasta_v_p_z_ - when ('1') => __encoding CLASTB_V_P_Z__ // clastb_v_p_z_ - when (_, _, _, '0', '110', '0', _, '0', _) => // sve_int_perm_splice - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case () of - when () => __encoding SPLICE_Z_P_ZZ_Des // splice_z_p_zz_des - when (_, _, _, '0', '110', '0', _, '1', _) => __UNPREDICTABLE - when (_, _, _, '0', '110', '1', _, _, _) => __UNPREDICTABLE - when (_, _, _, '0', '111', '0', _, _, _) => __UNPREDICTABLE - when (_, _, _, '0', '111', '1', _, _, _) => __UNPREDICTABLE - when (_, _, _, '0', 'x01', _, _, '1', _) => __UNPREDICTABLE - when (_, _, _, '1', '000', _, _, '0', _) => __UNPREDICTABLE - when (_, _, _, '1', '000', _, _, '1', _) => // sve_int_perm_clast_rz - __field size 22 +: 2 - __field B 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Rdn 0 +: 5 - case (B) of - when ('0') => __encoding CLASTA_R_P_Z__ // clasta_r_p_z_ - when ('1') => __encoding CLASTB_R_P_Z__ // clastb_r_p_z_ - when (_, _, _, '1', !'000', _, _, _, _) => __UNPREDICTABLE - when ('000', _, '1x', _, '1xxxx', _, '11xxxx', _) => // sve_int_sel_vvv - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 4 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case () of - when () => __encoding SEL_Z_P_ZZ__ // sel_z_p_zz_ - when ('000', _, '10', _, '1xxxx', _, '000xxx', _) => - // sve_perm_extract - case (23 +: 9, 22 +: 1, 21 +: 1, 16 +: 5, 13 +: 3, 0 +: 13) of - when (_, '0', _, _, _, _) => // sve_int_perm_extract_i - __field imm8h 16 +: 5 - __field imm8l 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case () of - when () => __encoding EXT_Z_ZI_Des // ext_z_zi_des - when (_, '1', _, _, _, _) => __UNPREDICTABLE - when ('000', _, '11', _, '1xxxx', _, '000xxx', _) => // sve_int_perm_bin_long_perm_zz - __field op 22 +: 1 - __field Zm 16 +: 5 - __field opc2 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (op, opc2) of - when ('0', '000') => __encoding ZIP1_Z_ZZ_Q // zip1_z_zz_q - when ('0', '001') => __encoding ZIP2_Z_ZZ_Q // zip2_z_zz_q - when ('0', '010') => __encoding UZP1_Z_ZZ_Q // uzp1_z_zz_q - when ('0', '011') => __encoding UZP2_Z_ZZ_Q // uzp2_z_zz_q - when ('0', '10x') => __UNALLOCATED - when ('0', '110') => __encoding TRN1_Z_ZZ_Q // trn1_z_zz_q - when ('0', '111') => __encoding TRN2_Z_ZZ_Q // trn2_z_zz_q - when ('1', _) => __UNALLOCATED - when ('001', _, '0x', _, '0xxxx', _, _, _) => - // sve_cmpvec - case (24 +: 8, 22 +: 2, 21 +: 1, 15 +: 6, 14 +: 1, 0 +: 14) of - when (_, _, _, _, '0', _) => // sve_int_cmp_0 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field op 15 +: 1 - __field o2 13 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field ne 4 +: 1 - __field Pd 0 +: 4 - case (op, o2, ne) of - when ('0', '0', '0') => __encoding CMPHS_P_P_ZZ__ // cmphs_p_p_zz_ - when ('0', '0', '1') => __encoding CMPHI_P_P_ZZ__ // cmphi_p_p_zz_ - when ('0', '1', '0') => __encoding CMPEQ_P_P_ZW__ // cmpeq_p_p_zw_ - when ('0', '1', '1') => __encoding CMPNE_P_P_ZW__ // cmpne_p_p_zw_ - when ('1', '0', '0') => __encoding CMPGE_P_P_ZZ__ // cmpge_p_p_zz_ - when ('1', '0', '1') => __encoding CMPGT_P_P_ZZ__ // cmpgt_p_p_zz_ - when ('1', '1', '0') => __encoding CMPEQ_P_P_ZZ__ // cmpeq_p_p_zz_ - when ('1', '1', '1') => __encoding CMPNE_P_P_ZZ__ // cmpne_p_p_zz_ - when (_, _, _, _, '1', _) => // sve_int_cmp_1 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field U 15 +: 1 - __field lt 13 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field ne 4 +: 1 - __field Pd 0 +: 4 - case (U, lt, ne) of - when ('0', '0', '0') => __encoding CMPGE_P_P_ZW__ // cmpge_p_p_zw_ - when ('0', '0', '1') => __encoding CMPGT_P_P_ZW__ // cmpgt_p_p_zw_ - when ('0', '1', '0') => __encoding CMPLT_P_P_ZW__ // cmplt_p_p_zw_ - when ('0', '1', '1') => __encoding CMPLE_P_P_ZW__ // cmple_p_p_zw_ - when ('1', '0', '0') => __encoding CMPHS_P_P_ZW__ // cmphs_p_p_zw_ - when ('1', '0', '1') => __encoding CMPHI_P_P_ZW__ // cmphi_p_p_zw_ - when ('1', '1', '0') => __encoding CMPLO_P_P_ZW__ // cmplo_p_p_zw_ - when ('1', '1', '1') => __encoding CMPLS_P_P_ZW__ // cmpls_p_p_zw_ - when ('001', _, '0x', _, '1xxxx', _, _, _) => // sve_int_ucmp_vi - __field size 22 +: 2 - __field imm7 14 +: 7 - __field lt 13 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field ne 4 +: 1 - __field Pd 0 +: 4 - case (lt, ne) of - when ('0', '0') => __encoding CMPHS_P_P_ZI__ // cmphs_p_p_zi_ - when ('0', '1') => __encoding CMPHI_P_P_ZI__ // cmphi_p_p_zi_ - when ('1', '0') => __encoding CMPLO_P_P_ZI__ // cmplo_p_p_zi_ - when ('1', '1') => __encoding CMPLS_P_P_ZI__ // cmpls_p_p_zi_ - when ('001', _, '1x', _, '0xxxx', _, 'x0xxxx', _) => // sve_int_scmp_vi - __field size 22 +: 2 - __field imm5 16 +: 5 - __field op 15 +: 1 - __field o2 13 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field ne 4 +: 1 - __field Pd 0 +: 4 - case (op, o2, ne) of - when ('0', '0', '0') => __encoding CMPGE_P_P_ZI__ // cmpge_p_p_zi_ - when ('0', '0', '1') => __encoding CMPGT_P_P_ZI__ // cmpgt_p_p_zi_ - when ('0', '1', '0') => __encoding CMPLT_P_P_ZI__ // cmplt_p_p_zi_ - when ('0', '1', '1') => __encoding CMPLE_P_P_ZI__ // cmple_p_p_zi_ - when ('1', '0', '0') => __encoding CMPEQ_P_P_ZI__ // cmpeq_p_p_zi_ - when ('1', '0', '1') => __encoding CMPNE_P_P_ZI__ // cmpne_p_p_zi_ - when ('1', '1', _) => __UNALLOCATED - when ('001', _, '1x', _, '00xxx', _, '01xxxx', _) => // sve_int_pred_log - __field op 23 +: 1 - __field S 22 +: 1 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field o2 9 +: 1 - __field Pn 5 +: 4 - __field o3 4 +: 1 - __field Pd 0 +: 4 - case (op, S, o2, o3) of - when ('0', '0', '0', '0') => __encoding AND_P_P_PP_Z // and_p_p_pp_z - when ('0', '0', '0', '1') => __encoding BIC_P_P_PP_Z // bic_p_p_pp_z - when ('0', '0', '1', '0') => __encoding EOR_P_P_PP_Z // eor_p_p_pp_z - when ('0', '0', '1', '1') => __encoding SEL_P_P_PP__ // sel_p_p_pp_ - when ('0', '1', '0', '0') => __encoding ANDS_P_P_PP_Z // ands_p_p_pp_z - when ('0', '1', '0', '1') => __encoding BICS_P_P_PP_Z // bics_p_p_pp_z - when ('0', '1', '1', '0') => __encoding EORS_P_P_PP_Z // eors_p_p_pp_z - when ('0', '1', '1', '1') => __UNALLOCATED - when ('1', '0', '0', '0') => __encoding ORR_P_P_PP_Z // orr_p_p_pp_z - when ('1', '0', '0', '1') => __encoding ORN_P_P_PP_Z // orn_p_p_pp_z - when ('1', '0', '1', '0') => __encoding NOR_P_P_PP_Z // nor_p_p_pp_z - when ('1', '0', '1', '1') => __encoding NAND_P_P_PP_Z // nand_p_p_pp_z - when ('1', '1', '0', '0') => __encoding ORRS_P_P_PP_Z // orrs_p_p_pp_z - when ('1', '1', '0', '1') => __encoding ORNS_P_P_PP_Z // orns_p_p_pp_z - when ('1', '1', '1', '0') => __encoding NORS_P_P_PP_Z // nors_p_p_pp_z - when ('1', '1', '1', '1') => __encoding NANDS_P_P_PP_Z // nands_p_p_pp_z - when ('001', _, '1x', _, '00xxx', _, '11xxxx', _) => - // sve_pred_gen_b - case (24 +: 8, 22 +: 2, 20 +: 2, 16 +: 4, 14 +: 2, 10 +: 4, 9 +: 1, 0 +: 9) of - when (_, _, _, _, _, _, '0', _) => // sve_int_brkp - __field op 23 +: 1 - __field S 22 +: 1 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field B 4 +: 1 - __field Pd 0 +: 4 - case (op, S, B) of - when ('0', '0', '0') => __encoding BRKPA_P_P_PP__ // brkpa_p_p_pp_ - when ('0', '0', '1') => __encoding BRKPB_P_P_PP__ // brkpb_p_p_pp_ - when ('0', '1', '0') => __encoding BRKPAS_P_P_PP__ // brkpas_p_p_pp_ - when ('0', '1', '1') => __encoding BRKPBS_P_P_PP__ // brkpbs_p_p_pp_ - when ('1', _, _) => __UNALLOCATED - when (_, _, _, _, _, _, '1', _) => __UNPREDICTABLE - when ('001', _, '1x', _, '01xxx', _, '01xxxx', _) => - // sve_pred_gen_c - case (24 +: 8, 23 +: 1, 22 +: 1, 20 +: 2, 16 +: 4, 14 +: 2, 10 +: 4, 9 +: 1, 5 +: 4, 4 +: 1, 0 +: 4) of - when (_, '0', _, _, '1000', _, _, '0', _, '0', _) => // sve_int_brkn - __field S 22 +: 1 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pdm 0 +: 4 - case (S) of - when ('0') => __encoding BRKN_P_P_PP__ // brkn_p_p_pp_ - when ('1') => __encoding BRKNS_P_P_PP__ // brkns_p_p_pp_ - when (_, '0', _, _, '1000', _, _, '0', _, '1', _) => __UNPREDICTABLE - when (_, '0', _, _, 'x000', _, _, '1', _, _, _) => __UNPREDICTABLE - when (_, '0', _, _, 'x1xx', _, _, _, _, _, _) => __UNPREDICTABLE - when (_, '0', _, _, 'xx1x', _, _, _, _, _, _) => __UNPREDICTABLE - when (_, '0', _, _, 'xxx1', _, _, _, _, _, _) => __UNPREDICTABLE - when (_, '1', _, _, '0000', _, _, '1', _, _, _) => __UNPREDICTABLE - when (_, '1', _, _, !'0000', _, _, _, _, _, _) => __UNPREDICTABLE - when (_, _, _, _, '0000', _, _, '0', _, _, _) => // sve_int_break - __field B 23 +: 1 - __field S 22 +: 1 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field M 4 +: 1 - __field Pd 0 +: 4 - case (B, S, M) of - when (_, '1', '1') => __UNALLOCATED - when ('0', '0', _) => __encoding BRKA_P_P_P__ // brka_p_p_p_ - when ('0', '1', '0') => __encoding BRKAS_P_P_P_Z // brkas_p_p_p_z - when ('1', '0', _) => __encoding BRKB_P_P_P__ // brkb_p_p_p_ - when ('1', '1', '0') => __encoding BRKBS_P_P_P_Z // brkbs_p_p_p_z - when ('001', _, '1x', _, '01xxx', _, '11xxxx', _) => - // sve_pred_gen_d - case (24 +: 8, 22 +: 2, 20 +: 2, 16 +: 4, 14 +: 2, 11 +: 3, 9 +: 2, 5 +: 4, 4 +: 1, 0 +: 4) of - when (_, _, _, '0000', _, _, 'x0', _, '0', _) => // sve_int_ptest - __field op 23 +: 1 - __field S 22 +: 1 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field opc2 0 +: 4 - case (op, S, opc2) of - when ('0', '0', _) => __UNALLOCATED - when ('0', '1', '0000') => __encoding PTEST__P_P__ // ptest_p_p_ - when ('0', '1', '0001') => __UNALLOCATED - when ('0', '1', '001x') => __UNALLOCATED - when ('0', '1', '01xx') => __UNALLOCATED - when ('0', '1', '1xxx') => __UNALLOCATED - when ('1', _, _) => __UNALLOCATED - when (_, _, _, '0100', _, _, 'x0', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '0x10', _, _, 'x0', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '0xx1', _, _, 'x0', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '0xxx', _, _, 'x1', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '1000', _, '000', '00', _, '0', _) => // sve_int_pfirst - __field op 23 +: 1 - __field S 22 +: 1 - __field Pg 5 +: 4 - __field Pdn 0 +: 4 - case (op, S) of - when ('0', '0') => __UNALLOCATED - when ('0', '1') => __encoding PFIRST_P_P_P__ // pfirst_p_p_p_ - when ('1', _) => __UNALLOCATED - when (_, _, _, '1000', _, '000', !'00', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '1000', _, '100', '10', '0000', '0', _) => // sve_int_pfalse - __field op 23 +: 1 - __field S 22 +: 1 - __field Pd 0 +: 4 - case (op, S) of - when ('0', '0') => __encoding PFALSE_P__ // pfalse_p_ - when ('0', '1') => __UNALLOCATED - when ('1', _) => __UNALLOCATED - when (_, _, _, '1000', _, '100', '10', !'0000', '0', _) => __UNPREDICTABLE - when (_, _, _, '1000', _, '110', '00', _, '0', _) => // sve_int_rdffr - __field op 23 +: 1 - __field S 22 +: 1 - __field Pg 5 +: 4 - __field Pd 0 +: 4 - case (op, S) of - when ('0', '0') => __encoding RDFFR_P_P_F__ // rdffr_p_p_f_ - when ('0', '1') => __encoding RDFFRS_P_P_F__ // rdffrs_p_p_f_ - when ('1', _) => __UNALLOCATED - when (_, _, _, '1001', _, '000', '0x', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '1001', _, '000', '10', _, '0', _) => // sve_int_pnext - __field size 22 +: 2 - __field Pg 5 +: 4 - __field Pdn 0 +: 4 - case () of - when () => __encoding PNEXT_P_P_P__ // pnext_p_p_p_ - when (_, _, _, '1001', _, '000', '11', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '1001', _, '100', '10', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '1001', _, '110', '00', '0000', '0', _) => // sve_int_rdffr_2 - __field op 23 +: 1 - __field S 22 +: 1 - __field Pd 0 +: 4 - case (op, S) of - when ('0', '0') => __encoding RDFFR_P_F__ // rdffr_p_f_ - when ('0', '1') => __UNALLOCATED - when ('1', _) => __UNALLOCATED - when (_, _, _, '1001', _, '110', '00', !'0000', '0', _) => __UNPREDICTABLE - when (_, _, _, '100x', _, '010', _, _, '0', _) => __UNPREDICTABLE - when (_, _, _, '100x', _, '100', '0x', _, '0', _) => // sve_int_ptrue - __field size 22 +: 2 - __field S 16 +: 1 - __field pattern 5 +: 5 - __field Pd 0 +: 4 - case (S) of - when ('0') => __encoding PTRUE_P_S__ // ptrue_p_s_ - when ('1') => __encoding PTRUES_P_S__ // ptrues_p_s_ - when (_, _, _, '100x', _, '100', '11', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '100x', _, '110', !'00', _, '0', _) => __UNPREDICTABLE - when (_, _, _, '100x', _, 'xx1', _, _, '0', _) => __UNPREDICTABLE - when (_, _, _, '110x', _, _, _, _, '0', _) => __UNPREDICTABLE - when (_, _, _, '1x1x', _, _, _, _, '0', _) => __UNPREDICTABLE - when (_, _, _, _, _, _, _, _, '1', _) => __UNPREDICTABLE - when ('001', _, '1x', _, '1xxxx', _, '00xxxx', _) => - // sve_cmpgpr - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 14 +: 2, 13 +: 1, 10 +: 3, 4 +: 6, 0 +: 4) of - when (_, _, _, _, _, '0', _, _, _) => // sve_int_while_rr - __field size 22 +: 2 - __field Rm 16 +: 5 - __field sf 12 +: 1 - __field U 11 +: 1 - __field lt 10 +: 1 - __field Rn 5 +: 5 - __field eq 4 +: 1 - __field Pd 0 +: 4 - case (U, lt, eq) of - when (_, '0', _) => __UNALLOCATED - when ('0', '1', '0') => __encoding WHILELT_P_P_RR__ // whilelt_p_p_rr_ - when ('0', '1', '1') => __encoding WHILELE_P_P_RR__ // whilele_p_p_rr_ - when ('1', '1', '0') => __encoding WHILELO_P_P_RR__ // whilelo_p_p_rr_ - when ('1', '1', '1') => __encoding WHILELS_P_P_RR__ // whilels_p_p_rr_ - when (_, _, _, _, _, '1', '000', _, '0000') => // sve_int_cterm - __field op 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field ne 4 +: 1 - case (op, ne) of - when ('0', _) => __UNALLOCATED - when ('1', '0') => __encoding CTERMEQ_RR__ // ctermeq_rr_ - when ('1', '1') => __encoding CTERMNE_RR__ // ctermne_rr_ - when (_, _, _, _, _, '1', '000', _, !'0000') => __UNPREDICTABLE - when (_, _, _, _, _, '1', !'000', _, _) => __UNPREDICTABLE - when ('001', _, '1x', _, '1xxxx', _, '01xxxx', _) => __UNPREDICTABLE - when ('001', _, '1x', _, '1xxxx', _, '11xxxx', _) => - // sve_wideimm_unpred - case (24 +: 8, 22 +: 2, 21 +: 1, 19 +: 2, 17 +: 2, 16 +: 1, 14 +: 2, 0 +: 14) of - when (_, _, _, '00', _, _, _, _) => // sve_int_arith_imm0 - __field size 22 +: 2 - __field opc 16 +: 3 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - case (opc) of - when ('000') => __encoding ADD_Z_ZI__ // add_z_zi_ - when ('001') => __encoding SUB_Z_ZI__ // sub_z_zi_ - when ('010') => __UNALLOCATED - when ('011') => __encoding SUBR_Z_ZI__ // subr_z_zi_ - when ('100') => __encoding SQADD_Z_ZI__ // sqadd_z_zi_ - when ('101') => __encoding UQADD_Z_ZI__ // uqadd_z_zi_ - when ('110') => __encoding SQSUB_Z_ZI__ // sqsub_z_zi_ - when ('111') => __encoding UQSUB_Z_ZI__ // uqsub_z_zi_ - when (_, _, _, '01', _, _, _, _) => // sve_int_arith_imm1 - __field size 22 +: 2 - __field opc 16 +: 3 - __field o2 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - case (opc, o2) of - when ('0xx', '1') => __UNALLOCATED - when ('000', '0') => __encoding SMAX_Z_ZI__ // smax_z_zi_ - when ('001', '0') => __encoding UMAX_Z_ZI__ // umax_z_zi_ - when ('010', '0') => __encoding SMIN_Z_ZI__ // smin_z_zi_ - when ('011', '0') => __encoding UMIN_Z_ZI__ // umin_z_zi_ - when ('1xx', _) => __UNALLOCATED - when (_, _, _, '10', _, _, _, _) => // sve_int_arith_imm2 - __field size 22 +: 2 - __field opc 16 +: 3 - __field o2 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - case (opc, o2) of - when ('000', '0') => __encoding MUL_Z_ZI__ // mul_z_zi_ - when ('000', '1') => __UNALLOCATED - when ('001', _) => __UNALLOCATED - when ('01x', _) => __UNALLOCATED - when ('1xx', _) => __UNALLOCATED - when (_, _, _, '11', _, '0', _, _) => // sve_int_dup_imm - __field size 22 +: 2 - __field opc 17 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - case (opc) of - when ('00') => __encoding DUP_Z_I__ // dup_z_i_ - when ('01') => __UNALLOCATED - when ('1x') => __UNALLOCATED - when (_, _, _, '11', _, '1', _, _) => // sve_int_dup_fpimm - __field size 22 +: 2 - __field opc 17 +: 2 - __field o2 13 +: 1 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - case (opc, o2) of - when ('00', '0') => __encoding FDUP_Z_I__ // fdup_z_i_ - when ('00', '1') => __UNALLOCATED - when ('01', _) => __UNALLOCATED - when ('1x', _) => __UNALLOCATED - when ('001', _, '1x', _, '100xx', _, '10xxxx', _) => // sve_int_pcount_pred - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 4 - __field o2 9 +: 1 - __field Pn 5 +: 4 - __field Rd 0 +: 5 - case (opc, o2) of - when ('000', '0') => __encoding CNTP_R_P_P__ // cntp_r_p_p_ - when ('000', '1') => __UNALLOCATED - when ('001', _) => __UNALLOCATED - when ('01x', _) => __UNALLOCATED - when ('1xx', _) => __UNALLOCATED - when ('001', _, '1x', _, '101xx', _, '1000xx', _) => - // sve_pred_count_b - case (24 +: 8, 22 +: 2, 19 +: 3, 18 +: 1, 16 +: 2, 12 +: 4, 11 +: 1, 0 +: 11) of - when (_, _, _, '0', _, _, '0', _) => // sve_int_count_v_sat - __field size 22 +: 2 - __field D 17 +: 1 - __field U 16 +: 1 - __field opc 9 +: 2 - __field Pm 5 +: 4 - __field Zdn 0 +: 5 - case (D, U, opc) of - when (_, _, '01') => __UNALLOCATED - when (_, _, '1x') => __UNALLOCATED - when ('0', '0', '00') => __encoding SQINCP_Z_P_Z__ // sqincp_z_p_z_ - when ('0', '1', '00') => __encoding UQINCP_Z_P_Z__ // uqincp_z_p_z_ - when ('1', '0', '00') => __encoding SQDECP_Z_P_Z__ // sqdecp_z_p_z_ - when ('1', '1', '00') => __encoding UQDECP_Z_P_Z__ // uqdecp_z_p_z_ - when (_, _, _, '0', _, _, '1', _) => // sve_int_count_r_sat - __field size 22 +: 2 - __field D 17 +: 1 - __field U 16 +: 1 - __field sf 10 +: 1 - __field op 9 +: 1 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - case (D, U, sf, op) of - when (_, _, _, '1') => __UNALLOCATED - when ('0', '0', '0', '0') => __encoding SQINCP_R_P_R_SX // sqincp_r_p_r_sx - when ('0', '0', '1', '0') => __encoding SQINCP_R_P_R_X // sqincp_r_p_r_x - when ('0', '1', '0', '0') => __encoding UQINCP_R_P_R_UW // uqincp_r_p_r_uw - when ('0', '1', '1', '0') => __encoding UQINCP_R_P_R_X // uqincp_r_p_r_x - when ('1', '0', '0', '0') => __encoding SQDECP_R_P_R_SX // sqdecp_r_p_r_sx - when ('1', '0', '1', '0') => __encoding SQDECP_R_P_R_X // sqdecp_r_p_r_x - when ('1', '1', '0', '0') => __encoding UQDECP_R_P_R_UW // uqdecp_r_p_r_uw - when ('1', '1', '1', '0') => __encoding UQDECP_R_P_R_X // uqdecp_r_p_r_x - when (_, _, _, '1', _, _, '0', _) => // sve_int_count_v - __field size 22 +: 2 - __field op 17 +: 1 - __field D 16 +: 1 - __field opc2 9 +: 2 - __field Pm 5 +: 4 - __field Zdn 0 +: 5 - case (op, D, opc2) of - when ('0', _, '01') => __UNALLOCATED - when ('0', _, '1x') => __UNALLOCATED - when ('0', '0', '00') => __encoding INCP_Z_P_Z__ // incp_z_p_z_ - when ('0', '1', '00') => __encoding DECP_Z_P_Z__ // decp_z_p_z_ - when ('1', _, _) => __UNALLOCATED - when (_, _, _, '1', _, _, '1', _) => // sve_int_count_r - __field size 22 +: 2 - __field op 17 +: 1 - __field D 16 +: 1 - __field opc2 9 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - case (op, D, opc2) of - when ('0', _, '01') => __UNALLOCATED - when ('0', _, '1x') => __UNALLOCATED - when ('0', '0', '00') => __encoding INCP_R_P_R__ // incp_r_p_r_ - when ('0', '1', '00') => __encoding DECP_R_P_R__ // decp_r_p_r_ - when ('1', _, _) => __UNALLOCATED - when ('001', _, '1x', _, '101xx', _, '1001xx', _) => - // sve_pred_wrffr - case (24 +: 8, 22 +: 2, 19 +: 3, 18 +: 1, 16 +: 2, 12 +: 4, 9 +: 3, 5 +: 4, 0 +: 5) of - when (_, _, _, '0', '00', _, '000', _, '00000') => // sve_int_wrffr - __field opc 22 +: 2 - __field Pn 5 +: 4 - case (opc) of - when ('00') => __encoding WRFFR_F_P__ // wrffr_f_p_ - when ('01') => __UNALLOCATED - when ('1x') => __UNALLOCATED - when (_, _, _, '1', '00', _, '000', '0000', '00000') => // sve_int_setffr - __field opc 22 +: 2 - case (opc) of - when ('00') => __encoding SETFFR_F__ // setffr_f_ - when ('01') => __UNALLOCATED - when ('1x') => __UNALLOCATED - when (_, _, _, '1', '00', _, '000', '1xxx', '00000') => __UNPREDICTABLE - when (_, _, _, '1', '00', _, '000', 'x1xx', '00000') => __UNPREDICTABLE - when (_, _, _, '1', '00', _, '000', 'xx1x', '00000') => __UNPREDICTABLE - when (_, _, _, '1', '00', _, '000', 'xxx1', '00000') => __UNPREDICTABLE - when (_, _, _, _, '00', _, '000', _, !'00000') => __UNPREDICTABLE - when (_, _, _, _, '00', _, !'000', _, _) => __UNPREDICTABLE - when (_, _, _, _, !'00', _, _, _, _) => __UNPREDICTABLE - when ('001', _, '1x', _, '101xx', _, '101xxx', _) => __UNPREDICTABLE - when ('001', _, '1x', _, '11xxx', _, '10xxxx', _) => __UNPREDICTABLE - when ('010', _, '0x', _, '0xxxx', _, '0xxxxx', _) => - // sve_intx_muladd_unpred - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 15 +: 1, 14 +: 1, 11 +: 3, 10 +: 1, 0 +: 10) of - when (_, _, _, _, _, '0', '000', _, _) => // sve_intx_dot - __field size 22 +: 2 - __field Zm 16 +: 5 - __field U 10 +: 1 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (U) of - when ('0') => __encoding SDOT_Z_ZZZ__ // sdot_z_zzz_ - when ('1') => __encoding UDOT_Z_ZZZ__ // udot_z_zzz_ - when (_, _, _, _, _, '0', !'000', _, _) => __UNPREDICTABLE - when (_, _, _, _, _, '1', '0xx', _, _) => __UNPREDICTABLE - when (_, _, _, _, _, '1', '10x', _, _) => __UNPREDICTABLE - when (_, _, _, _, _, '1', '110', _, _) => __UNPREDICTABLE - when (_, _, _, _, _, '1', '111', '0', _) => // sve_intx_mixed_dot - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (size) of - when ('0x') => __UNALLOCATED - when ('10') => __encoding USDOT_Z_ZZZ_S // usdot_z_zzz_s - when ('11') => __UNALLOCATED - when (_, _, _, _, _, '1', '111', '1', _) => __UNPREDICTABLE - when ('010', _, '0x', _, '0xxxx', _, '1xxxxx', _) => __UNPREDICTABLE - when ('010', _, '0x', _, '1xxxx', _, _, _) => - // sve_intx_by_indexed_elem - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 13 +: 3, 11 +: 2, 0 +: 11) of - when (_, _, _, _, '000', '00', _) => // sve_intx_dot_by_indexed_elem - __field size 22 +: 2 - __field opc 16 +: 5 - __field U 10 +: 1 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (size, U) of - when ('0x', _) => __UNALLOCATED - when ('10', '0') => __encoding SDOT_Z_ZZZi_S // sdot_z_zzzi_s - when ('10', '1') => __encoding UDOT_Z_ZZZi_S // udot_z_zzzi_s - when ('11', '0') => __encoding SDOT_Z_ZZZi_D // sdot_z_zzzi_d - when ('11', '1') => __encoding UDOT_Z_ZZZi_D // udot_z_zzzi_d - when (_, _, _, _, '000', '01', _) => __UNPREDICTABLE - when (_, _, _, _, '000', '10', _) => __UNPREDICTABLE - when (_, _, _, _, '000', '11', _) => // sve_intx_mixed_dot_by_indexed_elem - __field size 22 +: 2 - __field opc 16 +: 5 - __field U 10 +: 1 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (size, U) of - when ('0x', _) => __UNALLOCATED - when ('10', '0') => __encoding USDOT_Z_ZZZi_S // usdot_z_zzzi_s - when ('10', '1') => __encoding SUDOT_Z_ZZZi_S // sudot_z_zzzi_s - when ('11', _) => __UNALLOCATED - when (_, _, _, _, !'000', _, _) => __UNPREDICTABLE - when ('010', _, '1x', _, '0xxxx', _, '0xxxxx', _) => __UNPREDICTABLE - when ('010', _, '1x', _, '0xxxx', _, '10xxxx', _) => - // sve_intx_constructive - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 14 +: 2, 10 +: 4, 0 +: 10) of - when (_, _, _, _, _, '00xx', _) => __UNPREDICTABLE - when (_, _, _, _, _, '010x', _) => __UNPREDICTABLE - when (_, _, _, _, _, '0110', _) => // sve_intx_mmla - __field uns 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (uns) of - when ('00') => __encoding SMMLA_Z_ZZZ__ // smmla_z_zzz_ - when ('01') => __UNALLOCATED - when ('10') => __encoding USMMLA_Z_ZZZ__ // usmmla_z_zzz_ - when ('11') => __encoding UMMLA_Z_ZZZ__ // ummla_z_zzz_ - when (_, _, _, _, _, '0111', _) => __UNPREDICTABLE - when (_, _, _, _, _, '1xxx', _) => __UNPREDICTABLE - when ('010', _, '1x', _, '0xxxx', _, '11xxxx', _) => __UNPREDICTABLE - when ('010', _, '1x', _, '1xxxx', _, _, _) => __UNPREDICTABLE - when ('011', _, '0x', _, '0xxxx', _, '0xxxxx', _) => // sve_fp_fcmla - __field size 22 +: 2 - __field Zm 16 +: 5 - __field rot 13 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case () of - when () => __encoding FCMLA_Z_P_ZZZ__ // fcmla_z_p_zzz_ - when ('011', _, '0x', _, '00x1x', _, '1xxxxx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '00000', _, '100xxx', _) => // sve_fp_fcadd - __field size 22 +: 2 - __field rot 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case () of - when () => __encoding FCADD_Z_P_ZZ__ // fcadd_z_p_zz_ - when ('011', _, '0x', _, '00000', _, '101xxx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '00000', _, '11xxxx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '00001', _, '1xxxxx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '0010x', _, '100xxx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '0010x', _, '101xxx', _) => // sve_fp_fcvt2 - __field opc 22 +: 2 - __field opc2 16 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc, opc2) of - when ('0x', _) => __UNALLOCATED - when ('10', '0x') => __UNALLOCATED - when ('10', '10') => __encoding BFCVTNT_Z_P_Z_S2BF // bfcvtnt_z_p_z_s2bf - when ('10', '11') => __UNALLOCATED - when ('11', _) => __UNALLOCATED - when ('011', _, '0x', _, '0010x', _, '11xxxx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '01xxx', _, '1xxxxx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, 'x0x01x', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, '00000x', _) => // sve_fp_fma_by_indexed_elem - __field size 22 +: 2 - __field opc 16 +: 5 - __field op 10 +: 1 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (size, op) of - when ('0x', '0') => __encoding FMLA_Z_ZZZi_H // fmla_z_zzzi_h - when ('0x', '1') => __encoding FMLS_Z_ZZZi_H // fmls_z_zzzi_h - when ('10', '0') => __encoding FMLA_Z_ZZZi_S // fmla_z_zzzi_s - when ('10', '1') => __encoding FMLS_Z_ZZZi_S // fmls_z_zzzi_s - when ('11', '0') => __encoding FMLA_Z_ZZZi_D // fmla_z_zzzi_d - when ('11', '1') => __encoding FMLS_Z_ZZZi_D // fmls_z_zzzi_d - when ('011', _, '0x', _, '1xxxx', _, '0001xx', _) => // sve_fp_fcmla_by_indexed_elem - __field size 22 +: 2 - __field opc 16 +: 5 - __field rot 10 +: 2 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (size) of - when ('0x') => __UNALLOCATED - when ('10') => __encoding FCMLA_Z_ZZZi_H // fcmla_z_zzzi_h - when ('11') => __encoding FCMLA_Z_ZZZi_S // fcmla_z_zzzi_s - when ('011', _, '0x', _, '1xxxx', _, '001000', _) => // sve_fp_fmul_by_indexed_elem - __field size 22 +: 2 - __field opc 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (size) of - when ('0x') => __encoding FMUL_Z_ZZi_H // fmul_z_zzi_h - when ('10') => __encoding FMUL_Z_ZZi_S // fmul_z_zzi_s - when ('11') => __encoding FMUL_Z_ZZi_D // fmul_z_zzi_d - when ('011', _, '0x', _, '1xxxx', _, '001001', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, '0011xx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, '01x0xx', _) => - // sve_fp_fma_long_by_indexed_elem - case (24 +: 8, 23 +: 1, 22 +: 1, 21 +: 1, 16 +: 5, 14 +: 2, 13 +: 1, 12 +: 1, 10 +: 2, 0 +: 10) of - when (_, '0', _, _, _, _, '0', _, '00', _) => // sve_fp_fdot_by_indexed_elem - __field op 22 +: 1 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (op) of - when ('0') => __UNALLOCATED - when ('1') => __encoding BFDOT_Z_ZZZi__ // bfdot_z_zzzi_ - when (_, '0', _, _, _, _, '0', _, !'00', _) => __UNPREDICTABLE - when (_, '0', _, _, _, _, '1', _, _, _) => __UNPREDICTABLE - when (_, '1', _, _, _, _, _, _, _, _) => // sve_fp_fma_long_by_indexed_elem - __field o2 22 +: 1 - __field i3h 19 +: 2 - __field Zm 16 +: 3 - __field op 13 +: 1 - __field i3l 11 +: 1 - __field T 10 +: 1 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (o2, op, T) of - when ('0', _, _) => __UNALLOCATED - when ('1', '0', '0') => __encoding BFMLALB_Z_ZZZi__ // bfmlalb_z_zzzi_ - when ('1', '0', '1') => __encoding BFMLALT_Z_ZZZi__ // bfmlalt_z_zzzi_ - when ('1', '1', _) => __UNALLOCATED - when ('011', _, '0x', _, '1xxxx', _, '01x1xx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, '10x00x', _) => - // sve_fp_fma_long - case (24 +: 8, 23 +: 1, 22 +: 1, 21 +: 1, 16 +: 5, 14 +: 2, 13 +: 1, 11 +: 2, 10 +: 1, 0 +: 10) of - when (_, '0', _, _, _, _, '0', _, '0', _) => // sve_fp_fdot - __field op 22 +: 1 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (op) of - when ('0') => __UNALLOCATED - when ('1') => __encoding BFDOT_Z_ZZZ__ // bfdot_z_zzz_ - when (_, '0', _, _, _, _, '0', _, '1', _) => __UNPREDICTABLE - when (_, '0', _, _, _, _, '1', _, _, _) => __UNPREDICTABLE - when (_, '1', _, _, _, _, _, _, _, _) => // sve_fp_fma_long - __field o2 22 +: 1 - __field Zm 16 +: 5 - __field op 13 +: 1 - __field T 10 +: 1 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (o2, op, T) of - when ('0', _, _) => __UNALLOCATED - when ('1', '0', '0') => __encoding BFMLALB_Z_ZZZ__ // bfmlalb_z_zzz_ - when ('1', '0', '1') => __encoding BFMLALT_Z_ZZZ__ // bfmlalt_z_zzz_ - when ('1', '1', _) => __UNALLOCATED - when ('011', _, '0x', _, '1xxxx', _, '10x1xx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, '110xxx', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, '111000', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, '111001', _) => // sve_fp_fmmla - __field opc 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (opc) of - when ('00') => __UNALLOCATED - when ('01') => __encoding BFMMLA_Z_ZZZ__ // bfmmla_z_zzz_ - when ('10') => __encoding FMMLA_Z_ZZZ_S // fmmla_z_zzz_s - when ('11') => __encoding FMMLA_Z_ZZZ_D // fmmla_z_zzz_d - when ('011', _, '0x', _, '1xxxx', _, '11101x', _) => __UNPREDICTABLE - when ('011', _, '0x', _, '1xxxx', _, '1111xx', _) => __UNPREDICTABLE - when ('011', _, '1x', _, '0xxxx', _, 'x1xxxx', _) => // sve_fp_3op_p_pd - __field size 22 +: 2 - __field Zm 16 +: 5 - __field op 15 +: 1 - __field o2 13 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field o3 4 +: 1 - __field Pd 0 +: 4 - case (op, o2, o3) of - when ('0', '0', '0') => __encoding FCMGE_P_P_ZZ__ // fcmge_p_p_zz_ - when ('0', '0', '1') => __encoding FCMGT_P_P_ZZ__ // fcmgt_p_p_zz_ - when ('0', '1', '0') => __encoding FCMEQ_P_P_ZZ__ // fcmeq_p_p_zz_ - when ('0', '1', '1') => __encoding FCMNE_P_P_ZZ__ // fcmne_p_p_zz_ - when ('1', '0', '0') => __encoding FCMUO_P_P_ZZ__ // fcmuo_p_p_zz_ - when ('1', '0', '1') => __encoding FACGE_P_P_ZZ__ // facge_p_p_zz_ - when ('1', '1', '0') => __UNALLOCATED - when ('1', '1', '1') => __encoding FACGT_P_P_ZZ__ // facgt_p_p_zz_ - when ('011', _, '1x', _, '0xxxx', _, '000xxx', _) => // sve_fp_3op_u_zd - __field size 22 +: 2 - __field Zm 16 +: 5 - __field opc 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('000') => __encoding FADD_Z_ZZ__ // fadd_z_zz_ - when ('001') => __encoding FSUB_Z_ZZ__ // fsub_z_zz_ - when ('010') => __encoding FMUL_Z_ZZ__ // fmul_z_zz_ - when ('011') => __encoding FTSMUL_Z_ZZ__ // ftsmul_z_zz_ - when ('10x') => __UNALLOCATED - when ('110') => __encoding FRECPS_Z_ZZ__ // frecps_z_zz_ - when ('111') => __encoding FRSQRTS_Z_ZZ__ // frsqrts_z_zz_ - when ('011', _, '1x', _, '0xxxx', _, '100xxx', _) => - // sve_fp_pred - case (24 +: 8, 22 +: 2, 21 +: 1, 19 +: 2, 16 +: 3, 13 +: 3, 10 +: 3, 6 +: 4, 0 +: 6) of - when (_, _, _, '0x', _, _, _, _, _) => // sve_fp_2op_p_zds - __field size 22 +: 2 - __field opc 16 +: 4 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (opc) of - when ('0000') => __encoding FADD_Z_P_ZZ__ // fadd_z_p_zz_ - when ('0001') => __encoding FSUB_Z_P_ZZ__ // fsub_z_p_zz_ - when ('0010') => __encoding FMUL_Z_P_ZZ__ // fmul_z_p_zz_ - when ('0011') => __encoding FSUBR_Z_P_ZZ__ // fsubr_z_p_zz_ - when ('0100') => __encoding FMAXNM_Z_P_ZZ__ // fmaxnm_z_p_zz_ - when ('0101') => __encoding FMINNM_Z_P_ZZ__ // fminnm_z_p_zz_ - when ('0110') => __encoding FMAX_Z_P_ZZ__ // fmax_z_p_zz_ - when ('0111') => __encoding FMIN_Z_P_ZZ__ // fmin_z_p_zz_ - when ('1000') => __encoding FABD_Z_P_ZZ__ // fabd_z_p_zz_ - when ('1001') => __encoding FSCALE_Z_P_ZZ__ // fscale_z_p_zz_ - when ('1010') => __encoding FMULX_Z_P_ZZ__ // fmulx_z_p_zz_ - when ('1011') => __UNALLOCATED - when ('1100') => __encoding FDIVR_Z_P_ZZ__ // fdivr_z_p_zz_ - when ('1101') => __encoding FDIV_Z_P_ZZ__ // fdiv_z_p_zz_ - when ('111x') => __UNALLOCATED - when (_, _, _, '10', _, _, '000', _, _) => // sve_fp_ftmad - __field size 22 +: 2 - __field imm3 16 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case () of - when () => __encoding FTMAD_Z_ZZI__ // ftmad_z_zzi_ - when (_, _, _, '10', _, _, !'000', _, _) => __UNPREDICTABLE - when (_, _, _, '11', _, _, _, '0000', _) => // sve_fp_2op_i_p_zds - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - case (opc) of - when ('000') => __encoding FADD_Z_P_ZS__ // fadd_z_p_zs_ - when ('001') => __encoding FSUB_Z_P_ZS__ // fsub_z_p_zs_ - when ('010') => __encoding FMUL_Z_P_ZS__ // fmul_z_p_zs_ - when ('011') => __encoding FSUBR_Z_P_ZS__ // fsubr_z_p_zs_ - when ('100') => __encoding FMAXNM_Z_P_ZS__ // fmaxnm_z_p_zs_ - when ('101') => __encoding FMINNM_Z_P_ZS__ // fminnm_z_p_zs_ - when ('110') => __encoding FMAX_Z_P_ZS__ // fmax_z_p_zs_ - when ('111') => __encoding FMIN_Z_P_ZS__ // fmin_z_p_zs_ - when (_, _, _, '11', _, _, _, !'0000', _) => __UNPREDICTABLE - when ('011', _, '1x', _, '0xxxx', _, '101xxx', _) => - // sve_fp_unary - case (24 +: 8, 22 +: 2, 21 +: 1, 18 +: 3, 16 +: 2, 13 +: 3, 0 +: 13) of - when (_, _, _, '00x', _, _, _) => // sve_fp_2op_p_zd_a - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('000') => __encoding FRINTN_Z_P_Z__ // frintn_z_p_z_ - when ('001') => __encoding FRINTP_Z_P_Z__ // frintp_z_p_z_ - when ('010') => __encoding FRINTM_Z_P_Z__ // frintm_z_p_z_ - when ('011') => __encoding FRINTZ_Z_P_Z__ // frintz_z_p_z_ - when ('100') => __encoding FRINTA_Z_P_Z__ // frinta_z_p_z_ - when ('101') => __UNALLOCATED - when ('110') => __encoding FRINTX_Z_P_Z__ // frintx_z_p_z_ - when ('111') => __encoding FRINTI_Z_P_Z__ // frinti_z_p_z_ - when (_, _, _, '010', _, _, _) => // sve_fp_2op_p_zd_b_0 - __field opc 22 +: 2 - __field opc2 16 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc, opc2) of - when ('0x', _) => __UNALLOCATED - when ('10', '00') => __encoding FCVT_Z_P_Z_S2H // fcvt_z_p_z_s2h - when ('10', '01') => __encoding FCVT_Z_P_Z_H2S // fcvt_z_p_z_h2s - when ('10', '10') => __encoding BFCVT_Z_P_Z_S2BF // bfcvt_z_p_z_s2bf - when ('10', '11') => __UNALLOCATED - when ('11', '00') => __encoding FCVT_Z_P_Z_D2H // fcvt_z_p_z_d2h - when ('11', '01') => __encoding FCVT_Z_P_Z_H2D // fcvt_z_p_z_h2d - when ('11', '10') => __encoding FCVT_Z_P_Z_D2S // fcvt_z_p_z_d2s - when ('11', '11') => __encoding FCVT_Z_P_Z_S2D // fcvt_z_p_z_s2d - when (_, _, _, '011', _, _, _) => // sve_fp_2op_p_zd_b_1 - __field size 22 +: 2 - __field opc 16 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('00') => __encoding FRECPX_Z_P_Z__ // frecpx_z_p_z_ - when ('01') => __encoding FSQRT_Z_P_Z__ // fsqrt_z_p_z_ - when ('1x') => __UNALLOCATED - when (_, _, _, '10x', _, _, _) => // sve_fp_2op_p_zd_c - __field opc 22 +: 2 - __field opc2 17 +: 2 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc, opc2, U) of - when ('00', _, _) => __UNALLOCATED - when ('01', '00', _) => __UNALLOCATED - when ('01', '01', '0') => __encoding SCVTF_Z_P_Z_H2FP16 // scvtf_z_p_z_h2fp16 - when ('01', '01', '1') => __encoding UCVTF_Z_P_Z_H2FP16 // ucvtf_z_p_z_h2fp16 - when ('01', '10', '0') => __encoding SCVTF_Z_P_Z_W2FP16 // scvtf_z_p_z_w2fp16 - when ('01', '10', '1') => __encoding UCVTF_Z_P_Z_W2FP16 // ucvtf_z_p_z_w2fp16 - when ('01', '11', '0') => __encoding SCVTF_Z_P_Z_X2FP16 // scvtf_z_p_z_x2fp16 - when ('01', '11', '1') => __encoding UCVTF_Z_P_Z_X2FP16 // ucvtf_z_p_z_x2fp16 - when ('10', '0x', _) => __UNALLOCATED - when ('10', '10', '0') => __encoding SCVTF_Z_P_Z_W2S // scvtf_z_p_z_w2s - when ('10', '10', '1') => __encoding UCVTF_Z_P_Z_W2S // ucvtf_z_p_z_w2s - when ('10', '11', _) => __UNALLOCATED - when ('11', '00', '0') => __encoding SCVTF_Z_P_Z_W2D // scvtf_z_p_z_w2d - when ('11', '00', '1') => __encoding UCVTF_Z_P_Z_W2D // ucvtf_z_p_z_w2d - when ('11', '01', _) => __UNALLOCATED - when ('11', '10', '0') => __encoding SCVTF_Z_P_Z_X2S // scvtf_z_p_z_x2s - when ('11', '10', '1') => __encoding UCVTF_Z_P_Z_X2S // ucvtf_z_p_z_x2s - when ('11', '11', '0') => __encoding SCVTF_Z_P_Z_X2D // scvtf_z_p_z_x2d - when ('11', '11', '1') => __encoding UCVTF_Z_P_Z_X2D // ucvtf_z_p_z_x2d - when (_, _, _, '11x', _, _, _) => // sve_fp_2op_p_zd_d - __field opc 22 +: 2 - __field opc2 17 +: 2 - __field U 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc, opc2, U) of - when ('00', _, _) => __UNALLOCATED - when ('01', '00', _) => __UNALLOCATED - when ('01', '01', '0') => __encoding FCVTZS_Z_P_Z_FP162H // fcvtzs_z_p_z_fp162h - when ('01', '01', '1') => __encoding FCVTZU_Z_P_Z_FP162H // fcvtzu_z_p_z_fp162h - when ('01', '10', '0') => __encoding FCVTZS_Z_P_Z_FP162W // fcvtzs_z_p_z_fp162w - when ('01', '10', '1') => __encoding FCVTZU_Z_P_Z_FP162W // fcvtzu_z_p_z_fp162w - when ('01', '11', '0') => __encoding FCVTZS_Z_P_Z_FP162X // fcvtzs_z_p_z_fp162x - when ('01', '11', '1') => __encoding FCVTZU_Z_P_Z_FP162X // fcvtzu_z_p_z_fp162x - when ('10', '0x', _) => __UNALLOCATED - when ('10', '10', '0') => __encoding FCVTZS_Z_P_Z_S2W // fcvtzs_z_p_z_s2w - when ('10', '10', '1') => __encoding FCVTZU_Z_P_Z_S2W // fcvtzu_z_p_z_s2w - when ('10', '11', _) => __UNALLOCATED - when ('11', '00', '0') => __encoding FCVTZS_Z_P_Z_D2W // fcvtzs_z_p_z_d2w - when ('11', '00', '1') => __encoding FCVTZU_Z_P_Z_D2W // fcvtzu_z_p_z_d2w - when ('11', '01', _) => __UNALLOCATED - when ('11', '10', '0') => __encoding FCVTZS_Z_P_Z_S2X // fcvtzs_z_p_z_s2x - when ('11', '10', '1') => __encoding FCVTZU_Z_P_Z_S2X // fcvtzu_z_p_z_s2x - when ('11', '11', '0') => __encoding FCVTZS_Z_P_Z_D2X // fcvtzs_z_p_z_d2x - when ('11', '11', '1') => __encoding FCVTZU_Z_P_Z_D2X // fcvtzu_z_p_z_d2x - when ('011', _, '1x', _, '000xx', _, '001xxx', _) => // sve_fp_fast_red - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - case (opc) of - when ('000') => __encoding FADDV_V_P_Z__ // faddv_v_p_z_ - when ('001') => __UNALLOCATED - when ('01x') => __UNALLOCATED - when ('100') => __encoding FMAXNMV_V_P_Z__ // fmaxnmv_v_p_z_ - when ('101') => __encoding FMINNMV_V_P_Z__ // fminnmv_v_p_z_ - when ('110') => __encoding FMAXV_V_P_Z__ // fmaxv_v_p_z_ - when ('111') => __encoding FMINV_V_P_Z__ // fminv_v_p_z_ - when ('011', _, '1x', _, '001xx', _, '0010xx', _) => __UNPREDICTABLE - when ('011', _, '1x', _, '001xx', _, '0011xx', _) => - // sve_fp_unary_unpred - case (24 +: 8, 22 +: 2, 19 +: 3, 16 +: 3, 12 +: 4, 10 +: 2, 0 +: 10) of - when (_, _, _, _, _, '00', _) => // sve_fp_2op_u_zd - __field size 22 +: 2 - __field opc 16 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - case (opc) of - when ('0xx') => __UNALLOCATED - when ('10x') => __UNALLOCATED - when ('110') => __encoding FRECPE_Z_Z__ // frecpe_z_z_ - when ('111') => __encoding FRSQRTE_Z_Z__ // frsqrte_z_z_ - when (_, _, _, _, _, !'00', _) => __UNPREDICTABLE - when ('011', _, '1x', _, '010xx', _, '001xxx', _) => - // sve_fp_cmpzero - case (24 +: 8, 22 +: 2, 19 +: 3, 18 +: 1, 16 +: 2, 13 +: 3, 0 +: 13) of - when (_, _, _, '0', _, _, _) => // sve_fp_2op_p_pd - __field size 22 +: 2 - __field eq 17 +: 1 - __field lt 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field ne 4 +: 1 - __field Pd 0 +: 4 - case (eq, lt, ne) of - when ('0', '0', '0') => __encoding FCMGE_P_P_Z0__ // fcmge_p_p_z0_ - when ('0', '0', '1') => __encoding FCMGT_P_P_Z0__ // fcmgt_p_p_z0_ - when ('0', '1', '0') => __encoding FCMLT_P_P_Z0__ // fcmlt_p_p_z0_ - when ('0', '1', '1') => __encoding FCMLE_P_P_Z0__ // fcmle_p_p_z0_ - when ('1', _, '1') => __UNALLOCATED - when ('1', '0', '0') => __encoding FCMEQ_P_P_Z0__ // fcmeq_p_p_z0_ - when ('1', '1', '0') => __encoding FCMNE_P_P_Z0__ // fcmne_p_p_z0_ - when (_, _, _, '1', _, _, _) => __UNPREDICTABLE - when ('011', _, '1x', _, '011xx', _, '001xxx', _) => // sve_fp_2op_p_vd - __field size 22 +: 2 - __field opc 16 +: 3 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Vdn 0 +: 5 - case (opc) of - when ('000') => __encoding FADDA_V_P_Z__ // fadda_v_p_z_ - when ('001') => __UNALLOCATED - when ('01x') => __UNALLOCATED - when ('1xx') => __UNALLOCATED - when ('011', _, '1x', _, '1xxxx', _, _, _) => - // sve_fp_fma - case (24 +: 8, 22 +: 2, 21 +: 1, 16 +: 5, 15 +: 1, 0 +: 15) of - when (_, _, _, _, '0', _) => // sve_fp_3op_p_zds_a - __field size 22 +: 2 - __field Zm 16 +: 5 - __field opc 13 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - case (opc) of - when ('00') => __encoding FMLA_Z_P_ZZZ__ // fmla_z_p_zzz_ - when ('01') => __encoding FMLS_Z_P_ZZZ__ // fmls_z_p_zzz_ - when ('10') => __encoding FNMLA_Z_P_ZZZ__ // fnmla_z_p_zzz_ - when ('11') => __encoding FNMLS_Z_P_ZZZ__ // fnmls_z_p_zzz_ - when (_, _, _, _, '1', _) => // sve_fp_3op_p_zds_b - __field size 22 +: 2 - __field Za 16 +: 5 - __field opc 13 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - case (opc) of - when ('00') => __encoding FMAD_Z_P_ZZZ__ // fmad_z_p_zzz_ - when ('01') => __encoding FMSB_Z_P_ZZZ__ // fmsb_z_p_zzz_ - when ('10') => __encoding FNMAD_Z_P_ZZZ__ // fnmad_z_p_zzz_ - when ('11') => __encoding FNMSB_Z_P_ZZZ__ // fnmsb_z_p_zzz_ - when ('100', _, _, _, _, _, _, _) => - // sve_mem32 - case (25 +: 7, 23 +: 2, 21 +: 2, 16 +: 5, 13 +: 3, 5 +: 8, 4 +: 1, 0 +: 4) of - when (_, '00', 'x1', _, '0xx', _, '0', _) => // sve_mem_32b_prfm_sv - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field msz 13 +: 2 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - case (msz) of - when ('00') => __encoding PRFB_I_P_BZ_S_x32_scaled // prfb_i_p_bz_s_x32_scaled - when ('01') => __encoding PRFH_I_P_BZ_S_x32_scaled // prfh_i_p_bz_s_x32_scaled - when ('10') => __encoding PRFW_I_P_BZ_S_x32_scaled // prfw_i_p_bz_s_x32_scaled - when ('11') => __encoding PRFD_I_P_BZ_S_x32_scaled // prfd_i_p_bz_s_x32_scaled - when (_, '00', 'x1', _, '0xx', _, '1', _) => __UNPREDICTABLE - when (_, '01', 'x1', _, '0xx', _, _, _) => // sve_mem_32b_gld_sv_a - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (U, ff) of - when ('0', '0') => __encoding LD1SH_Z_P_BZ_S_x32_scaled // ld1sh_z_p_bz_s_x32_scaled - when ('0', '1') => __encoding LDFF1SH_Z_P_BZ_S_x32_scaled // ldff1sh_z_p_bz_s_x32_scaled - when ('1', '0') => __encoding LD1H_Z_P_BZ_S_x32_scaled // ld1h_z_p_bz_s_x32_scaled - when ('1', '1') => __encoding LDFF1H_Z_P_BZ_S_x32_scaled // ldff1h_z_p_bz_s_x32_scaled - when (_, '10', 'x1', _, '0xx', _, _, _) => // sve_mem_32b_gld_sv_b - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (U, ff) of - when ('0', _) => __UNALLOCATED - when ('1', '0') => __encoding LD1W_Z_P_BZ_S_x32_scaled // ld1w_z_p_bz_s_x32_scaled - when ('1', '1') => __encoding LDFF1W_Z_P_BZ_S_x32_scaled // ldff1w_z_p_bz_s_x32_scaled - when (_, '11', '0x', _, '000', _, '0', _) => // sve_mem_32b_pfill - __field imm9h 16 +: 6 - __field imm9l 10 +: 3 - __field Rn 5 +: 5 - __field Pt 0 +: 4 - case () of - when () => __encoding LDR_P_BI__ // ldr_p_bi_ - when (_, '11', '0x', _, '000', _, '1', _) => __UNPREDICTABLE - when (_, '11', '0x', _, '010', _, _, _) => // sve_mem_32b_fill - __field imm9h 16 +: 6 - __field imm9l 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case () of - when () => __encoding LDR_Z_BI__ // ldr_z_bi_ - when (_, '11', '0x', _, '0x1', _, _, _) => __UNPREDICTABLE - when (_, '11', '1x', _, '0xx', _, '0', _) => // sve_mem_prfm_si - __field imm6 16 +: 6 - __field msz 13 +: 2 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - case (msz) of - when ('00') => __encoding PRFB_I_P_BI_S // prfb_i_p_bi_s - when ('01') => __encoding PRFH_I_P_BI_S // prfh_i_p_bi_s - when ('10') => __encoding PRFW_I_P_BI_S // prfw_i_p_bi_s - when ('11') => __encoding PRFD_I_P_BI_S // prfd_i_p_bi_s - when (_, '11', '1x', _, '0xx', _, '1', _) => __UNPREDICTABLE - when (_, !'11', 'x0', _, '0xx', _, _, _) => // sve_mem_32b_gld_vs - __field opc 23 +: 2 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (opc, U, ff) of - when ('00', '0', '0') => __encoding LD1SB_Z_P_BZ_S_x32_unscaled // ld1sb_z_p_bz_s_x32_unscaled - when ('00', '0', '1') => __encoding LDFF1SB_Z_P_BZ_S_x32_unscaled // ldff1sb_z_p_bz_s_x32_unscaled - when ('00', '1', '0') => __encoding LD1B_Z_P_BZ_S_x32_unscaled // ld1b_z_p_bz_s_x32_unscaled - when ('00', '1', '1') => __encoding LDFF1B_Z_P_BZ_S_x32_unscaled // ldff1b_z_p_bz_s_x32_unscaled - when ('01', '0', '0') => __encoding LD1SH_Z_P_BZ_S_x32_unscaled // ld1sh_z_p_bz_s_x32_unscaled - when ('01', '0', '1') => __encoding LDFF1SH_Z_P_BZ_S_x32_unscaled // ldff1sh_z_p_bz_s_x32_unscaled - when ('01', '1', '0') => __encoding LD1H_Z_P_BZ_S_x32_unscaled // ld1h_z_p_bz_s_x32_unscaled - when ('01', '1', '1') => __encoding LDFF1H_Z_P_BZ_S_x32_unscaled // ldff1h_z_p_bz_s_x32_unscaled - when ('10', '0', _) => __UNALLOCATED - when ('10', '1', '0') => __encoding LD1W_Z_P_BZ_S_x32_unscaled // ld1w_z_p_bz_s_x32_unscaled - when ('10', '1', '1') => __encoding LDFF1W_Z_P_BZ_S_x32_unscaled // ldff1w_z_p_bz_s_x32_unscaled - when (_, _, '00', _, '10x', _, _, _) => __UNPREDICTABLE - when (_, _, '00', _, '110', _, '0', _) => // sve_mem_prfm_ss - __field msz 23 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - case (msz) of - when ('00') => __encoding PRFB_I_P_BR_S // prfb_i_p_br_s - when ('01') => __encoding PRFH_I_P_BR_S // prfh_i_p_br_s - when ('10') => __encoding PRFW_I_P_BR_S // prfw_i_p_br_s - when ('11') => __encoding PRFD_I_P_BR_S // prfd_i_p_br_s - when (_, _, '00', _, '111', _, '0', _) => // sve_mem_32b_prfm_vi - __field msz 23 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - case (msz) of - when ('00') => __encoding PRFB_I_P_AI_S // prfb_i_p_ai_s - when ('01') => __encoding PRFH_I_P_AI_S // prfh_i_p_ai_s - when ('10') => __encoding PRFW_I_P_AI_S // prfw_i_p_ai_s - when ('11') => __encoding PRFD_I_P_AI_S // prfd_i_p_ai_s - when (_, _, '00', _, '11x', _, '1', _) => __UNPREDICTABLE - when (_, _, '01', _, '1xx', _, _, _) => // sve_mem_32b_gld_vi - __field msz 23 +: 2 - __field imm5 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - case (msz, U, ff) of - when ('00', '0', '0') => __encoding LD1SB_Z_P_AI_S // ld1sb_z_p_ai_s - when ('00', '0', '1') => __encoding LDFF1SB_Z_P_AI_S // ldff1sb_z_p_ai_s - when ('00', '1', '0') => __encoding LD1B_Z_P_AI_S // ld1b_z_p_ai_s - when ('00', '1', '1') => __encoding LDFF1B_Z_P_AI_S // ldff1b_z_p_ai_s - when ('01', '0', '0') => __encoding LD1SH_Z_P_AI_S // ld1sh_z_p_ai_s - when ('01', '0', '1') => __encoding LDFF1SH_Z_P_AI_S // ldff1sh_z_p_ai_s - when ('01', '1', '0') => __encoding LD1H_Z_P_AI_S // ld1h_z_p_ai_s - when ('01', '1', '1') => __encoding LDFF1H_Z_P_AI_S // ldff1h_z_p_ai_s - when ('10', '0', _) => __UNALLOCATED - when ('10', '1', '0') => __encoding LD1W_Z_P_AI_S // ld1w_z_p_ai_s - when ('10', '1', '1') => __encoding LDFF1W_Z_P_AI_S // ldff1w_z_p_ai_s - when ('11', _, _) => __UNALLOCATED - when (_, _, '1x', _, '1xx', _, _, _) => // sve_mem_ld_dup - __field dtypeh 23 +: 2 - __field imm6 16 +: 6 - __field dtypel 13 +: 2 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (dtypeh, dtypel) of - when ('00', '00') => __encoding LD1RB_Z_P_BI_U8 // ld1rb_z_p_bi_u8 - when ('00', '01') => __encoding LD1RB_Z_P_BI_U16 // ld1rb_z_p_bi_u16 - when ('00', '10') => __encoding LD1RB_Z_P_BI_U32 // ld1rb_z_p_bi_u32 - when ('00', '11') => __encoding LD1RB_Z_P_BI_U64 // ld1rb_z_p_bi_u64 - when ('01', '00') => __encoding LD1RSW_Z_P_BI_S64 // ld1rsw_z_p_bi_s64 - when ('01', '01') => __encoding LD1RH_Z_P_BI_U16 // ld1rh_z_p_bi_u16 - when ('01', '10') => __encoding LD1RH_Z_P_BI_U32 // ld1rh_z_p_bi_u32 - when ('01', '11') => __encoding LD1RH_Z_P_BI_U64 // ld1rh_z_p_bi_u64 - when ('10', '00') => __encoding LD1RSH_Z_P_BI_S64 // ld1rsh_z_p_bi_s64 - when ('10', '01') => __encoding LD1RSH_Z_P_BI_S32 // ld1rsh_z_p_bi_s32 - when ('10', '10') => __encoding LD1RW_Z_P_BI_U32 // ld1rw_z_p_bi_u32 - when ('10', '11') => __encoding LD1RW_Z_P_BI_U64 // ld1rw_z_p_bi_u64 - when ('11', '00') => __encoding LD1RSB_Z_P_BI_S64 // ld1rsb_z_p_bi_s64 - when ('11', '01') => __encoding LD1RSB_Z_P_BI_S32 // ld1rsb_z_p_bi_s32 - when ('11', '10') => __encoding LD1RSB_Z_P_BI_S16 // ld1rsb_z_p_bi_s16 - when ('11', '11') => __encoding LD1RD_Z_P_BI_U64 // ld1rd_z_p_bi_u64 - when ('101', _, _, _, _, _, _, _) => - // sve_memcld - case (25 +: 7, 23 +: 2, 21 +: 2, 20 +: 1, 16 +: 4, 13 +: 3, 0 +: 13) of - when (_, _, '00', '0', _, '111', _) => // sve_mem_cldnt_si - __field msz 23 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding LDNT1B_Z_P_BI_Contiguous // ldnt1b_z_p_bi_contiguous - when ('01') => __encoding LDNT1H_Z_P_BI_Contiguous // ldnt1h_z_p_bi_contiguous - when ('10') => __encoding LDNT1W_Z_P_BI_Contiguous // ldnt1w_z_p_bi_contiguous - when ('11') => __encoding LDNT1D_Z_P_BI_Contiguous // ldnt1d_z_p_bi_contiguous - when (_, _, '00', _, _, '110', _) => // sve_mem_cldnt_ss - __field msz 23 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding LDNT1B_Z_P_BR_Contiguous // ldnt1b_z_p_br_contiguous - when ('01') => __encoding LDNT1H_Z_P_BR_Contiguous // ldnt1h_z_p_br_contiguous - when ('10') => __encoding LDNT1W_Z_P_BR_Contiguous // ldnt1w_z_p_br_contiguous - when ('11') => __encoding LDNT1D_Z_P_BR_Contiguous // ldnt1d_z_p_br_contiguous - when (_, _, !'00', '0', _, '111', _) => // sve_mem_eld_si - __field msz 23 +: 2 - __field opc 21 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz, opc) of - when ('00', '01') => __encoding LD2B_Z_P_BI_Contiguous // ld2b_z_p_bi_contiguous - when ('00', '10') => __encoding LD3B_Z_P_BI_Contiguous // ld3b_z_p_bi_contiguous - when ('00', '11') => __encoding LD4B_Z_P_BI_Contiguous // ld4b_z_p_bi_contiguous - when ('01', '01') => __encoding LD2H_Z_P_BI_Contiguous // ld2h_z_p_bi_contiguous - when ('01', '10') => __encoding LD3H_Z_P_BI_Contiguous // ld3h_z_p_bi_contiguous - when ('01', '11') => __encoding LD4H_Z_P_BI_Contiguous // ld4h_z_p_bi_contiguous - when ('10', '01') => __encoding LD2W_Z_P_BI_Contiguous // ld2w_z_p_bi_contiguous - when ('10', '10') => __encoding LD3W_Z_P_BI_Contiguous // ld3w_z_p_bi_contiguous - when ('10', '11') => __encoding LD4W_Z_P_BI_Contiguous // ld4w_z_p_bi_contiguous - when ('11', '01') => __encoding LD2D_Z_P_BI_Contiguous // ld2d_z_p_bi_contiguous - when ('11', '10') => __encoding LD3D_Z_P_BI_Contiguous // ld3d_z_p_bi_contiguous - when ('11', '11') => __encoding LD4D_Z_P_BI_Contiguous // ld4d_z_p_bi_contiguous - when (_, _, !'00', _, _, '110', _) => // sve_mem_eld_ss - __field msz 23 +: 2 - __field opc 21 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz, opc) of - when ('00', '01') => __encoding LD2B_Z_P_BR_Contiguous // ld2b_z_p_br_contiguous - when ('00', '10') => __encoding LD3B_Z_P_BR_Contiguous // ld3b_z_p_br_contiguous - when ('00', '11') => __encoding LD4B_Z_P_BR_Contiguous // ld4b_z_p_br_contiguous - when ('01', '01') => __encoding LD2H_Z_P_BR_Contiguous // ld2h_z_p_br_contiguous - when ('01', '10') => __encoding LD3H_Z_P_BR_Contiguous // ld3h_z_p_br_contiguous - when ('01', '11') => __encoding LD4H_Z_P_BR_Contiguous // ld4h_z_p_br_contiguous - when ('10', '01') => __encoding LD2W_Z_P_BR_Contiguous // ld2w_z_p_br_contiguous - when ('10', '10') => __encoding LD3W_Z_P_BR_Contiguous // ld3w_z_p_br_contiguous - when ('10', '11') => __encoding LD4W_Z_P_BR_Contiguous // ld4w_z_p_br_contiguous - when ('11', '01') => __encoding LD2D_Z_P_BR_Contiguous // ld2d_z_p_br_contiguous - when ('11', '10') => __encoding LD3D_Z_P_BR_Contiguous // ld3d_z_p_br_contiguous - when ('11', '11') => __encoding LD4D_Z_P_BR_Contiguous // ld4d_z_p_br_contiguous - when (_, _, _, '0', _, '001', _) => // sve_mem_ldqr_si - __field msz 23 +: 2 - __field ssz 21 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz, ssz) of - when (_, '1x') => __UNALLOCATED - when ('00', '00') => __encoding LD1RQB_Z_P_BI_U8 // ld1rqb_z_p_bi_u8 - when ('00', '01') => __encoding LD1ROB_Z_P_BI_U8 // ld1rob_z_p_bi_u8 - when ('01', '00') => __encoding LD1RQH_Z_P_BI_U16 // ld1rqh_z_p_bi_u16 - when ('01', '01') => __encoding LD1ROH_Z_P_BI_U16 // ld1roh_z_p_bi_u16 - when ('10', '00') => __encoding LD1RQW_Z_P_BI_U32 // ld1rqw_z_p_bi_u32 - when ('10', '01') => __encoding LD1ROW_Z_P_BI_U32 // ld1row_z_p_bi_u32 - when ('11', '00') => __encoding LD1RQD_Z_P_BI_U64 // ld1rqd_z_p_bi_u64 - when ('11', '01') => __encoding LD1ROD_Z_P_BI_U64 // ld1rod_z_p_bi_u64 - when (_, _, _, '0', _, '101', _) => // sve_mem_cld_si - __field dtype 21 +: 4 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (dtype) of - when ('0000') => __encoding LD1B_Z_P_BI_U8 // ld1b_z_p_bi_u8 - when ('0001') => __encoding LD1B_Z_P_BI_U16 // ld1b_z_p_bi_u16 - when ('0010') => __encoding LD1B_Z_P_BI_U32 // ld1b_z_p_bi_u32 - when ('0011') => __encoding LD1B_Z_P_BI_U64 // ld1b_z_p_bi_u64 - when ('0100') => __encoding LD1SW_Z_P_BI_S64 // ld1sw_z_p_bi_s64 - when ('0101') => __encoding LD1H_Z_P_BI_U16 // ld1h_z_p_bi_u16 - when ('0110') => __encoding LD1H_Z_P_BI_U32 // ld1h_z_p_bi_u32 - when ('0111') => __encoding LD1H_Z_P_BI_U64 // ld1h_z_p_bi_u64 - when ('1000') => __encoding LD1SH_Z_P_BI_S64 // ld1sh_z_p_bi_s64 - when ('1001') => __encoding LD1SH_Z_P_BI_S32 // ld1sh_z_p_bi_s32 - when ('1010') => __encoding LD1W_Z_P_BI_U32 // ld1w_z_p_bi_u32 - when ('1011') => __encoding LD1W_Z_P_BI_U64 // ld1w_z_p_bi_u64 - when ('1100') => __encoding LD1SB_Z_P_BI_S64 // ld1sb_z_p_bi_s64 - when ('1101') => __encoding LD1SB_Z_P_BI_S32 // ld1sb_z_p_bi_s32 - when ('1110') => __encoding LD1SB_Z_P_BI_S16 // ld1sb_z_p_bi_s16 - when ('1111') => __encoding LD1D_Z_P_BI_U64 // ld1d_z_p_bi_u64 - when (_, _, _, '1', _, '001', _) => __UNPREDICTABLE - when (_, _, _, '1', _, '101', _) => // sve_mem_cldnf_si - __field dtype 21 +: 4 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (dtype) of - when ('0000') => __encoding LDNF1B_Z_P_BI_U8 // ldnf1b_z_p_bi_u8 - when ('0001') => __encoding LDNF1B_Z_P_BI_U16 // ldnf1b_z_p_bi_u16 - when ('0010') => __encoding LDNF1B_Z_P_BI_U32 // ldnf1b_z_p_bi_u32 - when ('0011') => __encoding LDNF1B_Z_P_BI_U64 // ldnf1b_z_p_bi_u64 - when ('0100') => __encoding LDNF1SW_Z_P_BI_S64 // ldnf1sw_z_p_bi_s64 - when ('0101') => __encoding LDNF1H_Z_P_BI_U16 // ldnf1h_z_p_bi_u16 - when ('0110') => __encoding LDNF1H_Z_P_BI_U32 // ldnf1h_z_p_bi_u32 - when ('0111') => __encoding LDNF1H_Z_P_BI_U64 // ldnf1h_z_p_bi_u64 - when ('1000') => __encoding LDNF1SH_Z_P_BI_S64 // ldnf1sh_z_p_bi_s64 - when ('1001') => __encoding LDNF1SH_Z_P_BI_S32 // ldnf1sh_z_p_bi_s32 - when ('1010') => __encoding LDNF1W_Z_P_BI_U32 // ldnf1w_z_p_bi_u32 - when ('1011') => __encoding LDNF1W_Z_P_BI_U64 // ldnf1w_z_p_bi_u64 - when ('1100') => __encoding LDNF1SB_Z_P_BI_S64 // ldnf1sb_z_p_bi_s64 - when ('1101') => __encoding LDNF1SB_Z_P_BI_S32 // ldnf1sb_z_p_bi_s32 - when ('1110') => __encoding LDNF1SB_Z_P_BI_S16 // ldnf1sb_z_p_bi_s16 - when ('1111') => __encoding LDNF1D_Z_P_BI_U64 // ldnf1d_z_p_bi_u64 - when (_, _, _, '1', _, '111', _) => __UNPREDICTABLE - when (_, _, _, _, _, '000', _) => // sve_mem_ldqr_ss - __field msz 23 +: 2 - __field ssz 21 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz, ssz) of - when (_, '1x') => __UNALLOCATED - when ('00', '00') => __encoding LD1RQB_Z_P_BR_Contiguous // ld1rqb_z_p_br_contiguous - when ('00', '01') => __encoding LD1ROB_Z_P_BR_Contiguous // ld1rob_z_p_br_contiguous - when ('01', '00') => __encoding LD1RQH_Z_P_BR_Contiguous // ld1rqh_z_p_br_contiguous - when ('01', '01') => __encoding LD1ROH_Z_P_BR_Contiguous // ld1roh_z_p_br_contiguous - when ('10', '00') => __encoding LD1RQW_Z_P_BR_Contiguous // ld1rqw_z_p_br_contiguous - when ('10', '01') => __encoding LD1ROW_Z_P_BR_Contiguous // ld1row_z_p_br_contiguous - when ('11', '00') => __encoding LD1RQD_Z_P_BR_Contiguous // ld1rqd_z_p_br_contiguous - when ('11', '01') => __encoding LD1ROD_Z_P_BR_Contiguous // ld1rod_z_p_br_contiguous - when (_, _, _, _, _, '010', _) => // sve_mem_cld_ss - __field dtype 21 +: 4 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (dtype) of - when ('0000') => __encoding LD1B_Z_P_BR_U8 // ld1b_z_p_br_u8 - when ('0001') => __encoding LD1B_Z_P_BR_U16 // ld1b_z_p_br_u16 - when ('0010') => __encoding LD1B_Z_P_BR_U32 // ld1b_z_p_br_u32 - when ('0011') => __encoding LD1B_Z_P_BR_U64 // ld1b_z_p_br_u64 - when ('0100') => __encoding LD1SW_Z_P_BR_S64 // ld1sw_z_p_br_s64 - when ('0101') => __encoding LD1H_Z_P_BR_U16 // ld1h_z_p_br_u16 - when ('0110') => __encoding LD1H_Z_P_BR_U32 // ld1h_z_p_br_u32 - when ('0111') => __encoding LD1H_Z_P_BR_U64 // ld1h_z_p_br_u64 - when ('1000') => __encoding LD1SH_Z_P_BR_S64 // ld1sh_z_p_br_s64 - when ('1001') => __encoding LD1SH_Z_P_BR_S32 // ld1sh_z_p_br_s32 - when ('1010') => __encoding LD1W_Z_P_BR_U32 // ld1w_z_p_br_u32 - when ('1011') => __encoding LD1W_Z_P_BR_U64 // ld1w_z_p_br_u64 - when ('1100') => __encoding LD1SB_Z_P_BR_S64 // ld1sb_z_p_br_s64 - when ('1101') => __encoding LD1SB_Z_P_BR_S32 // ld1sb_z_p_br_s32 - when ('1110') => __encoding LD1SB_Z_P_BR_S16 // ld1sb_z_p_br_s16 - when ('1111') => __encoding LD1D_Z_P_BR_U64 // ld1d_z_p_br_u64 - when (_, _, _, _, _, '011', _) => // sve_mem_cldff_ss - __field dtype 21 +: 4 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (dtype) of - when ('0000') => __encoding LDFF1B_Z_P_BR_U8 // ldff1b_z_p_br_u8 - when ('0001') => __encoding LDFF1B_Z_P_BR_U16 // ldff1b_z_p_br_u16 - when ('0010') => __encoding LDFF1B_Z_P_BR_U32 // ldff1b_z_p_br_u32 - when ('0011') => __encoding LDFF1B_Z_P_BR_U64 // ldff1b_z_p_br_u64 - when ('0100') => __encoding LDFF1SW_Z_P_BR_S64 // ldff1sw_z_p_br_s64 - when ('0101') => __encoding LDFF1H_Z_P_BR_U16 // ldff1h_z_p_br_u16 - when ('0110') => __encoding LDFF1H_Z_P_BR_U32 // ldff1h_z_p_br_u32 - when ('0111') => __encoding LDFF1H_Z_P_BR_U64 // ldff1h_z_p_br_u64 - when ('1000') => __encoding LDFF1SH_Z_P_BR_S64 // ldff1sh_z_p_br_s64 - when ('1001') => __encoding LDFF1SH_Z_P_BR_S32 // ldff1sh_z_p_br_s32 - when ('1010') => __encoding LDFF1W_Z_P_BR_U32 // ldff1w_z_p_br_u32 - when ('1011') => __encoding LDFF1W_Z_P_BR_U64 // ldff1w_z_p_br_u64 - when ('1100') => __encoding LDFF1SB_Z_P_BR_S64 // ldff1sb_z_p_br_s64 - when ('1101') => __encoding LDFF1SB_Z_P_BR_S32 // ldff1sb_z_p_br_s32 - when ('1110') => __encoding LDFF1SB_Z_P_BR_S16 // ldff1sb_z_p_br_s16 - when ('1111') => __encoding LDFF1D_Z_P_BR_U64 // ldff1d_z_p_br_u64 - when (_, _, _, _, _, '100', _) => __UNPREDICTABLE - when ('110', _, _, _, _, _, _, _) => - // sve_mem64 - case (25 +: 7, 23 +: 2, 21 +: 2, 16 +: 5, 13 +: 3, 5 +: 8, 4 +: 1, 0 +: 4) of - when (_, '00', '01', _, '0xx', _, '1', _) => __UNPREDICTABLE - when (_, '00', '11', _, '1xx', _, '0', _) => // sve_mem_64b_prfm_sv2 - __field Zm 16 +: 5 - __field msz 13 +: 2 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - case (msz) of - when ('00') => __encoding PRFB_I_P_BZ_D_64_scaled // prfb_i_p_bz_d_64_scaled - when ('01') => __encoding PRFH_I_P_BZ_D_64_scaled // prfh_i_p_bz_d_64_scaled - when ('10') => __encoding PRFW_I_P_BZ_D_64_scaled // prfw_i_p_bz_d_64_scaled - when ('11') => __encoding PRFD_I_P_BZ_D_64_scaled // prfd_i_p_bz_d_64_scaled - when (_, '00', '11', _, _, _, '1', _) => __UNPREDICTABLE - when (_, '00', 'x1', _, '0xx', _, '0', _) => // sve_mem_64b_prfm_sv - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field msz 13 +: 2 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - case (msz) of - when ('00') => __encoding PRFB_I_P_BZ_D_x32_scaled // prfb_i_p_bz_d_x32_scaled - when ('01') => __encoding PRFH_I_P_BZ_D_x32_scaled // prfh_i_p_bz_d_x32_scaled - when ('10') => __encoding PRFW_I_P_BZ_D_x32_scaled // prfw_i_p_bz_d_x32_scaled - when ('11') => __encoding PRFD_I_P_BZ_D_x32_scaled // prfd_i_p_bz_d_x32_scaled - when (_, !'00', '11', _, '1xx', _, _, _) => // sve_mem_64b_gld_sv2 - __field opc 23 +: 2 - __field Zm 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (opc, U, ff) of - when ('01', '0', '0') => __encoding LD1SH_Z_P_BZ_D_64_scaled // ld1sh_z_p_bz_d_64_scaled - when ('01', '0', '1') => __encoding LDFF1SH_Z_P_BZ_D_64_scaled // ldff1sh_z_p_bz_d_64_scaled - when ('01', '1', '0') => __encoding LD1H_Z_P_BZ_D_64_scaled // ld1h_z_p_bz_d_64_scaled - when ('01', '1', '1') => __encoding LDFF1H_Z_P_BZ_D_64_scaled // ldff1h_z_p_bz_d_64_scaled - when ('10', '0', '0') => __encoding LD1SW_Z_P_BZ_D_64_scaled // ld1sw_z_p_bz_d_64_scaled - when ('10', '0', '1') => __encoding LDFF1SW_Z_P_BZ_D_64_scaled // ldff1sw_z_p_bz_d_64_scaled - when ('10', '1', '0') => __encoding LD1W_Z_P_BZ_D_64_scaled // ld1w_z_p_bz_d_64_scaled - when ('10', '1', '1') => __encoding LDFF1W_Z_P_BZ_D_64_scaled // ldff1w_z_p_bz_d_64_scaled - when ('11', '0', _) => __UNALLOCATED - when ('11', '1', '0') => __encoding LD1D_Z_P_BZ_D_64_scaled // ld1d_z_p_bz_d_64_scaled - when ('11', '1', '1') => __encoding LDFF1D_Z_P_BZ_D_64_scaled // ldff1d_z_p_bz_d_64_scaled - when (_, !'00', 'x1', _, '0xx', _, _, _) => // sve_mem_64b_gld_sv - __field opc 23 +: 2 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (opc, U, ff) of - when ('01', '0', '0') => __encoding LD1SH_Z_P_BZ_D_x32_scaled // ld1sh_z_p_bz_d_x32_scaled - when ('01', '0', '1') => __encoding LDFF1SH_Z_P_BZ_D_x32_scaled // ldff1sh_z_p_bz_d_x32_scaled - when ('01', '1', '0') => __encoding LD1H_Z_P_BZ_D_x32_scaled // ld1h_z_p_bz_d_x32_scaled - when ('01', '1', '1') => __encoding LDFF1H_Z_P_BZ_D_x32_scaled // ldff1h_z_p_bz_d_x32_scaled - when ('10', '0', '0') => __encoding LD1SW_Z_P_BZ_D_x32_scaled // ld1sw_z_p_bz_d_x32_scaled - when ('10', '0', '1') => __encoding LDFF1SW_Z_P_BZ_D_x32_scaled // ldff1sw_z_p_bz_d_x32_scaled - when ('10', '1', '0') => __encoding LD1W_Z_P_BZ_D_x32_scaled // ld1w_z_p_bz_d_x32_scaled - when ('10', '1', '1') => __encoding LDFF1W_Z_P_BZ_D_x32_scaled // ldff1w_z_p_bz_d_x32_scaled - when ('11', '0', _) => __UNALLOCATED - when ('11', '1', '0') => __encoding LD1D_Z_P_BZ_D_x32_scaled // ld1d_z_p_bz_d_x32_scaled - when ('11', '1', '1') => __encoding LDFF1D_Z_P_BZ_D_x32_scaled // ldff1d_z_p_bz_d_x32_scaled - when (_, _, '00', _, '10x', _, _, _) => __UNPREDICTABLE - when (_, _, '00', _, '110', _, _, _) => __UNPREDICTABLE - when (_, _, '00', _, '111', _, '0', _) => // sve_mem_64b_prfm_vi - __field msz 23 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - case (msz) of - when ('00') => __encoding PRFB_I_P_AI_D // prfb_i_p_ai_d - when ('01') => __encoding PRFH_I_P_AI_D // prfh_i_p_ai_d - when ('10') => __encoding PRFW_I_P_AI_D // prfw_i_p_ai_d - when ('11') => __encoding PRFD_I_P_AI_D // prfd_i_p_ai_d - when (_, _, '00', _, '111', _, '1', _) => __UNPREDICTABLE - when (_, _, '01', _, '1xx', _, _, _) => // sve_mem_64b_gld_vi - __field msz 23 +: 2 - __field imm5 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - case (msz, U, ff) of - when ('00', '0', '0') => __encoding LD1SB_Z_P_AI_D // ld1sb_z_p_ai_d - when ('00', '0', '1') => __encoding LDFF1SB_Z_P_AI_D // ldff1sb_z_p_ai_d - when ('00', '1', '0') => __encoding LD1B_Z_P_AI_D // ld1b_z_p_ai_d - when ('00', '1', '1') => __encoding LDFF1B_Z_P_AI_D // ldff1b_z_p_ai_d - when ('01', '0', '0') => __encoding LD1SH_Z_P_AI_D // ld1sh_z_p_ai_d - when ('01', '0', '1') => __encoding LDFF1SH_Z_P_AI_D // ldff1sh_z_p_ai_d - when ('01', '1', '0') => __encoding LD1H_Z_P_AI_D // ld1h_z_p_ai_d - when ('01', '1', '1') => __encoding LDFF1H_Z_P_AI_D // ldff1h_z_p_ai_d - when ('10', '0', '0') => __encoding LD1SW_Z_P_AI_D // ld1sw_z_p_ai_d - when ('10', '0', '1') => __encoding LDFF1SW_Z_P_AI_D // ldff1sw_z_p_ai_d - when ('10', '1', '0') => __encoding LD1W_Z_P_AI_D // ld1w_z_p_ai_d - when ('10', '1', '1') => __encoding LDFF1W_Z_P_AI_D // ldff1w_z_p_ai_d - when ('11', '0', _) => __UNALLOCATED - when ('11', '1', '0') => __encoding LD1D_Z_P_AI_D // ld1d_z_p_ai_d - when ('11', '1', '1') => __encoding LDFF1D_Z_P_AI_D // ldff1d_z_p_ai_d - when (_, _, '10', _, '1xx', _, _, _) => // sve_mem_64b_gld_vs2 - __field msz 23 +: 2 - __field Zm 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz, U, ff) of - when ('00', '0', '0') => __encoding LD1SB_Z_P_BZ_D_64_unscaled // ld1sb_z_p_bz_d_64_unscaled - when ('00', '0', '1') => __encoding LDFF1SB_Z_P_BZ_D_64_unscaled // ldff1sb_z_p_bz_d_64_unscaled - when ('00', '1', '0') => __encoding LD1B_Z_P_BZ_D_64_unscaled // ld1b_z_p_bz_d_64_unscaled - when ('00', '1', '1') => __encoding LDFF1B_Z_P_BZ_D_64_unscaled // ldff1b_z_p_bz_d_64_unscaled - when ('01', '0', '0') => __encoding LD1SH_Z_P_BZ_D_64_unscaled // ld1sh_z_p_bz_d_64_unscaled - when ('01', '0', '1') => __encoding LDFF1SH_Z_P_BZ_D_64_unscaled // ldff1sh_z_p_bz_d_64_unscaled - when ('01', '1', '0') => __encoding LD1H_Z_P_BZ_D_64_unscaled // ld1h_z_p_bz_d_64_unscaled - when ('01', '1', '1') => __encoding LDFF1H_Z_P_BZ_D_64_unscaled // ldff1h_z_p_bz_d_64_unscaled - when ('10', '0', '0') => __encoding LD1SW_Z_P_BZ_D_64_unscaled // ld1sw_z_p_bz_d_64_unscaled - when ('10', '0', '1') => __encoding LDFF1SW_Z_P_BZ_D_64_unscaled // ldff1sw_z_p_bz_d_64_unscaled - when ('10', '1', '0') => __encoding LD1W_Z_P_BZ_D_64_unscaled // ld1w_z_p_bz_d_64_unscaled - when ('10', '1', '1') => __encoding LDFF1W_Z_P_BZ_D_64_unscaled // ldff1w_z_p_bz_d_64_unscaled - when ('11', '0', _) => __UNALLOCATED - when ('11', '1', '0') => __encoding LD1D_Z_P_BZ_D_64_unscaled // ld1d_z_p_bz_d_64_unscaled - when ('11', '1', '1') => __encoding LDFF1D_Z_P_BZ_D_64_unscaled // ldff1d_z_p_bz_d_64_unscaled - when (_, _, 'x0', _, '0xx', _, _, _) => // sve_mem_64b_gld_vs - __field msz 23 +: 2 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field U 14 +: 1 - __field ff 13 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz, U, ff) of - when ('00', '0', '0') => __encoding LD1SB_Z_P_BZ_D_x32_unscaled // ld1sb_z_p_bz_d_x32_unscaled - when ('00', '0', '1') => __encoding LDFF1SB_Z_P_BZ_D_x32_unscaled // ldff1sb_z_p_bz_d_x32_unscaled - when ('00', '1', '0') => __encoding LD1B_Z_P_BZ_D_x32_unscaled // ld1b_z_p_bz_d_x32_unscaled - when ('00', '1', '1') => __encoding LDFF1B_Z_P_BZ_D_x32_unscaled // ldff1b_z_p_bz_d_x32_unscaled - when ('01', '0', '0') => __encoding LD1SH_Z_P_BZ_D_x32_unscaled // ld1sh_z_p_bz_d_x32_unscaled - when ('01', '0', '1') => __encoding LDFF1SH_Z_P_BZ_D_x32_unscaled // ldff1sh_z_p_bz_d_x32_unscaled - when ('01', '1', '0') => __encoding LD1H_Z_P_BZ_D_x32_unscaled // ld1h_z_p_bz_d_x32_unscaled - when ('01', '1', '1') => __encoding LDFF1H_Z_P_BZ_D_x32_unscaled // ldff1h_z_p_bz_d_x32_unscaled - when ('10', '0', '0') => __encoding LD1SW_Z_P_BZ_D_x32_unscaled // ld1sw_z_p_bz_d_x32_unscaled - when ('10', '0', '1') => __encoding LDFF1SW_Z_P_BZ_D_x32_unscaled // ldff1sw_z_p_bz_d_x32_unscaled - when ('10', '1', '0') => __encoding LD1W_Z_P_BZ_D_x32_unscaled // ld1w_z_p_bz_d_x32_unscaled - when ('10', '1', '1') => __encoding LDFF1W_Z_P_BZ_D_x32_unscaled // ldff1w_z_p_bz_d_x32_unscaled - when ('11', '0', _) => __UNALLOCATED - when ('11', '1', '0') => __encoding LD1D_Z_P_BZ_D_x32_unscaled // ld1d_z_p_bz_d_x32_unscaled - when ('11', '1', '1') => __encoding LDFF1D_Z_P_BZ_D_x32_unscaled // ldff1d_z_p_bz_d_x32_unscaled - when ('111', _, _, _, _, _, '0x0xxx', _) => - // sve_memst_cs - case (25 +: 7, 22 +: 3, 16 +: 6, 15 +: 1, 14 +: 1, 13 +: 1, 5 +: 8, 4 +: 1, 0 +: 4) of - when (_, '0xx', _, _, '0', _, _, _, _) => __UNPREDICTABLE - when (_, '10x', _, _, '0', _, _, _, _) => __UNPREDICTABLE - when (_, '110', _, _, '0', _, _, '0', _) => // sve_mem_pspill - __field imm9h 16 +: 6 - __field imm9l 10 +: 3 - __field Rn 5 +: 5 - __field Pt 0 +: 4 - case () of - when () => __encoding STR_P_BI__ // str_p_bi_ - when (_, '110', _, _, '0', _, _, '1', _) => __UNPREDICTABLE - when (_, '110', _, _, '1', _, _, _, _) => // sve_mem_spill - __field imm9h 16 +: 6 - __field imm9l 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case () of - when () => __encoding STR_Z_BI__ // str_z_bi_ - when (_, '111', _, _, '0', _, _, _, _) => __UNPREDICTABLE - when (_, !'110', _, _, '1', _, _, _, _) => // sve_mem_cst_ss - __field opc 22 +: 3 - __field o2 21 +: 1 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (opc, o2) of - when ('00x', _) => __encoding ST1B_Z_P_BR__ // st1b_z_p_br_ - when ('01x', _) => __encoding ST1H_Z_P_BR__ // st1h_z_p_br_ - when ('10x', _) => __encoding ST1W_Z_P_BR__ // st1w_z_p_br_ - when ('111', '0') => __UNALLOCATED - when ('111', '1') => __encoding ST1D_Z_P_BR__ // st1d_z_p_br_ - when ('111', _, _, _, _, _, '0x1xxx', _) => - // sve_memst_nt - case (25 +: 7, 23 +: 2, 21 +: 2, 16 +: 5, 15 +: 1, 14 +: 1, 13 +: 1, 0 +: 13) of - when (_, _, '00', _, _, '1', _, _) => // sve_mem_cstnt_ss - __field msz 23 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding STNT1B_Z_P_BR_Contiguous // stnt1b_z_p_br_contiguous - when ('01') => __encoding STNT1H_Z_P_BR_Contiguous // stnt1h_z_p_br_contiguous - when ('10') => __encoding STNT1W_Z_P_BR_Contiguous // stnt1w_z_p_br_contiguous - when ('11') => __encoding STNT1D_Z_P_BR_Contiguous // stnt1d_z_p_br_contiguous - when (_, _, !'00', _, _, '1', _, _) => // sve_mem_est_ss - __field msz 23 +: 2 - __field opc 21 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz, opc) of - when ('00', '01') => __encoding ST2B_Z_P_BR_Contiguous // st2b_z_p_br_contiguous - when ('00', '10') => __encoding ST3B_Z_P_BR_Contiguous // st3b_z_p_br_contiguous - when ('00', '11') => __encoding ST4B_Z_P_BR_Contiguous // st4b_z_p_br_contiguous - when ('01', '01') => __encoding ST2H_Z_P_BR_Contiguous // st2h_z_p_br_contiguous - when ('01', '10') => __encoding ST3H_Z_P_BR_Contiguous // st3h_z_p_br_contiguous - when ('01', '11') => __encoding ST4H_Z_P_BR_Contiguous // st4h_z_p_br_contiguous - when ('10', '01') => __encoding ST2W_Z_P_BR_Contiguous // st2w_z_p_br_contiguous - when ('10', '10') => __encoding ST3W_Z_P_BR_Contiguous // st3w_z_p_br_contiguous - when ('10', '11') => __encoding ST4W_Z_P_BR_Contiguous // st4w_z_p_br_contiguous - when ('11', '01') => __encoding ST2D_Z_P_BR_Contiguous // st2d_z_p_br_contiguous - when ('11', '10') => __encoding ST3D_Z_P_BR_Contiguous // st3d_z_p_br_contiguous - when ('11', '11') => __encoding ST4D_Z_P_BR_Contiguous // st4d_z_p_br_contiguous - when (_, _, _, _, _, '0', _, _) => __UNPREDICTABLE - when ('111', _, _, _, _, _, '1x0xxx', _) => - // sve_memst_ss - case (25 +: 7, 23 +: 2, 21 +: 2, 16 +: 5, 15 +: 1, 14 +: 1, 13 +: 1, 0 +: 13) of - when (_, _, '00', _, _, _, _, _) => // sve_mem_sst_vs_a - __field msz 23 +: 2 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding ST1B_Z_P_BZ_D_x32_unscaled // st1b_z_p_bz_d_x32_unscaled - when ('01') => __encoding ST1H_Z_P_BZ_D_x32_unscaled // st1h_z_p_bz_d_x32_unscaled - when ('10') => __encoding ST1W_Z_P_BZ_D_x32_unscaled // st1w_z_p_bz_d_x32_unscaled - when ('11') => __encoding ST1D_Z_P_BZ_D_x32_unscaled // st1d_z_p_bz_d_x32_unscaled - when (_, _, '01', _, _, _, _, _) => // sve_mem_sst_sv_a - __field msz 23 +: 2 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __UNALLOCATED - when ('01') => __encoding ST1H_Z_P_BZ_D_x32_scaled // st1h_z_p_bz_d_x32_scaled - when ('10') => __encoding ST1W_Z_P_BZ_D_x32_scaled // st1w_z_p_bz_d_x32_scaled - when ('11') => __encoding ST1D_Z_P_BZ_D_x32_scaled // st1d_z_p_bz_d_x32_scaled - when (_, _, '10', _, _, _, _, _) => // sve_mem_sst_vs_b - __field msz 23 +: 2 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding ST1B_Z_P_BZ_S_x32_unscaled // st1b_z_p_bz_s_x32_unscaled - when ('01') => __encoding ST1H_Z_P_BZ_S_x32_unscaled // st1h_z_p_bz_s_x32_unscaled - when ('10') => __encoding ST1W_Z_P_BZ_S_x32_unscaled // st1w_z_p_bz_s_x32_unscaled - when ('11') => __UNALLOCATED - when (_, _, '11', _, _, _, _, _) => // sve_mem_sst_sv_b - __field msz 23 +: 2 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __UNALLOCATED - when ('01') => __encoding ST1H_Z_P_BZ_S_x32_scaled // st1h_z_p_bz_s_x32_scaled - when ('10') => __encoding ST1W_Z_P_BZ_S_x32_scaled // st1w_z_p_bz_s_x32_scaled - when ('11') => __UNALLOCATED - when ('111', _, _, _, _, _, '101xxx', _) => - // sve_memst_ss2 - case (25 +: 7, 23 +: 2, 21 +: 2, 16 +: 5, 13 +: 3, 0 +: 13) of - when (_, _, '00', _, _, _) => // sve_mem_sst_vs2 - __field msz 23 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding ST1B_Z_P_BZ_D_64_unscaled // st1b_z_p_bz_d_64_unscaled - when ('01') => __encoding ST1H_Z_P_BZ_D_64_unscaled // st1h_z_p_bz_d_64_unscaled - when ('10') => __encoding ST1W_Z_P_BZ_D_64_unscaled // st1w_z_p_bz_d_64_unscaled - when ('11') => __encoding ST1D_Z_P_BZ_D_64_unscaled // st1d_z_p_bz_d_64_unscaled - when (_, _, '01', _, _, _) => // sve_mem_sst_sv2 - __field msz 23 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __UNALLOCATED - when ('01') => __encoding ST1H_Z_P_BZ_D_64_scaled // st1h_z_p_bz_d_64_scaled - when ('10') => __encoding ST1W_Z_P_BZ_D_64_scaled // st1w_z_p_bz_d_64_scaled - when ('11') => __encoding ST1D_Z_P_BZ_D_64_scaled // st1d_z_p_bz_d_64_scaled - when (_, _, '10', _, _, _) => // sve_mem_sst_vi_a - __field msz 23 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding ST1B_Z_P_AI_D // st1b_z_p_ai_d - when ('01') => __encoding ST1H_Z_P_AI_D // st1h_z_p_ai_d - when ('10') => __encoding ST1W_Z_P_AI_D // st1w_z_p_ai_d - when ('11') => __encoding ST1D_Z_P_AI_D // st1d_z_p_ai_d - when (_, _, '11', _, _, _) => // sve_mem_sst_vi_b - __field msz 23 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding ST1B_Z_P_AI_S // st1b_z_p_ai_s - when ('01') => __encoding ST1H_Z_P_AI_S // st1h_z_p_ai_s - when ('10') => __encoding ST1W_Z_P_AI_S // st1w_z_p_ai_s - when ('11') => __UNALLOCATED - when ('111', _, _, _, _, _, '111xxx', _) => - // sve_memst_si - case (25 +: 7, 23 +: 2, 21 +: 2, 20 +: 1, 16 +: 4, 13 +: 3, 0 +: 13) of - when (_, _, '00', '1', _, _, _) => // sve_mem_cstnt_si - __field msz 23 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding STNT1B_Z_P_BI_Contiguous // stnt1b_z_p_bi_contiguous - when ('01') => __encoding STNT1H_Z_P_BI_Contiguous // stnt1h_z_p_bi_contiguous - when ('10') => __encoding STNT1W_Z_P_BI_Contiguous // stnt1w_z_p_bi_contiguous - when ('11') => __encoding STNT1D_Z_P_BI_Contiguous // stnt1d_z_p_bi_contiguous - when (_, _, !'00', '1', _, _, _) => // sve_mem_est_si - __field msz 23 +: 2 - __field opc 21 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz, opc) of - when ('00', '01') => __encoding ST2B_Z_P_BI_Contiguous // st2b_z_p_bi_contiguous - when ('00', '10') => __encoding ST3B_Z_P_BI_Contiguous // st3b_z_p_bi_contiguous - when ('00', '11') => __encoding ST4B_Z_P_BI_Contiguous // st4b_z_p_bi_contiguous - when ('01', '01') => __encoding ST2H_Z_P_BI_Contiguous // st2h_z_p_bi_contiguous - when ('01', '10') => __encoding ST3H_Z_P_BI_Contiguous // st3h_z_p_bi_contiguous - when ('01', '11') => __encoding ST4H_Z_P_BI_Contiguous // st4h_z_p_bi_contiguous - when ('10', '01') => __encoding ST2W_Z_P_BI_Contiguous // st2w_z_p_bi_contiguous - when ('10', '10') => __encoding ST3W_Z_P_BI_Contiguous // st3w_z_p_bi_contiguous - when ('10', '11') => __encoding ST4W_Z_P_BI_Contiguous // st4w_z_p_bi_contiguous - when ('11', '01') => __encoding ST2D_Z_P_BI_Contiguous // st2d_z_p_bi_contiguous - when ('11', '10') => __encoding ST3D_Z_P_BI_Contiguous // st3d_z_p_bi_contiguous - when ('11', '11') => __encoding ST4D_Z_P_BI_Contiguous // st4d_z_p_bi_contiguous - when (_, _, _, '0', _, _, _) => // sve_mem_cst_si - __field msz 23 +: 2 - __field size 21 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - case (msz) of - when ('00') => __encoding ST1B_Z_P_BI__ // st1b_z_p_bi_ - when ('01') => __encoding ST1H_Z_P_BI__ // st1h_z_p_bi_ - when ('10') => __encoding ST1W_Z_P_BI__ // st1w_z_p_bi_ - when ('11') => __encoding ST1D_Z_P_BI__ // st1d_z_p_bi_ - when (_, '0011x', _) => __UNPREDICTABLE - when (_, '100xx', _) => - // dpimm - case (29 +: 3, 26 +: 3, 23 +: 3, 0 +: 23) of - when (_, _, '00x', _) => // pcreladdr - __field op 31 +: 1 - __field immlo 29 +: 2 - __field immhi 5 +: 19 - __field Rd 0 +: 5 - case (op) of - when ('0') => __encoding aarch64_integer_arithmetic_address_pc_rel // ADR_only_pcreladdr - when ('1') => __encoding aarch64_integer_arithmetic_address_pc_rel // ADRP_only_pcreladdr - when (_, _, '010', _) => // addsub_imm - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field sh 22 +: 1 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, op, S) of - when ('0', '0', '0') => __encoding aarch64_integer_arithmetic_add_sub_immediate // ADD_32_addsub_imm - when ('0', '0', '1') => __encoding aarch64_integer_arithmetic_add_sub_immediate // ADDS_32S_addsub_imm - when ('0', '1', '0') => __encoding aarch64_integer_arithmetic_add_sub_immediate // SUB_32_addsub_imm - when ('0', '1', '1') => __encoding aarch64_integer_arithmetic_add_sub_immediate // SUBS_32S_addsub_imm - when ('1', '0', '0') => __encoding aarch64_integer_arithmetic_add_sub_immediate // ADD_64_addsub_imm - when ('1', '0', '1') => __encoding aarch64_integer_arithmetic_add_sub_immediate // ADDS_64S_addsub_imm - when ('1', '1', '0') => __encoding aarch64_integer_arithmetic_add_sub_immediate // SUB_64_addsub_imm - when ('1', '1', '1') => __encoding aarch64_integer_arithmetic_add_sub_immediate // SUBS_64S_addsub_imm - when (_, _, '011', _) => // addsub_immtags - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field o2 22 +: 1 - __field uimm6 16 +: 6 - __field op3 14 +: 2 - __field uimm4 10 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, op, S, o2) of - when (_, _, _, '1') => __UNALLOCATED - when ('0', _, _, '0') => __UNALLOCATED - when ('1', _, '1', '0') => __UNALLOCATED - when ('1', '0', '0', '0') => __encoding aarch64_integer_tags_mcaddtag // ADDG_64_addsub_immtags - when ('1', '1', '0', '0') => __encoding aarch64_integer_tags_mcsubtag // SUBG_64_addsub_immtags - when (_, _, '100', _) => // log_imm - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, opc, N) of - when ('0', _, '1') => __UNALLOCATED - when ('0', '00', '0') => __encoding aarch64_integer_logical_immediate // AND_32_log_imm - when ('0', '01', '0') => __encoding aarch64_integer_logical_immediate // ORR_32_log_imm - when ('0', '10', '0') => __encoding aarch64_integer_logical_immediate // EOR_32_log_imm - when ('0', '11', '0') => __encoding aarch64_integer_logical_immediate // ANDS_32S_log_imm - when ('1', '00', _) => __encoding aarch64_integer_logical_immediate // AND_64_log_imm - when ('1', '01', _) => __encoding aarch64_integer_logical_immediate // ORR_64_log_imm - when ('1', '10', _) => __encoding aarch64_integer_logical_immediate // EOR_64_log_imm - when ('1', '11', _) => __encoding aarch64_integer_logical_immediate // ANDS_64S_log_imm - when (_, _, '101', _) => // movewide - __field sf 31 +: 1 - __field opc 29 +: 2 - __field hw 21 +: 2 - __field imm16 5 +: 16 - __field Rd 0 +: 5 - case (sf, opc, hw) of - when (_, '01', _) => __UNALLOCATED - when ('0', _, '1x') => __UNALLOCATED - when ('0', '00', '0x') => __encoding aarch64_integer_ins_ext_insert_movewide // MOVN_32_movewide - when ('0', '10', '0x') => __encoding aarch64_integer_ins_ext_insert_movewide // MOVZ_32_movewide - when ('0', '11', '0x') => __encoding aarch64_integer_ins_ext_insert_movewide // MOVK_32_movewide - when ('1', '00', _) => __encoding aarch64_integer_ins_ext_insert_movewide // MOVN_64_movewide - when ('1', '10', _) => __encoding aarch64_integer_ins_ext_insert_movewide // MOVZ_64_movewide - when ('1', '11', _) => __encoding aarch64_integer_ins_ext_insert_movewide // MOVK_64_movewide - when (_, _, '110', _) => // bitfield - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, opc, N) of - when (_, '11', _) => __UNALLOCATED - when ('0', _, '1') => __UNALLOCATED - when ('0', '00', '0') => __encoding aarch64_integer_bitfield // SBFM_32M_bitfield - when ('0', '01', '0') => __encoding aarch64_integer_bitfield // BFM_32M_bitfield - when ('0', '10', '0') => __encoding aarch64_integer_bitfield // UBFM_32M_bitfield - when ('1', _, '0') => __UNALLOCATED - when ('1', '00', '1') => __encoding aarch64_integer_bitfield // SBFM_64M_bitfield - when ('1', '01', '1') => __encoding aarch64_integer_bitfield // BFM_64M_bitfield - when ('1', '10', '1') => __encoding aarch64_integer_bitfield // UBFM_64M_bitfield - when (_, _, '111', _) => // extract - __field sf 31 +: 1 - __field op21 29 +: 2 - __field N 22 +: 1 - __field o0 21 +: 1 - __field Rm 16 +: 5 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, op21, N, o0, imms) of - when (_, 'x1', _, _, _) => __UNALLOCATED - when (_, '00', _, '1', _) => __UNALLOCATED - when (_, '1x', _, _, _) => __UNALLOCATED - when ('0', _, _, _, '1xxxxx') => __UNALLOCATED - when ('0', _, '1', _, _) => __UNALLOCATED - when ('0', '00', '0', '0', '0xxxxx') => __encoding aarch64_integer_ins_ext_extract_immediate // EXTR_32_extract - when ('1', _, '0', _, _) => __UNALLOCATED - when ('1', '00', '1', '0', _) => __encoding aarch64_integer_ins_ext_extract_immediate // EXTR_64_extract - when (_, '101xx', _) => - // control - case (29 +: 3, 26 +: 3, 12 +: 14, 5 +: 7, 0 +: 5) of - when ('010', _, '0xxxxxxxxxxxxx', _, _) => // condbranch - __field o1 24 +: 1 - __field imm19 5 +: 19 - __field o0 4 +: 1 - __field cond 0 +: 4 - case (o1, o0) of - when ('0', '0') => __encoding aarch64_branch_conditional_cond // B_only_condbranch - when ('0', '1') => __UNALLOCATED - when ('1', _) => __UNALLOCATED - when ('110', _, '00xxxxxxxxxxxx', _, _) => // exception - __field opc 21 +: 3 - __field imm16 5 +: 16 - __field op2 2 +: 3 - __field LL 0 +: 2 - case (opc, op2, LL) of - when (_, '001', _) => __UNALLOCATED - when (_, '01x', _) => __UNALLOCATED - when (_, '1xx', _) => __UNALLOCATED - when ('000', '000', '00') => __UNALLOCATED - when ('000', '000', '01') => __encoding aarch64_system_exceptions_runtime_svc // SVC_EX_exception - when ('000', '000', '10') => __encoding aarch64_system_exceptions_runtime_hvc // HVC_EX_exception - when ('000', '000', '11') => __encoding aarch64_system_exceptions_runtime_smc // SMC_EX_exception - when ('001', '000', 'x1') => __UNALLOCATED - when ('001', '000', '00') => __encoding aarch64_system_exceptions_debug_breakpoint // BRK_EX_exception - when ('001', '000', '1x') => __UNALLOCATED - when ('010', '000', 'x1') => __UNALLOCATED - when ('010', '000', '00') => __encoding aarch64_system_exceptions_debug_halt // HLT_EX_exception - when ('010', '000', '1x') => __UNALLOCATED - when ('011', '000', '01') => __UNALLOCATED - when ('011', '000', '1x') => __UNALLOCATED - when ('100', '000', _) => __UNALLOCATED - when ('101', '000', '00') => __UNALLOCATED - when ('101', '000', '01') => __encoding aarch64_system_exceptions_debug_exception // DCPS1_DC_exception - when ('101', '000', '10') => __encoding aarch64_system_exceptions_debug_exception // DCPS2_DC_exception - when ('101', '000', '11') => __encoding aarch64_system_exceptions_debug_exception // DCPS3_DC_exception - when ('110', '000', _) => __UNALLOCATED - when ('111', '000', _) => __UNALLOCATED - when ('110', _, '01000000110010', _, '11111') => // hints - __field CRm 8 +: 4 - __field op2 5 +: 3 - case (CRm, op2) of - when (_, _) => __encoding aarch64_system_hints // HINT_HM_hints - when ('0000', '000') => __encoding aarch64_system_hints // NOP_HI_hints - when ('0000', '001') => __encoding aarch64_system_hints // YIELD_HI_hints - when ('0000', '010') => __encoding aarch64_system_hints // WFE_HI_hints - when ('0000', '011') => __encoding aarch64_system_hints // WFI_HI_hints - when ('0000', '100') => __encoding aarch64_system_hints // SEV_HI_hints - when ('0000', '101') => __encoding aarch64_system_hints // SEVL_HI_hints - when ('0000', '110') => __encoding aarch64_system_hints // DGH_HI_hints - when ('0000', '111') => __encoding aarch64_integer_pac_strip_hint // XPACLRI_HI_hints - when ('0001', '000') => __encoding aarch64_integer_pac_pacia_hint // PACIA1716_HI_hints - when ('0001', '010') => __encoding aarch64_integer_pac_pacib_hint // PACIB1716_HI_hints - when ('0001', '100') => __encoding aarch64_integer_pac_autia_hint // AUTIA1716_HI_hints - when ('0001', '110') => __encoding aarch64_integer_pac_autib_hint // AUTIB1716_HI_hints - when ('0010', '000') => __encoding aarch64_system_hints // ESB_HI_hints - when ('0010', '001') => __encoding aarch64_system_hints // PSB_HC_hints - when ('0010', '010') => __encoding aarch64_system_hints // TSB_HC_hints - when ('0010', '100') => __encoding aarch64_system_hints // CSDB_HI_hints - when ('0011', '000') => __encoding aarch64_integer_pac_pacia_hint // PACIAZ_HI_hints - when ('0011', '001') => __encoding aarch64_integer_pac_pacia_hint // PACIASP_HI_hints - when ('0011', '010') => __encoding aarch64_integer_pac_pacib_hint // PACIBZ_HI_hints - when ('0011', '011') => __encoding aarch64_integer_pac_pacib_hint // PACIBSP_HI_hints - when ('0011', '100') => __encoding aarch64_integer_pac_autia_hint // AUTIAZ_HI_hints - when ('0011', '101') => __encoding aarch64_integer_pac_autia_hint // AUTIASP_HI_hints - when ('0011', '110') => __encoding aarch64_integer_pac_autib_hint // AUTIBZ_HI_hints - when ('0011', '111') => __encoding aarch64_integer_pac_autib_hint // AUTIBSP_HI_hints - when ('0100', 'xx0') => __encoding aarch64_system_hints // BTI_HB_hints - when ('110', _, '01000000110011', _, _) => // barriers - __field CRm 8 +: 4 - __field op2 5 +: 3 - __field Rt 0 +: 5 - case (CRm, op2, Rt) of - when (_, '000', _) => __UNALLOCATED - when (_, '001', _) => __UNALLOCATED - when (_, '010', '11111') => __encoding aarch64_system_monitors // CLREX_BN_barriers - when (_, '101', '11111') => __encoding aarch64_system_barriers_dmb // DMB_BO_barriers - when (_, '110', '11111') => __encoding aarch64_system_barriers_isb // ISB_BI_barriers - when (_, '111', !'11111') => __UNALLOCATED - when (_, '111', '11111') => __encoding aarch64_system_barriers_sb // SB_only_barriers - when (!'0x00', '100', '11111') => __encoding aarch64_system_barriers_dsb // DSB_BO_barriers - when ('0000', '100', '11111') => __encoding aarch64_system_barriers_ssbb // SSBB_only_barriers - when ('0001', '011', _) => __UNALLOCATED - when ('001x', '011', _) => __UNALLOCATED - when ('01xx', '011', _) => __UNALLOCATED - when ('0100', '100', '11111') => __encoding aarch64_system_barriers_pssbb // PSSBB_only_barriers - when ('1xxx', '011', _) => __UNALLOCATED - when ('110', _, '0100000xxx0100', _, _) => // pstate - __field op1 16 +: 3 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __field Rt 0 +: 5 - case (op1, op2, Rt) of - when (_, _, !'11111') => __UNALLOCATED - when (_, _, '11111') => __encoding aarch64_system_register_cpsr // MSR_SI_pstate - when ('000', '000', '11111') => __encoding aarch64_integer_flags_cfinv // CFINV_M_pstate - when ('000', '001', '11111') => __encoding aarch64_integer_flags_xaflag // XAFLAG_M_pstate - when ('000', '010', '11111') => __encoding aarch64_integer_flags_axflag // AXFLAG_M_pstate - when ('110', _, '0100x01xxxxxxx', _, _) => // systeminstrs - __field L 21 +: 1 - __field op1 16 +: 3 - __field CRn 12 +: 4 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __field Rt 0 +: 5 - case (L) of - when ('0') => __encoding aarch64_system_sysops // SYS_CR_systeminstrs - when ('1') => __encoding aarch64_system_sysops // SYSL_RC_systeminstrs - when ('110', _, '0100x1xxxxxxxx', _, _) => // systemmove - __field L 21 +: 1 - __field o0 19 +: 1 - __field op1 16 +: 3 - __field CRn 12 +: 4 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __field Rt 0 +: 5 - case (L) of - when ('0') => __encoding aarch64_system_register_system // MSR_SR_systemmove - when ('1') => __encoding aarch64_system_register_system // MRS_RS_systemmove - when ('110', _, '1xxxxxxxxxxxxx', _, _) => // branch_reg - __field opc 21 +: 4 - __field op2 16 +: 5 - __field op3 10 +: 6 - __field Rn 5 +: 5 - __field op4 0 +: 5 - case (opc, op2, op3, Rn, op4) of - when (_, !'11111', _, _, _) => __UNALLOCATED - when ('0000', '11111', '000000', _, !'00000') => __UNALLOCATED - when ('0000', '11111', '000000', _, '00000') => __encoding aarch64_branch_unconditional_register // BR_64_branch_reg - when ('0000', '11111', '000001', _, _) => __UNALLOCATED - when ('0000', '11111', '000010', _, !'11111') => __UNALLOCATED - when ('0000', '11111', '000010', _, '11111') => __encoding aarch64_branch_unconditional_register // BRAAZ_64_branch_reg - when ('0000', '11111', '000011', _, !'11111') => __UNALLOCATED - when ('0000', '11111', '000011', _, '11111') => __encoding aarch64_branch_unconditional_register // BRABZ_64_branch_reg - when ('0000', '11111', '0001xx', _, _) => __UNALLOCATED - when ('0000', '11111', '001xxx', _, _) => __UNALLOCATED - when ('0000', '11111', '01xxxx', _, _) => __UNALLOCATED - when ('0000', '11111', '1xxxxx', _, _) => __UNALLOCATED - when ('0001', '11111', '000000', _, !'00000') => __UNALLOCATED - when ('0001', '11111', '000000', _, '00000') => __encoding aarch64_branch_unconditional_register // BLR_64_branch_reg - when ('0001', '11111', '000001', _, _) => __UNALLOCATED - when ('0001', '11111', '000010', _, !'11111') => __UNALLOCATED - when ('0001', '11111', '000010', _, '11111') => __encoding aarch64_branch_unconditional_register // BLRAAZ_64_branch_reg - when ('0001', '11111', '000011', _, !'11111') => __UNALLOCATED - when ('0001', '11111', '000011', _, '11111') => __encoding aarch64_branch_unconditional_register // BLRABZ_64_branch_reg - when ('0001', '11111', '0001xx', _, _) => __UNALLOCATED - when ('0001', '11111', '001xxx', _, _) => __UNALLOCATED - when ('0001', '11111', '01xxxx', _, _) => __UNALLOCATED - when ('0001', '11111', '1xxxxx', _, _) => __UNALLOCATED - when ('0010', '11111', '000000', _, !'00000') => __UNALLOCATED - when ('0010', '11111', '000000', _, '00000') => __encoding aarch64_branch_unconditional_register // RET_64R_branch_reg - when ('0010', '11111', '000001', _, _) => __UNALLOCATED - when ('0010', '11111', '000010', !'11111', !'11111') => __UNALLOCATED - when ('0010', '11111', '000010', '11111', '11111') => __encoding aarch64_branch_unconditional_register // RETAA_64E_branch_reg - when ('0010', '11111', '000011', !'11111', !'11111') => __UNALLOCATED - when ('0010', '11111', '000011', '11111', '11111') => __encoding aarch64_branch_unconditional_register // RETAB_64E_branch_reg - when ('0010', '11111', '0001xx', _, _) => __UNALLOCATED - when ('0010', '11111', '001xxx', _, _) => __UNALLOCATED - when ('0010', '11111', '01xxxx', _, _) => __UNALLOCATED - when ('0010', '11111', '1xxxxx', _, _) => __UNALLOCATED - when ('0011', '11111', _, _, _) => __UNALLOCATED - when ('0100', '11111', '000000', !'11111', !'00000') => __UNALLOCATED - when ('0100', '11111', '000000', !'11111', '00000') => __UNALLOCATED - when ('0100', '11111', '000000', '11111', !'00000') => __UNALLOCATED - when ('0100', '11111', '000000', '11111', '00000') => __encoding aarch64_branch_unconditional_eret // ERET_64E_branch_reg - when ('0100', '11111', '000001', _, _) => __UNALLOCATED - when ('0100', '11111', '000010', !'11111', !'11111') => __UNALLOCATED - when ('0100', '11111', '000010', !'11111', '11111') => __UNALLOCATED - when ('0100', '11111', '000010', '11111', !'11111') => __UNALLOCATED - when ('0100', '11111', '000010', '11111', '11111') => __encoding aarch64_branch_unconditional_eret // ERETAA_64E_branch_reg - when ('0100', '11111', '000011', !'11111', !'11111') => __UNALLOCATED - when ('0100', '11111', '000011', !'11111', '11111') => __UNALLOCATED - when ('0100', '11111', '000011', '11111', !'11111') => __UNALLOCATED - when ('0100', '11111', '000011', '11111', '11111') => __encoding aarch64_branch_unconditional_eret // ERETAB_64E_branch_reg - when ('0100', '11111', '0001xx', _, _) => __UNALLOCATED - when ('0100', '11111', '001xxx', _, _) => __UNALLOCATED - when ('0100', '11111', '01xxxx', _, _) => __UNALLOCATED - when ('0100', '11111', '1xxxxx', _, _) => __UNALLOCATED - when ('0101', '11111', !'000000', _, _) => __UNALLOCATED - when ('0101', '11111', '000000', !'11111', !'00000') => __UNALLOCATED - when ('0101', '11111', '000000', !'11111', '00000') => __UNALLOCATED - when ('0101', '11111', '000000', '11111', !'00000') => __UNALLOCATED - when ('0101', '11111', '000000', '11111', '00000') => __encoding aarch64_branch_unconditional_dret // DRPS_64E_branch_reg - when ('011x', '11111', _, _, _) => __UNALLOCATED - when ('1000', '11111', '00000x', _, _) => __UNALLOCATED - when ('1000', '11111', '000010', _, _) => __encoding aarch64_branch_unconditional_register // BRAA_64P_branch_reg - when ('1000', '11111', '000011', _, _) => __encoding aarch64_branch_unconditional_register // BRAB_64P_branch_reg - when ('1000', '11111', '0001xx', _, _) => __UNALLOCATED - when ('1000', '11111', '001xxx', _, _) => __UNALLOCATED - when ('1000', '11111', '01xxxx', _, _) => __UNALLOCATED - when ('1000', '11111', '1xxxxx', _, _) => __UNALLOCATED - when ('1001', '11111', '00000x', _, _) => __UNALLOCATED - when ('1001', '11111', '000010', _, _) => __encoding aarch64_branch_unconditional_register // BLRAA_64P_branch_reg - when ('1001', '11111', '000011', _, _) => __encoding aarch64_branch_unconditional_register // BLRAB_64P_branch_reg - when ('1001', '11111', '0001xx', _, _) => __UNALLOCATED - when ('1001', '11111', '001xxx', _, _) => __UNALLOCATED - when ('1001', '11111', '01xxxx', _, _) => __UNALLOCATED - when ('1001', '11111', '1xxxxx', _, _) => __UNALLOCATED - when ('101x', '11111', _, _, _) => __UNALLOCATED - when ('11xx', '11111', _, _, _) => __UNALLOCATED - when ('x00', _, _, _, _) => // branch_imm - __field op 31 +: 1 - __field imm26 0 +: 26 - case (op) of - when ('0') => __encoding aarch64_branch_unconditional_immediate // B_only_branch_imm - when ('1') => __encoding aarch64_branch_unconditional_immediate // BL_only_branch_imm - when ('x01', _, '0xxxxxxxxxxxxx', _, _) => // compbranch - __field sf 31 +: 1 - __field op 24 +: 1 - __field imm19 5 +: 19 - __field Rt 0 +: 5 - case (sf, op) of - when ('0', '0') => __encoding aarch64_branch_conditional_compare // CBZ_32_compbranch - when ('0', '1') => __encoding aarch64_branch_conditional_compare // CBNZ_32_compbranch - when ('1', '0') => __encoding aarch64_branch_conditional_compare // CBZ_64_compbranch - when ('1', '1') => __encoding aarch64_branch_conditional_compare // CBNZ_64_compbranch - when ('x01', _, '1xxxxxxxxxxxxx', _, _) => // testbranch - __field b5 31 +: 1 - __field op 24 +: 1 - __field b40 19 +: 5 - __field imm14 5 +: 14 - __field Rt 0 +: 5 - case (op) of - when ('0') => __encoding aarch64_branch_conditional_test // TBZ_only_testbranch - when ('1') => __encoding aarch64_branch_conditional_test // TBNZ_only_testbranch - when (_, 'x1x0x', _) => - // ldst - case (28 +: 4, 27 +: 1, 26 +: 1, 25 +: 1, 23 +: 2, 22 +: 1, 16 +: 6, 12 +: 4, 10 +: 2, 0 +: 10) of - when ('0x00', _, '1', _, '00', _, '000000', _, _, _) => // asisdlse - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (L, opcode) of - when ('0', '0000') => __encoding aarch64_memory_vector_multiple_no_wb // ST4_asisdlse_R4 - when ('0', '0001') => __UNALLOCATED - when ('0', '0010') => __encoding aarch64_memory_vector_multiple_no_wb // ST1_asisdlse_R4_4v - when ('0', '0011') => __UNALLOCATED - when ('0', '0100') => __encoding aarch64_memory_vector_multiple_no_wb // ST3_asisdlse_R3 - when ('0', '0101') => __UNALLOCATED - when ('0', '0110') => __encoding aarch64_memory_vector_multiple_no_wb // ST1_asisdlse_R3_3v - when ('0', '0111') => __encoding aarch64_memory_vector_multiple_no_wb // ST1_asisdlse_R1_1v - when ('0', '1000') => __encoding aarch64_memory_vector_multiple_no_wb // ST2_asisdlse_R2 - when ('0', '1001') => __UNALLOCATED - when ('0', '1010') => __encoding aarch64_memory_vector_multiple_no_wb // ST1_asisdlse_R2_2v - when ('0', '1011') => __UNALLOCATED - when ('0', '11xx') => __UNALLOCATED - when ('1', '0000') => __encoding aarch64_memory_vector_multiple_no_wb // LD4_asisdlse_R4 - when ('1', '0001') => __UNALLOCATED - when ('1', '0010') => __encoding aarch64_memory_vector_multiple_no_wb // LD1_asisdlse_R4_4v - when ('1', '0011') => __UNALLOCATED - when ('1', '0100') => __encoding aarch64_memory_vector_multiple_no_wb // LD3_asisdlse_R3 - when ('1', '0101') => __UNALLOCATED - when ('1', '0110') => __encoding aarch64_memory_vector_multiple_no_wb // LD1_asisdlse_R3_3v - when ('1', '0111') => __encoding aarch64_memory_vector_multiple_no_wb // LD1_asisdlse_R1_1v - when ('1', '1000') => __encoding aarch64_memory_vector_multiple_no_wb // LD2_asisdlse_R2 - when ('1', '1001') => __UNALLOCATED - when ('1', '1010') => __encoding aarch64_memory_vector_multiple_no_wb // LD1_asisdlse_R2_2v - when ('1', '1011') => __UNALLOCATED - when ('1', '11xx') => __UNALLOCATED - when ('0x00', _, '1', _, '01', _, '0xxxxx', _, _, _) => // asisdlsep - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (L, Rm, opcode) of - when ('0', _, '0001') => __UNALLOCATED - when ('0', _, '0011') => __UNALLOCATED - when ('0', _, '0101') => __UNALLOCATED - when ('0', _, '1001') => __UNALLOCATED - when ('0', _, '1011') => __UNALLOCATED - when ('0', _, '11xx') => __UNALLOCATED - when ('0', !'11111', '0000') => __encoding aarch64_memory_vector_multiple_post_inc // ST4_asisdlsep_R4_r - when ('0', !'11111', '0010') => __encoding aarch64_memory_vector_multiple_post_inc // ST1_asisdlsep_R4_r4 - when ('0', !'11111', '0100') => __encoding aarch64_memory_vector_multiple_post_inc // ST3_asisdlsep_R3_r - when ('0', !'11111', '0110') => __encoding aarch64_memory_vector_multiple_post_inc // ST1_asisdlsep_R3_r3 - when ('0', !'11111', '0111') => __encoding aarch64_memory_vector_multiple_post_inc // ST1_asisdlsep_R1_r1 - when ('0', !'11111', '1000') => __encoding aarch64_memory_vector_multiple_post_inc // ST2_asisdlsep_R2_r - when ('0', !'11111', '1010') => __encoding aarch64_memory_vector_multiple_post_inc // ST1_asisdlsep_R2_r2 - when ('0', '11111', '0000') => __encoding aarch64_memory_vector_multiple_post_inc // ST4_asisdlsep_I4_i - when ('0', '11111', '0010') => __encoding aarch64_memory_vector_multiple_post_inc // ST1_asisdlsep_I4_i4 - when ('0', '11111', '0100') => __encoding aarch64_memory_vector_multiple_post_inc // ST3_asisdlsep_I3_i - when ('0', '11111', '0110') => __encoding aarch64_memory_vector_multiple_post_inc // ST1_asisdlsep_I3_i3 - when ('0', '11111', '0111') => __encoding aarch64_memory_vector_multiple_post_inc // ST1_asisdlsep_I1_i1 - when ('0', '11111', '1000') => __encoding aarch64_memory_vector_multiple_post_inc // ST2_asisdlsep_I2_i - when ('0', '11111', '1010') => __encoding aarch64_memory_vector_multiple_post_inc // ST1_asisdlsep_I2_i2 - when ('1', _, '0001') => __UNALLOCATED - when ('1', _, '0011') => __UNALLOCATED - when ('1', _, '0101') => __UNALLOCATED - when ('1', _, '1001') => __UNALLOCATED - when ('1', _, '1011') => __UNALLOCATED - when ('1', _, '11xx') => __UNALLOCATED - when ('1', !'11111', '0000') => __encoding aarch64_memory_vector_multiple_post_inc // LD4_asisdlsep_R4_r - when ('1', !'11111', '0010') => __encoding aarch64_memory_vector_multiple_post_inc // LD1_asisdlsep_R4_r4 - when ('1', !'11111', '0100') => __encoding aarch64_memory_vector_multiple_post_inc // LD3_asisdlsep_R3_r - when ('1', !'11111', '0110') => __encoding aarch64_memory_vector_multiple_post_inc // LD1_asisdlsep_R3_r3 - when ('1', !'11111', '0111') => __encoding aarch64_memory_vector_multiple_post_inc // LD1_asisdlsep_R1_r1 - when ('1', !'11111', '1000') => __encoding aarch64_memory_vector_multiple_post_inc // LD2_asisdlsep_R2_r - when ('1', !'11111', '1010') => __encoding aarch64_memory_vector_multiple_post_inc // LD1_asisdlsep_R2_r2 - when ('1', '11111', '0000') => __encoding aarch64_memory_vector_multiple_post_inc // LD4_asisdlsep_I4_i - when ('1', '11111', '0010') => __encoding aarch64_memory_vector_multiple_post_inc // LD1_asisdlsep_I4_i4 - when ('1', '11111', '0100') => __encoding aarch64_memory_vector_multiple_post_inc // LD3_asisdlsep_I3_i - when ('1', '11111', '0110') => __encoding aarch64_memory_vector_multiple_post_inc // LD1_asisdlsep_I3_i3 - when ('1', '11111', '0111') => __encoding aarch64_memory_vector_multiple_post_inc // LD1_asisdlsep_I1_i1 - when ('1', '11111', '1000') => __encoding aarch64_memory_vector_multiple_post_inc // LD2_asisdlsep_I2_i - when ('1', '11111', '1010') => __encoding aarch64_memory_vector_multiple_post_inc // LD1_asisdlsep_I2_i2 - when ('0x00', _, '1', _, '0x', _, '1xxxxx', _, _, _) => __UNPREDICTABLE - when ('0x00', _, '1', _, '10', _, 'x00000', _, _, _) => // asisdlso - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (L, R, opcode, S, size) of - when ('0', _, '11x', _, _) => __UNALLOCATED - when ('0', '0', '000', _, _) => __encoding aarch64_memory_vector_single_no_wb // ST1_asisdlso_B1_1b - when ('0', '0', '001', _, _) => __encoding aarch64_memory_vector_single_no_wb // ST3_asisdlso_B3_3b - when ('0', '0', '010', _, 'x0') => __encoding aarch64_memory_vector_single_no_wb // ST1_asisdlso_H1_1h - when ('0', '0', '010', _, 'x1') => __UNALLOCATED - when ('0', '0', '011', _, 'x0') => __encoding aarch64_memory_vector_single_no_wb // ST3_asisdlso_H3_3h - when ('0', '0', '011', _, 'x1') => __UNALLOCATED - when ('0', '0', '100', _, '00') => __encoding aarch64_memory_vector_single_no_wb // ST1_asisdlso_S1_1s - when ('0', '0', '100', _, '1x') => __UNALLOCATED - when ('0', '0', '100', '0', '01') => __encoding aarch64_memory_vector_single_no_wb // ST1_asisdlso_D1_1d - when ('0', '0', '100', '1', '01') => __UNALLOCATED - when ('0', '0', '101', _, '00') => __encoding aarch64_memory_vector_single_no_wb // ST3_asisdlso_S3_3s - when ('0', '0', '101', _, '10') => __UNALLOCATED - when ('0', '0', '101', '0', '01') => __encoding aarch64_memory_vector_single_no_wb // ST3_asisdlso_D3_3d - when ('0', '0', '101', '0', '11') => __UNALLOCATED - when ('0', '0', '101', '1', 'x1') => __UNALLOCATED - when ('0', '1', '000', _, _) => __encoding aarch64_memory_vector_single_no_wb // ST2_asisdlso_B2_2b - when ('0', '1', '001', _, _) => __encoding aarch64_memory_vector_single_no_wb // ST4_asisdlso_B4_4b - when ('0', '1', '010', _, 'x0') => __encoding aarch64_memory_vector_single_no_wb // ST2_asisdlso_H2_2h - when ('0', '1', '010', _, 'x1') => __UNALLOCATED - when ('0', '1', '011', _, 'x0') => __encoding aarch64_memory_vector_single_no_wb // ST4_asisdlso_H4_4h - when ('0', '1', '011', _, 'x1') => __UNALLOCATED - when ('0', '1', '100', _, '00') => __encoding aarch64_memory_vector_single_no_wb // ST2_asisdlso_S2_2s - when ('0', '1', '100', _, '10') => __UNALLOCATED - when ('0', '1', '100', '0', '01') => __encoding aarch64_memory_vector_single_no_wb // ST2_asisdlso_D2_2d - when ('0', '1', '100', '0', '11') => __UNALLOCATED - when ('0', '1', '100', '1', 'x1') => __UNALLOCATED - when ('0', '1', '101', _, '00') => __encoding aarch64_memory_vector_single_no_wb // ST4_asisdlso_S4_4s - when ('0', '1', '101', _, '10') => __UNALLOCATED - when ('0', '1', '101', '0', '01') => __encoding aarch64_memory_vector_single_no_wb // ST4_asisdlso_D4_4d - when ('0', '1', '101', '0', '11') => __UNALLOCATED - when ('0', '1', '101', '1', 'x1') => __UNALLOCATED - when ('1', '0', '000', _, _) => __encoding aarch64_memory_vector_single_no_wb // LD1_asisdlso_B1_1b - when ('1', '0', '001', _, _) => __encoding aarch64_memory_vector_single_no_wb // LD3_asisdlso_B3_3b - when ('1', '0', '010', _, 'x0') => __encoding aarch64_memory_vector_single_no_wb // LD1_asisdlso_H1_1h - when ('1', '0', '010', _, 'x1') => __UNALLOCATED - when ('1', '0', '011', _, 'x0') => __encoding aarch64_memory_vector_single_no_wb // LD3_asisdlso_H3_3h - when ('1', '0', '011', _, 'x1') => __UNALLOCATED - when ('1', '0', '100', _, '00') => __encoding aarch64_memory_vector_single_no_wb // LD1_asisdlso_S1_1s - when ('1', '0', '100', _, '1x') => __UNALLOCATED - when ('1', '0', '100', '0', '01') => __encoding aarch64_memory_vector_single_no_wb // LD1_asisdlso_D1_1d - when ('1', '0', '100', '1', '01') => __UNALLOCATED - when ('1', '0', '101', _, '00') => __encoding aarch64_memory_vector_single_no_wb // LD3_asisdlso_S3_3s - when ('1', '0', '101', _, '10') => __UNALLOCATED - when ('1', '0', '101', '0', '01') => __encoding aarch64_memory_vector_single_no_wb // LD3_asisdlso_D3_3d - when ('1', '0', '101', '0', '11') => __UNALLOCATED - when ('1', '0', '101', '1', 'x1') => __UNALLOCATED - when ('1', '0', '110', '0', _) => __encoding aarch64_memory_vector_single_no_wb // LD1R_asisdlso_R1 - when ('1', '0', '110', '1', _) => __UNALLOCATED - when ('1', '0', '111', '0', _) => __encoding aarch64_memory_vector_single_no_wb // LD3R_asisdlso_R3 - when ('1', '0', '111', '1', _) => __UNALLOCATED - when ('1', '1', '000', _, _) => __encoding aarch64_memory_vector_single_no_wb // LD2_asisdlso_B2_2b - when ('1', '1', '001', _, _) => __encoding aarch64_memory_vector_single_no_wb // LD4_asisdlso_B4_4b - when ('1', '1', '010', _, 'x0') => __encoding aarch64_memory_vector_single_no_wb // LD2_asisdlso_H2_2h - when ('1', '1', '010', _, 'x1') => __UNALLOCATED - when ('1', '1', '011', _, 'x0') => __encoding aarch64_memory_vector_single_no_wb // LD4_asisdlso_H4_4h - when ('1', '1', '011', _, 'x1') => __UNALLOCATED - when ('1', '1', '100', _, '00') => __encoding aarch64_memory_vector_single_no_wb // LD2_asisdlso_S2_2s - when ('1', '1', '100', _, '10') => __UNALLOCATED - when ('1', '1', '100', '0', '01') => __encoding aarch64_memory_vector_single_no_wb // LD2_asisdlso_D2_2d - when ('1', '1', '100', '0', '11') => __UNALLOCATED - when ('1', '1', '100', '1', 'x1') => __UNALLOCATED - when ('1', '1', '101', _, '00') => __encoding aarch64_memory_vector_single_no_wb // LD4_asisdlso_S4_4s - when ('1', '1', '101', _, '10') => __UNALLOCATED - when ('1', '1', '101', '0', '01') => __encoding aarch64_memory_vector_single_no_wb // LD4_asisdlso_D4_4d - when ('1', '1', '101', '0', '11') => __UNALLOCATED - when ('1', '1', '101', '1', 'x1') => __UNALLOCATED - when ('1', '1', '110', '0', _) => __encoding aarch64_memory_vector_single_no_wb // LD2R_asisdlso_R2 - when ('1', '1', '110', '1', _) => __UNALLOCATED - when ('1', '1', '111', '0', _) => __encoding aarch64_memory_vector_single_no_wb // LD4R_asisdlso_R4 - when ('1', '1', '111', '1', _) => __UNALLOCATED - when ('0x00', _, '1', _, '11', _, _, _, _, _) => // asisdlsop - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (L, R, Rm, opcode, S, size) of - when ('0', _, _, '11x', _, _) => __UNALLOCATED - when ('0', '0', _, '010', _, 'x1') => __UNALLOCATED - when ('0', '0', _, '011', _, 'x1') => __UNALLOCATED - when ('0', '0', _, '100', _, '1x') => __UNALLOCATED - when ('0', '0', _, '100', '1', '01') => __UNALLOCATED - when ('0', '0', _, '101', _, '10') => __UNALLOCATED - when ('0', '0', _, '101', '0', '11') => __UNALLOCATED - when ('0', '0', _, '101', '1', 'x1') => __UNALLOCATED - when ('0', '0', !'11111', '000', _, _) => __encoding aarch64_memory_vector_single_post_inc // ST1_asisdlsop_BX1_r1b - when ('0', '0', !'11111', '001', _, _) => __encoding aarch64_memory_vector_single_post_inc // ST3_asisdlsop_BX3_r3b - when ('0', '0', !'11111', '010', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // ST1_asisdlsop_HX1_r1h - when ('0', '0', !'11111', '011', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // ST3_asisdlsop_HX3_r3h - when ('0', '0', !'11111', '100', _, '00') => __encoding aarch64_memory_vector_single_post_inc // ST1_asisdlsop_SX1_r1s - when ('0', '0', !'11111', '100', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // ST1_asisdlsop_DX1_r1d - when ('0', '0', !'11111', '101', _, '00') => __encoding aarch64_memory_vector_single_post_inc // ST3_asisdlsop_SX3_r3s - when ('0', '0', !'11111', '101', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // ST3_asisdlsop_DX3_r3d - when ('0', '0', '11111', '000', _, _) => __encoding aarch64_memory_vector_single_post_inc // ST1_asisdlsop_B1_i1b - when ('0', '0', '11111', '001', _, _) => __encoding aarch64_memory_vector_single_post_inc // ST3_asisdlsop_B3_i3b - when ('0', '0', '11111', '010', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // ST1_asisdlsop_H1_i1h - when ('0', '0', '11111', '011', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // ST3_asisdlsop_H3_i3h - when ('0', '0', '11111', '100', _, '00') => __encoding aarch64_memory_vector_single_post_inc // ST1_asisdlsop_S1_i1s - when ('0', '0', '11111', '100', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // ST1_asisdlsop_D1_i1d - when ('0', '0', '11111', '101', _, '00') => __encoding aarch64_memory_vector_single_post_inc // ST3_asisdlsop_S3_i3s - when ('0', '0', '11111', '101', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // ST3_asisdlsop_D3_i3d - when ('0', '1', _, '010', _, 'x1') => __UNALLOCATED - when ('0', '1', _, '011', _, 'x1') => __UNALLOCATED - when ('0', '1', _, '100', _, '10') => __UNALLOCATED - when ('0', '1', _, '100', '0', '11') => __UNALLOCATED - when ('0', '1', _, '100', '1', 'x1') => __UNALLOCATED - when ('0', '1', _, '101', _, '10') => __UNALLOCATED - when ('0', '1', _, '101', '0', '11') => __UNALLOCATED - when ('0', '1', _, '101', '1', 'x1') => __UNALLOCATED - when ('0', '1', !'11111', '000', _, _) => __encoding aarch64_memory_vector_single_post_inc // ST2_asisdlsop_BX2_r2b - when ('0', '1', !'11111', '001', _, _) => __encoding aarch64_memory_vector_single_post_inc // ST4_asisdlsop_BX4_r4b - when ('0', '1', !'11111', '010', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // ST2_asisdlsop_HX2_r2h - when ('0', '1', !'11111', '011', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // ST4_asisdlsop_HX4_r4h - when ('0', '1', !'11111', '100', _, '00') => __encoding aarch64_memory_vector_single_post_inc // ST2_asisdlsop_SX2_r2s - when ('0', '1', !'11111', '100', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // ST2_asisdlsop_DX2_r2d - when ('0', '1', !'11111', '101', _, '00') => __encoding aarch64_memory_vector_single_post_inc // ST4_asisdlsop_SX4_r4s - when ('0', '1', !'11111', '101', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // ST4_asisdlsop_DX4_r4d - when ('0', '1', '11111', '000', _, _) => __encoding aarch64_memory_vector_single_post_inc // ST2_asisdlsop_B2_i2b - when ('0', '1', '11111', '001', _, _) => __encoding aarch64_memory_vector_single_post_inc // ST4_asisdlsop_B4_i4b - when ('0', '1', '11111', '010', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // ST2_asisdlsop_H2_i2h - when ('0', '1', '11111', '011', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // ST4_asisdlsop_H4_i4h - when ('0', '1', '11111', '100', _, '00') => __encoding aarch64_memory_vector_single_post_inc // ST2_asisdlsop_S2_i2s - when ('0', '1', '11111', '100', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // ST2_asisdlsop_D2_i2d - when ('0', '1', '11111', '101', _, '00') => __encoding aarch64_memory_vector_single_post_inc // ST4_asisdlsop_S4_i4s - when ('0', '1', '11111', '101', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // ST4_asisdlsop_D4_i4d - when ('1', '0', _, '010', _, 'x1') => __UNALLOCATED - when ('1', '0', _, '011', _, 'x1') => __UNALLOCATED - when ('1', '0', _, '100', _, '1x') => __UNALLOCATED - when ('1', '0', _, '100', '1', '01') => __UNALLOCATED - when ('1', '0', _, '101', _, '10') => __UNALLOCATED - when ('1', '0', _, '101', '0', '11') => __UNALLOCATED - when ('1', '0', _, '101', '1', 'x1') => __UNALLOCATED - when ('1', '0', _, '110', '1', _) => __UNALLOCATED - when ('1', '0', _, '111', '1', _) => __UNALLOCATED - when ('1', '0', !'11111', '000', _, _) => __encoding aarch64_memory_vector_single_post_inc // LD1_asisdlsop_BX1_r1b - when ('1', '0', !'11111', '001', _, _) => __encoding aarch64_memory_vector_single_post_inc // LD3_asisdlsop_BX3_r3b - when ('1', '0', !'11111', '010', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // LD1_asisdlsop_HX1_r1h - when ('1', '0', !'11111', '011', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // LD3_asisdlsop_HX3_r3h - when ('1', '0', !'11111', '100', _, '00') => __encoding aarch64_memory_vector_single_post_inc // LD1_asisdlsop_SX1_r1s - when ('1', '0', !'11111', '100', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // LD1_asisdlsop_DX1_r1d - when ('1', '0', !'11111', '101', _, '00') => __encoding aarch64_memory_vector_single_post_inc // LD3_asisdlsop_SX3_r3s - when ('1', '0', !'11111', '101', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // LD3_asisdlsop_DX3_r3d - when ('1', '0', !'11111', '110', '0', _) => __encoding aarch64_memory_vector_single_post_inc // LD1R_asisdlsop_RX1_r - when ('1', '0', !'11111', '111', '0', _) => __encoding aarch64_memory_vector_single_post_inc // LD3R_asisdlsop_RX3_r - when ('1', '0', '11111', '000', _, _) => __encoding aarch64_memory_vector_single_post_inc // LD1_asisdlsop_B1_i1b - when ('1', '0', '11111', '001', _, _) => __encoding aarch64_memory_vector_single_post_inc // LD3_asisdlsop_B3_i3b - when ('1', '0', '11111', '010', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // LD1_asisdlsop_H1_i1h - when ('1', '0', '11111', '011', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // LD3_asisdlsop_H3_i3h - when ('1', '0', '11111', '100', _, '00') => __encoding aarch64_memory_vector_single_post_inc // LD1_asisdlsop_S1_i1s - when ('1', '0', '11111', '100', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // LD1_asisdlsop_D1_i1d - when ('1', '0', '11111', '101', _, '00') => __encoding aarch64_memory_vector_single_post_inc // LD3_asisdlsop_S3_i3s - when ('1', '0', '11111', '101', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // LD3_asisdlsop_D3_i3d - when ('1', '0', '11111', '110', '0', _) => __encoding aarch64_memory_vector_single_post_inc // LD1R_asisdlsop_R1_i - when ('1', '0', '11111', '111', '0', _) => __encoding aarch64_memory_vector_single_post_inc // LD3R_asisdlsop_R3_i - when ('1', '1', _, '010', _, 'x1') => __UNALLOCATED - when ('1', '1', _, '011', _, 'x1') => __UNALLOCATED - when ('1', '1', _, '100', _, '10') => __UNALLOCATED - when ('1', '1', _, '100', '0', '11') => __UNALLOCATED - when ('1', '1', _, '100', '1', 'x1') => __UNALLOCATED - when ('1', '1', _, '101', _, '10') => __UNALLOCATED - when ('1', '1', _, '101', '0', '11') => __UNALLOCATED - when ('1', '1', _, '101', '1', 'x1') => __UNALLOCATED - when ('1', '1', _, '110', '1', _) => __UNALLOCATED - when ('1', '1', _, '111', '1', _) => __UNALLOCATED - when ('1', '1', !'11111', '000', _, _) => __encoding aarch64_memory_vector_single_post_inc // LD2_asisdlsop_BX2_r2b - when ('1', '1', !'11111', '001', _, _) => __encoding aarch64_memory_vector_single_post_inc // LD4_asisdlsop_BX4_r4b - when ('1', '1', !'11111', '010', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // LD2_asisdlsop_HX2_r2h - when ('1', '1', !'11111', '011', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // LD4_asisdlsop_HX4_r4h - when ('1', '1', !'11111', '100', _, '00') => __encoding aarch64_memory_vector_single_post_inc // LD2_asisdlsop_SX2_r2s - when ('1', '1', !'11111', '100', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // LD2_asisdlsop_DX2_r2d - when ('1', '1', !'11111', '101', _, '00') => __encoding aarch64_memory_vector_single_post_inc // LD4_asisdlsop_SX4_r4s - when ('1', '1', !'11111', '101', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // LD4_asisdlsop_DX4_r4d - when ('1', '1', !'11111', '110', '0', _) => __encoding aarch64_memory_vector_single_post_inc // LD2R_asisdlsop_RX2_r - when ('1', '1', !'11111', '111', '0', _) => __encoding aarch64_memory_vector_single_post_inc // LD4R_asisdlsop_RX4_r - when ('1', '1', '11111', '000', _, _) => __encoding aarch64_memory_vector_single_post_inc // LD2_asisdlsop_B2_i2b - when ('1', '1', '11111', '001', _, _) => __encoding aarch64_memory_vector_single_post_inc // LD4_asisdlsop_B4_i4b - when ('1', '1', '11111', '010', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // LD2_asisdlsop_H2_i2h - when ('1', '1', '11111', '011', _, 'x0') => __encoding aarch64_memory_vector_single_post_inc // LD4_asisdlsop_H4_i4h - when ('1', '1', '11111', '100', _, '00') => __encoding aarch64_memory_vector_single_post_inc // LD2_asisdlsop_S2_i2s - when ('1', '1', '11111', '100', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // LD2_asisdlsop_D2_i2d - when ('1', '1', '11111', '101', _, '00') => __encoding aarch64_memory_vector_single_post_inc // LD4_asisdlsop_S4_i4s - when ('1', '1', '11111', '101', '0', '01') => __encoding aarch64_memory_vector_single_post_inc // LD4_asisdlsop_D4_i4d - when ('1', '1', '11111', '110', '0', _) => __encoding aarch64_memory_vector_single_post_inc // LD2R_asisdlsop_R2_i - when ('1', '1', '11111', '111', '0', _) => __encoding aarch64_memory_vector_single_post_inc // LD4R_asisdlsop_R4_i - when ('0x00', _, '1', _, 'x0', _, 'x1xxxx', _, _, _) => __UNPREDICTABLE - when ('0x00', _, '1', _, 'x0', _, 'xx1xxx', _, _, _) => __UNPREDICTABLE - when ('0x00', _, '1', _, 'x0', _, 'xxx1xx', _, _, _) => __UNPREDICTABLE - when ('0x00', _, '1', _, 'x0', _, 'xxxx1x', _, _, _) => __UNPREDICTABLE - when ('0x00', _, '1', _, 'x0', _, 'xxxxx1', _, _, _) => __UNPREDICTABLE - when ('1101', _, '0', _, '1x', _, '1xxxxx', _, _, _) => // ldsttags - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field op2 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (opc, imm9, op2) of - when ('00', _, '01') => __encoding aarch64_integer_tags_mcsettagpost // STG_64Spost_ldsttags - when ('00', _, '10') => __encoding aarch64_integer_tags_mcsettag // STG_64Soffset_ldsttags - when ('00', _, '11') => __encoding aarch64_integer_tags_mcsettagpre // STG_64Spre_ldsttags - when ('00', '000000000', '00') => __encoding aarch64_integer_tags_mcsettagandzeroarray // STZGM_64bulk_ldsttags - when ('01', _, '00') => __encoding aarch64_integer_tags_mcgettag // LDG_64Loffset_ldsttags - when ('01', _, '01') => __encoding aarch64_integer_tags_mcsettagandzerodatapost // STZG_64Spost_ldsttags - when ('01', _, '10') => __encoding aarch64_integer_tags_mcsettagandzerodata // STZG_64Soffset_ldsttags - when ('01', _, '11') => __encoding aarch64_integer_tags_mcsettagandzerodatapre // STZG_64Spre_ldsttags - when ('10', _, '01') => __encoding aarch64_integer_tags_mcsettagpairpost // ST2G_64Spost_ldsttags - when ('10', _, '10') => __encoding aarch64_integer_tags_mcsettagpair // ST2G_64Soffset_ldsttags - when ('10', _, '11') => __encoding aarch64_integer_tags_mcsettagpairpre // ST2G_64Spre_ldsttags - when ('10', !'000000000', '00') => __UNALLOCATED - when ('10', '000000000', '00') => __encoding aarch64_integer_tags_mcsettagarray // STGM_64bulk_ldsttags - when ('11', _, '01') => __encoding aarch64_integer_tags_mcsettagpairandzerodatapost // STZ2G_64Spost_ldsttags - when ('11', _, '10') => __encoding aarch64_integer_tags_mcsettagpairandzerodata // STZ2G_64Soffset_ldsttags - when ('11', _, '11') => __encoding aarch64_integer_tags_mcsettagpairandzerodatapre // STZ2G_64Spre_ldsttags - when ('11', !'000000000', '00') => __UNALLOCATED - when ('11', '000000000', '00') => __encoding aarch64_integer_tags_mcgettagarray // LDGM_64bulk_ldsttags - when ('1x00', _, '1', _, _, _, _, _, _, _) => __UNPREDICTABLE - when ('xx00', _, '0', _, '0x', _, _, _, _, _) => // ldstexcl - __field size 30 +: 2 - __field o2 23 +: 1 - __field L 22 +: 1 - __field o1 21 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, o2, L, o1, o0, Rt2) of - when (_, '1', _, '1', _, !'11111') => __UNALLOCATED - when ('0x', '0', _, '1', _, !'11111') => __UNALLOCATED - when ('00', '0', '0', '0', '0', _) => __encoding aarch64_memory_exclusive_single // STXRB_SR32_ldstexcl - when ('00', '0', '0', '0', '1', _) => __encoding aarch64_memory_exclusive_single // STLXRB_SR32_ldstexcl - when ('00', '0', '0', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_pair // CASP_CP32_ldstexcl - when ('00', '0', '0', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_pair // CASPL_CP32_ldstexcl - when ('00', '0', '1', '0', '0', _) => __encoding aarch64_memory_exclusive_single // LDXRB_LR32_ldstexcl - when ('00', '0', '1', '0', '1', _) => __encoding aarch64_memory_exclusive_single // LDAXRB_LR32_ldstexcl - when ('00', '0', '1', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_pair // CASPA_CP32_ldstexcl - when ('00', '0', '1', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_pair // CASPAL_CP32_ldstexcl - when ('00', '1', '0', '0', '0', _) => __encoding aarch64_memory_ordered // STLLRB_SL32_ldstexcl - when ('00', '1', '0', '0', '1', _) => __encoding aarch64_memory_ordered // STLRB_SL32_ldstexcl - when ('00', '1', '0', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASB_C32_ldstexcl - when ('00', '1', '0', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASLB_C32_ldstexcl - when ('00', '1', '1', '0', '0', _) => __encoding aarch64_memory_ordered // LDLARB_LR32_ldstexcl - when ('00', '1', '1', '0', '1', _) => __encoding aarch64_memory_ordered // LDARB_LR32_ldstexcl - when ('00', '1', '1', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASAB_C32_ldstexcl - when ('00', '1', '1', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASALB_C32_ldstexcl - when ('01', '0', '0', '0', '0', _) => __encoding aarch64_memory_exclusive_single // STXRH_SR32_ldstexcl - when ('01', '0', '0', '0', '1', _) => __encoding aarch64_memory_exclusive_single // STLXRH_SR32_ldstexcl - when ('01', '0', '0', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_pair // CASP_CP64_ldstexcl - when ('01', '0', '0', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_pair // CASPL_CP64_ldstexcl - when ('01', '0', '1', '0', '0', _) => __encoding aarch64_memory_exclusive_single // LDXRH_LR32_ldstexcl - when ('01', '0', '1', '0', '1', _) => __encoding aarch64_memory_exclusive_single // LDAXRH_LR32_ldstexcl - when ('01', '0', '1', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_pair // CASPA_CP64_ldstexcl - when ('01', '0', '1', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_pair // CASPAL_CP64_ldstexcl - when ('01', '1', '0', '0', '0', _) => __encoding aarch64_memory_ordered // STLLRH_SL32_ldstexcl - when ('01', '1', '0', '0', '1', _) => __encoding aarch64_memory_ordered // STLRH_SL32_ldstexcl - when ('01', '1', '0', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASH_C32_ldstexcl - when ('01', '1', '0', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASLH_C32_ldstexcl - when ('01', '1', '1', '0', '0', _) => __encoding aarch64_memory_ordered // LDLARH_LR32_ldstexcl - when ('01', '1', '1', '0', '1', _) => __encoding aarch64_memory_ordered // LDARH_LR32_ldstexcl - when ('01', '1', '1', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASAH_C32_ldstexcl - when ('01', '1', '1', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASALH_C32_ldstexcl - when ('10', '0', '0', '0', '0', _) => __encoding aarch64_memory_exclusive_single // STXR_SR32_ldstexcl - when ('10', '0', '0', '0', '1', _) => __encoding aarch64_memory_exclusive_single // STLXR_SR32_ldstexcl - when ('10', '0', '0', '1', '0', _) => __encoding aarch64_memory_exclusive_pair // STXP_SP32_ldstexcl - when ('10', '0', '0', '1', '1', _) => __encoding aarch64_memory_exclusive_pair // STLXP_SP32_ldstexcl - when ('10', '0', '1', '0', '0', _) => __encoding aarch64_memory_exclusive_single // LDXR_LR32_ldstexcl - when ('10', '0', '1', '0', '1', _) => __encoding aarch64_memory_exclusive_single // LDAXR_LR32_ldstexcl - when ('10', '0', '1', '1', '0', _) => __encoding aarch64_memory_exclusive_pair // LDXP_LP32_ldstexcl - when ('10', '0', '1', '1', '1', _) => __encoding aarch64_memory_exclusive_pair // LDAXP_LP32_ldstexcl - when ('10', '1', '0', '0', '0', _) => __encoding aarch64_memory_ordered // STLLR_SL32_ldstexcl - when ('10', '1', '0', '0', '1', _) => __encoding aarch64_memory_ordered // STLR_SL32_ldstexcl - when ('10', '1', '0', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_single // CAS_C32_ldstexcl - when ('10', '1', '0', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASL_C32_ldstexcl - when ('10', '1', '1', '0', '0', _) => __encoding aarch64_memory_ordered // LDLAR_LR32_ldstexcl - when ('10', '1', '1', '0', '1', _) => __encoding aarch64_memory_ordered // LDAR_LR32_ldstexcl - when ('10', '1', '1', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASA_C32_ldstexcl - when ('10', '1', '1', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASAL_C32_ldstexcl - when ('11', '0', '0', '0', '0', _) => __encoding aarch64_memory_exclusive_single // STXR_SR64_ldstexcl - when ('11', '0', '0', '0', '1', _) => __encoding aarch64_memory_exclusive_single // STLXR_SR64_ldstexcl - when ('11', '0', '0', '1', '0', _) => __encoding aarch64_memory_exclusive_pair // STXP_SP64_ldstexcl - when ('11', '0', '0', '1', '1', _) => __encoding aarch64_memory_exclusive_pair // STLXP_SP64_ldstexcl - when ('11', '0', '1', '0', '0', _) => __encoding aarch64_memory_exclusive_single // LDXR_LR64_ldstexcl - when ('11', '0', '1', '0', '1', _) => __encoding aarch64_memory_exclusive_single // LDAXR_LR64_ldstexcl - when ('11', '0', '1', '1', '0', _) => __encoding aarch64_memory_exclusive_pair // LDXP_LP64_ldstexcl - when ('11', '0', '1', '1', '1', _) => __encoding aarch64_memory_exclusive_pair // LDAXP_LP64_ldstexcl - when ('11', '1', '0', '0', '0', _) => __encoding aarch64_memory_ordered // STLLR_SL64_ldstexcl - when ('11', '1', '0', '0', '1', _) => __encoding aarch64_memory_ordered // STLR_SL64_ldstexcl - when ('11', '1', '0', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_single // CAS_C64_ldstexcl - when ('11', '1', '0', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASL_C64_ldstexcl - when ('11', '1', '1', '0', '0', _) => __encoding aarch64_memory_ordered // LDLAR_LR64_ldstexcl - when ('11', '1', '1', '0', '1', _) => __encoding aarch64_memory_ordered // LDAR_LR64_ldstexcl - when ('11', '1', '1', '1', '0', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASA_C64_ldstexcl - when ('11', '1', '1', '1', '1', '11111') => __encoding aarch64_memory_atomicops_cas_single // CASAL_C64_ldstexcl - when ('xx01', _, '0', _, '1x', _, '0xxxxx', _, '00', _) => // ldapstl_unscaled - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, opc) of - when ('00', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // STLURB_32_ldapstl_unscaled - when ('00', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPURB_32_ldapstl_unscaled - when ('00', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPURSB_64_ldapstl_unscaled - when ('00', '11') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPURSB_32_ldapstl_unscaled - when ('01', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // STLURH_32_ldapstl_unscaled - when ('01', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPURH_32_ldapstl_unscaled - when ('01', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPURSH_64_ldapstl_unscaled - when ('01', '11') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPURSH_32_ldapstl_unscaled - when ('10', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // STLUR_32_ldapstl_unscaled - when ('10', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPUR_32_ldapstl_unscaled - when ('10', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPURSW_64_ldapstl_unscaled - when ('10', '11') => __UNALLOCATED - when ('11', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // STLUR_64_ldapstl_unscaled - when ('11', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl // LDAPUR_64_ldapstl_unscaled - when ('11', '10') => __UNALLOCATED - when ('11', '11') => __UNALLOCATED - when ('xx01', _, _, _, '0x', _, _, _, _, _) => // loadlit - __field opc 30 +: 2 - __field V 26 +: 1 - __field imm19 5 +: 19 - __field Rt 0 +: 5 - case (opc, V) of - when ('00', '0') => __encoding aarch64_memory_literal_general // LDR_32_loadlit - when ('00', '1') => __encoding aarch64_memory_literal_simdfp // LDR_S_loadlit - when ('01', '0') => __encoding aarch64_memory_literal_general // LDR_64_loadlit - when ('01', '1') => __encoding aarch64_memory_literal_simdfp // LDR_D_loadlit - when ('10', '0') => __encoding aarch64_memory_literal_general // LDRSW_64_loadlit - when ('10', '1') => __encoding aarch64_memory_literal_simdfp // LDR_Q_loadlit - when ('11', '0') => __encoding aarch64_memory_literal_general // PRFM_P_loadlit - when ('11', '1') => __UNALLOCATED - when ('xx10', _, _, _, '00', _, _, _, _, _) => // ldstnapair_offs - __field opc 30 +: 2 - __field V 26 +: 1 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (opc, V, L) of - when ('00', '0', '0') => __encoding aarch64_memory_pair_general_no_alloc // STNP_32_ldstnapair_offs - when ('00', '0', '1') => __encoding aarch64_memory_pair_general_no_alloc // LDNP_32_ldstnapair_offs - when ('00', '1', '0') => __encoding aarch64_memory_pair_simdfp_no_alloc // STNP_S_ldstnapair_offs - when ('00', '1', '1') => __encoding aarch64_memory_pair_simdfp_no_alloc // LDNP_S_ldstnapair_offs - when ('01', '0', _) => __UNALLOCATED - when ('01', '1', '0') => __encoding aarch64_memory_pair_simdfp_no_alloc // STNP_D_ldstnapair_offs - when ('01', '1', '1') => __encoding aarch64_memory_pair_simdfp_no_alloc // LDNP_D_ldstnapair_offs - when ('10', '0', '0') => __encoding aarch64_memory_pair_general_no_alloc // STNP_64_ldstnapair_offs - when ('10', '0', '1') => __encoding aarch64_memory_pair_general_no_alloc // LDNP_64_ldstnapair_offs - when ('10', '1', '0') => __encoding aarch64_memory_pair_simdfp_no_alloc // STNP_Q_ldstnapair_offs - when ('10', '1', '1') => __encoding aarch64_memory_pair_simdfp_no_alloc // LDNP_Q_ldstnapair_offs - when ('11', _, _) => __UNALLOCATED - when ('xx10', _, _, _, '01', _, _, _, _, _) => // ldstpair_post - __field opc 30 +: 2 - __field V 26 +: 1 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (opc, V, L) of - when ('00', '0', '0') => __encoding aarch64_memory_pair_general_post_idx // STP_32_ldstpair_post - when ('00', '0', '1') => __encoding aarch64_memory_pair_general_post_idx // LDP_32_ldstpair_post - when ('00', '1', '0') => __encoding aarch64_memory_pair_simdfp_post_idx // STP_S_ldstpair_post - when ('00', '1', '1') => __encoding aarch64_memory_pair_simdfp_post_idx // LDP_S_ldstpair_post - when ('01', '0', '0') => __encoding aarch64_integer_tags_mcsettaganddatapairpost // STGP_64_ldstpair_post - when ('01', '0', '1') => __encoding aarch64_memory_pair_general_post_idx // LDPSW_64_ldstpair_post - when ('01', '1', '0') => __encoding aarch64_memory_pair_simdfp_post_idx // STP_D_ldstpair_post - when ('01', '1', '1') => __encoding aarch64_memory_pair_simdfp_post_idx // LDP_D_ldstpair_post - when ('10', '0', '0') => __encoding aarch64_memory_pair_general_post_idx // STP_64_ldstpair_post - when ('10', '0', '1') => __encoding aarch64_memory_pair_general_post_idx // LDP_64_ldstpair_post - when ('10', '1', '0') => __encoding aarch64_memory_pair_simdfp_post_idx // STP_Q_ldstpair_post - when ('10', '1', '1') => __encoding aarch64_memory_pair_simdfp_post_idx // LDP_Q_ldstpair_post - when ('11', _, _) => __UNALLOCATED - when ('xx10', _, _, _, '10', _, _, _, _, _) => // ldstpair_off - __field opc 30 +: 2 - __field V 26 +: 1 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (opc, V, L) of - when ('00', '0', '0') => __encoding aarch64_memory_pair_general_offset // STP_32_ldstpair_off - when ('00', '0', '1') => __encoding aarch64_memory_pair_general_offset // LDP_32_ldstpair_off - when ('00', '1', '0') => __encoding aarch64_memory_pair_simdfp_offset // STP_S_ldstpair_off - when ('00', '1', '1') => __encoding aarch64_memory_pair_simdfp_offset // LDP_S_ldstpair_off - when ('01', '0', '0') => __encoding aarch64_integer_tags_mcsettaganddatapair // STGP_64_ldstpair_off - when ('01', '0', '1') => __encoding aarch64_memory_pair_general_offset // LDPSW_64_ldstpair_off - when ('01', '1', '0') => __encoding aarch64_memory_pair_simdfp_offset // STP_D_ldstpair_off - when ('01', '1', '1') => __encoding aarch64_memory_pair_simdfp_offset // LDP_D_ldstpair_off - when ('10', '0', '0') => __encoding aarch64_memory_pair_general_offset // STP_64_ldstpair_off - when ('10', '0', '1') => __encoding aarch64_memory_pair_general_offset // LDP_64_ldstpair_off - when ('10', '1', '0') => __encoding aarch64_memory_pair_simdfp_offset // STP_Q_ldstpair_off - when ('10', '1', '1') => __encoding aarch64_memory_pair_simdfp_offset // LDP_Q_ldstpair_off - when ('11', _, _) => __UNALLOCATED - when ('xx10', _, _, _, '11', _, _, _, _, _) => // ldstpair_pre - __field opc 30 +: 2 - __field V 26 +: 1 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (opc, V, L) of - when ('00', '0', '0') => __encoding aarch64_memory_pair_general_pre_idx // STP_32_ldstpair_pre - when ('00', '0', '1') => __encoding aarch64_memory_pair_general_pre_idx // LDP_32_ldstpair_pre - when ('00', '1', '0') => __encoding aarch64_memory_pair_simdfp_pre_idx // STP_S_ldstpair_pre - when ('00', '1', '1') => __encoding aarch64_memory_pair_simdfp_pre_idx // LDP_S_ldstpair_pre - when ('01', '0', '0') => __encoding aarch64_integer_tags_mcsettaganddatapairpre // STGP_64_ldstpair_pre - when ('01', '0', '1') => __encoding aarch64_memory_pair_general_pre_idx // LDPSW_64_ldstpair_pre - when ('01', '1', '0') => __encoding aarch64_memory_pair_simdfp_pre_idx // STP_D_ldstpair_pre - when ('01', '1', '1') => __encoding aarch64_memory_pair_simdfp_pre_idx // LDP_D_ldstpair_pre - when ('10', '0', '0') => __encoding aarch64_memory_pair_general_pre_idx // STP_64_ldstpair_pre - when ('10', '0', '1') => __encoding aarch64_memory_pair_general_pre_idx // LDP_64_ldstpair_pre - when ('10', '1', '0') => __encoding aarch64_memory_pair_simdfp_pre_idx // STP_Q_ldstpair_pre - when ('10', '1', '1') => __encoding aarch64_memory_pair_simdfp_pre_idx // LDP_Q_ldstpair_pre - when ('11', _, _) => __UNALLOCATED - when ('xx11', _, _, _, '0x', _, '0xxxxx', _, '00', _) => // ldst_unscaled - __field size 30 +: 2 - __field V 26 +: 1 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, V, opc) of - when ('x1', '1', '1x') => __UNALLOCATED - when ('00', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // STURB_32_ldst_unscaled - when ('00', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDURB_32_ldst_unscaled - when ('00', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDURSB_64_ldst_unscaled - when ('00', '0', '11') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDURSB_32_ldst_unscaled - when ('00', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // STUR_B_ldst_unscaled - when ('00', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // LDUR_B_ldst_unscaled - when ('00', '1', '10') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // STUR_Q_ldst_unscaled - when ('00', '1', '11') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // LDUR_Q_ldst_unscaled - when ('01', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // STURH_32_ldst_unscaled - when ('01', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDURH_32_ldst_unscaled - when ('01', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDURSH_64_ldst_unscaled - when ('01', '0', '11') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDURSH_32_ldst_unscaled - when ('01', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // STUR_H_ldst_unscaled - when ('01', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // LDUR_H_ldst_unscaled - when ('1x', '0', '11') => __UNALLOCATED - when ('1x', '1', '1x') => __UNALLOCATED - when ('10', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // STUR_32_ldst_unscaled - when ('10', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDUR_32_ldst_unscaled - when ('10', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDURSW_64_ldst_unscaled - when ('10', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // STUR_S_ldst_unscaled - when ('10', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // LDUR_S_ldst_unscaled - when ('11', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // STUR_64_ldst_unscaled - when ('11', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // LDUR_64_ldst_unscaled - when ('11', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_normal // PRFUM_P_ldst_unscaled - when ('11', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // STUR_D_ldst_unscaled - when ('11', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal // LDUR_D_ldst_unscaled - when ('xx11', _, _, _, '0x', _, '0xxxxx', _, '01', _) => // ldst_immpost - __field size 30 +: 2 - __field V 26 +: 1 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, V, opc) of - when ('x1', '1', '1x') => __UNALLOCATED - when ('00', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // STRB_32_ldst_immpost - when ('00', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDRB_32_ldst_immpost - when ('00', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDRSB_64_ldst_immpost - when ('00', '0', '11') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDRSB_32_ldst_immpost - when ('00', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // STR_B_ldst_immpost - when ('00', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // LDR_B_ldst_immpost - when ('00', '1', '10') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // STR_Q_ldst_immpost - when ('00', '1', '11') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // LDR_Q_ldst_immpost - when ('01', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // STRH_32_ldst_immpost - when ('01', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDRH_32_ldst_immpost - when ('01', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDRSH_64_ldst_immpost - when ('01', '0', '11') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDRSH_32_ldst_immpost - when ('01', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // STR_H_ldst_immpost - when ('01', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // LDR_H_ldst_immpost - when ('1x', '0', '11') => __UNALLOCATED - when ('1x', '1', '1x') => __UNALLOCATED - when ('10', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // STR_32_ldst_immpost - when ('10', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDR_32_ldst_immpost - when ('10', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDRSW_64_ldst_immpost - when ('10', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // STR_S_ldst_immpost - when ('10', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // LDR_S_ldst_immpost - when ('11', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // STR_64_ldst_immpost - when ('11', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_post_idx // LDR_64_ldst_immpost - when ('11', '0', '10') => __UNALLOCATED - when ('11', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // STR_D_ldst_immpost - when ('11', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx // LDR_D_ldst_immpost - when ('xx11', _, _, _, '0x', _, '0xxxxx', _, '10', _) => // ldst_unpriv - __field size 30 +: 2 - __field V 26 +: 1 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, V, opc) of - when (_, '1', _) => __UNALLOCATED - when ('00', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // STTRB_32_ldst_unpriv - when ('00', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTRB_32_ldst_unpriv - when ('00', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTRSB_64_ldst_unpriv - when ('00', '0', '11') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTRSB_32_ldst_unpriv - when ('01', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // STTRH_32_ldst_unpriv - when ('01', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTRH_32_ldst_unpriv - when ('01', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTRSH_64_ldst_unpriv - when ('01', '0', '11') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTRSH_32_ldst_unpriv - when ('1x', '0', '11') => __UNALLOCATED - when ('10', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // STTR_32_ldst_unpriv - when ('10', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTR_32_ldst_unpriv - when ('10', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTRSW_64_ldst_unpriv - when ('11', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // STTR_64_ldst_unpriv - when ('11', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv // LDTR_64_ldst_unpriv - when ('11', '0', '10') => __UNALLOCATED - when ('xx11', _, _, _, '0x', _, '0xxxxx', _, '11', _) => // ldst_immpre - __field size 30 +: 2 - __field V 26 +: 1 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, V, opc) of - when ('x1', '1', '1x') => __UNALLOCATED - when ('00', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // STRB_32_ldst_immpre - when ('00', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDRB_32_ldst_immpre - when ('00', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDRSB_64_ldst_immpre - when ('00', '0', '11') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDRSB_32_ldst_immpre - when ('00', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // STR_B_ldst_immpre - when ('00', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // LDR_B_ldst_immpre - when ('00', '1', '10') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // STR_Q_ldst_immpre - when ('00', '1', '11') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // LDR_Q_ldst_immpre - when ('01', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // STRH_32_ldst_immpre - when ('01', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDRH_32_ldst_immpre - when ('01', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDRSH_64_ldst_immpre - when ('01', '0', '11') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDRSH_32_ldst_immpre - when ('01', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // STR_H_ldst_immpre - when ('01', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // LDR_H_ldst_immpre - when ('1x', '0', '11') => __UNALLOCATED - when ('1x', '1', '1x') => __UNALLOCATED - when ('10', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // STR_32_ldst_immpre - when ('10', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDR_32_ldst_immpre - when ('10', '0', '10') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDRSW_64_ldst_immpre - when ('10', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // STR_S_ldst_immpre - when ('10', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // LDR_S_ldst_immpre - when ('11', '0', '00') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // STR_64_ldst_immpre - when ('11', '0', '01') => __encoding aarch64_memory_single_general_immediate_signed_pre_idx // LDR_64_ldst_immpre - when ('11', '0', '10') => __UNALLOCATED - when ('11', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // STR_D_ldst_immpre - when ('11', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx // LDR_D_ldst_immpre - when ('xx11', _, _, _, '0x', _, '1xxxxx', _, '00', _) => // memop - __field size 30 +: 2 - __field V 26 +: 1 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field o3 15 +: 1 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, V, A, R, o3, opc) of - when (_, '0', _, _, '1', '001') => __UNALLOCATED - when (_, '0', _, _, '1', '01x') => __UNALLOCATED - when (_, '0', _, _, '1', '101') => __UNALLOCATED - when (_, '0', _, _, '1', '11x') => __UNALLOCATED - when (_, '0', '0', _, '1', '100') => __UNALLOCATED - when (_, '0', '1', '1', '1', '100') => __UNALLOCATED - when (_, '1', _, _, _, _) => __UNALLOCATED - when ('00', '0', '0', '0', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDB_32_memop - when ('00', '0', '0', '0', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRB_32_memop - when ('00', '0', '0', '0', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORB_32_memop - when ('00', '0', '0', '0', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETB_32_memop - when ('00', '0', '0', '0', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXB_32_memop - when ('00', '0', '0', '0', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINB_32_memop - when ('00', '0', '0', '0', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXB_32_memop - when ('00', '0', '0', '0', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINB_32_memop - when ('00', '0', '0', '0', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPB_32_memop - when ('00', '0', '0', '1', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDLB_32_memop - when ('00', '0', '0', '1', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRLB_32_memop - when ('00', '0', '0', '1', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORLB_32_memop - when ('00', '0', '0', '1', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETLB_32_memop - when ('00', '0', '0', '1', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXLB_32_memop - when ('00', '0', '0', '1', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINLB_32_memop - when ('00', '0', '0', '1', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXLB_32_memop - when ('00', '0', '0', '1', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINLB_32_memop - when ('00', '0', '0', '1', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPLB_32_memop - when ('00', '0', '1', '0', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDAB_32_memop - when ('00', '0', '1', '0', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRAB_32_memop - when ('00', '0', '1', '0', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORAB_32_memop - when ('00', '0', '1', '0', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETAB_32_memop - when ('00', '0', '1', '0', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXAB_32_memop - when ('00', '0', '1', '0', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINAB_32_memop - when ('00', '0', '1', '0', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXAB_32_memop - when ('00', '0', '1', '0', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINAB_32_memop - when ('00', '0', '1', '0', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPAB_32_memop - when ('00', '0', '1', '0', '1', '100') => __encoding aarch64_memory_ordered_rcpc // LDAPRB_32L_memop - when ('00', '0', '1', '1', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDALB_32_memop - when ('00', '0', '1', '1', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRALB_32_memop - when ('00', '0', '1', '1', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORALB_32_memop - when ('00', '0', '1', '1', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETALB_32_memop - when ('00', '0', '1', '1', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXALB_32_memop - when ('00', '0', '1', '1', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINALB_32_memop - when ('00', '0', '1', '1', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXALB_32_memop - when ('00', '0', '1', '1', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINALB_32_memop - when ('00', '0', '1', '1', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPALB_32_memop - when ('01', '0', '0', '0', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDH_32_memop - when ('01', '0', '0', '0', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRH_32_memop - when ('01', '0', '0', '0', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORH_32_memop - when ('01', '0', '0', '0', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETH_32_memop - when ('01', '0', '0', '0', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXH_32_memop - when ('01', '0', '0', '0', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINH_32_memop - when ('01', '0', '0', '0', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXH_32_memop - when ('01', '0', '0', '0', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINH_32_memop - when ('01', '0', '0', '0', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPH_32_memop - when ('01', '0', '0', '1', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDLH_32_memop - when ('01', '0', '0', '1', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRLH_32_memop - when ('01', '0', '0', '1', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORLH_32_memop - when ('01', '0', '0', '1', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETLH_32_memop - when ('01', '0', '0', '1', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXLH_32_memop - when ('01', '0', '0', '1', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINLH_32_memop - when ('01', '0', '0', '1', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXLH_32_memop - when ('01', '0', '0', '1', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINLH_32_memop - when ('01', '0', '0', '1', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPLH_32_memop - when ('01', '0', '1', '0', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDAH_32_memop - when ('01', '0', '1', '0', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRAH_32_memop - when ('01', '0', '1', '0', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORAH_32_memop - when ('01', '0', '1', '0', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETAH_32_memop - when ('01', '0', '1', '0', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXAH_32_memop - when ('01', '0', '1', '0', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINAH_32_memop - when ('01', '0', '1', '0', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXAH_32_memop - when ('01', '0', '1', '0', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINAH_32_memop - when ('01', '0', '1', '0', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPAH_32_memop - when ('01', '0', '1', '0', '1', '100') => __encoding aarch64_memory_ordered_rcpc // LDAPRH_32L_memop - when ('01', '0', '1', '1', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDALH_32_memop - when ('01', '0', '1', '1', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRALH_32_memop - when ('01', '0', '1', '1', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORALH_32_memop - when ('01', '0', '1', '1', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETALH_32_memop - when ('01', '0', '1', '1', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXALH_32_memop - when ('01', '0', '1', '1', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINALH_32_memop - when ('01', '0', '1', '1', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXALH_32_memop - when ('01', '0', '1', '1', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINALH_32_memop - when ('01', '0', '1', '1', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPALH_32_memop - when ('10', '0', '0', '0', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADD_32_memop - when ('10', '0', '0', '0', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLR_32_memop - when ('10', '0', '0', '0', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEOR_32_memop - when ('10', '0', '0', '0', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSET_32_memop - when ('10', '0', '0', '0', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAX_32_memop - when ('10', '0', '0', '0', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMIN_32_memop - when ('10', '0', '0', '0', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAX_32_memop - when ('10', '0', '0', '0', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMIN_32_memop - when ('10', '0', '0', '0', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWP_32_memop - when ('10', '0', '0', '1', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDL_32_memop - when ('10', '0', '0', '1', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRL_32_memop - when ('10', '0', '0', '1', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORL_32_memop - when ('10', '0', '0', '1', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETL_32_memop - when ('10', '0', '0', '1', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXL_32_memop - when ('10', '0', '0', '1', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINL_32_memop - when ('10', '0', '0', '1', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXL_32_memop - when ('10', '0', '0', '1', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINL_32_memop - when ('10', '0', '0', '1', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPL_32_memop - when ('10', '0', '1', '0', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDA_32_memop - when ('10', '0', '1', '0', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRA_32_memop - when ('10', '0', '1', '0', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORA_32_memop - when ('10', '0', '1', '0', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETA_32_memop - when ('10', '0', '1', '0', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXA_32_memop - when ('10', '0', '1', '0', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINA_32_memop - when ('10', '0', '1', '0', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXA_32_memop - when ('10', '0', '1', '0', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINA_32_memop - when ('10', '0', '1', '0', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPA_32_memop - when ('10', '0', '1', '0', '1', '100') => __encoding aarch64_memory_ordered_rcpc // LDAPR_32L_memop - when ('10', '0', '1', '1', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDAL_32_memop - when ('10', '0', '1', '1', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRAL_32_memop - when ('10', '0', '1', '1', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORAL_32_memop - when ('10', '0', '1', '1', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETAL_32_memop - when ('10', '0', '1', '1', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXAL_32_memop - when ('10', '0', '1', '1', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINAL_32_memop - when ('10', '0', '1', '1', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXAL_32_memop - when ('10', '0', '1', '1', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINAL_32_memop - when ('10', '0', '1', '1', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPAL_32_memop - when ('11', '0', '0', '0', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADD_64_memop - when ('11', '0', '0', '0', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLR_64_memop - when ('11', '0', '0', '0', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEOR_64_memop - when ('11', '0', '0', '0', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSET_64_memop - when ('11', '0', '0', '0', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAX_64_memop - when ('11', '0', '0', '0', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMIN_64_memop - when ('11', '0', '0', '0', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAX_64_memop - when ('11', '0', '0', '0', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMIN_64_memop - when ('11', '0', '0', '0', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWP_64_memop - when ('11', '0', '0', '1', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDL_64_memop - when ('11', '0', '0', '1', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRL_64_memop - when ('11', '0', '0', '1', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORL_64_memop - when ('11', '0', '0', '1', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETL_64_memop - when ('11', '0', '0', '1', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXL_64_memop - when ('11', '0', '0', '1', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINL_64_memop - when ('11', '0', '0', '1', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXL_64_memop - when ('11', '0', '0', '1', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINL_64_memop - when ('11', '0', '0', '1', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPL_64_memop - when ('11', '0', '1', '0', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDA_64_memop - when ('11', '0', '1', '0', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRA_64_memop - when ('11', '0', '1', '0', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORA_64_memop - when ('11', '0', '1', '0', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETA_64_memop - when ('11', '0', '1', '0', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXA_64_memop - when ('11', '0', '1', '0', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINA_64_memop - when ('11', '0', '1', '0', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXA_64_memop - when ('11', '0', '1', '0', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINA_64_memop - when ('11', '0', '1', '0', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPA_64_memop - when ('11', '0', '1', '0', '1', '100') => __encoding aarch64_memory_ordered_rcpc // LDAPR_64L_memop - when ('11', '0', '1', '1', '0', '000') => __encoding aarch64_memory_atomicops_ld // LDADDAL_64_memop - when ('11', '0', '1', '1', '0', '001') => __encoding aarch64_memory_atomicops_ld // LDCLRAL_64_memop - when ('11', '0', '1', '1', '0', '010') => __encoding aarch64_memory_atomicops_ld // LDEORAL_64_memop - when ('11', '0', '1', '1', '0', '011') => __encoding aarch64_memory_atomicops_ld // LDSETAL_64_memop - when ('11', '0', '1', '1', '0', '100') => __encoding aarch64_memory_atomicops_ld // LDSMAXAL_64_memop - when ('11', '0', '1', '1', '0', '101') => __encoding aarch64_memory_atomicops_ld // LDSMINAL_64_memop - when ('11', '0', '1', '1', '0', '110') => __encoding aarch64_memory_atomicops_ld // LDUMAXAL_64_memop - when ('11', '0', '1', '1', '0', '111') => __encoding aarch64_memory_atomicops_ld // LDUMINAL_64_memop - when ('11', '0', '1', '1', '1', '000') => __encoding aarch64_memory_atomicops_swp // SWPAL_64_memop - when ('xx11', _, _, _, '0x', _, '1xxxxx', _, '10', _) => // ldst_regoff - __field size 30 +: 2 - __field V 26 +: 1 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, V, opc, option) of - when (_, _, _, 'x0x') => __UNALLOCATED - when ('x1', '1', '1x', _) => __UNALLOCATED - when ('00', '0', '00', !'011') => __encoding aarch64_memory_single_general_register // STRB_32B_ldst_regoff - when ('00', '0', '00', '011') => __encoding aarch64_memory_single_general_register // STRB_32BL_ldst_regoff - when ('00', '0', '01', !'011') => __encoding aarch64_memory_single_general_register // LDRB_32B_ldst_regoff - when ('00', '0', '01', '011') => __encoding aarch64_memory_single_general_register // LDRB_32BL_ldst_regoff - when ('00', '0', '10', !'011') => __encoding aarch64_memory_single_general_register // LDRSB_64B_ldst_regoff - when ('00', '0', '10', '011') => __encoding aarch64_memory_single_general_register // LDRSB_64BL_ldst_regoff - when ('00', '0', '11', !'011') => __encoding aarch64_memory_single_general_register // LDRSB_32B_ldst_regoff - when ('00', '0', '11', '011') => __encoding aarch64_memory_single_general_register // LDRSB_32BL_ldst_regoff - when ('00', '1', '00', !'011') => __encoding aarch64_memory_single_simdfp_register // STR_B_ldst_regoff - when ('00', '1', '00', '011') => __encoding aarch64_memory_single_simdfp_register // STR_BL_ldst_regoff - when ('00', '1', '01', !'011') => __encoding aarch64_memory_single_simdfp_register // LDR_B_ldst_regoff - when ('00', '1', '01', '011') => __encoding aarch64_memory_single_simdfp_register // LDR_BL_ldst_regoff - when ('00', '1', '10', _) => __encoding aarch64_memory_single_simdfp_register // STR_Q_ldst_regoff - when ('00', '1', '11', _) => __encoding aarch64_memory_single_simdfp_register // LDR_Q_ldst_regoff - when ('01', '0', '00', _) => __encoding aarch64_memory_single_general_register // STRH_32_ldst_regoff - when ('01', '0', '01', _) => __encoding aarch64_memory_single_general_register // LDRH_32_ldst_regoff - when ('01', '0', '10', _) => __encoding aarch64_memory_single_general_register // LDRSH_64_ldst_regoff - when ('01', '0', '11', _) => __encoding aarch64_memory_single_general_register // LDRSH_32_ldst_regoff - when ('01', '1', '00', _) => __encoding aarch64_memory_single_simdfp_register // STR_H_ldst_regoff - when ('01', '1', '01', _) => __encoding aarch64_memory_single_simdfp_register // LDR_H_ldst_regoff - when ('1x', '0', '11', _) => __UNALLOCATED - when ('1x', '1', '1x', _) => __UNALLOCATED - when ('10', '0', '00', _) => __encoding aarch64_memory_single_general_register // STR_32_ldst_regoff - when ('10', '0', '01', _) => __encoding aarch64_memory_single_general_register // LDR_32_ldst_regoff - when ('10', '0', '10', _) => __encoding aarch64_memory_single_general_register // LDRSW_64_ldst_regoff - when ('10', '1', '00', _) => __encoding aarch64_memory_single_simdfp_register // STR_S_ldst_regoff - when ('10', '1', '01', _) => __encoding aarch64_memory_single_simdfp_register // LDR_S_ldst_regoff - when ('11', '0', '00', _) => __encoding aarch64_memory_single_general_register // STR_64_ldst_regoff - when ('11', '0', '01', _) => __encoding aarch64_memory_single_general_register // LDR_64_ldst_regoff - when ('11', '0', '10', _) => __encoding aarch64_memory_single_general_register // PRFM_P_ldst_regoff - when ('11', '1', '00', _) => __encoding aarch64_memory_single_simdfp_register // STR_D_ldst_regoff - when ('11', '1', '01', _) => __encoding aarch64_memory_single_simdfp_register // LDR_D_ldst_regoff - when ('xx11', _, _, _, '0x', _, '1xxxxx', _, 'x1', _) => // ldst_pac - __field size 30 +: 2 - __field V 26 +: 1 - __field M 23 +: 1 - __field S 22 +: 1 - __field imm9 12 +: 9 - __field W 11 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, V, M, W) of - when (!'11', _, _, _) => __UNALLOCATED - when ('11', '0', '0', '0') => __encoding aarch64_memory_single_general_immediate_signed_pac // LDRAA_64_ldst_pac - when ('11', '0', '0', '1') => __encoding aarch64_memory_single_general_immediate_signed_pac // LDRAA_64W_ldst_pac - when ('11', '0', '1', '0') => __encoding aarch64_memory_single_general_immediate_signed_pac // LDRAB_64_ldst_pac - when ('11', '0', '1', '1') => __encoding aarch64_memory_single_general_immediate_signed_pac // LDRAB_64W_ldst_pac - when ('11', '1', _, _) => __UNALLOCATED - when ('xx11', _, _, _, '1x', _, _, _, _, _) => // ldst_pos - __field size 30 +: 2 - __field V 26 +: 1 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - case (size, V, opc) of - when ('x1', '1', '1x') => __UNALLOCATED - when ('00', '0', '00') => __encoding aarch64_memory_single_general_immediate_unsigned // STRB_32_ldst_pos - when ('00', '0', '01') => __encoding aarch64_memory_single_general_immediate_unsigned // LDRB_32_ldst_pos - when ('00', '0', '10') => __encoding aarch64_memory_single_general_immediate_unsigned // LDRSB_64_ldst_pos - when ('00', '0', '11') => __encoding aarch64_memory_single_general_immediate_unsigned // LDRSB_32_ldst_pos - when ('00', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // STR_B_ldst_pos - when ('00', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // LDR_B_ldst_pos - when ('00', '1', '10') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // STR_Q_ldst_pos - when ('00', '1', '11') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // LDR_Q_ldst_pos - when ('01', '0', '00') => __encoding aarch64_memory_single_general_immediate_unsigned // STRH_32_ldst_pos - when ('01', '0', '01') => __encoding aarch64_memory_single_general_immediate_unsigned // LDRH_32_ldst_pos - when ('01', '0', '10') => __encoding aarch64_memory_single_general_immediate_unsigned // LDRSH_64_ldst_pos - when ('01', '0', '11') => __encoding aarch64_memory_single_general_immediate_unsigned // LDRSH_32_ldst_pos - when ('01', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // STR_H_ldst_pos - when ('01', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // LDR_H_ldst_pos - when ('1x', '0', '11') => __UNALLOCATED - when ('1x', '1', '1x') => __UNALLOCATED - when ('10', '0', '00') => __encoding aarch64_memory_single_general_immediate_unsigned // STR_32_ldst_pos - when ('10', '0', '01') => __encoding aarch64_memory_single_general_immediate_unsigned // LDR_32_ldst_pos - when ('10', '0', '10') => __encoding aarch64_memory_single_general_immediate_unsigned // LDRSW_64_ldst_pos - when ('10', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // STR_S_ldst_pos - when ('10', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // LDR_S_ldst_pos - when ('11', '0', '00') => __encoding aarch64_memory_single_general_immediate_unsigned // STR_64_ldst_pos - when ('11', '0', '01') => __encoding aarch64_memory_single_general_immediate_unsigned // LDR_64_ldst_pos - when ('11', '0', '10') => __encoding aarch64_memory_single_general_immediate_unsigned // PRFM_P_ldst_pos - when ('11', '1', '00') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // STR_D_ldst_pos - when ('11', '1', '01') => __encoding aarch64_memory_single_simdfp_immediate_unsigned // LDR_D_ldst_pos - when (_, 'x101x', _) => - // dpreg - case (31 +: 1, 30 +: 1, 29 +: 1, 28 +: 1, 25 +: 3, 21 +: 4, 16 +: 5, 10 +: 6, 0 +: 10) of - when (_, '0', _, '1', _, '0110', _, _, _) => // dp_2src - __field sf 31 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field opcode 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, S, opcode) of - when (_, _, '000001') => __UNALLOCATED - when (_, _, '011xxx') => __UNALLOCATED - when (_, _, '1xxxxx') => __UNALLOCATED - when (_, '0', '00011x') => __UNALLOCATED - when (_, '0', '001101') => __UNALLOCATED - when (_, '0', '00111x') => __UNALLOCATED - when (_, '1', '00001x') => __UNALLOCATED - when (_, '1', '0001xx') => __UNALLOCATED - when (_, '1', '001xxx') => __UNALLOCATED - when (_, '1', '01xxxx') => __UNALLOCATED - when ('0', _, '000000') => __UNALLOCATED - when ('0', '0', '000010') => __encoding aarch64_integer_arithmetic_div // UDIV_32_dp_2src - when ('0', '0', '000011') => __encoding aarch64_integer_arithmetic_div // SDIV_32_dp_2src - when ('0', '0', '00010x') => __UNALLOCATED - when ('0', '0', '001000') => __encoding aarch64_integer_shift_variable // LSLV_32_dp_2src - when ('0', '0', '001001') => __encoding aarch64_integer_shift_variable // LSRV_32_dp_2src - when ('0', '0', '001010') => __encoding aarch64_integer_shift_variable // ASRV_32_dp_2src - when ('0', '0', '001011') => __encoding aarch64_integer_shift_variable // RORV_32_dp_2src - when ('0', '0', '001100') => __UNALLOCATED - when ('0', '0', '010x11') => __UNALLOCATED - when ('0', '0', '010000') => __encoding aarch64_integer_crc // CRC32B_32C_dp_2src - when ('0', '0', '010001') => __encoding aarch64_integer_crc // CRC32H_32C_dp_2src - when ('0', '0', '010010') => __encoding aarch64_integer_crc // CRC32W_32C_dp_2src - when ('0', '0', '010100') => __encoding aarch64_integer_crc // CRC32CB_32C_dp_2src - when ('0', '0', '010101') => __encoding aarch64_integer_crc // CRC32CH_32C_dp_2src - when ('0', '0', '010110') => __encoding aarch64_integer_crc // CRC32CW_32C_dp_2src - when ('1', '0', '000000') => __encoding aarch64_integer_arithmetic_pointer_mcsubtracttaggedaddress // SUBP_64S_dp_2src - when ('1', '0', '000010') => __encoding aarch64_integer_arithmetic_div // UDIV_64_dp_2src - when ('1', '0', '000011') => __encoding aarch64_integer_arithmetic_div // SDIV_64_dp_2src - when ('1', '0', '000100') => __encoding aarch64_integer_tags_mcinsertrandomtag // IRG_64I_dp_2src - when ('1', '0', '000101') => __encoding aarch64_integer_tags_mcinserttagmask // GMI_64G_dp_2src - when ('1', '0', '001000') => __encoding aarch64_integer_shift_variable // LSLV_64_dp_2src - when ('1', '0', '001001') => __encoding aarch64_integer_shift_variable // LSRV_64_dp_2src - when ('1', '0', '001010') => __encoding aarch64_integer_shift_variable // ASRV_64_dp_2src - when ('1', '0', '001011') => __encoding aarch64_integer_shift_variable // RORV_64_dp_2src - when ('1', '0', '001100') => __encoding aarch64_integer_pac_pacga_dp_2src // PACGA_64P_dp_2src - when ('1', '0', '010xx0') => __UNALLOCATED - when ('1', '0', '010x0x') => __UNALLOCATED - when ('1', '0', '010011') => __encoding aarch64_integer_crc // CRC32X_64C_dp_2src - when ('1', '0', '010111') => __encoding aarch64_integer_crc // CRC32CX_64C_dp_2src - when ('1', '1', '000000') => __encoding aarch64_integer_arithmetic_pointer_mcsubtracttaggedaddresssetflags // SUBPS_64S_dp_2src - when (_, '1', _, '1', _, '0110', _, _, _) => // dp_1src - __field sf 31 +: 1 - __field S 29 +: 1 - __field opcode2 16 +: 5 - __field opcode 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, S, opcode2, opcode, Rn) of - when (_, _, _, '1xxxxx', _) => __UNALLOCATED - when (_, _, 'xxx1x', _, _) => __UNALLOCATED - when (_, _, 'xx1xx', _, _) => __UNALLOCATED - when (_, _, 'x1xxx', _, _) => __UNALLOCATED - when (_, _, '1xxxx', _, _) => __UNALLOCATED - when (_, '0', '00000', '00011x', _) => __UNALLOCATED - when (_, '0', '00000', '001xxx', _) => __UNALLOCATED - when (_, '0', '00000', '01xxxx', _) => __UNALLOCATED - when (_, '1', _, _, _) => __UNALLOCATED - when ('0', _, '00001', _, _) => __UNALLOCATED - when ('0', '0', '00000', '000000', _) => __encoding aarch64_integer_arithmetic_rbit // RBIT_32_dp_1src - when ('0', '0', '00000', '000001', _) => __encoding aarch64_integer_arithmetic_rev // REV16_32_dp_1src - when ('0', '0', '00000', '000010', _) => __encoding aarch64_integer_arithmetic_rev // REV_32_dp_1src - when ('0', '0', '00000', '000011', _) => __UNALLOCATED - when ('0', '0', '00000', '000100', _) => __encoding aarch64_integer_arithmetic_cnt // CLZ_32_dp_1src - when ('0', '0', '00000', '000101', _) => __encoding aarch64_integer_arithmetic_cnt // CLS_32_dp_1src - when ('1', '0', '00000', '000000', _) => __encoding aarch64_integer_arithmetic_rbit // RBIT_64_dp_1src - when ('1', '0', '00000', '000001', _) => __encoding aarch64_integer_arithmetic_rev // REV16_64_dp_1src - when ('1', '0', '00000', '000010', _) => __encoding aarch64_integer_arithmetic_rev // REV32_64_dp_1src - when ('1', '0', '00000', '000011', _) => __encoding aarch64_integer_arithmetic_rev // REV_64_dp_1src - when ('1', '0', '00000', '000100', _) => __encoding aarch64_integer_arithmetic_cnt // CLZ_64_dp_1src - when ('1', '0', '00000', '000101', _) => __encoding aarch64_integer_arithmetic_cnt // CLS_64_dp_1src - when ('1', '0', '00001', '000000', _) => __encoding aarch64_integer_pac_pacia_dp_1src // PACIA_64P_dp_1src - when ('1', '0', '00001', '000001', _) => __encoding aarch64_integer_pac_pacib_dp_1src // PACIB_64P_dp_1src - when ('1', '0', '00001', '000010', _) => __encoding aarch64_integer_pac_pacda_dp_1src // PACDA_64P_dp_1src - when ('1', '0', '00001', '000011', _) => __encoding aarch64_integer_pac_pacdb_dp_1src // PACDB_64P_dp_1src - when ('1', '0', '00001', '000100', _) => __encoding aarch64_integer_pac_autia_dp_1src // AUTIA_64P_dp_1src - when ('1', '0', '00001', '000101', _) => __encoding aarch64_integer_pac_autib_dp_1src // AUTIB_64P_dp_1src - when ('1', '0', '00001', '000110', _) => __encoding aarch64_integer_pac_autda_dp_1src // AUTDA_64P_dp_1src - when ('1', '0', '00001', '000111', _) => __encoding aarch64_integer_pac_autdb_dp_1src // AUTDB_64P_dp_1src - when ('1', '0', '00001', '001000', '11111') => __encoding aarch64_integer_pac_pacia_dp_1src // PACIZA_64Z_dp_1src - when ('1', '0', '00001', '001001', '11111') => __encoding aarch64_integer_pac_pacib_dp_1src // PACIZB_64Z_dp_1src - when ('1', '0', '00001', '001010', '11111') => __encoding aarch64_integer_pac_pacda_dp_1src // PACDZA_64Z_dp_1src - when ('1', '0', '00001', '001011', '11111') => __encoding aarch64_integer_pac_pacdb_dp_1src // PACDZB_64Z_dp_1src - when ('1', '0', '00001', '001100', '11111') => __encoding aarch64_integer_pac_autia_dp_1src // AUTIZA_64Z_dp_1src - when ('1', '0', '00001', '001101', '11111') => __encoding aarch64_integer_pac_autib_dp_1src // AUTIZB_64Z_dp_1src - when ('1', '0', '00001', '001110', '11111') => __encoding aarch64_integer_pac_autda_dp_1src // AUTDZA_64Z_dp_1src - when ('1', '0', '00001', '001111', '11111') => __encoding aarch64_integer_pac_autdb_dp_1src // AUTDZB_64Z_dp_1src - when ('1', '0', '00001', '010000', '11111') => __encoding aarch64_integer_pac_strip_dp_1src // XPACI_64Z_dp_1src - when ('1', '0', '00001', '010001', '11111') => __encoding aarch64_integer_pac_strip_dp_1src // XPACD_64Z_dp_1src - when ('1', '0', '00001', '01001x', _) => __UNALLOCATED - when ('1', '0', '00001', '0101xx', _) => __UNALLOCATED - when ('1', '0', '00001', '011xxx', _) => __UNALLOCATED - when (_, _, _, '0', _, '0xxx', _, _, _) => // log_shift - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, opc, N, imm6) of - when ('0', _, _, '1xxxxx') => __UNALLOCATED - when ('0', '00', '0', _) => __encoding aarch64_integer_logical_shiftedreg // AND_32_log_shift - when ('0', '00', '1', _) => __encoding aarch64_integer_logical_shiftedreg // BIC_32_log_shift - when ('0', '01', '0', _) => __encoding aarch64_integer_logical_shiftedreg // ORR_32_log_shift - when ('0', '01', '1', _) => __encoding aarch64_integer_logical_shiftedreg // ORN_32_log_shift - when ('0', '10', '0', _) => __encoding aarch64_integer_logical_shiftedreg // EOR_32_log_shift - when ('0', '10', '1', _) => __encoding aarch64_integer_logical_shiftedreg // EON_32_log_shift - when ('0', '11', '0', _) => __encoding aarch64_integer_logical_shiftedreg // ANDS_32_log_shift - when ('0', '11', '1', _) => __encoding aarch64_integer_logical_shiftedreg // BICS_32_log_shift - when ('1', '00', '0', _) => __encoding aarch64_integer_logical_shiftedreg // AND_64_log_shift - when ('1', '00', '1', _) => __encoding aarch64_integer_logical_shiftedreg // BIC_64_log_shift - when ('1', '01', '0', _) => __encoding aarch64_integer_logical_shiftedreg // ORR_64_log_shift - when ('1', '01', '1', _) => __encoding aarch64_integer_logical_shiftedreg // ORN_64_log_shift - when ('1', '10', '0', _) => __encoding aarch64_integer_logical_shiftedreg // EOR_64_log_shift - when ('1', '10', '1', _) => __encoding aarch64_integer_logical_shiftedreg // EON_64_log_shift - when ('1', '11', '0', _) => __encoding aarch64_integer_logical_shiftedreg // ANDS_64_log_shift - when ('1', '11', '1', _) => __encoding aarch64_integer_logical_shiftedreg // BICS_64_log_shift - when (_, _, _, '0', _, '1xx0', _, _, _) => // addsub_shift - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field shift 22 +: 2 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, op, S, shift, imm6) of - when (_, _, _, '11', _) => __UNALLOCATED - when ('0', _, _, _, '1xxxxx') => __UNALLOCATED - when ('0', '0', '0', _, _) => __encoding aarch64_integer_arithmetic_add_sub_shiftedreg // ADD_32_addsub_shift - when ('0', '0', '1', _, _) => __encoding aarch64_integer_arithmetic_add_sub_shiftedreg // ADDS_32_addsub_shift - when ('0', '1', '0', _, _) => __encoding aarch64_integer_arithmetic_add_sub_shiftedreg // SUB_32_addsub_shift - when ('0', '1', '1', _, _) => __encoding aarch64_integer_arithmetic_add_sub_shiftedreg // SUBS_32_addsub_shift - when ('1', '0', '0', _, _) => __encoding aarch64_integer_arithmetic_add_sub_shiftedreg // ADD_64_addsub_shift - when ('1', '0', '1', _, _) => __encoding aarch64_integer_arithmetic_add_sub_shiftedreg // ADDS_64_addsub_shift - when ('1', '1', '0', _, _) => __encoding aarch64_integer_arithmetic_add_sub_shiftedreg // SUB_64_addsub_shift - when ('1', '1', '1', _, _) => __encoding aarch64_integer_arithmetic_add_sub_shiftedreg // SUBS_64_addsub_shift - when (_, _, _, '0', _, '1xx1', _, _, _) => // addsub_ext - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field opt 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field imm3 10 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, op, S, opt, imm3) of - when (_, _, _, _, '1x1') => __UNALLOCATED - when (_, _, _, _, '11x') => __UNALLOCATED - when (_, _, _, 'x1', _) => __UNALLOCATED - when (_, _, _, '1x', _) => __UNALLOCATED - when ('0', '0', '0', '00', _) => __encoding aarch64_integer_arithmetic_add_sub_extendedreg // ADD_32_addsub_ext - when ('0', '0', '1', '00', _) => __encoding aarch64_integer_arithmetic_add_sub_extendedreg // ADDS_32S_addsub_ext - when ('0', '1', '0', '00', _) => __encoding aarch64_integer_arithmetic_add_sub_extendedreg // SUB_32_addsub_ext - when ('0', '1', '1', '00', _) => __encoding aarch64_integer_arithmetic_add_sub_extendedreg // SUBS_32S_addsub_ext - when ('1', '0', '0', '00', _) => __encoding aarch64_integer_arithmetic_add_sub_extendedreg // ADD_64_addsub_ext - when ('1', '0', '1', '00', _) => __encoding aarch64_integer_arithmetic_add_sub_extendedreg // ADDS_64S_addsub_ext - when ('1', '1', '0', '00', _) => __encoding aarch64_integer_arithmetic_add_sub_extendedreg // SUB_64_addsub_ext - when ('1', '1', '1', '00', _) => __encoding aarch64_integer_arithmetic_add_sub_extendedreg // SUBS_64S_addsub_ext - when (_, _, _, '1', _, '0000', _, '000000', _) => // addsub_carry - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, op, S) of - when ('0', '0', '0') => __encoding aarch64_integer_arithmetic_add_sub_carry // ADC_32_addsub_carry - when ('0', '0', '1') => __encoding aarch64_integer_arithmetic_add_sub_carry // ADCS_32_addsub_carry - when ('0', '1', '0') => __encoding aarch64_integer_arithmetic_add_sub_carry // SBC_32_addsub_carry - when ('0', '1', '1') => __encoding aarch64_integer_arithmetic_add_sub_carry // SBCS_32_addsub_carry - when ('1', '0', '0') => __encoding aarch64_integer_arithmetic_add_sub_carry // ADC_64_addsub_carry - when ('1', '0', '1') => __encoding aarch64_integer_arithmetic_add_sub_carry // ADCS_64_addsub_carry - when ('1', '1', '0') => __encoding aarch64_integer_arithmetic_add_sub_carry // SBC_64_addsub_carry - when ('1', '1', '1') => __encoding aarch64_integer_arithmetic_add_sub_carry // SBCS_64_addsub_carry - when (_, _, _, '1', _, '0000', _, 'x00001', _) => // rmif - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field imm6 15 +: 6 - __field Rn 5 +: 5 - __field o2 4 +: 1 - __field mask 0 +: 4 - case (sf, op, S, o2) of - when ('0', _, _, _) => __UNALLOCATED - when ('1', '0', '0', _) => __UNALLOCATED - when ('1', '0', '1', '0') => __encoding aarch64_integer_flags_rmif // RMIF_only_rmif - when ('1', '0', '1', '1') => __UNALLOCATED - when ('1', '1', _, _) => __UNALLOCATED - when (_, _, _, '1', _, '0000', _, 'xx0010', _) => // setf - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field opcode2 15 +: 6 - __field sz 14 +: 1 - __field Rn 5 +: 5 - __field o3 4 +: 1 - __field mask 0 +: 4 - case (sf, op, S, opcode2, sz, o3, mask) of - when ('0', '0', '0', _, _, _, _) => __UNALLOCATED - when ('0', '0', '1', !'000000', _, _, _) => __UNALLOCATED - when ('0', '0', '1', '000000', _, '0', !'1101') => __UNALLOCATED - when ('0', '0', '1', '000000', _, '1', _) => __UNALLOCATED - when ('0', '0', '1', '000000', '0', '0', '1101') => __encoding aarch64_integer_flags_setf // SETF8_only_setf - when ('0', '0', '1', '000000', '1', '0', '1101') => __encoding aarch64_integer_flags_setf // SETF16_only_setf - when ('0', '1', _, _, _, _, _) => __UNALLOCATED - when ('1', _, _, _, _, _, _) => __UNALLOCATED - when (_, _, _, '1', _, '0010', _, 'xxxx0x', _) => // condcmp_reg - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field o2 10 +: 1 - __field Rn 5 +: 5 - __field o3 4 +: 1 - __field nzcv 0 +: 4 - case (sf, op, S, o2, o3) of - when (_, _, _, _, '1') => __UNALLOCATED - when (_, _, _, '1', _) => __UNALLOCATED - when (_, _, '0', _, _) => __UNALLOCATED - when ('0', '0', '1', '0', '0') => __encoding aarch64_integer_conditional_compare_register // CCMN_32_condcmp_reg - when ('0', '1', '1', '0', '0') => __encoding aarch64_integer_conditional_compare_register // CCMP_32_condcmp_reg - when ('1', '0', '1', '0', '0') => __encoding aarch64_integer_conditional_compare_register // CCMN_64_condcmp_reg - when ('1', '1', '1', '0', '0') => __encoding aarch64_integer_conditional_compare_register // CCMP_64_condcmp_reg - when (_, _, _, '1', _, '0010', _, 'xxxx1x', _) => // condcmp_imm - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field imm5 16 +: 5 - __field cond 12 +: 4 - __field o2 10 +: 1 - __field Rn 5 +: 5 - __field o3 4 +: 1 - __field nzcv 0 +: 4 - case (sf, op, S, o2, o3) of - when (_, _, _, _, '1') => __UNALLOCATED - when (_, _, _, '1', _) => __UNALLOCATED - when (_, _, '0', _, _) => __UNALLOCATED - when ('0', '0', '1', '0', '0') => __encoding aarch64_integer_conditional_compare_immediate // CCMN_32_condcmp_imm - when ('0', '1', '1', '0', '0') => __encoding aarch64_integer_conditional_compare_immediate // CCMP_32_condcmp_imm - when ('1', '0', '1', '0', '0') => __encoding aarch64_integer_conditional_compare_immediate // CCMN_64_condcmp_imm - when ('1', '1', '1', '0', '0') => __encoding aarch64_integer_conditional_compare_immediate // CCMP_64_condcmp_imm - when (_, _, _, '1', _, '0100', _, _, _) => // condsel - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field op2 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, op, S, op2) of - when (_, _, _, '1x') => __UNALLOCATED - when (_, _, '1', _) => __UNALLOCATED - when ('0', '0', '0', '00') => __encoding aarch64_integer_conditional_select // CSEL_32_condsel - when ('0', '0', '0', '01') => __encoding aarch64_integer_conditional_select // CSINC_32_condsel - when ('0', '1', '0', '00') => __encoding aarch64_integer_conditional_select // CSINV_32_condsel - when ('0', '1', '0', '01') => __encoding aarch64_integer_conditional_select // CSNEG_32_condsel - when ('1', '0', '0', '00') => __encoding aarch64_integer_conditional_select // CSEL_64_condsel - when ('1', '0', '0', '01') => __encoding aarch64_integer_conditional_select // CSINC_64_condsel - when ('1', '1', '0', '00') => __encoding aarch64_integer_conditional_select // CSINV_64_condsel - when ('1', '1', '0', '01') => __encoding aarch64_integer_conditional_select // CSNEG_64_condsel - when (_, _, _, '1', _, '1xxx', _, _, _) => // dp_3src - __field sf 31 +: 1 - __field op54 29 +: 2 - __field op31 21 +: 3 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, op54, op31, o0) of - when (_, '00', '010', '1') => __UNALLOCATED - when (_, '00', '011', _) => __UNALLOCATED - when (_, '00', '100', _) => __UNALLOCATED - when (_, '00', '110', '1') => __UNALLOCATED - when (_, '00', '111', _) => __UNALLOCATED - when (_, '01', _, _) => __UNALLOCATED - when (_, '1x', _, _) => __UNALLOCATED - when ('0', '00', '000', '0') => __encoding aarch64_integer_arithmetic_mul_uniform_add_sub // MADD_32A_dp_3src - when ('0', '00', '000', '1') => __encoding aarch64_integer_arithmetic_mul_uniform_add_sub // MSUB_32A_dp_3src - when ('0', '00', '001', '0') => __UNALLOCATED - when ('0', '00', '001', '1') => __UNALLOCATED - when ('0', '00', '010', '0') => __UNALLOCATED - when ('0', '00', '101', '0') => __UNALLOCATED - when ('0', '00', '101', '1') => __UNALLOCATED - when ('0', '00', '110', '0') => __UNALLOCATED - when ('1', '00', '000', '0') => __encoding aarch64_integer_arithmetic_mul_uniform_add_sub // MADD_64A_dp_3src - when ('1', '00', '000', '1') => __encoding aarch64_integer_arithmetic_mul_uniform_add_sub // MSUB_64A_dp_3src - when ('1', '00', '001', '0') => __encoding aarch64_integer_arithmetic_mul_widening_32_64 // SMADDL_64WA_dp_3src - when ('1', '00', '001', '1') => __encoding aarch64_integer_arithmetic_mul_widening_32_64 // SMSUBL_64WA_dp_3src - when ('1', '00', '010', '0') => __encoding aarch64_integer_arithmetic_mul_widening_64_128hi // SMULH_64_dp_3src - when ('1', '00', '101', '0') => __encoding aarch64_integer_arithmetic_mul_widening_32_64 // UMADDL_64WA_dp_3src - when ('1', '00', '101', '1') => __encoding aarch64_integer_arithmetic_mul_widening_32_64 // UMSUBL_64WA_dp_3src - when ('1', '00', '110', '0') => __encoding aarch64_integer_arithmetic_mul_widening_64_128hi // UMULH_64_dp_3src - when (_, 'x111x', _) => - // simd-dp - case (28 +: 4, 25 +: 3, 23 +: 2, 19 +: 4, 10 +: 9, 0 +: 10) of - when ('0000', _, '0x', 'x101', '00xxxxx10', _) => __UNPREDICTABLE - when ('0010', _, '0x', 'x101', '00xxxxx10', _) => __UNPREDICTABLE - when ('0100', _, '0x', 'x101', '00xxxxx10', _) => // cryptoaes - __field size 22 +: 2 - __field opcode 12 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (size, opcode) of - when (_, 'x1xxx') => __UNALLOCATED - when (_, '000xx') => __UNALLOCATED - when (_, '1xxxx') => __UNALLOCATED - when ('x1', _) => __UNALLOCATED - when ('00', '00100') => __encoding aarch64_vector_crypto_aes_round // AESE_B_cryptoaes - when ('00', '00101') => __encoding aarch64_vector_crypto_aes_round // AESD_B_cryptoaes - when ('00', '00110') => __encoding aarch64_vector_crypto_aes_mix // AESMC_B_cryptoaes - when ('00', '00111') => __encoding aarch64_vector_crypto_aes_mix // AESIMC_B_cryptoaes - when ('1x', _) => __UNALLOCATED - when ('0101', _, '0x', 'x0xx', 'xxx0xxx00', _) => // cryptosha3 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field opcode 12 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (size, opcode) of - when (_, '111') => __UNALLOCATED - when ('x1', _) => __UNALLOCATED - when ('00', '000') => __encoding aarch64_vector_crypto_sha3op_sha1_hash_choose // SHA1C_QSV_cryptosha3 - when ('00', '001') => __encoding aarch64_vector_crypto_sha3op_sha1_hash_parity // SHA1P_QSV_cryptosha3 - when ('00', '010') => __encoding aarch64_vector_crypto_sha3op_sha1_hash_majority // SHA1M_QSV_cryptosha3 - when ('00', '011') => __encoding aarch64_vector_crypto_sha3op_sha1_sched0 // SHA1SU0_VVV_cryptosha3 - when ('00', '100') => __encoding aarch64_vector_crypto_sha3op_sha256_hash // SHA256H_QQV_cryptosha3 - when ('00', '101') => __encoding aarch64_vector_crypto_sha3op_sha256_hash // SHA256H2_QQV_cryptosha3 - when ('00', '110') => __encoding aarch64_vector_crypto_sha3op_sha256_sched1 // SHA256SU1_VVV_cryptosha3 - when ('1x', _) => __UNALLOCATED - when ('0101', _, '0x', 'x0xx', 'xxx0xxx10', _) => __UNPREDICTABLE - when ('0101', _, '0x', 'x101', '00xxxxx10', _) => // cryptosha2 - __field size 22 +: 2 - __field opcode 12 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (size, opcode) of - when (_, 'xx1xx') => __UNALLOCATED - when (_, 'x1xxx') => __UNALLOCATED - when (_, '1xxxx') => __UNALLOCATED - when ('x1', _) => __UNALLOCATED - when ('00', '00000') => __encoding aarch64_vector_crypto_sha2op_sha1_hash // SHA1H_SS_cryptosha2 - when ('00', '00001') => __encoding aarch64_vector_crypto_sha2op_sha1_sched1 // SHA1SU1_VV_cryptosha2 - when ('00', '00010') => __encoding aarch64_vector_crypto_sha2op_sha256_sched0 // SHA256SU0_VV_cryptosha2 - when ('00', '00011') => __UNALLOCATED - when ('1x', _) => __UNALLOCATED - when ('0110', _, '0x', 'x101', '00xxxxx10', _) => __UNPREDICTABLE - when ('0111', _, '0x', 'x0xx', 'xxx0xxxx0', _) => __UNPREDICTABLE - when ('0111', _, '0x', 'x101', '00xxxxx10', _) => __UNPREDICTABLE - when ('01x1', _, '00', '00xx', 'xxx0xxxx1', _) => // asisdone - __field op 29 +: 1 - __field imm5 16 +: 5 - __field imm4 11 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (op, imm5, imm4) of - when ('0', _, 'xxx1') => __UNALLOCATED - when ('0', _, 'xx1x') => __UNALLOCATED - when ('0', _, 'x1xx') => __UNALLOCATED - when ('0', _, '0000') => __encoding aarch64_vector_transfer_vector_cpy_dup_sisd // DUP_asisdone_only - when ('0', _, '1xxx') => __UNALLOCATED - when ('0', 'x0000', '0000') => __UNALLOCATED - when ('1', _, _) => __UNALLOCATED - when ('01x1', _, '01', '00xx', 'xxx0xxxx1', _) => __UNPREDICTABLE - when ('01x1', _, '0x', '0111', '00xxxxx10', _) => __UNPREDICTABLE - when ('01x1', _, '0x', '10xx', 'xxx00xxx1', _) => // asisdsamefp16 - __field U 29 +: 1 - __field a 23 +: 1 - __field Rm 16 +: 5 - __field opcode 11 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, a, opcode) of - when (_, _, '110') => __UNALLOCATED - when (_, '1', '011') => __UNALLOCATED - when ('0', '0', '011') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_extended_sisd // FMULX_asisdsamefp16_only - when ('0', '0', '100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd // FCMEQ_asisdsamefp16_only - when ('0', '0', '101') => __UNALLOCATED - when ('0', '0', '111') => __encoding aarch64_vector_arithmetic_binary_uniform_recps_fp16_sisd // FRECPS_asisdsamefp16_only - when ('0', '1', '100') => __UNALLOCATED - when ('0', '1', '101') => __UNALLOCATED - when ('0', '1', '111') => __encoding aarch64_vector_arithmetic_binary_uniform_rsqrts_fp16_sisd // FRSQRTS_asisdsamefp16_only - when ('1', '0', '011') => __UNALLOCATED - when ('1', '0', '100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd // FCMGE_asisdsamefp16_only - when ('1', '0', '101') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd // FACGE_asisdsamefp16_only - when ('1', '0', '111') => __UNALLOCATED - when ('1', '1', '010') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp16_sisd // FABD_asisdsamefp16_only - when ('1', '1', '100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd // FCMGT_asisdsamefp16_only - when ('1', '1', '101') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd // FACGT_asisdsamefp16_only - when ('1', '1', '111') => __UNALLOCATED - when ('01x1', _, '0x', '10xx', 'xxx01xxx1', _) => __UNPREDICTABLE - when ('01x1', _, '0x', '1111', '00xxxxx10', _) => // asisdmiscfp16 - __field U 29 +: 1 - __field a 23 +: 1 - __field opcode 12 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, a, opcode) of - when (_, _, '00xxx') => __UNALLOCATED - when (_, _, '010xx') => __UNALLOCATED - when (_, _, '10xxx') => __UNALLOCATED - when (_, _, '1100x') => __UNALLOCATED - when (_, _, '11110') => __UNALLOCATED - when (_, '0', '011xx') => __UNALLOCATED - when (_, '0', '11111') => __UNALLOCATED - when (_, '1', '01111') => __UNALLOCATED - when (_, '1', '11100') => __UNALLOCATED - when ('0', '0', '11010') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd // FCVTNS_asisdmiscfp16_R - when ('0', '0', '11011') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd // FCVTMS_asisdmiscfp16_R - when ('0', '0', '11100') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_sisd // FCVTAS_asisdmiscfp16_R - when ('0', '0', '11101') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_int_sisd // SCVTF_asisdmiscfp16_R - when ('0', '1', '01100') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd // FCMGT_asisdmiscfp16_FZ - when ('0', '1', '01101') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd // FCMEQ_asisdmiscfp16_FZ - when ('0', '1', '01110') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_lessthan_sisd // FCMLT_asisdmiscfp16_FZ - when ('0', '1', '11010') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd // FCVTPS_asisdmiscfp16_R - when ('0', '1', '11011') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd // FCVTZS_asisdmiscfp16_R - when ('0', '1', '11101') => __encoding aarch64_vector_arithmetic_unary_special_recip_fp16_sisd // FRECPE_asisdmiscfp16_R - when ('0', '1', '11111') => __encoding aarch64_vector_arithmetic_unary_special_frecpx_fp16 // FRECPX_asisdmiscfp16_R - when ('1', '0', '11010') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd // FCVTNU_asisdmiscfp16_R - when ('1', '0', '11011') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd // FCVTMU_asisdmiscfp16_R - when ('1', '0', '11100') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_sisd // FCVTAU_asisdmiscfp16_R - when ('1', '0', '11101') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_int_sisd // UCVTF_asisdmiscfp16_R - when ('1', '1', '01100') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd // FCMGE_asisdmiscfp16_FZ - when ('1', '1', '01101') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd // FCMLE_asisdmiscfp16_FZ - when ('1', '1', '01110') => __UNALLOCATED - when ('1', '1', '11010') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd // FCVTPU_asisdmiscfp16_R - when ('1', '1', '11011') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd // FCVTZU_asisdmiscfp16_R - when ('1', '1', '11101') => __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_fp16_sisd // FRSQRTE_asisdmiscfp16_R - when ('1', '1', '11111') => __UNALLOCATED - when ('01x1', _, '0x', 'x0xx', 'xxx1xxxx0', _) => __UNPREDICTABLE - when ('01x1', _, '0x', 'x0xx', 'xxx1xxxx1', _) => // asisdsame2 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field opcode 11 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, opcode) of - when (_, '001x') => __UNALLOCATED - when (_, '01xx') => __UNALLOCATED - when (_, '1xxx') => __UNALLOCATED - when ('0', '0000') => __UNALLOCATED - when ('0', '0001') => __UNALLOCATED - when ('1', '0000') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_sisd // SQRDMLAH_asisdsame2_only - when ('1', '0001') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_sisd // SQRDMLSH_asisdsame2_only - when ('01x1', _, '0x', 'x100', '00xxxxx10', _) => // asisdmisc - __field U 29 +: 1 - __field size 22 +: 2 - __field opcode 12 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, size, opcode) of - when (_, _, '0000x') => __UNALLOCATED - when (_, _, '00010') => __UNALLOCATED - when (_, _, '0010x') => __UNALLOCATED - when (_, _, '00110') => __UNALLOCATED - when (_, _, '01111') => __UNALLOCATED - when (_, _, '1000x') => __UNALLOCATED - when (_, _, '10011') => __UNALLOCATED - when (_, _, '10101') => __UNALLOCATED - when (_, _, '10111') => __UNALLOCATED - when (_, _, '1100x') => __UNALLOCATED - when (_, _, '11110') => __UNALLOCATED - when (_, '0x', '011xx') => __UNALLOCATED - when (_, '0x', '11111') => __UNALLOCATED - when (_, '1x', '10110') => __UNALLOCATED - when (_, '1x', '11100') => __UNALLOCATED - when ('0', _, '00011') => __encoding aarch64_vector_arithmetic_unary_add_saturating_sisd // SUQADD_asisdmisc_R - when ('0', _, '00111') => __encoding aarch64_vector_arithmetic_unary_diff_neg_sat_sisd // SQABS_asisdmisc_R - when ('0', _, '01000') => __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd // CMGT_asisdmisc_Z - when ('0', _, '01001') => __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd // CMEQ_asisdmisc_Z - when ('0', _, '01010') => __encoding aarch64_vector_arithmetic_unary_cmp_int_lessthan_sisd // CMLT_asisdmisc_Z - when ('0', _, '01011') => __encoding aarch64_vector_arithmetic_unary_diff_neg_int_sisd // ABS_asisdmisc_R - when ('0', _, '10010') => __UNALLOCATED - when ('0', _, '10100') => __encoding aarch64_vector_arithmetic_unary_extract_sat_sisd // SQXTN_asisdmisc_N - when ('0', '0x', '10110') => __UNALLOCATED - when ('0', '0x', '11010') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd // FCVTNS_asisdmisc_R - when ('0', '0x', '11011') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd // FCVTMS_asisdmisc_R - when ('0', '0x', '11100') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_tieaway_sisd // FCVTAS_asisdmisc_R - when ('0', '0x', '11101') => __encoding aarch64_vector_arithmetic_unary_float_conv_int_sisd // SCVTF_asisdmisc_R - when ('0', '1x', '01100') => __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_sisd // FCMGT_asisdmisc_FZ - when ('0', '1x', '01101') => __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_sisd // FCMEQ_asisdmisc_FZ - when ('0', '1x', '01110') => __encoding aarch64_vector_arithmetic_unary_cmp_float_lessthan_sisd // FCMLT_asisdmisc_FZ - when ('0', '1x', '11010') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd // FCVTPS_asisdmisc_R - when ('0', '1x', '11011') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd // FCVTZS_asisdmisc_R - when ('0', '1x', '11101') => __encoding aarch64_vector_arithmetic_unary_special_recip_float_sisd // FRECPE_asisdmisc_R - when ('0', '1x', '11111') => __encoding aarch64_vector_arithmetic_unary_special_frecpx // FRECPX_asisdmisc_R - when ('1', _, '00011') => __encoding aarch64_vector_arithmetic_unary_add_saturating_sisd // USQADD_asisdmisc_R - when ('1', _, '00111') => __encoding aarch64_vector_arithmetic_unary_diff_neg_sat_sisd // SQNEG_asisdmisc_R - when ('1', _, '01000') => __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd // CMGE_asisdmisc_Z - when ('1', _, '01001') => __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd // CMLE_asisdmisc_Z - when ('1', _, '01010') => __UNALLOCATED - when ('1', _, '01011') => __encoding aarch64_vector_arithmetic_unary_diff_neg_int_sisd // NEG_asisdmisc_R - when ('1', _, '10010') => __encoding aarch64_vector_arithmetic_unary_extract_sqxtun_sisd // SQXTUN_asisdmisc_N - when ('1', _, '10100') => __encoding aarch64_vector_arithmetic_unary_extract_sat_sisd // UQXTN_asisdmisc_N - when ('1', '0x', '10110') => __encoding aarch64_vector_arithmetic_unary_float_xtn_sisd // FCVTXN_asisdmisc_N - when ('1', '0x', '11010') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd // FCVTNU_asisdmisc_R - when ('1', '0x', '11011') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd // FCVTMU_asisdmisc_R - when ('1', '0x', '11100') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_tieaway_sisd // FCVTAU_asisdmisc_R - when ('1', '0x', '11101') => __encoding aarch64_vector_arithmetic_unary_float_conv_int_sisd // UCVTF_asisdmisc_R - when ('1', '1x', '01100') => __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_sisd // FCMGE_asisdmisc_FZ - when ('1', '1x', '01101') => __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_sisd // FCMLE_asisdmisc_FZ - when ('1', '1x', '01110') => __UNALLOCATED - when ('1', '1x', '11010') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd // FCVTPU_asisdmisc_R - when ('1', '1x', '11011') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd // FCVTZU_asisdmisc_R - when ('1', '1x', '11101') => __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_float_sisd // FRSQRTE_asisdmisc_R - when ('1', '1x', '11111') => __UNALLOCATED - when ('01x1', _, '0x', 'x110', '00xxxxx10', _) => // asisdpair - __field U 29 +: 1 - __field size 22 +: 2 - __field opcode 12 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, size, opcode) of - when (_, _, '00xxx') => __UNALLOCATED - when (_, _, '010xx') => __UNALLOCATED - when (_, _, '01110') => __UNALLOCATED - when (_, _, '10xxx') => __UNALLOCATED - when (_, _, '1100x') => __UNALLOCATED - when (_, _, '11010') => __UNALLOCATED - when (_, _, '111xx') => __UNALLOCATED - when (_, '1x', '01101') => __UNALLOCATED - when ('0', _, '11011') => __encoding aarch64_vector_reduce_add_sisd // ADDP_asisdpair_only - when ('0', '00', '01100') => __encoding aarch64_vector_reduce_fp16_maxnm_sisd // FMAXNMP_asisdpair_only_H - when ('0', '00', '01101') => __encoding aarch64_vector_reduce_fp16_add_sisd // FADDP_asisdpair_only_H - when ('0', '00', '01111') => __encoding aarch64_vector_reduce_fp16_max_sisd // FMAXP_asisdpair_only_H - when ('0', '01', '01100') => __UNALLOCATED - when ('0', '01', '01101') => __UNALLOCATED - when ('0', '01', '01111') => __UNALLOCATED - when ('0', '10', '01100') => __encoding aarch64_vector_reduce_fp16_maxnm_sisd // FMINNMP_asisdpair_only_H - when ('0', '10', '01111') => __encoding aarch64_vector_reduce_fp16_max_sisd // FMINP_asisdpair_only_H - when ('0', '11', '01100') => __UNALLOCATED - when ('0', '11', '01111') => __UNALLOCATED - when ('1', _, '11011') => __UNALLOCATED - when ('1', '0x', '01100') => __encoding aarch64_vector_reduce_fp_maxnm_sisd // FMAXNMP_asisdpair_only_SD - when ('1', '0x', '01101') => __encoding aarch64_vector_reduce_fp_add_sisd // FADDP_asisdpair_only_SD - when ('1', '0x', '01111') => __encoding aarch64_vector_reduce_fp_max_sisd // FMAXP_asisdpair_only_SD - when ('1', '1x', '01100') => __encoding aarch64_vector_reduce_fp_maxnm_sisd // FMINNMP_asisdpair_only_SD - when ('1', '1x', '01111') => __encoding aarch64_vector_reduce_fp_max_sisd // FMINP_asisdpair_only_SD - when ('01x1', _, '0x', 'x1xx', '1xxxxxx10', _) => __UNPREDICTABLE - when ('01x1', _, '0x', 'x1xx', 'x1xxxxx10', _) => __UNPREDICTABLE - when ('01x1', _, '0x', 'x1xx', 'xxxxxxx00', _) => // asisddiff - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, opcode) of - when (_, '00xx') => __UNALLOCATED - when (_, '01xx') => __UNALLOCATED - when (_, '1000') => __UNALLOCATED - when (_, '1010') => __UNALLOCATED - when (_, '1100') => __UNALLOCATED - when (_, '111x') => __UNALLOCATED - when ('0', '1001') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_dmacc_sisd // SQDMLAL_asisddiff_only - when ('0', '1011') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_dmacc_sisd // SQDMLSL_asisddiff_only - when ('0', '1101') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_double_sisd // SQDMULL_asisddiff_only - when ('1', '1001') => __UNALLOCATED - when ('1', '1011') => __UNALLOCATED - when ('1', '1101') => __UNALLOCATED - when ('01x1', _, '0x', 'x1xx', 'xxxxxxxx1', _) => // asisdsame - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field opcode 11 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, size, opcode) of - when (_, _, '00000') => __UNALLOCATED - when (_, _, '0001x') => __UNALLOCATED - when (_, _, '00100') => __UNALLOCATED - when (_, _, '011xx') => __UNALLOCATED - when (_, _, '1001x') => __UNALLOCATED - when (_, '1x', '11011') => __UNALLOCATED - when ('0', _, '00001') => __encoding aarch64_vector_arithmetic_binary_uniform_add_saturating_sisd // SQADD_asisdsame_only - when ('0', _, '00101') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_saturating_sisd // SQSUB_asisdsame_only - when ('0', _, '00110') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd // CMGT_asisdsame_only - when ('0', _, '00111') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd // CMGE_asisdsame_only - when ('0', _, '01000') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd // SSHL_asisdsame_only - when ('0', _, '01001') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd // SQSHL_asisdsame_only - when ('0', _, '01010') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd // SRSHL_asisdsame_only - when ('0', _, '01011') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd // SQRSHL_asisdsame_only - when ('0', _, '10000') => __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_sisd // ADD_asisdsame_only - when ('0', _, '10001') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_sisd // CMTST_asisdsame_only - when ('0', _, '10100') => __UNALLOCATED - when ('0', _, '10101') => __UNALLOCATED - when ('0', _, '10110') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_sisd // SQDMULH_asisdsame_only - when ('0', _, '10111') => __UNALLOCATED - when ('0', '0x', '11000') => __UNALLOCATED - when ('0', '0x', '11001') => __UNALLOCATED - when ('0', '0x', '11010') => __UNALLOCATED - when ('0', '0x', '11011') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_extended_sisd // FMULX_asisdsame_only - when ('0', '0x', '11100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd // FCMEQ_asisdsame_only - when ('0', '0x', '11101') => __UNALLOCATED - when ('0', '0x', '11110') => __UNALLOCATED - when ('0', '0x', '11111') => __encoding aarch64_vector_arithmetic_binary_uniform_recps_sisd // FRECPS_asisdsame_only - when ('0', '1x', '11000') => __UNALLOCATED - when ('0', '1x', '11001') => __UNALLOCATED - when ('0', '1x', '11010') => __UNALLOCATED - when ('0', '1x', '11100') => __UNALLOCATED - when ('0', '1x', '11101') => __UNALLOCATED - when ('0', '1x', '11110') => __UNALLOCATED - when ('0', '1x', '11111') => __encoding aarch64_vector_arithmetic_binary_uniform_rsqrts_sisd // FRSQRTS_asisdsame_only - when ('1', _, '00001') => __encoding aarch64_vector_arithmetic_binary_uniform_add_saturating_sisd // UQADD_asisdsame_only - when ('1', _, '00101') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_saturating_sisd // UQSUB_asisdsame_only - when ('1', _, '00110') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd // CMHI_asisdsame_only - when ('1', _, '00111') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd // CMHS_asisdsame_only - when ('1', _, '01000') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd // USHL_asisdsame_only - when ('1', _, '01001') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd // UQSHL_asisdsame_only - when ('1', _, '01010') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd // URSHL_asisdsame_only - when ('1', _, '01011') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd // UQRSHL_asisdsame_only - when ('1', _, '10000') => __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_sisd // SUB_asisdsame_only - when ('1', _, '10001') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_sisd // CMEQ_asisdsame_only - when ('1', _, '10100') => __UNALLOCATED - when ('1', _, '10101') => __UNALLOCATED - when ('1', _, '10110') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_sisd // SQRDMULH_asisdsame_only - when ('1', _, '10111') => __UNALLOCATED - when ('1', '0x', '11000') => __UNALLOCATED - when ('1', '0x', '11001') => __UNALLOCATED - when ('1', '0x', '11010') => __UNALLOCATED - when ('1', '0x', '11011') => __UNALLOCATED - when ('1', '0x', '11100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd // FCMGE_asisdsame_only - when ('1', '0x', '11101') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd // FACGE_asisdsame_only - when ('1', '0x', '11110') => __UNALLOCATED - when ('1', '0x', '11111') => __UNALLOCATED - when ('1', '1x', '11000') => __UNALLOCATED - when ('1', '1x', '11001') => __UNALLOCATED - when ('1', '1x', '11010') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp_sisd // FABD_asisdsame_only - when ('1', '1x', '11100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd // FCMGT_asisdsame_only - when ('1', '1x', '11101') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd // FACGT_asisdsame_only - when ('1', '1x', '11110') => __UNALLOCATED - when ('1', '1x', '11111') => __UNALLOCATED - when ('01x1', _, '10', _, 'xxxxxxxx1', _) => // asisdshf - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field opcode 11 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, immh, opcode) of - when (_, !'0000', '00001') => __UNALLOCATED - when (_, !'0000', '00011') => __UNALLOCATED - when (_, !'0000', '00101') => __UNALLOCATED - when (_, !'0000', '00111') => __UNALLOCATED - when (_, !'0000', '01001') => __UNALLOCATED - when (_, !'0000', '01011') => __UNALLOCATED - when (_, !'0000', '01101') => __UNALLOCATED - when (_, !'0000', '01111') => __UNALLOCATED - when (_, !'0000', '101xx') => __UNALLOCATED - when (_, !'0000', '110xx') => __UNALLOCATED - when (_, !'0000', '11101') => __UNALLOCATED - when (_, !'0000', '11110') => __UNALLOCATED - when (_, '0000', _) => __UNALLOCATED - when ('0', !'0000', '00000') => __encoding aarch64_vector_shift_right_sisd // SSHR_asisdshf_R - when ('0', !'0000', '00010') => __encoding aarch64_vector_shift_right_sisd // SSRA_asisdshf_R - when ('0', !'0000', '00100') => __encoding aarch64_vector_shift_right_sisd // SRSHR_asisdshf_R - when ('0', !'0000', '00110') => __encoding aarch64_vector_shift_right_sisd // SRSRA_asisdshf_R - when ('0', !'0000', '01000') => __UNALLOCATED - when ('0', !'0000', '01010') => __encoding aarch64_vector_shift_left_sisd // SHL_asisdshf_R - when ('0', !'0000', '01100') => __UNALLOCATED - when ('0', !'0000', '01110') => __encoding aarch64_vector_shift_left_sat_sisd // SQSHL_asisdshf_R - when ('0', !'0000', '10000') => __UNALLOCATED - when ('0', !'0000', '10001') => __UNALLOCATED - when ('0', !'0000', '10010') => __encoding aarch64_vector_shift_right_narrow_uniform_sisd // SQSHRN_asisdshf_N - when ('0', !'0000', '10011') => __encoding aarch64_vector_shift_right_narrow_uniform_sisd // SQRSHRN_asisdshf_N - when ('0', !'0000', '11100') => __encoding aarch64_vector_shift_conv_int_sisd // SCVTF_asisdshf_C - when ('0', !'0000', '11111') => __encoding aarch64_vector_shift_conv_float_sisd // FCVTZS_asisdshf_C - when ('1', !'0000', '00000') => __encoding aarch64_vector_shift_right_sisd // USHR_asisdshf_R - when ('1', !'0000', '00010') => __encoding aarch64_vector_shift_right_sisd // USRA_asisdshf_R - when ('1', !'0000', '00100') => __encoding aarch64_vector_shift_right_sisd // URSHR_asisdshf_R - when ('1', !'0000', '00110') => __encoding aarch64_vector_shift_right_sisd // URSRA_asisdshf_R - when ('1', !'0000', '01000') => __encoding aarch64_vector_shift_right_insert_sisd // SRI_asisdshf_R - when ('1', !'0000', '01010') => __encoding aarch64_vector_shift_left_insert_sisd // SLI_asisdshf_R - when ('1', !'0000', '01100') => __encoding aarch64_vector_shift_left_sat_sisd // SQSHLU_asisdshf_R - when ('1', !'0000', '01110') => __encoding aarch64_vector_shift_left_sat_sisd // UQSHL_asisdshf_R - when ('1', !'0000', '10000') => __encoding aarch64_vector_shift_right_narrow_nonuniform_sisd // SQSHRUN_asisdshf_N - when ('1', !'0000', '10001') => __encoding aarch64_vector_shift_right_narrow_nonuniform_sisd // SQRSHRUN_asisdshf_N - when ('1', !'0000', '10010') => __encoding aarch64_vector_shift_right_narrow_uniform_sisd // UQSHRN_asisdshf_N - when ('1', !'0000', '10011') => __encoding aarch64_vector_shift_right_narrow_uniform_sisd // UQRSHRN_asisdshf_N - when ('1', !'0000', '11100') => __encoding aarch64_vector_shift_conv_int_sisd // UCVTF_asisdshf_C - when ('1', !'0000', '11111') => __encoding aarch64_vector_shift_conv_float_sisd // FCVTZU_asisdshf_C - when ('01x1', _, '11', _, 'xxxxxxxx1', _) => __UNPREDICTABLE - when ('01x1', _, '1x', _, 'xxxxxxxx0', _) => // asisdelem - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field opcode 12 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, size, opcode) of - when (_, _, '0000') => __UNALLOCATED - when (_, _, '0010') => __UNALLOCATED - when (_, _, '0100') => __UNALLOCATED - when (_, _, '0110') => __UNALLOCATED - when (_, _, '1000') => __UNALLOCATED - when (_, _, '1010') => __UNALLOCATED - when (_, _, '1110') => __UNALLOCATED - when (_, '01', '0001') => __UNALLOCATED - when (_, '01', '0101') => __UNALLOCATED - when (_, '01', '1001') => __UNALLOCATED - when ('0', _, '0011') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_double_sisd // SQDMLAL_asisdelem_L - when ('0', _, '0111') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_double_sisd // SQDMLSL_asisdelem_L - when ('0', _, '1011') => __encoding aarch64_vector_arithmetic_binary_element_mul_double_sisd // SQDMULL_asisdelem_L - when ('0', _, '1100') => __encoding aarch64_vector_arithmetic_binary_element_mul_high_sisd // SQDMULH_asisdelem_R - when ('0', _, '1101') => __encoding aarch64_vector_arithmetic_binary_element_mul_high_sisd // SQRDMULH_asisdelem_R - when ('0', _, '1111') => __UNALLOCATED - when ('0', '00', '0001') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp16_sisd // FMLA_asisdelem_RH_H - when ('0', '00', '0101') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp16_sisd // FMLS_asisdelem_RH_H - when ('0', '00', '1001') => __encoding aarch64_vector_arithmetic_binary_element_mul_fp16_sisd // FMUL_asisdelem_RH_H - when ('0', '1x', '0001') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp_sisd // FMLA_asisdelem_R_SD - when ('0', '1x', '0101') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp_sisd // FMLS_asisdelem_R_SD - when ('0', '1x', '1001') => __encoding aarch64_vector_arithmetic_binary_element_mul_fp_sisd // FMUL_asisdelem_R_SD - when ('1', _, '0011') => __UNALLOCATED - when ('1', _, '0111') => __UNALLOCATED - when ('1', _, '1011') => __UNALLOCATED - when ('1', _, '1100') => __UNALLOCATED - when ('1', _, '1101') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_high_sisd // SQRDMLAH_asisdelem_R - when ('1', _, '1111') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_high_sisd // SQRDMLSH_asisdelem_R - when ('1', '00', '0001') => __UNALLOCATED - when ('1', '00', '0101') => __UNALLOCATED - when ('1', '00', '1001') => __encoding aarch64_vector_arithmetic_binary_element_mul_fp16_sisd // FMULX_asisdelem_RH_H - when ('1', '1x', '0001') => __UNALLOCATED - when ('1', '1x', '0101') => __UNALLOCATED - when ('1', '1x', '1001') => __encoding aarch64_vector_arithmetic_binary_element_mul_fp_sisd // FMULX_asisdelem_R_SD - when ('0x00', _, '0x', 'x0xx', 'xxx0xxx00', _) => // asimdtbl - __field Q 30 +: 1 - __field op2 22 +: 2 - __field Rm 16 +: 5 - __field len 13 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (op2, len, op) of - when ('x1', _, _) => __UNALLOCATED - when ('00', '00', '0') => __encoding aarch64_vector_transfer_vector_table // TBL_asimdtbl_L1_1 - when ('00', '00', '1') => __encoding aarch64_vector_transfer_vector_table // TBX_asimdtbl_L1_1 - when ('00', '01', '0') => __encoding aarch64_vector_transfer_vector_table // TBL_asimdtbl_L2_2 - when ('00', '01', '1') => __encoding aarch64_vector_transfer_vector_table // TBX_asimdtbl_L2_2 - when ('00', '10', '0') => __encoding aarch64_vector_transfer_vector_table // TBL_asimdtbl_L3_3 - when ('00', '10', '1') => __encoding aarch64_vector_transfer_vector_table // TBX_asimdtbl_L3_3 - when ('00', '11', '0') => __encoding aarch64_vector_transfer_vector_table // TBL_asimdtbl_L4_4 - when ('00', '11', '1') => __encoding aarch64_vector_transfer_vector_table // TBX_asimdtbl_L4_4 - when ('1x', _, _) => __UNALLOCATED - when ('0x00', _, '0x', 'x0xx', 'xxx0xxx10', _) => // asimdperm - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field opcode 12 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (opcode) of - when ('000') => __UNALLOCATED - when ('001') => __encoding aarch64_vector_transfer_vector_permute_unzip // UZP1_asimdperm_only - when ('010') => __encoding aarch64_vector_transfer_vector_permute_transpose // TRN1_asimdperm_only - when ('011') => __encoding aarch64_vector_transfer_vector_permute_zip // ZIP1_asimdperm_only - when ('100') => __UNALLOCATED - when ('101') => __encoding aarch64_vector_transfer_vector_permute_unzip // UZP2_asimdperm_only - when ('110') => __encoding aarch64_vector_transfer_vector_permute_transpose // TRN2_asimdperm_only - when ('111') => __encoding aarch64_vector_transfer_vector_permute_zip // ZIP2_asimdperm_only - when ('0x10', _, '0x', 'x0xx', 'xxx0xxxx0', _) => // asimdext - __field Q 30 +: 1 - __field op2 22 +: 2 - __field Rm 16 +: 5 - __field imm4 11 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (op2) of - when ('x1') => __UNALLOCATED - when ('00') => __encoding aarch64_vector_transfer_vector_extract // EXT_asimdext_only - when ('1x') => __UNALLOCATED - when ('0xx0', _, '00', '00xx', 'xxx0xxxx1', _) => // asimdins - __field Q 30 +: 1 - __field op 29 +: 1 - __field imm5 16 +: 5 - __field imm4 11 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (Q, op, imm5, imm4) of - when (_, _, 'x0000', _) => __UNALLOCATED - when (_, '0', _, '0000') => __encoding aarch64_vector_transfer_vector_cpy_dup_simd // DUP_asimdins_DV_v - when (_, '0', _, '0001') => __encoding aarch64_vector_transfer_integer_dup // DUP_asimdins_DR_r - when (_, '0', _, '0010') => __UNALLOCATED - when (_, '0', _, '0100') => __UNALLOCATED - when (_, '0', _, '0110') => __UNALLOCATED - when (_, '0', _, '1xxx') => __UNALLOCATED - when ('0', '0', _, '0011') => __UNALLOCATED - when ('0', '0', _, '0101') => __encoding aarch64_vector_transfer_integer_move_signed // SMOV_asimdins_W_w - when ('0', '0', _, '0111') => __encoding aarch64_vector_transfer_integer_move_unsigned // UMOV_asimdins_W_w - when ('0', '1', _, _) => __UNALLOCATED - when ('1', '0', _, '0011') => __encoding aarch64_vector_transfer_integer_insert // INS_asimdins_IR_r - when ('1', '0', _, '0101') => __encoding aarch64_vector_transfer_integer_move_signed // SMOV_asimdins_X_x - when ('1', '0', 'x1000', '0111') => __encoding aarch64_vector_transfer_integer_move_unsigned // UMOV_asimdins_X_x - when ('1', '1', _, _) => __encoding aarch64_vector_transfer_vector_insert // INS_asimdins_IV_v - when ('0xx0', _, '01', '00xx', 'xxx0xxxx1', _) => __UNPREDICTABLE - when ('0xx0', _, '0x', '0111', '00xxxxx10', _) => __UNPREDICTABLE - when ('0xx0', _, '0x', '10xx', 'xxx00xxx1', _) => // asimdsamefp16 - __field Q 30 +: 1 - __field U 29 +: 1 - __field a 23 +: 1 - __field Rm 16 +: 5 - __field opcode 11 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, a, opcode) of - when ('0', '0', '000') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 // FMAXNM_asimdsamefp16_only - when ('0', '0', '001') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_fused // FMLA_asimdsamefp16_only - when ('0', '0', '010') => __encoding aarch64_vector_arithmetic_binary_uniform_add_fp16 // FADD_asimdsamefp16_only - when ('0', '0', '011') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_extended_simd // FMULX_asimdsamefp16_only - when ('0', '0', '100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd // FCMEQ_asimdsamefp16_only - when ('0', '0', '101') => __UNALLOCATED - when ('0', '0', '110') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 // FMAX_asimdsamefp16_only - when ('0', '0', '111') => __encoding aarch64_vector_arithmetic_binary_uniform_recps_fp16_simd // FRECPS_asimdsamefp16_only - when ('0', '1', '000') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 // FMINNM_asimdsamefp16_only - when ('0', '1', '001') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_fused // FMLS_asimdsamefp16_only - when ('0', '1', '010') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp16_simd // FSUB_asimdsamefp16_only - when ('0', '1', '011') => __UNALLOCATED - when ('0', '1', '100') => __UNALLOCATED - when ('0', '1', '101') => __UNALLOCATED - when ('0', '1', '110') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 // FMIN_asimdsamefp16_only - when ('0', '1', '111') => __encoding aarch64_vector_arithmetic_binary_uniform_rsqrts_fp16_simd // FRSQRTS_asimdsamefp16_only - when ('1', '0', '000') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 // FMAXNMP_asimdsamefp16_only - when ('1', '0', '001') => __UNALLOCATED - when ('1', '0', '010') => __encoding aarch64_vector_arithmetic_binary_uniform_add_fp16 // FADDP_asimdsamefp16_only - when ('1', '0', '011') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_product // FMUL_asimdsamefp16_only - when ('1', '0', '100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd // FCMGE_asimdsamefp16_only - when ('1', '0', '101') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd // FACGE_asimdsamefp16_only - when ('1', '0', '110') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 // FMAXP_asimdsamefp16_only - when ('1', '0', '111') => __encoding aarch64_vector_arithmetic_binary_uniform_div_fp16 // FDIV_asimdsamefp16_only - when ('1', '1', '000') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 // FMINNMP_asimdsamefp16_only - when ('1', '1', '001') => __UNALLOCATED - when ('1', '1', '010') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp16_simd // FABD_asimdsamefp16_only - when ('1', '1', '011') => __UNALLOCATED - when ('1', '1', '100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd // FCMGT_asimdsamefp16_only - when ('1', '1', '101') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd // FACGT_asimdsamefp16_only - when ('1', '1', '110') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 // FMINP_asimdsamefp16_only - when ('1', '1', '111') => __UNALLOCATED - when ('0xx0', _, '0x', '10xx', 'xxx01xxx1', _) => __UNPREDICTABLE - when ('0xx0', _, '0x', '1111', '00xxxxx10', _) => // asimdmiscfp16 - __field Q 30 +: 1 - __field U 29 +: 1 - __field a 23 +: 1 - __field opcode 12 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, a, opcode) of - when (_, _, '00xxx') => __UNALLOCATED - when (_, _, '010xx') => __UNALLOCATED - when (_, _, '10xxx') => __UNALLOCATED - when (_, _, '11110') => __UNALLOCATED - when (_, '0', '011xx') => __UNALLOCATED - when (_, '0', '11111') => __UNALLOCATED - when (_, '1', '11100') => __UNALLOCATED - when ('0', '0', '11000') => __encoding aarch64_vector_arithmetic_unary_fp16_round // FRINTN_asimdmiscfp16_R - when ('0', '0', '11001') => __encoding aarch64_vector_arithmetic_unary_fp16_round // FRINTM_asimdmiscfp16_R - when ('0', '0', '11010') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd // FCVTNS_asimdmiscfp16_R - when ('0', '0', '11011') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd // FCVTMS_asimdmiscfp16_R - when ('0', '0', '11100') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_simd // FCVTAS_asimdmiscfp16_R - when ('0', '0', '11101') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_int_simd // SCVTF_asimdmiscfp16_R - when ('0', '1', '01100') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_simd // FCMGT_asimdmiscfp16_FZ - when ('0', '1', '01101') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_simd // FCMEQ_asimdmiscfp16_FZ - when ('0', '1', '01110') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_lessthan_simd // FCMLT_asimdmiscfp16_FZ - when ('0', '1', '01111') => __encoding aarch64_vector_arithmetic_unary_diff_neg_fp16 // FABS_asimdmiscfp16_R - when ('0', '1', '11000') => __encoding aarch64_vector_arithmetic_unary_fp16_round // FRINTP_asimdmiscfp16_R - when ('0', '1', '11001') => __encoding aarch64_vector_arithmetic_unary_fp16_round // FRINTZ_asimdmiscfp16_R - when ('0', '1', '11010') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd // FCVTPS_asimdmiscfp16_R - when ('0', '1', '11011') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd // FCVTZS_asimdmiscfp16_R - when ('0', '1', '11101') => __encoding aarch64_vector_arithmetic_unary_special_recip_fp16_simd // FRECPE_asimdmiscfp16_R - when ('0', '1', '11111') => __UNALLOCATED - when ('1', '0', '11000') => __encoding aarch64_vector_arithmetic_unary_fp16_round // FRINTA_asimdmiscfp16_R - when ('1', '0', '11001') => __encoding aarch64_vector_arithmetic_unary_fp16_round // FRINTX_asimdmiscfp16_R - when ('1', '0', '11010') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd // FCVTNU_asimdmiscfp16_R - when ('1', '0', '11011') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd // FCVTMU_asimdmiscfp16_R - when ('1', '0', '11100') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_simd // FCVTAU_asimdmiscfp16_R - when ('1', '0', '11101') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_int_simd // UCVTF_asimdmiscfp16_R - when ('1', '1', '01100') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_simd // FCMGE_asimdmiscfp16_FZ - when ('1', '1', '01101') => __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_simd // FCMLE_asimdmiscfp16_FZ - when ('1', '1', '01110') => __UNALLOCATED - when ('1', '1', '01111') => __encoding aarch64_vector_arithmetic_unary_diff_neg_fp16 // FNEG_asimdmiscfp16_R - when ('1', '1', '11000') => __UNALLOCATED - when ('1', '1', '11001') => __encoding aarch64_vector_arithmetic_unary_fp16_round // FRINTI_asimdmiscfp16_R - when ('1', '1', '11010') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd // FCVTPU_asimdmiscfp16_R - when ('1', '1', '11011') => __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd // FCVTZU_asimdmiscfp16_R - when ('1', '1', '11101') => __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_fp16_simd // FRSQRTE_asimdmiscfp16_R - when ('1', '1', '11111') => __encoding aarch64_vector_arithmetic_unary_special_sqrt_fp16 // FSQRT_asimdmiscfp16_R - when ('0xx0', _, '0x', 'x0xx', 'xxx1xxxx0', _) => __UNPREDICTABLE - when ('0xx0', _, '0x', 'x0xx', 'xxx1xxxx1', _) => // asimdsame2 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field opcode 11 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (Q, U, size, opcode) of - when (_, _, '0x', '0011') => __UNALLOCATED - when (_, _, '11', '0011') => __UNALLOCATED - when (_, '0', _, '0000') => __UNALLOCATED - when (_, '0', _, '0001') => __UNALLOCATED - when (_, '0', _, '0010') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_dotp // SDOT_asimdsame2_D - when (_, '0', _, '1xxx') => __UNALLOCATED - when (_, '0', '10', '0011') => __encoding aarch64_vector_arithmetic_binary_uniform_mat_mul_int_usdot // USDOT_asimdsame2_D - when (_, '1', _, '0000') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_simd // SQRDMLAH_asimdsame2_only - when (_, '1', _, '0001') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_simd // SQRDMLSH_asimdsame2_only - when (_, '1', _, '0010') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_dotp // UDOT_asimdsame2_D - when (_, '1', _, '10xx') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_complex // FCMLA_asimdsame2_C - when (_, '1', _, '11x0') => __encoding aarch64_vector_arithmetic_binary_uniform_add_fp_complex // FCADD_asimdsame2_C - when (_, '1', '00', '1101') => __UNALLOCATED - when (_, '1', '00', '1111') => __UNALLOCATED - when (_, '1', '01', '1111') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_bfdot // BFDOT_asimdsame2_D - when (_, '1', '1x', '1101') => __UNALLOCATED - when (_, '1', '10', '0011') => __UNALLOCATED - when (_, '1', '10', '1111') => __UNALLOCATED - when (_, '1', '11', '1111') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_acc_bf16_long // BFMLAL_asimdsame2_F_ - when ('0', _, _, '01xx') => __UNALLOCATED - when ('0', '1', '01', '1101') => __UNALLOCATED - when ('1', _, '0x', '01xx') => __UNALLOCATED - when ('1', _, '1x', '011x') => __UNALLOCATED - when ('1', '0', '10', '0100') => __encoding aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla // SMMLA_asimdsame2_G - when ('1', '0', '10', '0101') => __encoding aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla // USMMLA_asimdsame2_G - when ('1', '1', '01', '1101') => __encoding aarch64_vector_bfmmla // BFMMLA_asimdsame2_E - when ('1', '1', '10', '0100') => __encoding aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla // UMMLA_asimdsame2_G - when ('1', '1', '10', '0101') => __UNALLOCATED - when ('0xx0', _, '0x', 'x100', '00xxxxx10', _) => // asimdmisc - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field opcode 12 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, size, opcode) of - when (_, _, '1000x') => __UNALLOCATED - when (_, _, '10101') => __UNALLOCATED - when (_, '0x', '011xx') => __UNALLOCATED - when (_, '1x', '10111') => __UNALLOCATED - when (_, '1x', '11110') => __UNALLOCATED - when (_, '11', '10110') => __UNALLOCATED - when ('0', _, '00000') => __encoding aarch64_vector_arithmetic_unary_rev // REV64_asimdmisc_R - when ('0', _, '00001') => __encoding aarch64_vector_arithmetic_unary_rev // REV16_asimdmisc_R - when ('0', _, '00010') => __encoding aarch64_vector_arithmetic_unary_add_pairwise // SADDLP_asimdmisc_P - when ('0', _, '00011') => __encoding aarch64_vector_arithmetic_unary_add_saturating_simd // SUQADD_asimdmisc_R - when ('0', _, '00100') => __encoding aarch64_vector_arithmetic_unary_clsz // CLS_asimdmisc_R - when ('0', _, '00101') => __encoding aarch64_vector_arithmetic_unary_cnt // CNT_asimdmisc_R - when ('0', _, '00110') => __encoding aarch64_vector_arithmetic_unary_add_pairwise // SADALP_asimdmisc_P - when ('0', _, '00111') => __encoding aarch64_vector_arithmetic_unary_diff_neg_sat_simd // SQABS_asimdmisc_R - when ('0', _, '01000') => __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_simd // CMGT_asimdmisc_Z - when ('0', _, '01001') => __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_simd // CMEQ_asimdmisc_Z - when ('0', _, '01010') => __encoding aarch64_vector_arithmetic_unary_cmp_int_lessthan_simd // CMLT_asimdmisc_Z - when ('0', _, '01011') => __encoding aarch64_vector_arithmetic_unary_diff_neg_int_simd // ABS_asimdmisc_R - when ('0', _, '10010') => __encoding aarch64_vector_arithmetic_unary_extract_nosat // XTN_asimdmisc_N - when ('0', _, '10011') => __UNALLOCATED - when ('0', _, '10100') => __encoding aarch64_vector_arithmetic_unary_extract_sat_simd // SQXTN_asimdmisc_N - when ('0', '0x', '10110') => __encoding aarch64_vector_arithmetic_unary_float_narrow // FCVTN_asimdmisc_N - when ('0', '0x', '10111') => __encoding aarch64_vector_arithmetic_unary_float_widen // FCVTL_asimdmisc_L - when ('0', '0x', '11000') => __encoding aarch64_vector_arithmetic_unary_float_round // FRINTN_asimdmisc_R - when ('0', '0x', '11001') => __encoding aarch64_vector_arithmetic_unary_float_round // FRINTM_asimdmisc_R - when ('0', '0x', '11010') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd // FCVTNS_asimdmisc_R - when ('0', '0x', '11011') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd // FCVTMS_asimdmisc_R - when ('0', '0x', '11100') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_tieaway_simd // FCVTAS_asimdmisc_R - when ('0', '0x', '11101') => __encoding aarch64_vector_arithmetic_unary_float_conv_int_simd // SCVTF_asimdmisc_R - when ('0', '0x', '11110') => __encoding aarch64_vector_arithmetic_unary_float_round_frint_32_64 // FRINT32Z_asimdmisc_R - when ('0', '0x', '11111') => __encoding aarch64_vector_arithmetic_unary_float_round_frint_32_64 // FRINT64Z_asimdmisc_R - when ('0', '1x', '01100') => __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_simd // FCMGT_asimdmisc_FZ - when ('0', '1x', '01101') => __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_simd // FCMEQ_asimdmisc_FZ - when ('0', '1x', '01110') => __encoding aarch64_vector_arithmetic_unary_cmp_float_lessthan_simd // FCMLT_asimdmisc_FZ - when ('0', '1x', '01111') => __encoding aarch64_vector_arithmetic_unary_diff_neg_float // FABS_asimdmisc_R - when ('0', '1x', '11000') => __encoding aarch64_vector_arithmetic_unary_float_round // FRINTP_asimdmisc_R - when ('0', '1x', '11001') => __encoding aarch64_vector_arithmetic_unary_float_round // FRINTZ_asimdmisc_R - when ('0', '1x', '11010') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd // FCVTPS_asimdmisc_R - when ('0', '1x', '11011') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd // FCVTZS_asimdmisc_R - when ('0', '1x', '11100') => __encoding aarch64_vector_arithmetic_unary_special_recip_int // URECPE_asimdmisc_R - when ('0', '1x', '11101') => __encoding aarch64_vector_arithmetic_unary_special_recip_float_simd // FRECPE_asimdmisc_R - when ('0', '1x', '11111') => __UNALLOCATED - when ('0', '10', '10110') => __encoding aarch64_vector_cvt_bf16_vector // BFCVTN_asimdmisc_4S - when ('1', _, '00000') => __encoding aarch64_vector_arithmetic_unary_rev // REV32_asimdmisc_R - when ('1', _, '00001') => __UNALLOCATED - when ('1', _, '00010') => __encoding aarch64_vector_arithmetic_unary_add_pairwise // UADDLP_asimdmisc_P - when ('1', _, '00011') => __encoding aarch64_vector_arithmetic_unary_add_saturating_simd // USQADD_asimdmisc_R - when ('1', _, '00100') => __encoding aarch64_vector_arithmetic_unary_clsz // CLZ_asimdmisc_R - when ('1', _, '00110') => __encoding aarch64_vector_arithmetic_unary_add_pairwise // UADALP_asimdmisc_P - when ('1', _, '00111') => __encoding aarch64_vector_arithmetic_unary_diff_neg_sat_simd // SQNEG_asimdmisc_R - when ('1', _, '01000') => __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_simd // CMGE_asimdmisc_Z - when ('1', _, '01001') => __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_simd // CMLE_asimdmisc_Z - when ('1', _, '01010') => __UNALLOCATED - when ('1', _, '01011') => __encoding aarch64_vector_arithmetic_unary_diff_neg_int_simd // NEG_asimdmisc_R - when ('1', _, '10010') => __encoding aarch64_vector_arithmetic_unary_extract_sqxtun_simd // SQXTUN_asimdmisc_N - when ('1', _, '10011') => __encoding aarch64_vector_arithmetic_unary_shift // SHLL_asimdmisc_S - when ('1', _, '10100') => __encoding aarch64_vector_arithmetic_unary_extract_sat_simd // UQXTN_asimdmisc_N - when ('1', '0x', '10110') => __encoding aarch64_vector_arithmetic_unary_float_xtn_simd // FCVTXN_asimdmisc_N - when ('1', '0x', '10111') => __UNALLOCATED - when ('1', '0x', '11000') => __encoding aarch64_vector_arithmetic_unary_float_round // FRINTA_asimdmisc_R - when ('1', '0x', '11001') => __encoding aarch64_vector_arithmetic_unary_float_round // FRINTX_asimdmisc_R - when ('1', '0x', '11010') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd // FCVTNU_asimdmisc_R - when ('1', '0x', '11011') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd // FCVTMU_asimdmisc_R - when ('1', '0x', '11100') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_tieaway_simd // FCVTAU_asimdmisc_R - when ('1', '0x', '11101') => __encoding aarch64_vector_arithmetic_unary_float_conv_int_simd // UCVTF_asimdmisc_R - when ('1', '0x', '11110') => __encoding aarch64_vector_arithmetic_unary_float_round_frint_32_64 // FRINT32X_asimdmisc_R - when ('1', '0x', '11111') => __encoding aarch64_vector_arithmetic_unary_float_round_frint_32_64 // FRINT64X_asimdmisc_R - when ('1', '00', '00101') => __encoding aarch64_vector_arithmetic_unary_not // NOT_asimdmisc_R - when ('1', '01', '00101') => __encoding aarch64_vector_arithmetic_unary_rbit // RBIT_asimdmisc_R - when ('1', '1x', '00101') => __UNALLOCATED - when ('1', '1x', '01100') => __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_simd // FCMGE_asimdmisc_FZ - when ('1', '1x', '01101') => __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_simd // FCMLE_asimdmisc_FZ - when ('1', '1x', '01110') => __UNALLOCATED - when ('1', '1x', '01111') => __encoding aarch64_vector_arithmetic_unary_diff_neg_float // FNEG_asimdmisc_R - when ('1', '1x', '11000') => __UNALLOCATED - when ('1', '1x', '11001') => __encoding aarch64_vector_arithmetic_unary_float_round // FRINTI_asimdmisc_R - when ('1', '1x', '11010') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd // FCVTPU_asimdmisc_R - when ('1', '1x', '11011') => __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd // FCVTZU_asimdmisc_R - when ('1', '1x', '11100') => __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_int // URSQRTE_asimdmisc_R - when ('1', '1x', '11101') => __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_float_simd // FRSQRTE_asimdmisc_R - when ('1', '1x', '11111') => __encoding aarch64_vector_arithmetic_unary_special_sqrt // FSQRT_asimdmisc_R - when ('1', '10', '10110') => __UNALLOCATED - when ('0xx0', _, '0x', 'x110', '00xxxxx10', _) => // asimdall - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field opcode 12 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, size, opcode) of - when (_, _, '0000x') => __UNALLOCATED - when (_, _, '00010') => __UNALLOCATED - when (_, _, '001xx') => __UNALLOCATED - when (_, _, '0100x') => __UNALLOCATED - when (_, _, '01011') => __UNALLOCATED - when (_, _, '01101') => __UNALLOCATED - when (_, _, '01110') => __UNALLOCATED - when (_, _, '10xxx') => __UNALLOCATED - when (_, _, '1100x') => __UNALLOCATED - when (_, _, '111xx') => __UNALLOCATED - when ('0', _, '00011') => __encoding aarch64_vector_reduce_add_long // SADDLV_asimdall_only - when ('0', _, '01010') => __encoding aarch64_vector_reduce_int_max // SMAXV_asimdall_only - when ('0', _, '11010') => __encoding aarch64_vector_reduce_int_max // SMINV_asimdall_only - when ('0', _, '11011') => __encoding aarch64_vector_reduce_add_simd // ADDV_asimdall_only - when ('0', '00', '01100') => __encoding aarch64_vector_reduce_fp16_maxnm_simd // FMAXNMV_asimdall_only_H - when ('0', '00', '01111') => __encoding aarch64_vector_reduce_fp16_max_simd // FMAXV_asimdall_only_H - when ('0', '01', '01100') => __UNALLOCATED - when ('0', '01', '01111') => __UNALLOCATED - when ('0', '10', '01100') => __encoding aarch64_vector_reduce_fp16_maxnm_simd // FMINNMV_asimdall_only_H - when ('0', '10', '01111') => __encoding aarch64_vector_reduce_fp16_max_simd // FMINV_asimdall_only_H - when ('0', '11', '01100') => __UNALLOCATED - when ('0', '11', '01111') => __UNALLOCATED - when ('1', _, '00011') => __encoding aarch64_vector_reduce_add_long // UADDLV_asimdall_only - when ('1', _, '01010') => __encoding aarch64_vector_reduce_int_max // UMAXV_asimdall_only - when ('1', _, '11010') => __encoding aarch64_vector_reduce_int_max // UMINV_asimdall_only - when ('1', _, '11011') => __UNALLOCATED - when ('1', '0x', '01100') => __encoding aarch64_vector_reduce_fp_maxnm_simd // FMAXNMV_asimdall_only_SD - when ('1', '0x', '01111') => __encoding aarch64_vector_reduce_fp_max_simd // FMAXV_asimdall_only_SD - when ('1', '1x', '01100') => __encoding aarch64_vector_reduce_fp_maxnm_simd // FMINNMV_asimdall_only_SD - when ('1', '1x', '01111') => __encoding aarch64_vector_reduce_fp_max_simd // FMINV_asimdall_only_SD - when ('0xx0', _, '0x', 'x1xx', '1xxxxxx10', _) => __UNPREDICTABLE - when ('0xx0', _, '0x', 'x1xx', 'x1xxxxx10', _) => __UNPREDICTABLE - when ('0xx0', _, '0x', 'x1xx', 'xxxxxxx00', _) => // asimddiff - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, opcode) of - when (_, '1111') => __UNALLOCATED - when ('0', '0000') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_long // SADDL_asimddiff_L - when ('0', '0001') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_wide // SADDW_asimddiff_W - when ('0', '0010') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_long // SSUBL_asimddiff_L - when ('0', '0011') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_wide // SSUBW_asimddiff_W - when ('0', '0100') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_narrow // ADDHN_asimddiff_N - when ('0', '0101') => __encoding aarch64_vector_arithmetic_binary_disparate_diff // SABAL_asimddiff_L - when ('0', '0110') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_narrow // SUBHN_asimddiff_N - when ('0', '0111') => __encoding aarch64_vector_arithmetic_binary_disparate_diff // SABDL_asimddiff_L - when ('0', '1000') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_accum // SMLAL_asimddiff_L - when ('0', '1001') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_dmacc_simd // SQDMLAL_asimddiff_L - when ('0', '1010') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_accum // SMLSL_asimddiff_L - when ('0', '1011') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_dmacc_simd // SQDMLSL_asimddiff_L - when ('0', '1100') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_product // SMULL_asimddiff_L - when ('0', '1101') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_double_simd // SQDMULL_asimddiff_L - when ('0', '1110') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_poly // PMULL_asimddiff_L - when ('1', '0000') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_long // UADDL_asimddiff_L - when ('1', '0001') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_wide // UADDW_asimddiff_W - when ('1', '0010') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_long // USUBL_asimddiff_L - when ('1', '0011') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_wide // USUBW_asimddiff_W - when ('1', '0100') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_narrow // RADDHN_asimddiff_N - when ('1', '0101') => __encoding aarch64_vector_arithmetic_binary_disparate_diff // UABAL_asimddiff_L - when ('1', '0110') => __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_narrow // RSUBHN_asimddiff_N - when ('1', '0111') => __encoding aarch64_vector_arithmetic_binary_disparate_diff // UABDL_asimddiff_L - when ('1', '1000') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_accum // UMLAL_asimddiff_L - when ('1', '1001') => __UNALLOCATED - when ('1', '1010') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_accum // UMLSL_asimddiff_L - when ('1', '1011') => __UNALLOCATED - when ('1', '1100') => __encoding aarch64_vector_arithmetic_binary_disparate_mul_product // UMULL_asimddiff_L - when ('1', '1101') => __UNALLOCATED - when ('1', '1110') => __UNALLOCATED - when ('0xx0', _, '0x', 'x1xx', 'xxxxxxxx1', _) => // asimdsame - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field opcode 11 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, size, opcode) of - when ('0', _, '00000') => __encoding aarch64_vector_arithmetic_binary_uniform_add_halving_truncating // SHADD_asimdsame_only - when ('0', _, '00001') => __encoding aarch64_vector_arithmetic_binary_uniform_add_saturating_simd // SQADD_asimdsame_only - when ('0', _, '00010') => __encoding aarch64_vector_arithmetic_binary_uniform_add_halving_rounding // SRHADD_asimdsame_only - when ('0', _, '00100') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_int // SHSUB_asimdsame_only - when ('0', _, '00101') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_saturating_simd // SQSUB_asimdsame_only - when ('0', _, '00110') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_simd // CMGT_asimdsame_only - when ('0', _, '00111') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_simd // CMGE_asimdsame_only - when ('0', _, '01000') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd // SSHL_asimdsame_only - when ('0', _, '01001') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd // SQSHL_asimdsame_only - when ('0', _, '01010') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd // SRSHL_asimdsame_only - when ('0', _, '01011') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd // SQRSHL_asimdsame_only - when ('0', _, '01100') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_single // SMAX_asimdsame_only - when ('0', _, '01101') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_single // SMIN_asimdsame_only - when ('0', _, '01110') => __encoding aarch64_vector_arithmetic_binary_uniform_diff // SABD_asimdsame_only - when ('0', _, '01111') => __encoding aarch64_vector_arithmetic_binary_uniform_diff // SABA_asimdsame_only - when ('0', _, '10000') => __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_simd // ADD_asimdsame_only - when ('0', _, '10001') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_simd // CMTST_asimdsame_only - when ('0', _, '10010') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_accum // MLA_asimdsame_only - when ('0', _, '10011') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_product // MUL_asimdsame_only - when ('0', _, '10100') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_pair // SMAXP_asimdsame_only - when ('0', _, '10101') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_pair // SMINP_asimdsame_only - when ('0', _, '10110') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_simd // SQDMULH_asimdsame_only - when ('0', _, '10111') => __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_pair // ADDP_asimdsame_only - when ('0', '0x', '11000') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_2008 // FMAXNM_asimdsame_only - when ('0', '0x', '11001') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_fused // FMLA_asimdsame_only - when ('0', '0x', '11010') => __encoding aarch64_vector_arithmetic_binary_uniform_add_fp // FADD_asimdsame_only - when ('0', '0x', '11011') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_extended_simd // FMULX_asimdsame_only - when ('0', '0x', '11100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd // FCMEQ_asimdsame_only - when ('0', '0x', '11110') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_1985 // FMAX_asimdsame_only - when ('0', '0x', '11111') => __encoding aarch64_vector_arithmetic_binary_uniform_recps_simd // FRECPS_asimdsame_only - when ('0', '00', '00011') => __encoding aarch64_vector_arithmetic_binary_uniform_logical_and_orr // AND_asimdsame_only - when ('0', '00', '11101') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_lower // FMLAL_asimdsame_F - when ('0', '01', '00011') => __encoding aarch64_vector_arithmetic_binary_uniform_logical_and_orr // BIC_asimdsame_only - when ('0', '01', '11101') => __UNALLOCATED - when ('0', '1x', '11000') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_2008 // FMINNM_asimdsame_only - when ('0', '1x', '11001') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_fused // FMLS_asimdsame_only - when ('0', '1x', '11010') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp_simd // FSUB_asimdsame_only - when ('0', '1x', '11011') => __UNALLOCATED - when ('0', '1x', '11100') => __UNALLOCATED - when ('0', '1x', '11110') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_1985 // FMIN_asimdsame_only - when ('0', '1x', '11111') => __encoding aarch64_vector_arithmetic_binary_uniform_rsqrts_simd // FRSQRTS_asimdsame_only - when ('0', '10', '00011') => __encoding aarch64_vector_arithmetic_binary_uniform_logical_and_orr // ORR_asimdsame_only - when ('0', '10', '11101') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_lower // FMLSL_asimdsame_F - when ('0', '11', '00011') => __encoding aarch64_vector_arithmetic_binary_uniform_logical_and_orr // ORN_asimdsame_only - when ('0', '11', '11101') => __UNALLOCATED - when ('1', _, '00000') => __encoding aarch64_vector_arithmetic_binary_uniform_add_halving_truncating // UHADD_asimdsame_only - when ('1', _, '00001') => __encoding aarch64_vector_arithmetic_binary_uniform_add_saturating_simd // UQADD_asimdsame_only - when ('1', _, '00010') => __encoding aarch64_vector_arithmetic_binary_uniform_add_halving_rounding // URHADD_asimdsame_only - when ('1', _, '00100') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_int // UHSUB_asimdsame_only - when ('1', _, '00101') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_saturating_simd // UQSUB_asimdsame_only - when ('1', _, '00110') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_simd // CMHI_asimdsame_only - when ('1', _, '00111') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_simd // CMHS_asimdsame_only - when ('1', _, '01000') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd // USHL_asimdsame_only - when ('1', _, '01001') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd // UQSHL_asimdsame_only - when ('1', _, '01010') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd // URSHL_asimdsame_only - when ('1', _, '01011') => __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd // UQRSHL_asimdsame_only - when ('1', _, '01100') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_single // UMAX_asimdsame_only - when ('1', _, '01101') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_single // UMIN_asimdsame_only - when ('1', _, '01110') => __encoding aarch64_vector_arithmetic_binary_uniform_diff // UABD_asimdsame_only - when ('1', _, '01111') => __encoding aarch64_vector_arithmetic_binary_uniform_diff // UABA_asimdsame_only - when ('1', _, '10000') => __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_simd // SUB_asimdsame_only - when ('1', _, '10001') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_simd // CMEQ_asimdsame_only - when ('1', _, '10010') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_accum // MLS_asimdsame_only - when ('1', _, '10011') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_product // PMUL_asimdsame_only - when ('1', _, '10100') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_pair // UMAXP_asimdsame_only - when ('1', _, '10101') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_pair // UMINP_asimdsame_only - when ('1', _, '10110') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_simd // SQRDMULH_asimdsame_only - when ('1', _, '10111') => __UNALLOCATED - when ('1', '0x', '11000') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_2008 // FMAXNMP_asimdsame_only - when ('1', '0x', '11010') => __encoding aarch64_vector_arithmetic_binary_uniform_add_fp // FADDP_asimdsame_only - when ('1', '0x', '11011') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_product // FMUL_asimdsame_only - when ('1', '0x', '11100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd // FCMGE_asimdsame_only - when ('1', '0x', '11101') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd // FACGE_asimdsame_only - when ('1', '0x', '11110') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_1985 // FMAXP_asimdsame_only - when ('1', '0x', '11111') => __encoding aarch64_vector_arithmetic_binary_uniform_div // FDIV_asimdsame_only - when ('1', '00', '00011') => __encoding aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor // EOR_asimdsame_only - when ('1', '00', '11001') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_upper // FMLAL2_asimdsame_F - when ('1', '01', '00011') => __encoding aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor // BSL_asimdsame_only - when ('1', '01', '11001') => __UNALLOCATED - when ('1', '1x', '11000') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_2008 // FMINNMP_asimdsame_only - when ('1', '1x', '11010') => __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp_simd // FABD_asimdsame_only - when ('1', '1x', '11011') => __UNALLOCATED - when ('1', '1x', '11100') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd // FCMGT_asimdsame_only - when ('1', '1x', '11101') => __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd // FACGT_asimdsame_only - when ('1', '1x', '11110') => __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_1985 // FMINP_asimdsame_only - when ('1', '1x', '11111') => __UNALLOCATED - when ('1', '10', '00011') => __encoding aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor // BIT_asimdsame_only - when ('1', '10', '11001') => __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_upper // FMLSL2_asimdsame_F - when ('1', '11', '00011') => __encoding aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor // BIF_asimdsame_only - when ('1', '11', '11001') => __UNALLOCATED - when ('0xx0', _, '10', '0000', 'xxxxxxxx1', _) => // asimdimm - __field Q 30 +: 1 - __field op 29 +: 1 - __field a 18 +: 1 - __field b 17 +: 1 - __field c 16 +: 1 - __field cmode 12 +: 4 - __field o2 11 +: 1 - __field d 9 +: 1 - __field e 8 +: 1 - __field f 7 +: 1 - __field g 6 +: 1 - __field h 5 +: 1 - __field Rd 0 +: 5 - case (Q, op, cmode, o2) of - when (_, '0', '0xxx', '1') => __UNALLOCATED - when (_, '0', '0xx0', '0') => __encoding aarch64_vector_logical // MOVI_asimdimm_L_sl - when (_, '0', '0xx1', '0') => __encoding aarch64_vector_logical // ORR_asimdimm_L_sl - when (_, '0', '10xx', '1') => __UNALLOCATED - when (_, '0', '10x0', '0') => __encoding aarch64_vector_logical // MOVI_asimdimm_L_hl - when (_, '0', '10x1', '0') => __encoding aarch64_vector_logical // ORR_asimdimm_L_hl - when (_, '0', '110x', '0') => __encoding aarch64_vector_logical // MOVI_asimdimm_M_sm - when (_, '0', '110x', '1') => __UNALLOCATED - when (_, '0', '1110', '0') => __encoding aarch64_vector_logical // MOVI_asimdimm_N_b - when (_, '0', '1110', '1') => __UNALLOCATED - when (_, '0', '1111', '0') => __encoding aarch64_vector_logical // FMOV_asimdimm_S_s - when (_, '0', '1111', '1') => __encoding aarch64_vector_fp16_movi // FMOV_asimdimm_H_h - when (_, '1', _, '1') => __UNALLOCATED - when (_, '1', '0xx0', '0') => __encoding aarch64_vector_logical // MVNI_asimdimm_L_sl - when (_, '1', '0xx1', '0') => __encoding aarch64_vector_logical // BIC_asimdimm_L_sl - when (_, '1', '10x0', '0') => __encoding aarch64_vector_logical // MVNI_asimdimm_L_hl - when (_, '1', '10x1', '0') => __encoding aarch64_vector_logical // BIC_asimdimm_L_hl - when (_, '1', '110x', '0') => __encoding aarch64_vector_logical // MVNI_asimdimm_M_sm - when ('0', '1', '1110', '0') => __encoding aarch64_vector_logical // MOVI_asimdimm_D_ds - when ('0', '1', '1111', '0') => __UNALLOCATED - when ('1', '1', '1110', '0') => __encoding aarch64_vector_logical // MOVI_asimdimm_D2_d - when ('1', '1', '1111', '0') => __encoding aarch64_vector_logical // FMOV_asimdimm_D2_d - when ('0xx0', _, '10', !'0000', 'xxxxxxxx1', _) => // asimdshf - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field opcode 11 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, opcode) of - when (_, '00001') => __UNALLOCATED - when (_, '00011') => __UNALLOCATED - when (_, '00101') => __UNALLOCATED - when (_, '00111') => __UNALLOCATED - when (_, '01001') => __UNALLOCATED - when (_, '01011') => __UNALLOCATED - when (_, '01101') => __UNALLOCATED - when (_, '01111') => __UNALLOCATED - when (_, '10101') => __UNALLOCATED - when (_, '1011x') => __UNALLOCATED - when (_, '110xx') => __UNALLOCATED - when (_, '11101') => __UNALLOCATED - when (_, '11110') => __UNALLOCATED - when ('0', '00000') => __encoding aarch64_vector_shift_right_simd // SSHR_asimdshf_R - when ('0', '00010') => __encoding aarch64_vector_shift_right_simd // SSRA_asimdshf_R - when ('0', '00100') => __encoding aarch64_vector_shift_right_simd // SRSHR_asimdshf_R - when ('0', '00110') => __encoding aarch64_vector_shift_right_simd // SRSRA_asimdshf_R - when ('0', '01000') => __UNALLOCATED - when ('0', '01010') => __encoding aarch64_vector_shift_left_simd // SHL_asimdshf_R - when ('0', '01100') => __UNALLOCATED - when ('0', '01110') => __encoding aarch64_vector_shift_left_sat_simd // SQSHL_asimdshf_R - when ('0', '10000') => __encoding aarch64_vector_shift_right_narrow_logical // SHRN_asimdshf_N - when ('0', '10001') => __encoding aarch64_vector_shift_right_narrow_logical // RSHRN_asimdshf_N - when ('0', '10010') => __encoding aarch64_vector_shift_right_narrow_uniform_simd // SQSHRN_asimdshf_N - when ('0', '10011') => __encoding aarch64_vector_shift_right_narrow_uniform_simd // SQRSHRN_asimdshf_N - when ('0', '10100') => __encoding aarch64_vector_shift_left_long // SSHLL_asimdshf_L - when ('0', '11100') => __encoding aarch64_vector_shift_conv_int_simd // SCVTF_asimdshf_C - when ('0', '11111') => __encoding aarch64_vector_shift_conv_float_simd // FCVTZS_asimdshf_C - when ('1', '00000') => __encoding aarch64_vector_shift_right_simd // USHR_asimdshf_R - when ('1', '00010') => __encoding aarch64_vector_shift_right_simd // USRA_asimdshf_R - when ('1', '00100') => __encoding aarch64_vector_shift_right_simd // URSHR_asimdshf_R - when ('1', '00110') => __encoding aarch64_vector_shift_right_simd // URSRA_asimdshf_R - when ('1', '01000') => __encoding aarch64_vector_shift_right_insert_simd // SRI_asimdshf_R - when ('1', '01010') => __encoding aarch64_vector_shift_left_insert_simd // SLI_asimdshf_R - when ('1', '01100') => __encoding aarch64_vector_shift_left_sat_simd // SQSHLU_asimdshf_R - when ('1', '01110') => __encoding aarch64_vector_shift_left_sat_simd // UQSHL_asimdshf_R - when ('1', '10000') => __encoding aarch64_vector_shift_right_narrow_nonuniform_simd // SQSHRUN_asimdshf_N - when ('1', '10001') => __encoding aarch64_vector_shift_right_narrow_nonuniform_simd // SQRSHRUN_asimdshf_N - when ('1', '10010') => __encoding aarch64_vector_shift_right_narrow_uniform_simd // UQSHRN_asimdshf_N - when ('1', '10011') => __encoding aarch64_vector_shift_right_narrow_uniform_simd // UQRSHRN_asimdshf_N - when ('1', '10100') => __encoding aarch64_vector_shift_left_long // USHLL_asimdshf_L - when ('1', '11100') => __encoding aarch64_vector_shift_conv_int_simd // UCVTF_asimdshf_C - when ('1', '11111') => __encoding aarch64_vector_shift_conv_float_simd // FCVTZU_asimdshf_C - when ('0xx0', _, '11', _, 'xxxxxxxx1', _) => __UNPREDICTABLE - when ('0xx0', _, '1x', _, 'xxxxxxxx0', _) => // asimdelem - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field opcode 12 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (U, size, opcode) of - when (_, '01', '1001') => __UNALLOCATED - when ('0', _, '0010') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_long // SMLAL_asimdelem_L - when ('0', _, '0011') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_double_simd // SQDMLAL_asimdelem_L - when ('0', _, '0110') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_long // SMLSL_asimdelem_L - when ('0', _, '0111') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_double_simd // SQDMLSL_asimdelem_L - when ('0', _, '1000') => __encoding aarch64_vector_arithmetic_binary_element_mul_int // MUL_asimdelem_R - when ('0', _, '1010') => __encoding aarch64_vector_arithmetic_binary_element_mul_long // SMULL_asimdelem_L - when ('0', _, '1011') => __encoding aarch64_vector_arithmetic_binary_element_mul_double_simd // SQDMULL_asimdelem_L - when ('0', _, '1100') => __encoding aarch64_vector_arithmetic_binary_element_mul_high_simd // SQDMULH_asimdelem_R - when ('0', _, '1101') => __encoding aarch64_vector_arithmetic_binary_element_mul_high_simd // SQRDMULH_asimdelem_R - when ('0', _, '1110') => __encoding aarch64_vector_arithmetic_binary_element_dotp // SDOT_asimdelem_D - when ('0', '0x', '0000') => __UNALLOCATED - when ('0', '0x', '0100') => __UNALLOCATED - when ('0', '00', '0001') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp16_simd // FMLA_asimdelem_RH_H - when ('0', '00', '0101') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp16_simd // FMLS_asimdelem_RH_H - when ('0', '00', '1001') => __encoding aarch64_vector_arithmetic_binary_element_mul_fp16_simd // FMUL_asimdelem_RH_H - when ('0', '00', '1111') => __encoding aarch64_vector_arithmetic_binary_element_mat_mul_int_dotp // SUDOT_asimdelem_D - when ('0', '01', '0001') => __UNALLOCATED - when ('0', '01', '0101') => __UNALLOCATED - when ('0', '01', '1111') => __encoding aarch64_vector_arithmetic_binary_element_bfdot // BFDOT_asimdelem_E - when ('0', '1x', '0001') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp_simd // FMLA_asimdelem_R_SD - when ('0', '1x', '0101') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp_simd // FMLS_asimdelem_R_SD - when ('0', '1x', '1001') => __encoding aarch64_vector_arithmetic_binary_element_mul_fp_simd // FMUL_asimdelem_R_SD - when ('0', '10', '0000') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_lower // FMLAL_asimdelem_LH - when ('0', '10', '0100') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_lower // FMLSL_asimdelem_LH - when ('0', '10', '1111') => __encoding aarch64_vector_arithmetic_binary_element_mat_mul_int_dotp // USDOT_asimdelem_D - when ('0', '11', '0000') => __UNALLOCATED - when ('0', '11', '0100') => __UNALLOCATED - when ('0', '11', '1111') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_bf16_long // BFMLAL_asimdelem_F - when ('1', _, '0000') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_int // MLA_asimdelem_R - when ('1', _, '0010') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_long // UMLAL_asimdelem_L - when ('1', _, '0100') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_int // MLS_asimdelem_R - when ('1', _, '0110') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_long // UMLSL_asimdelem_L - when ('1', _, '1010') => __encoding aarch64_vector_arithmetic_binary_element_mul_long // UMULL_asimdelem_L - when ('1', _, '1011') => __UNALLOCATED - when ('1', _, '1101') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_high_simd // SQRDMLAH_asimdelem_R - when ('1', _, '1110') => __encoding aarch64_vector_arithmetic_binary_element_dotp // UDOT_asimdelem_D - when ('1', _, '1111') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_high_simd // SQRDMLSH_asimdelem_R - when ('1', '0x', '1000') => __UNALLOCATED - when ('1', '0x', '1100') => __UNALLOCATED - when ('1', '00', '0001') => __UNALLOCATED - when ('1', '00', '0011') => __UNALLOCATED - when ('1', '00', '0101') => __UNALLOCATED - when ('1', '00', '0111') => __UNALLOCATED - when ('1', '00', '1001') => __encoding aarch64_vector_arithmetic_binary_element_mul_fp16_simd // FMULX_asimdelem_RH_H - when ('1', '01', '0xx1') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_complex // FCMLA_asimdelem_C_H - when ('1', '1x', '1001') => __encoding aarch64_vector_arithmetic_binary_element_mul_fp_simd // FMULX_asimdelem_R_SD - when ('1', '10', '0xx1') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_complex // FCMLA_asimdelem_C_S - when ('1', '10', '1000') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_upper // FMLAL2_asimdelem_LH - when ('1', '10', '1100') => __encoding aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_upper // FMLSL2_asimdelem_LH - when ('1', '11', '0001') => __UNALLOCATED - when ('1', '11', '0011') => __UNALLOCATED - when ('1', '11', '0101') => __UNALLOCATED - when ('1', '11', '0111') => __UNALLOCATED - when ('1', '11', '1000') => __UNALLOCATED - when ('1', '11', '1100') => __UNALLOCATED - when ('1100', _, '00', '10xx', 'xxx10xxxx', _) => // crypto3_imm2 - __field Rm 16 +: 5 - __field imm2 12 +: 2 - __field opcode 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (opcode) of - when ('00') => __encoding aarch64_vector_crypto_sm3_sm3tt1a // SM3TT1A_VVV4_crypto3_imm2 - when ('01') => __encoding aarch64_vector_crypto_sm3_sm3tt1b // SM3TT1B_VVV4_crypto3_imm2 - when ('10') => __encoding aarch64_vector_crypto_sm3_sm3tt2a // SM3TT2A_VVV4_crypto3_imm2 - when ('11') => __encoding aarch64_vector_crypto_sm3_sm3tt2b // SM3TT2B_VVV_crypto3_imm2 - when ('1100', _, '00', '11xx', 'xxx1x00xx', _) => // cryptosha512_3 - __field Rm 16 +: 5 - __field O 14 +: 1 - __field opcode 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (O, opcode) of - when ('0', '00') => __encoding aarch64_vector_crypto_sha512_sha512h // SHA512H_QQV_cryptosha512_3 - when ('0', '01') => __encoding aarch64_vector_crypto_sha512_sha512h2 // SHA512H2_QQV_cryptosha512_3 - when ('0', '10') => __encoding aarch64_vector_crypto_sha512_sha512su1 // SHA512SU1_VVV2_cryptosha512_3 - when ('0', '11') => __encoding aarch64_vector_crypto_sha3_rax1 // RAX1_VVV2_cryptosha512_3 - when ('1', '00') => __encoding aarch64_vector_crypto_sm3_sm3partw1 // SM3PARTW1_VVV4_cryptosha512_3 - when ('1', '01') => __encoding aarch64_vector_crypto_sm3_sm3partw2 // SM3PARTW2_VVV4_cryptosha512_3 - when ('1', '10') => __encoding aarch64_vector_crypto_sm4_sm4enckey // SM4EKEY_VVV4_cryptosha512_3 - when ('1', '11') => __UNALLOCATED - when ('1100', _, '00', _, 'xxx0xxxxx', _) => // crypto4 - __field Op0 21 +: 2 - __field Rm 16 +: 5 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (Op0) of - when ('00') => __encoding aarch64_vector_crypto_sha3_eor3 // EOR3_VVV16_crypto4 - when ('01') => __encoding aarch64_vector_crypto_sha3_bcax // BCAX_VVV16_crypto4 - when ('10') => __encoding aarch64_vector_crypto_sm3_sm3ss1 // SM3SS1_VVV4_crypto4 - when ('11') => __UNALLOCATED - when ('1100', _, '01', '00xx', _, _) => // crypto3_imm6 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case () of - when () => __encoding aarch64_vector_crypto_sha3_xar // XAR_VVV2_crypto3_imm6 - when ('1100', _, '01', '1000', '0001000xx', _) => // cryptosha512_2 - __field opcode 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (opcode) of - when ('00') => __encoding aarch64_vector_crypto_sha512_sha512su0 // SHA512SU0_VV2_cryptosha512_2 - when ('01') => __encoding aarch64_vector_crypto_sm4_sm4enc // SM4E_VV4_cryptosha512_2 - when ('1x') => __UNALLOCATED - when ('1xx0', _, '1x', _, _, _) => __UNPREDICTABLE - when ('x0x1', _, '0x', 'x0xx', _, _) => // float2fix - __field sf 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field scale 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, S, ptype, rmode, opcode, scale) of - when (_, _, _, _, '1xx', _) => __UNALLOCATED - when (_, _, _, 'x0', '00x', _) => __UNALLOCATED - when (_, _, _, 'x1', '01x', _) => __UNALLOCATED - when (_, _, _, '0x', '00x', _) => __UNALLOCATED - when (_, _, _, '1x', '01x', _) => __UNALLOCATED - when (_, _, '10', _, _, _) => __UNALLOCATED - when (_, '1', _, _, _, _) => __UNALLOCATED - when ('0', _, _, _, _, '0xxxxx') => __UNALLOCATED - when ('0', '0', '00', '00', '010', _) => __encoding aarch64_float_convert_fix // SCVTF_S32_float2fix - when ('0', '0', '00', '00', '011', _) => __encoding aarch64_float_convert_fix // UCVTF_S32_float2fix - when ('0', '0', '00', '11', '000', _) => __encoding aarch64_float_convert_fix // FCVTZS_32S_float2fix - when ('0', '0', '00', '11', '001', _) => __encoding aarch64_float_convert_fix // FCVTZU_32S_float2fix - when ('0', '0', '01', '00', '010', _) => __encoding aarch64_float_convert_fix // SCVTF_D32_float2fix - when ('0', '0', '01', '00', '011', _) => __encoding aarch64_float_convert_fix // UCVTF_D32_float2fix - when ('0', '0', '01', '11', '000', _) => __encoding aarch64_float_convert_fix // FCVTZS_32D_float2fix - when ('0', '0', '01', '11', '001', _) => __encoding aarch64_float_convert_fix // FCVTZU_32D_float2fix - when ('0', '0', '11', '00', '010', _) => __encoding aarch64_float_convert_fix // SCVTF_H32_float2fix - when ('0', '0', '11', '00', '011', _) => __encoding aarch64_float_convert_fix // UCVTF_H32_float2fix - when ('0', '0', '11', '11', '000', _) => __encoding aarch64_float_convert_fix // FCVTZS_32H_float2fix - when ('0', '0', '11', '11', '001', _) => __encoding aarch64_float_convert_fix // FCVTZU_32H_float2fix - when ('1', '0', '00', '00', '010', _) => __encoding aarch64_float_convert_fix // SCVTF_S64_float2fix - when ('1', '0', '00', '00', '011', _) => __encoding aarch64_float_convert_fix // UCVTF_S64_float2fix - when ('1', '0', '00', '11', '000', _) => __encoding aarch64_float_convert_fix // FCVTZS_64S_float2fix - when ('1', '0', '00', '11', '001', _) => __encoding aarch64_float_convert_fix // FCVTZU_64S_float2fix - when ('1', '0', '01', '00', '010', _) => __encoding aarch64_float_convert_fix // SCVTF_D64_float2fix - when ('1', '0', '01', '00', '011', _) => __encoding aarch64_float_convert_fix // UCVTF_D64_float2fix - when ('1', '0', '01', '11', '000', _) => __encoding aarch64_float_convert_fix // FCVTZS_64D_float2fix - when ('1', '0', '01', '11', '001', _) => __encoding aarch64_float_convert_fix // FCVTZU_64D_float2fix - when ('1', '0', '11', '00', '010', _) => __encoding aarch64_float_convert_fix // SCVTF_H64_float2fix - when ('1', '0', '11', '00', '011', _) => __encoding aarch64_float_convert_fix // UCVTF_H64_float2fix - when ('1', '0', '11', '11', '000', _) => __encoding aarch64_float_convert_fix // FCVTZS_64H_float2fix - when ('1', '0', '11', '11', '001', _) => __encoding aarch64_float_convert_fix // FCVTZU_64H_float2fix - when ('x0x1', _, '0x', 'x1xx', 'xxx000000', _) => // float2int - __field sf 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (sf, S, ptype, rmode, opcode) of - when (_, _, _, 'x1', '01x') => __UNALLOCATED - when (_, _, _, 'x1', '10x') => __UNALLOCATED - when (_, _, _, '1x', '01x') => __UNALLOCATED - when (_, _, _, '1x', '10x') => __UNALLOCATED - when (_, '0', '10', _, '0xx') => __UNALLOCATED - when (_, '0', '10', _, '10x') => __UNALLOCATED - when (_, '1', _, _, _) => __UNALLOCATED - when ('0', '0', '00', 'x1', '11x') => __UNALLOCATED - when ('0', '0', '00', '00', '000') => __encoding aarch64_float_convert_int // FCVTNS_32S_float2int - when ('0', '0', '00', '00', '001') => __encoding aarch64_float_convert_int // FCVTNU_32S_float2int - when ('0', '0', '00', '00', '010') => __encoding aarch64_float_convert_int // SCVTF_S32_float2int - when ('0', '0', '00', '00', '011') => __encoding aarch64_float_convert_int // UCVTF_S32_float2int - when ('0', '0', '00', '00', '100') => __encoding aarch64_float_convert_int // FCVTAS_32S_float2int - when ('0', '0', '00', '00', '101') => __encoding aarch64_float_convert_int // FCVTAU_32S_float2int - when ('0', '0', '00', '00', '110') => __encoding aarch64_float_convert_int // FMOV_32S_float2int - when ('0', '0', '00', '00', '111') => __encoding aarch64_float_convert_int // FMOV_S32_float2int - when ('0', '0', '00', '01', '000') => __encoding aarch64_float_convert_int // FCVTPS_32S_float2int - when ('0', '0', '00', '01', '001') => __encoding aarch64_float_convert_int // FCVTPU_32S_float2int - when ('0', '0', '00', '1x', '11x') => __UNALLOCATED - when ('0', '0', '00', '10', '000') => __encoding aarch64_float_convert_int // FCVTMS_32S_float2int - when ('0', '0', '00', '10', '001') => __encoding aarch64_float_convert_int // FCVTMU_32S_float2int - when ('0', '0', '00', '11', '000') => __encoding aarch64_float_convert_int // FCVTZS_32S_float2int - when ('0', '0', '00', '11', '001') => __encoding aarch64_float_convert_int // FCVTZU_32S_float2int - when ('0', '0', '01', '0x', '11x') => __UNALLOCATED - when ('0', '0', '01', '00', '000') => __encoding aarch64_float_convert_int // FCVTNS_32D_float2int - when ('0', '0', '01', '00', '001') => __encoding aarch64_float_convert_int // FCVTNU_32D_float2int - when ('0', '0', '01', '00', '010') => __encoding aarch64_float_convert_int // SCVTF_D32_float2int - when ('0', '0', '01', '00', '011') => __encoding aarch64_float_convert_int // UCVTF_D32_float2int - when ('0', '0', '01', '00', '100') => __encoding aarch64_float_convert_int // FCVTAS_32D_float2int - when ('0', '0', '01', '00', '101') => __encoding aarch64_float_convert_int // FCVTAU_32D_float2int - when ('0', '0', '01', '01', '000') => __encoding aarch64_float_convert_int // FCVTPS_32D_float2int - when ('0', '0', '01', '01', '001') => __encoding aarch64_float_convert_int // FCVTPU_32D_float2int - when ('0', '0', '01', '10', '000') => __encoding aarch64_float_convert_int // FCVTMS_32D_float2int - when ('0', '0', '01', '10', '001') => __encoding aarch64_float_convert_int // FCVTMU_32D_float2int - when ('0', '0', '01', '10', '11x') => __UNALLOCATED - when ('0', '0', '01', '11', '000') => __encoding aarch64_float_convert_int // FCVTZS_32D_float2int - when ('0', '0', '01', '11', '001') => __encoding aarch64_float_convert_int // FCVTZU_32D_float2int - when ('0', '0', '01', '11', '110') => __encoding aarch64_float_convert_int // FJCVTZS_32D_float2int - when ('0', '0', '01', '11', '111') => __UNALLOCATED - when ('0', '0', '10', _, '11x') => __UNALLOCATED - when ('0', '0', '11', '00', '000') => __encoding aarch64_float_convert_int // FCVTNS_32H_float2int - when ('0', '0', '11', '00', '001') => __encoding aarch64_float_convert_int // FCVTNU_32H_float2int - when ('0', '0', '11', '00', '010') => __encoding aarch64_float_convert_int // SCVTF_H32_float2int - when ('0', '0', '11', '00', '011') => __encoding aarch64_float_convert_int // UCVTF_H32_float2int - when ('0', '0', '11', '00', '100') => __encoding aarch64_float_convert_int // FCVTAS_32H_float2int - when ('0', '0', '11', '00', '101') => __encoding aarch64_float_convert_int // FCVTAU_32H_float2int - when ('0', '0', '11', '00', '110') => __encoding aarch64_float_convert_int // FMOV_32H_float2int - when ('0', '0', '11', '00', '111') => __encoding aarch64_float_convert_int // FMOV_H32_float2int - when ('0', '0', '11', '01', '000') => __encoding aarch64_float_convert_int // FCVTPS_32H_float2int - when ('0', '0', '11', '01', '001') => __encoding aarch64_float_convert_int // FCVTPU_32H_float2int - when ('0', '0', '11', '10', '000') => __encoding aarch64_float_convert_int // FCVTMS_32H_float2int - when ('0', '0', '11', '10', '001') => __encoding aarch64_float_convert_int // FCVTMU_32H_float2int - when ('0', '0', '11', '11', '000') => __encoding aarch64_float_convert_int // FCVTZS_32H_float2int - when ('0', '0', '11', '11', '001') => __encoding aarch64_float_convert_int // FCVTZU_32H_float2int - when ('1', '0', '00', _, '11x') => __UNALLOCATED - when ('1', '0', '00', '00', '000') => __encoding aarch64_float_convert_int // FCVTNS_64S_float2int - when ('1', '0', '00', '00', '001') => __encoding aarch64_float_convert_int // FCVTNU_64S_float2int - when ('1', '0', '00', '00', '010') => __encoding aarch64_float_convert_int // SCVTF_S64_float2int - when ('1', '0', '00', '00', '011') => __encoding aarch64_float_convert_int // UCVTF_S64_float2int - when ('1', '0', '00', '00', '100') => __encoding aarch64_float_convert_int // FCVTAS_64S_float2int - when ('1', '0', '00', '00', '101') => __encoding aarch64_float_convert_int // FCVTAU_64S_float2int - when ('1', '0', '00', '01', '000') => __encoding aarch64_float_convert_int // FCVTPS_64S_float2int - when ('1', '0', '00', '01', '001') => __encoding aarch64_float_convert_int // FCVTPU_64S_float2int - when ('1', '0', '00', '10', '000') => __encoding aarch64_float_convert_int // FCVTMS_64S_float2int - when ('1', '0', '00', '10', '001') => __encoding aarch64_float_convert_int // FCVTMU_64S_float2int - when ('1', '0', '00', '11', '000') => __encoding aarch64_float_convert_int // FCVTZS_64S_float2int - when ('1', '0', '00', '11', '001') => __encoding aarch64_float_convert_int // FCVTZU_64S_float2int - when ('1', '0', '01', 'x1', '11x') => __UNALLOCATED - when ('1', '0', '01', '00', '000') => __encoding aarch64_float_convert_int // FCVTNS_64D_float2int - when ('1', '0', '01', '00', '001') => __encoding aarch64_float_convert_int // FCVTNU_64D_float2int - when ('1', '0', '01', '00', '010') => __encoding aarch64_float_convert_int // SCVTF_D64_float2int - when ('1', '0', '01', '00', '011') => __encoding aarch64_float_convert_int // UCVTF_D64_float2int - when ('1', '0', '01', '00', '100') => __encoding aarch64_float_convert_int // FCVTAS_64D_float2int - when ('1', '0', '01', '00', '101') => __encoding aarch64_float_convert_int // FCVTAU_64D_float2int - when ('1', '0', '01', '00', '110') => __encoding aarch64_float_convert_int // FMOV_64D_float2int - when ('1', '0', '01', '00', '111') => __encoding aarch64_float_convert_int // FMOV_D64_float2int - when ('1', '0', '01', '01', '000') => __encoding aarch64_float_convert_int // FCVTPS_64D_float2int - when ('1', '0', '01', '01', '001') => __encoding aarch64_float_convert_int // FCVTPU_64D_float2int - when ('1', '0', '01', '1x', '11x') => __UNALLOCATED - when ('1', '0', '01', '10', '000') => __encoding aarch64_float_convert_int // FCVTMS_64D_float2int - when ('1', '0', '01', '10', '001') => __encoding aarch64_float_convert_int // FCVTMU_64D_float2int - when ('1', '0', '01', '11', '000') => __encoding aarch64_float_convert_int // FCVTZS_64D_float2int - when ('1', '0', '01', '11', '001') => __encoding aarch64_float_convert_int // FCVTZU_64D_float2int - when ('1', '0', '10', 'x0', '11x') => __UNALLOCATED - when ('1', '0', '10', '01', '110') => __encoding aarch64_float_convert_int // FMOV_64VX_float2int - when ('1', '0', '10', '01', '111') => __encoding aarch64_float_convert_int // FMOV_V64I_float2int - when ('1', '0', '10', '1x', '11x') => __UNALLOCATED - when ('1', '0', '11', '00', '000') => __encoding aarch64_float_convert_int // FCVTNS_64H_float2int - when ('1', '0', '11', '00', '001') => __encoding aarch64_float_convert_int // FCVTNU_64H_float2int - when ('1', '0', '11', '00', '010') => __encoding aarch64_float_convert_int // SCVTF_H64_float2int - when ('1', '0', '11', '00', '011') => __encoding aarch64_float_convert_int // UCVTF_H64_float2int - when ('1', '0', '11', '00', '100') => __encoding aarch64_float_convert_int // FCVTAS_64H_float2int - when ('1', '0', '11', '00', '101') => __encoding aarch64_float_convert_int // FCVTAU_64H_float2int - when ('1', '0', '11', '00', '110') => __encoding aarch64_float_convert_int // FMOV_64H_float2int - when ('1', '0', '11', '00', '111') => __encoding aarch64_float_convert_int // FMOV_H64_float2int - when ('1', '0', '11', '01', '000') => __encoding aarch64_float_convert_int // FCVTPS_64H_float2int - when ('1', '0', '11', '01', '001') => __encoding aarch64_float_convert_int // FCVTPU_64H_float2int - when ('1', '0', '11', '10', '000') => __encoding aarch64_float_convert_int // FCVTMS_64H_float2int - when ('1', '0', '11', '10', '001') => __encoding aarch64_float_convert_int // FCVTMU_64H_float2int - when ('1', '0', '11', '11', '000') => __encoding aarch64_float_convert_int // FCVTZS_64H_float2int - when ('1', '0', '11', '11', '001') => __encoding aarch64_float_convert_int // FCVTZU_64H_float2int - when ('x0x1', _, '0x', 'x1xx', 'xxxx10000', _) => // floatdp1 - __field M 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field opcode 15 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (M, S, ptype, opcode) of - when (_, _, _, '1xxxxx') => __UNALLOCATED - when (_, '1', _, _) => __UNALLOCATED - when ('0', '0', '00', '000000') => __encoding aarch64_float_arithmetic_unary // FMOV_S_floatdp1 - when ('0', '0', '00', '000001') => __encoding aarch64_float_arithmetic_unary // FABS_S_floatdp1 - when ('0', '0', '00', '000010') => __encoding aarch64_float_arithmetic_unary // FNEG_S_floatdp1 - when ('0', '0', '00', '000011') => __encoding aarch64_float_arithmetic_unary // FSQRT_S_floatdp1 - when ('0', '0', '00', '000100') => __UNALLOCATED - when ('0', '0', '00', '000101') => __encoding aarch64_float_convert_fp // FCVT_DS_floatdp1 - when ('0', '0', '00', '000110') => __UNALLOCATED - when ('0', '0', '00', '000111') => __encoding aarch64_float_convert_fp // FCVT_HS_floatdp1 - when ('0', '0', '00', '001000') => __encoding aarch64_float_arithmetic_round_frint // FRINTN_S_floatdp1 - when ('0', '0', '00', '001001') => __encoding aarch64_float_arithmetic_round_frint // FRINTP_S_floatdp1 - when ('0', '0', '00', '001010') => __encoding aarch64_float_arithmetic_round_frint // FRINTM_S_floatdp1 - when ('0', '0', '00', '001011') => __encoding aarch64_float_arithmetic_round_frint // FRINTZ_S_floatdp1 - when ('0', '0', '00', '001100') => __encoding aarch64_float_arithmetic_round_frint // FRINTA_S_floatdp1 - when ('0', '0', '00', '001101') => __UNALLOCATED - when ('0', '0', '00', '001110') => __encoding aarch64_float_arithmetic_round_frint // FRINTX_S_floatdp1 - when ('0', '0', '00', '001111') => __encoding aarch64_float_arithmetic_round_frint // FRINTI_S_floatdp1 - when ('0', '0', '00', '010000') => __encoding aarch64_float_arithmetic_round_frint_32_64 // FRINT32Z_S_floatdp1 - when ('0', '0', '00', '010001') => __encoding aarch64_float_arithmetic_round_frint_32_64 // FRINT32X_S_floatdp1 - when ('0', '0', '00', '010010') => __encoding aarch64_float_arithmetic_round_frint_32_64 // FRINT64Z_S_floatdp1 - when ('0', '0', '00', '010011') => __encoding aarch64_float_arithmetic_round_frint_32_64 // FRINT64X_S_floatdp1 - when ('0', '0', '00', '0101xx') => __UNALLOCATED - when ('0', '0', '00', '011xxx') => __UNALLOCATED - when ('0', '0', '01', '000000') => __encoding aarch64_float_arithmetic_unary // FMOV_D_floatdp1 - when ('0', '0', '01', '000001') => __encoding aarch64_float_arithmetic_unary // FABS_D_floatdp1 - when ('0', '0', '01', '000010') => __encoding aarch64_float_arithmetic_unary // FNEG_D_floatdp1 - when ('0', '0', '01', '000011') => __encoding aarch64_float_arithmetic_unary // FSQRT_D_floatdp1 - when ('0', '0', '01', '000100') => __encoding aarch64_float_convert_fp // FCVT_SD_floatdp1 - when ('0', '0', '01', '000101') => __UNALLOCATED - when ('0', '0', '01', '000110') => __encoding aarch64_vector_cvt_bf16_scalar // BFCVT_BS_floatdp1 - when ('0', '0', '01', '000111') => __encoding aarch64_float_convert_fp // FCVT_HD_floatdp1 - when ('0', '0', '01', '001000') => __encoding aarch64_float_arithmetic_round_frint // FRINTN_D_floatdp1 - when ('0', '0', '01', '001001') => __encoding aarch64_float_arithmetic_round_frint // FRINTP_D_floatdp1 - when ('0', '0', '01', '001010') => __encoding aarch64_float_arithmetic_round_frint // FRINTM_D_floatdp1 - when ('0', '0', '01', '001011') => __encoding aarch64_float_arithmetic_round_frint // FRINTZ_D_floatdp1 - when ('0', '0', '01', '001100') => __encoding aarch64_float_arithmetic_round_frint // FRINTA_D_floatdp1 - when ('0', '0', '01', '001101') => __UNALLOCATED - when ('0', '0', '01', '001110') => __encoding aarch64_float_arithmetic_round_frint // FRINTX_D_floatdp1 - when ('0', '0', '01', '001111') => __encoding aarch64_float_arithmetic_round_frint // FRINTI_D_floatdp1 - when ('0', '0', '01', '010000') => __encoding aarch64_float_arithmetic_round_frint_32_64 // FRINT32Z_D_floatdp1 - when ('0', '0', '01', '010001') => __encoding aarch64_float_arithmetic_round_frint_32_64 // FRINT32X_D_floatdp1 - when ('0', '0', '01', '010010') => __encoding aarch64_float_arithmetic_round_frint_32_64 // FRINT64Z_D_floatdp1 - when ('0', '0', '01', '010011') => __encoding aarch64_float_arithmetic_round_frint_32_64 // FRINT64X_D_floatdp1 - when ('0', '0', '01', '0101xx') => __UNALLOCATED - when ('0', '0', '01', '011xxx') => __UNALLOCATED - when ('0', '0', '10', '0xxxxx') => __UNALLOCATED - when ('0', '0', '11', '000000') => __encoding aarch64_float_arithmetic_unary // FMOV_H_floatdp1 - when ('0', '0', '11', '000001') => __encoding aarch64_float_arithmetic_unary // FABS_H_floatdp1 - when ('0', '0', '11', '000010') => __encoding aarch64_float_arithmetic_unary // FNEG_H_floatdp1 - when ('0', '0', '11', '000011') => __encoding aarch64_float_arithmetic_unary // FSQRT_H_floatdp1 - when ('0', '0', '11', '000100') => __encoding aarch64_float_convert_fp // FCVT_SH_floatdp1 - when ('0', '0', '11', '000101') => __encoding aarch64_float_convert_fp // FCVT_DH_floatdp1 - when ('0', '0', '11', '00011x') => __UNALLOCATED - when ('0', '0', '11', '001000') => __encoding aarch64_float_arithmetic_round_frint // FRINTN_H_floatdp1 - when ('0', '0', '11', '001001') => __encoding aarch64_float_arithmetic_round_frint // FRINTP_H_floatdp1 - when ('0', '0', '11', '001010') => __encoding aarch64_float_arithmetic_round_frint // FRINTM_H_floatdp1 - when ('0', '0', '11', '001011') => __encoding aarch64_float_arithmetic_round_frint // FRINTZ_H_floatdp1 - when ('0', '0', '11', '001100') => __encoding aarch64_float_arithmetic_round_frint // FRINTA_H_floatdp1 - when ('0', '0', '11', '001101') => __UNALLOCATED - when ('0', '0', '11', '001110') => __encoding aarch64_float_arithmetic_round_frint // FRINTX_H_floatdp1 - when ('0', '0', '11', '001111') => __encoding aarch64_float_arithmetic_round_frint // FRINTI_H_floatdp1 - when ('0', '0', '11', '01xxxx') => __UNALLOCATED - when ('1', _, _, _) => __UNALLOCATED - when ('x0x1', _, '0x', 'x1xx', 'xxxxx1000', _) => // floatcmp - __field M 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field Rm 16 +: 5 - __field op 14 +: 2 - __field Rn 5 +: 5 - __field opcode2 0 +: 5 - case (M, S, ptype, op, opcode2) of - when (_, _, _, _, 'xxxx1') => __UNALLOCATED - when (_, _, _, _, 'xxx1x') => __UNALLOCATED - when (_, _, _, _, 'xx1xx') => __UNALLOCATED - when (_, _, _, 'x1', _) => __UNALLOCATED - when (_, _, _, '1x', _) => __UNALLOCATED - when (_, _, '10', _, _) => __UNALLOCATED - when (_, '1', _, _, _) => __UNALLOCATED - when ('0', '0', '00', '00', '00000') => __encoding aarch64_float_compare_uncond // FCMP_S_floatcmp - when ('0', '0', '00', '00', '01000') => __encoding aarch64_float_compare_uncond // FCMP_SZ_floatcmp - when ('0', '0', '00', '00', '10000') => __encoding aarch64_float_compare_uncond // FCMPE_S_floatcmp - when ('0', '0', '00', '00', '11000') => __encoding aarch64_float_compare_uncond // FCMPE_SZ_floatcmp - when ('0', '0', '01', '00', '00000') => __encoding aarch64_float_compare_uncond // FCMP_D_floatcmp - when ('0', '0', '01', '00', '01000') => __encoding aarch64_float_compare_uncond // FCMP_DZ_floatcmp - when ('0', '0', '01', '00', '10000') => __encoding aarch64_float_compare_uncond // FCMPE_D_floatcmp - when ('0', '0', '01', '00', '11000') => __encoding aarch64_float_compare_uncond // FCMPE_DZ_floatcmp - when ('0', '0', '11', '00', '00000') => __encoding aarch64_float_compare_uncond // FCMP_H_floatcmp - when ('0', '0', '11', '00', '01000') => __encoding aarch64_float_compare_uncond // FCMP_HZ_floatcmp - when ('0', '0', '11', '00', '10000') => __encoding aarch64_float_compare_uncond // FCMPE_H_floatcmp - when ('0', '0', '11', '00', '11000') => __encoding aarch64_float_compare_uncond // FCMPE_HZ_floatcmp - when ('1', _, _, _, _) => __UNALLOCATED - when ('x0x1', _, '0x', 'x1xx', 'xxxxxx100', _) => // floatimm - __field M 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field imm8 13 +: 8 - __field imm5 5 +: 5 - __field Rd 0 +: 5 - case (M, S, ptype, imm5) of - when (_, _, _, 'xxxx1') => __UNALLOCATED - when (_, _, _, 'xxx1x') => __UNALLOCATED - when (_, _, _, 'xx1xx') => __UNALLOCATED - when (_, _, _, 'x1xxx') => __UNALLOCATED - when (_, _, _, '1xxxx') => __UNALLOCATED - when (_, _, '10', _) => __UNALLOCATED - when (_, '1', _, _) => __UNALLOCATED - when ('0', '0', '00', '00000') => __encoding aarch64_float_move_fp_imm // FMOV_S_floatimm - when ('0', '0', '01', '00000') => __encoding aarch64_float_move_fp_imm // FMOV_D_floatimm - when ('0', '0', '11', '00000') => __encoding aarch64_float_move_fp_imm // FMOV_H_floatimm - when ('1', _, _, _) => __UNALLOCATED - when ('x0x1', _, '0x', 'x1xx', 'xxxxxxx01', _) => // floatccmp - __field M 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field op 4 +: 1 - __field nzcv 0 +: 4 - case (M, S, ptype, op) of - when (_, _, '10', _) => __UNALLOCATED - when (_, '1', _, _) => __UNALLOCATED - when ('0', '0', '00', '0') => __encoding aarch64_float_compare_cond // FCCMP_S_floatccmp - when ('0', '0', '00', '1') => __encoding aarch64_float_compare_cond // FCCMPE_S_floatccmp - when ('0', '0', '01', '0') => __encoding aarch64_float_compare_cond // FCCMP_D_floatccmp - when ('0', '0', '01', '1') => __encoding aarch64_float_compare_cond // FCCMPE_D_floatccmp - when ('0', '0', '11', '0') => __encoding aarch64_float_compare_cond // FCCMP_H_floatccmp - when ('0', '0', '11', '1') => __encoding aarch64_float_compare_cond // FCCMPE_H_floatccmp - when ('1', _, _, _) => __UNALLOCATED - when ('x0x1', _, '0x', 'x1xx', 'xxxxxxx10', _) => // floatdp2 - __field M 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (M, S, ptype, opcode) of - when (_, _, _, '1xx1') => __UNALLOCATED - when (_, _, _, '1x1x') => __UNALLOCATED - when (_, _, _, '11xx') => __UNALLOCATED - when (_, _, '10', _) => __UNALLOCATED - when (_, '1', _, _) => __UNALLOCATED - when ('0', '0', '00', '0000') => __encoding aarch64_float_arithmetic_mul_product // FMUL_S_floatdp2 - when ('0', '0', '00', '0001') => __encoding aarch64_float_arithmetic_div // FDIV_S_floatdp2 - when ('0', '0', '00', '0010') => __encoding aarch64_float_arithmetic_add_sub // FADD_S_floatdp2 - when ('0', '0', '00', '0011') => __encoding aarch64_float_arithmetic_add_sub // FSUB_S_floatdp2 - when ('0', '0', '00', '0100') => __encoding aarch64_float_arithmetic_max_min // FMAX_S_floatdp2 - when ('0', '0', '00', '0101') => __encoding aarch64_float_arithmetic_max_min // FMIN_S_floatdp2 - when ('0', '0', '00', '0110') => __encoding aarch64_float_arithmetic_max_min // FMAXNM_S_floatdp2 - when ('0', '0', '00', '0111') => __encoding aarch64_float_arithmetic_max_min // FMINNM_S_floatdp2 - when ('0', '0', '00', '1000') => __encoding aarch64_float_arithmetic_mul_product // FNMUL_S_floatdp2 - when ('0', '0', '01', '0000') => __encoding aarch64_float_arithmetic_mul_product // FMUL_D_floatdp2 - when ('0', '0', '01', '0001') => __encoding aarch64_float_arithmetic_div // FDIV_D_floatdp2 - when ('0', '0', '01', '0010') => __encoding aarch64_float_arithmetic_add_sub // FADD_D_floatdp2 - when ('0', '0', '01', '0011') => __encoding aarch64_float_arithmetic_add_sub // FSUB_D_floatdp2 - when ('0', '0', '01', '0100') => __encoding aarch64_float_arithmetic_max_min // FMAX_D_floatdp2 - when ('0', '0', '01', '0101') => __encoding aarch64_float_arithmetic_max_min // FMIN_D_floatdp2 - when ('0', '0', '01', '0110') => __encoding aarch64_float_arithmetic_max_min // FMAXNM_D_floatdp2 - when ('0', '0', '01', '0111') => __encoding aarch64_float_arithmetic_max_min // FMINNM_D_floatdp2 - when ('0', '0', '01', '1000') => __encoding aarch64_float_arithmetic_mul_product // FNMUL_D_floatdp2 - when ('0', '0', '11', '0000') => __encoding aarch64_float_arithmetic_mul_product // FMUL_H_floatdp2 - when ('0', '0', '11', '0001') => __encoding aarch64_float_arithmetic_div // FDIV_H_floatdp2 - when ('0', '0', '11', '0010') => __encoding aarch64_float_arithmetic_add_sub // FADD_H_floatdp2 - when ('0', '0', '11', '0011') => __encoding aarch64_float_arithmetic_add_sub // FSUB_H_floatdp2 - when ('0', '0', '11', '0100') => __encoding aarch64_float_arithmetic_max_min // FMAX_H_floatdp2 - when ('0', '0', '11', '0101') => __encoding aarch64_float_arithmetic_max_min // FMIN_H_floatdp2 - when ('0', '0', '11', '0110') => __encoding aarch64_float_arithmetic_max_min // FMAXNM_H_floatdp2 - when ('0', '0', '11', '0111') => __encoding aarch64_float_arithmetic_max_min // FMINNM_H_floatdp2 - when ('0', '0', '11', '1000') => __encoding aarch64_float_arithmetic_mul_product // FNMUL_H_floatdp2 - when ('1', _, _, _) => __UNALLOCATED - when ('x0x1', _, '0x', 'x1xx', 'xxxxxxx11', _) => // floatsel - __field M 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (M, S, ptype) of - when (_, _, '10') => __UNALLOCATED - when (_, '1', _) => __UNALLOCATED - when ('0', '0', '00') => __encoding aarch64_float_move_fp_select // FCSEL_S_floatsel - when ('0', '0', '01') => __encoding aarch64_float_move_fp_select // FCSEL_D_floatsel - when ('0', '0', '11') => __encoding aarch64_float_move_fp_select // FCSEL_H_floatsel - when ('1', _, _) => __UNALLOCATED - when ('x0x1', _, '1x', _, _, _) => // floatdp3 - __field M 31 +: 1 - __field S 29 +: 1 - __field ptype 22 +: 2 - __field o1 21 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - case (M, S, ptype, o1, o0) of - when (_, _, '10', _, _) => __UNALLOCATED - when (_, '1', _, _, _) => __UNALLOCATED - when ('0', '0', '00', '0', '0') => __encoding aarch64_float_arithmetic_mul_add_sub // FMADD_S_floatdp3 - when ('0', '0', '00', '0', '1') => __encoding aarch64_float_arithmetic_mul_add_sub // FMSUB_S_floatdp3 - when ('0', '0', '00', '1', '0') => __encoding aarch64_float_arithmetic_mul_add_sub // FNMADD_S_floatdp3 - when ('0', '0', '00', '1', '1') => __encoding aarch64_float_arithmetic_mul_add_sub // FNMSUB_S_floatdp3 - when ('0', '0', '01', '0', '0') => __encoding aarch64_float_arithmetic_mul_add_sub // FMADD_D_floatdp3 - when ('0', '0', '01', '0', '1') => __encoding aarch64_float_arithmetic_mul_add_sub // FMSUB_D_floatdp3 - when ('0', '0', '01', '1', '0') => __encoding aarch64_float_arithmetic_mul_add_sub // FNMADD_D_floatdp3 - when ('0', '0', '01', '1', '1') => __encoding aarch64_float_arithmetic_mul_add_sub // FNMSUB_D_floatdp3 - when ('0', '0', '11', '0', '0') => __encoding aarch64_float_arithmetic_mul_add_sub // FMADD_H_floatdp3 - when ('0', '0', '11', '0', '1') => __encoding aarch64_float_arithmetic_mul_add_sub // FMSUB_H_floatdp3 - when ('0', '0', '11', '1', '0') => __encoding aarch64_float_arithmetic_mul_add_sub // FNMADD_H_floatdp3 - when ('0', '0', '11', '1', '1') => __encoding aarch64_float_arithmetic_mul_add_sub // FNMSUB_H_floatdp3 - when ('1', _, _, _, _) => __UNALLOCATED -__decode T32 - // T32 - case (29 +: 3, 27 +: 2, 0 +: 27) of - when (!'111', _, _) => - // n - case (26 +: 6, 0 +: 26) of - when ('00xxxx', _) => - // sftdpi - case (30 +: 2, 29 +: 1, 27 +: 2, 26 +: 1, 0 +: 26) of - when (_, '0', '11', '0', _) => // addsub16_3l - __field S 25 +: 1 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rd 16 +: 3 - case (S) of - when ('0') => __encoding aarch32_ADD_r_T1_A // ADD_r_T1 - when ('1') => __encoding aarch32_SUB_r_T1_A // SUB_r_T1 - when (_, '0', '11', '1', _) => // addsub16_2l_imm - __field S 25 +: 1 - __field imm3 22 +: 3 - __field Rn 19 +: 3 - __field Rd 16 +: 3 - case (S) of - when ('0') => __encoding aarch32_ADD_i_T1_A // ADD_i_T1 - when ('1') => __encoding aarch32_SUB_i_T1_A // SUB_i_T1 - when (_, '0', !'11', _, _) => // shift16_imm - __field op 27 +: 2 - __field imm5 22 +: 5 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - case () of - when () => __encoding aarch32_MOV_r_T2_A // MOV_r_T2 - when (_, '1', _, _, _) => // addsub16_1l_imm - __field op 27 +: 2 - __field Rd 24 +: 3 - __field imm8 16 +: 8 - case (op) of - when ('00') => __encoding aarch32_MOV_i_T1_A // MOV_i_T1 - when ('01') => __encoding aarch32_CMP_i_T1_A // CMP_i_T1 - when ('10') => __encoding aarch32_ADD_i_T2_A // ADD_i_T2 - when ('11') => __encoding aarch32_SUB_i_T2_A // SUB_i_T2 - when ('010000', _) => // dpint16_2l - __field op 22 +: 4 - __field Rs 19 +: 3 - __field Rd 16 +: 3 - case (op) of - when ('0000') => __encoding aarch32_AND_r_T1_A // AND_r_T1 - when ('0001') => __encoding aarch32_EOR_r_T1_A // EOR_r_T1 - when ('0010') => __encoding aarch32_MOV_rr_T1_A // MOV_rr_T1_LSL - when ('0011') => __encoding aarch32_MOV_rr_T1_A // MOV_rr_T1_LSR - when ('0100') => __encoding aarch32_MOV_rr_T1_A // MOV_rr_T1_ASR - when ('0101') => __encoding aarch32_ADC_r_T1_A // ADC_r_T1 - when ('0110') => __encoding aarch32_SBC_r_T1_A // SBC_r_T1 - when ('0111') => __encoding aarch32_MOV_rr_T1_A // MOV_rr_T1_ROR - when ('1000') => __encoding aarch32_TST_r_T1_A // TST_r_T1 - when ('1001') => __encoding aarch32_RSB_i_T1_A // RSB_i_T1 - when ('1010') => __encoding aarch32_CMP_r_T1_A // CMP_r_T1 - when ('1011') => __encoding aarch32_CMN_r_T1_A // CMN_r_T1 - when ('1100') => __encoding aarch32_ORR_r_T1_A // ORR_r_T1 - when ('1101') => __encoding aarch32_MUL_T1_A // MUL_T1 - when ('1110') => __encoding aarch32_BIC_r_T1_A // BIC_r_T1 - when ('1111') => __encoding aarch32_MVN_r_T1_A // MVN_r_T1 - when ('010001', _) => - // spcd - case (26 +: 6, 24 +: 2, 0 +: 24) of - when (_, '11', _) => // bx16 - __field L 23 +: 1 - __field Rm 19 +: 4 - case (L) of - when ('0') => __encoding aarch32_BX_T1_A // BX_T1 - when ('1') => __encoding aarch32_BLX_r_T1_A // BLX_r_T1 - when (_, !'11', _) => // addsub16_2h - __field op 24 +: 2 - __field D 23 +: 1 - __field Rs 19 +: 4 - __field Rd 16 +: 3 - case (op, D:Rd, Rs) of - when ('00', !'1101', !'1101') => __encoding aarch32_ADD_r_T2_A // ADD_r_T2 - when ('00', _, '1101') => __encoding aarch32_ADD_SP_r_A1_A - when ('00', '1101', !'1101') => __encoding aarch32_ADD_SP_r_A1_A - when ('01', _, _) => __encoding aarch32_CMP_r_T2_A // CMP_r_T2 - when ('10', _, _) => __encoding aarch32_MOV_r_T1_A // MOV_r_T1 - when ('01001x', _) => // ldlit16 - __field Rt 24 +: 3 - __field imm8 16 +: 8 - case () of - when () => __encoding aarch32_LDR_l_T1_A // LDR_l_T1 - when ('0101xx', _) => // ldst16_reg - __field L 27 +: 1 - __field B 26 +: 1 - __field H 25 +: 1 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - case (L, B, H) of - when ('0', '0', '0') => __encoding aarch32_STR_r_T1_A // STR_r_T1 - when ('0', '0', '1') => __encoding aarch32_STRH_r_T1_A // STRH_r_T1 - when ('0', '1', '0') => __encoding aarch32_STRB_r_T1_A // STRB_r_T1 - when ('0', '1', '1') => __encoding aarch32_LDRSB_r_T1_A // LDRSB_r_T1 - when ('1', '0', '0') => __encoding aarch32_LDR_r_T1_A // LDR_r_T1 - when ('1', '0', '1') => __encoding aarch32_LDRH_r_T1_A // LDRH_r_T1 - when ('1', '1', '0') => __encoding aarch32_LDRB_r_T1_A // LDRB_r_T1 - when ('1', '1', '1') => __encoding aarch32_LDRSH_r_T1_A // LDRSH_r_T1 - when ('011xxx', _) => // ldst16_imm - __field B 28 +: 1 - __field L 27 +: 1 - __field imm5 22 +: 5 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - case (B, L) of - when ('0', '0') => __encoding aarch32_STR_i_T1_A // STR_i_T1 - when ('0', '1') => __encoding aarch32_LDR_i_T1_A // LDR_i_T1 - when ('1', '0') => __encoding aarch32_STRB_i_T1_A // STRB_i_T1 - when ('1', '1') => __encoding aarch32_LDRB_i_T1_A // LDRB_i_T1 - when ('1000xx', _) => // ldsth16_imm - __field L 27 +: 1 - __field imm5 22 +: 5 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - case (L) of - when ('0') => __encoding aarch32_STRH_i_T1_A // STRH_i_T1 - when ('1') => __encoding aarch32_LDRH_i_T1_A // LDRH_i_T1 - when ('1001xx', _) => // ldst16_sp - __field L 27 +: 1 - __field Rt 24 +: 3 - __field imm8 16 +: 8 - case (L) of - when ('0') => __encoding aarch32_STR_i_T2_A // STR_i_T2 - when ('1') => __encoding aarch32_LDR_i_T2_A // LDR_i_T2 - when ('1010xx', _) => // addpcsp16 - __field SP 27 +: 1 - __field Rd 24 +: 3 - __field imm8 16 +: 8 - case (SP) of - when ('0') => __encoding aarch32_ADR_T1_A // ADR_T1 - when ('1') => __encoding aarch32_ADD_SP_i_T1_A // ADD_SP_i_T1 - when ('1011xx', _) => - // misc16 - case (28 +: 4, 24 +: 4, 22 +: 2, 21 +: 1, 20 +: 1, 16 +: 4, 0 +: 16) of - when (_, '0000', _, _, _, _, _) => // adjsp16 - __field S 23 +: 1 - __field imm7 16 +: 7 - case (S) of - when ('0') => __encoding aarch32_ADD_SP_i_T2_A // ADD_SP_i_T2 - when ('1') => __encoding aarch32_SUB_SP_i_T1_A // SUB_SP_i_T1 - when (_, '0010', _, _, _, _, _) => // ext16 - __field U 23 +: 1 - __field B 22 +: 1 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - case (U, B) of - when ('0', '0') => __encoding aarch32_SXTH_T1_A // SXTH_T1 - when ('0', '1') => __encoding aarch32_SXTB_T1_A // SXTB_T1 - when ('1', '0') => __encoding aarch32_UXTH_T1_A // UXTH_T1 - when ('1', '1') => __encoding aarch32_UXTB_T1_A // UXTB_T1 - when (_, '0110', '00', '0', _, _, _) => // setpan16 - __field imm1 19 +: 1 - case () of - when () => __encoding aarch32_SETPAN_T1_A // SETPAN_T1 - when (_, '0110', '00', '1', _, _, _) => __UNPREDICTABLE - when (_, '0110', '01', _, _, _, _) => // cps16 - __field op 21 +: 1 - __field flags 16 +: 5 - case (op, flags) of - when ('0', _) => __encoding aarch32_SETEND_T1_A // SETEND_T1 - when ('1', _) => __encoding aarch32_CPS_T1_AS // CPSID_T1_AS - when (_, '0110', '1x', _, _, _, _) => __UNPREDICTABLE - when (_, '0111', _, _, _, _, _) => __UNPREDICTABLE - when (_, '1000', _, _, _, _, _) => __UNPREDICTABLE - when (_, '1010', '10', _, _, _, _) => // hlt16 - __field imm6 16 +: 6 - case () of - when () => __encoding aarch32_HLT_T1_A // HLT_T1 - when (_, '1010', !'10', _, _, _, _) => // rev16 - __field op 22 +: 2 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - case (op) of - when ('00') => __encoding aarch32_REV_T1_A // REV_T1 - when ('01') => __encoding aarch32_REV16_T1_A // REV16_T1 - when ('11') => __encoding aarch32_REVSH_T1_A // REVSH_T1 - when (_, '1110', _, _, _, _, _) => // bkpt16 - __field imm8 16 +: 8 - case () of - when () => __encoding aarch32_BKPT_T1_A // BKPT_T1 - when (_, '1111', _, _, _, '0000', _) => // hints16 - __field hint 20 +: 4 - case (hint) of - when ('0000') => __encoding aarch32_NOP_T1_A // NOP_T1 - when ('0001') => __encoding aarch32_YIELD_T1_A // YIELD_T1 - when ('0010') => __encoding aarch32_WFE_T1_A // WFE_T1 - when ('0011') => __encoding aarch32_WFI_T1_A // WFI_T1 - when ('0100') => __encoding aarch32_SEV_T1_A // SEV_T1 - when ('0101') => __encoding aarch32_SEVL_T1_A // SEVL_T1 - when ('011x') => __NOP - when ('1xxx') => __NOP - when (_, '1111', _, _, _, !'0000', _) => // it16 - __field firstcond 20 +: 4 - __field mask 16 +: 4 - case () of - when () => __encoding aarch32_IT_T1_A // IT_T1 - when (_, 'x0x1', _, _, _, _, _) => // cbznz16 - __field op 27 +: 1 - __field i 25 +: 1 - __field imm5 19 +: 5 - __field Rn 16 +: 3 - case () of - when () => __encoding aarch32_CBNZ_T1_A // CBNZ_T1 - when (_, 'x10x', _, _, _, _, _) => // pushpop16 - __field L 27 +: 1 - __field P 24 +: 1 - __field register_list 16 +: 8 - case (L) of - when ('0') => __encoding aarch32_PUSH_T1_A // PUSH_T1 - when ('1') => __encoding aarch32_POP_T1_A // POP_T1 - when ('1100xx', _) => // ldstm16 - __field L 27 +: 1 - __field Rn 24 +: 3 - __field register_list 16 +: 8 - case (L) of - when ('0') => __encoding aarch32_STM_T1_A // STM_T1 - when ('1') => __encoding aarch32_LDM_T1_A // LDM_T1 - when ('1101xx', _) => - // brc - case (28 +: 4, 24 +: 4, 0 +: 24) of - when (_, '111x', _) => // except16 - __field S 24 +: 1 - __field imm8 16 +: 8 - case (S) of - when ('0') => __encoding aarch32_UDF_T1_A // UDF_T1 - when ('1') => __encoding aarch32_SVC_T1_A // SVC_T1 - when (_, !'111x', _) => // bcond16 - __field cond 24 +: 4 - __field imm8 16 +: 8 - case () of - when () => __encoding aarch32_B_T1_A // B_T1 - when ('111', '00', _) => // b16 - __field imm11 16 +: 11 - case () of - when () => __encoding aarch32_B_T2_A // B_T2 - when ('111', !'00', _) => - // w - case (29 +: 3, 25 +: 4, 20 +: 5, 16 +: 4, 15 +: 1, 0 +: 15) of - when (_, 'x11x', _, _, _, _) => - // cpaf - case (29 +: 3, 28 +: 1, 26 +: 2, 24 +: 2, 12 +: 12, 9 +: 3, 5 +: 4, 4 +: 1, 0 +: 4) of - when (_, _, _, '0x', _, '111', _, _, _) => - // sysldst_mov64 - case (29 +: 3, 28 +: 1, 25 +: 3, 21 +: 4, 12 +: 9, 9 +: 3, 0 +: 9) of - when (_, _, _, '00x0', _, _, _) => // cp_mov64 - __field o0 28 +: 1 - __field D 22 +: 1 - __field L 20 +: 1 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field cp15 8 +: 1 - __field opc1 4 +: 4 - __field CRm 0 +: 4 - case (o0, D, L) of - when ('0', '0', _) => __UNALLOCATED - when ('0', '1', '0') => __encoding aarch32_MCRR_T1A1_A // MCRR_T1 - when ('0', '1', '1') => __encoding aarch32_MRRC_T1A1_A // MRRC_T1 - when ('1', '0', _) => __UNALLOCATED - when ('1', '1', _) => __UNALLOCATED - when (_, _, _, !'00x0', _, _, _) => // cp_ldst - __field o0 28 +: 1 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field CRd 12 +: 4 - __field cp15 8 +: 1 - __field imm8 0 +: 8 - case (o0, P:U:W, D, L, Rn, CRd, cp15) of - when (_, !'000', _, _, _, !'0101', '0') => __UNALLOCATED - when (_, !'000', _, _, _, _, '1') => __UNALLOCATED - when (_, !'000', '1', _, _, '0101', '0') => __UNALLOCATED - when ('0', !'000', '0', '1', '1111', '0101', '0') => __encoding aarch32_LDC_l_T1A1_A // LDC_l_T1 - when ('0', '0x1', '0', '0', _, '0101', '0') => __encoding aarch32_STC_T1A1_A // STC_T1_post - when ('0', '0x1', '0', '1', !'1111', '0101', '0') => __encoding aarch32_LDC_i_T1A1_A // LDC_i_T1_post - when ('0', '010', '0', '0', _, '0101', '0') => __encoding aarch32_STC_T1A1_A // STC_T1_unind - when ('0', '010', '0', '1', !'1111', '0101', '0') => __encoding aarch32_LDC_i_T1A1_A // LDC_i_T1_unind - when ('0', '1x0', '0', '0', _, '0101', '0') => __encoding aarch32_STC_T1A1_A // STC_T1_off - when ('0', '1x0', '0', '1', !'1111', '0101', '0') => __encoding aarch32_LDC_i_T1A1_A // LDC_i_T1_off - when ('0', '1x1', '0', '0', _, '0101', '0') => __encoding aarch32_STC_T1A1_A // STC_T1_pre - when ('0', '1x1', '0', '1', !'1111', '0101', '0') => __encoding aarch32_LDC_i_T1A1_A // LDC_i_T1_pre - when ('1', !'000', '0', _, _, '0101', '0') => __UNALLOCATED - when (_, _, _, '10', _, '10x', _, '0', _) => - // fpdp - case (29 +: 3, 28 +: 1, 24 +: 4, 20 +: 4, 16 +: 4, 12 +: 4, 10 +: 2, 8 +: 2, 7 +: 1, 6 +: 1, 5 +: 1, 4 +: 1, 0 +: 4) of - when (_, '0', _, '1x11', _, _, _, _, _, '1', _, _, _) => // fp_2r - __field D 22 +: 1 - __field o1 19 +: 1 - __field opc2 16 +: 3 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field o3 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (o1, opc2, size, o3) of - when (_, _, '00', _) => __UNALLOCATED - when ('0', '000', '01', '0') => __UNALLOCATED - when ('0', '000', _, '1') => __encoding aarch32_VABS_T2_A // VABS_T2_D - when ('0', '000', '10', '0') => __encoding aarch32_VMOV_r_T2A2_A // VMOV_r_T2_S - when ('0', '000', '11', '0') => __encoding aarch32_VMOV_r_T2A2_A // VMOV_r_T2_D - when ('0', '001', _, '0') => __encoding aarch32_VNEG_T2_A // VNEG_T2_D - when ('0', '001', _, '1') => __encoding aarch32_VSQRT_T1_A // VSQRT_T1_D - when ('0', '010', _, '0') => __encoding aarch32_VCVTB_T1A1_A // VCVTB_T1_DH - when ('0', '010', '01', _) => __UNALLOCATED - when ('0', '010', _, '1') => __encoding aarch32_VCVTB_T1A1_A // VCVTT_T1_DH - when ('0', '011', '01', '0') => __encoding aarch32_VCVTB_bf16_T1A1_A // VCVTB_T1_bfs - when ('0', '011', '01', '1') => __encoding aarch32_VCVTT_T1A1_A // VCVTT_T1_bfs - when ('0', '011', '10', '0') => __encoding aarch32_VCVTB_T1A1_A // VCVTB_T1_HS - when ('0', '011', '10', '1') => __encoding aarch32_VCVTB_T1A1_A // VCVTT_T1_HS - when ('0', '011', '11', '0') => __encoding aarch32_VCVTB_T1A1_A // VCVTB_T1_HD - when ('0', '011', '11', '1') => __encoding aarch32_VCVTB_T1A1_A // VCVTT_T1_HD - when ('0', '100', _, '0') => __encoding aarch32_VCMP_A1_A - when ('0', '100', _, '1') => __encoding aarch32_VCMP_A1_A - when ('0', '101', _, '0') => __encoding aarch32_VCMP_A1_A - when ('0', '101', _, '1') => __encoding aarch32_VCMP_A1_A - when ('0', '110', _, '0') => __encoding aarch32_VRINTZ_vfp_T1_A // VRINTR_vfp_T1_D - when ('0', '110', _, '1') => __encoding aarch32_VRINTZ_vfp_T1_A // VRINTZ_vfp_T1_D - when ('0', '111', _, '0') => __encoding aarch32_VRINTX_vfp_T1_A // VRINTX_vfp_T1_D - when ('0', '111', '01', '1') => __UNALLOCATED - when ('0', '111', '10', '1') => __encoding aarch32_VCVT_ds_T1A1_A // VCVT_ds_T1 - when ('0', '111', '11', '1') => __encoding aarch32_VCVT_ds_T1A1_A // VCVT_sd_T1 - when ('1', '000', _, _) => __encoding aarch32_VCVT_iv_T1_A // VCVT_vi_T1_D - when ('1', '001', '01', _) => __UNALLOCATED - when ('1', '001', '10', _) => __UNALLOCATED - when ('1', '001', '11', '0') => __UNALLOCATED - when ('1', '001', '11', '1') => __encoding aarch32_VJCVT_T1_A // VJCVT_T1 - when ('1', '01x', _, _) => __encoding aarch32_VCVT_xv_T1_A // VCVT_toxv_T1_D - when ('1', '100', _, '0') => __encoding aarch32_VCVT_iv_T1_A // VCVTR_uiv_T1_D - when ('1', '100', _, '1') => __encoding aarch32_VCVT_iv_T1_A // VCVT_uiv_T1_D - when ('1', '101', _, '0') => __encoding aarch32_VCVT_iv_T1_A // VCVTR_siv_T1_D - when ('1', '101', _, '1') => __encoding aarch32_VCVT_iv_T1_A // VCVT_siv_T1_D - when ('1', '11x', _, _) => __encoding aarch32_VCVT_xv_T1_A // VCVT_xv_T1_D - when (_, '0', _, '1x11', _, _, _, _, _, '0', _, _, _) => // fp_movi - __field D 22 +: 1 - __field imm4H 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm4L 0 +: 4 - case (size) of - when ('00') => __UNALLOCATED - when ('01') => __encoding aarch32_VMOV_i_T2_A // VMOV_i_T2_H - when ('10') => __encoding aarch32_VMOV_i_T2_A // VMOV_i_T2_S - when ('11') => __encoding aarch32_VMOV_i_T2_A // VMOV_i_T2_D - when (_, '0', _, !'1x11', _, _, _, _, _, _, _, _, _) => // fp_3r - __field o0 23 +: 1 - __field D 22 +: 1 - __field o1 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field o2 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (o0:o1, size, o2) of - when (!'111', '00', _) => __UNALLOCATED - when ('000', _, '0') => __encoding aarch32_VMLA_f_T2_A // VMLA_f_T2_D - when ('000', _, '1') => __encoding aarch32_VMLA_f_T2_A // VMLS_f_T2_D - when ('001', _, '0') => __encoding aarch32_VNMLA_T1_A // VNMLS_T1_D - when ('001', _, '1') => __encoding aarch32_VNMLA_T1_A // VNMLA_T1_D - when ('010', _, '0') => __encoding aarch32_VMUL_f_T2_A // VMUL_f_T2_D - when ('010', _, '1') => __encoding aarch32_VNMLA_T2_A // VNMUL_T1_D - when ('011', _, '0') => __encoding aarch32_VADD_f_T2_A // VADD_f_T2_D - when ('011', _, '1') => __encoding aarch32_VSUB_f_T2_A // VSUB_f_T2_D - when ('100', _, '0') => __encoding aarch32_VDIV_T1_A // VDIV_T1_D - when ('101', _, '0') => __encoding aarch32_VFNMA_T1_A // VFNMS_T1_D - when ('101', _, '1') => __encoding aarch32_VFNMA_T1_A // VFNMA_T1_D - when ('110', _, '0') => __encoding aarch32_VFMA_T2_A // VFMA_T2_D - when ('110', _, '1') => __encoding aarch32_VFMA_T2_A // VFMS_T2_D - when (_, '1', _, '0xxx', _, _, _, !'00', _, '0', _, _, _) => // fp_csel - __field D 22 +: 1 - __field cc 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (cc, size) of - when ('00', _) => __encoding aarch32_VSEL_T1_A // VSELEQ_T1_D - when ('01', _) => __encoding aarch32_VSEL_T1_A // VSELVS_T1_D - when (_, '01') => __UNALLOCATED - when ('10', _) => __encoding aarch32_VSEL_T1_A // VSELGE_T1_D - when ('11', _) => __encoding aarch32_VSEL_T1_A // VSELGT_T1_D - when (_, '1', _, '1x00', _, _, _, !'00', _, _, _, _, _) => // fp_minmax - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (size, op) of - when (_, '0') => __encoding aarch32_VMAXNM_T2_A // VMAXNM_T2_D - when ('01', _) => __UNALLOCATED - when (_, '1') => __encoding aarch32_VMAXNM_T2_A // VMINNM_T2_D - when (_, '1', _, '1x11', '0000', _, _, !'00', _, '1', _, _, _) => // fp_extins - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (size, op) of - when ('01', _) => __UNALLOCATED - when ('10', '0') => __encoding aarch32_VMOVX_T1_A // VMOVX_T1 - when ('10', '1') => __encoding aarch32_VINS_T1_A // VINS_T1 - when ('11', _) => __UNALLOCATED - when (_, '1', _, '1x11', '1xxx', _, _, !'00', _, '1', _, _, _) => // fp_toint - __field D 22 +: 1 - __field o1 18 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (o1, RM, size) of - when ('0', '00', _) => __encoding aarch32_VRINTA_vfp_T1_A // VRINTA_vfp_T1_D - when ('0', '01', _) => __encoding aarch32_VRINTA_vfp_T1_A // VRINTN_vfp_T1_D - when (_, _, '01') => __UNALLOCATED - when ('0', '10', _) => __encoding aarch32_VRINTA_vfp_T1_A // VRINTP_vfp_T1_D - when ('0', '11', _) => __encoding aarch32_VRINTA_vfp_T1_A // VRINTM_vfp_T1_D - when ('1', '00', _) => __encoding aarch32_VCVTA_vfp_T1_A // VCVTA_vfp_T1_D - when ('1', '01', _) => __encoding aarch32_VCVTA_vfp_T1_A // VCVTN_vfp_T1_D - when ('1', '10', _) => __encoding aarch32_VCVTA_vfp_T1_A // VCVTP_vfp_T1_D - when ('1', '11', _) => __encoding aarch32_VCVTA_vfp_T1_A // VCVTM_vfp_T1_D - when (_, _, _, '10', _, '111', _, '1', _) => // cp_mov32 - __field o0 28 +: 1 - __field opc1 21 +: 3 - __field L 20 +: 1 - __field CRn 16 +: 4 - __field Rt 12 +: 4 - __field cp15 8 +: 1 - __field opc2 5 +: 3 - __field CRm 0 +: 4 - case (o0, L) of - when ('0', '0') => __encoding aarch32_MCR_T1A1_A // MCR_T1 - when ('0', '1') => __encoding aarch32_MRC_T1A1_A // MRC_T1 - when ('1', _) => __UNALLOCATED - when (_, _, _, '11', _, _, _, _, _) => - // simddp - case (29 +: 3, 28 +: 1, 24 +: 4, 23 +: 1, 5 +: 18, 4 +: 1, 0 +: 4) of - when (_, _, _, '0', _, _, _) => // simd_3same - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field opc 8 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field o1 4 +: 1 - __field Vm 0 +: 4 - case (U, size, opc, Q, o1) of - when ('0', '0x', '1100', _, '1') => __encoding aarch32_VFMA_T1_A // VFMA_T1_Q - when ('0', '0x', '1101', _, '0') => __encoding aarch32_VADD_f_T1_A // VADD_f_T1_Q - when ('0', '0x', '1101', _, '1') => __encoding aarch32_VMLA_f_T1_A // VMLA_f_T1_Q - when ('0', '0x', '1110', _, '0') => __encoding aarch32_VCEQ_r_T1A1_A - when ('0', '0x', '1111', _, '0') => __encoding aarch32_VMAX_f_T1_A // VMAX_f_T1_Q - when ('0', '0x', '1111', _, '1') => __encoding aarch32_VRECPS_T1_A // VRECPS_T1_Q - when (_, _, '0000', _, '0') => __encoding aarch32_VHADD_T1A1_A // VHADD_T1_Q - when ('0', '00', '0001', _, '1') => __encoding aarch32_VAND_r_T1A1_A // VAND_r_T1_Q - when (_, _, '0000', _, '1') => __encoding aarch32_VQADD_T1A1_A // VQADD_T1_Q - when (_, _, '0001', _, '0') => __encoding aarch32_VRHADD_T1A1_A // VRHADD_T1_Q - when ('0', '00', '1100', _, '0') => __encoding aarch32_SHA1C_T1_A // SHA1C_T1 - when (_, _, '0010', _, '0') => __encoding aarch32_VHADD_T1A1_A // VHSUB_T1_Q - when ('0', '01', '0001', _, '1') => __encoding aarch32_VBIC_r_T1A1_A // VBIC_r_T1_Q - when (_, _, '0010', _, '1') => __encoding aarch32_VQSUB_T1A1_A // VQSUB_T1_Q - when (_, _, '0011', _, '0') => __encoding aarch32_VCGT_r_T1A1_A - when (_, _, '0011', _, '1') => __encoding aarch32_VCGE_r_T1A1_A - when ('0', '01', '1100', _, '0') => __encoding aarch32_SHA1P_T1_A // SHA1P_T1 - when ('0', '1x', '1100', _, '1') => __encoding aarch32_VFMA_T1_A // VFMS_T1_Q - when ('0', '1x', '1101', _, '0') => __encoding aarch32_VSUB_f_T1_A // VSUB_f_T1_Q - when ('0', '1x', '1101', _, '1') => __encoding aarch32_VMLA_f_T1_A // VMLS_f_T1_Q - when ('0', '1x', '1110', _, '0') => __UNALLOCATED - when ('0', '1x', '1111', _, '0') => __encoding aarch32_VMAX_f_T1_A // VMIN_f_T1_Q - when ('0', '1x', '1111', _, '1') => __encoding aarch32_VRSQRTS_T1_A // VRSQRTS_T1_Q - when (_, _, '0100', _, '0') => __encoding aarch32_VSHL_r_T1A1_A // VSHL_r_T1_Q - when ('0', _, '1000', _, '0') => __encoding aarch32_VADD_i_T1A1_A // VADD_i_T1_Q - when ('0', '10', '0001', _, '1') => __encoding aarch32_VORR_r_T1A1_A // VORR_r_T1_Q - when ('0', _, '1000', _, '1') => __encoding aarch32_VTST_T1A1_A // VTST_T1_Q - when (_, _, '0100', _, '1') => __encoding aarch32_VQSHL_r_T1A1_A // VQSHL_r_T1_Q - when ('0', _, '1001', _, '0') => __encoding aarch32_VMLA_i_T1A1_A // VMLA_i_T1_Q - when (_, _, '0101', _, '0') => __encoding aarch32_VRSHL_T1A1_A // VRSHL_T1_Q - when (_, _, '0101', _, '1') => __encoding aarch32_VQRSHL_T1A1_A // VQRSHL_T1_Q - when ('0', _, '1011', _, '0') => __encoding aarch32_VQDMULH_T1A1_A // VQDMULH_T1_Q - when ('0', '10', '1100', _, '0') => __encoding aarch32_SHA1M_T1_A // SHA1M_T1 - when ('0', _, '1011', _, '1') => __encoding aarch32_VPADD_i_T1A1_A // VPADD_i_T1 - when (_, _, '0110', _, '0') => __encoding aarch32_VMAX_i_T1A1_A // VMAX_i_T1_Q - when ('0', '11', '0001', _, '1') => __encoding aarch32_VORN_r_T1A1_A // VORN_r_T1_Q - when (_, _, '0110', _, '1') => __encoding aarch32_VMAX_i_T1A1_A // VMIN_i_T1_Q - when (_, _, '0111', _, '0') => __encoding aarch32_VABD_i_T1A1_A // VABD_i_T1_Q - when (_, _, '0111', _, '1') => __encoding aarch32_VABA_T1A1_A // VABA_T1_Q - when ('0', '11', '1100', _, '0') => __encoding aarch32_SHA1SU0_T1_A // SHA1SU0_T1 - when ('1', '0x', '1101', _, '0') => __encoding aarch32_VPADD_f_T1_A // VPADD_f_T1 - when ('1', '0x', '1101', _, '1') => __encoding aarch32_VMUL_f_T1_A // VMUL_f_T1_Q - when ('1', '0x', '1110', _, '0') => __encoding aarch32_VCGE_r_T1A1_A - when ('1', '0x', '1110', _, '1') => __encoding aarch32_VACGE_T1_A // VACGE_T1_Q - when ('1', '0x', '1111', '0', '0') => __encoding aarch32_VPMAX_f_T1_A // VPMAX_f_T1 - when ('1', '0x', '1111', _, '1') => __encoding aarch32_VMAXNM_T1_A // VMAXNM_T1_Q - when ('1', '00', '0001', _, '1') => __encoding aarch32_VEOR_T1A1_A // VEOR_T1_Q - when (_, _, '1001', _, '1') => __encoding aarch32_VMUL_i_T1A1_A // VMUL_i_T1_Q - when ('1', '00', '1100', _, '0') => __encoding aarch32_SHA256H_T1_A // SHA256H_T1 - when (_, _, '1010', '0', '0') => __encoding aarch32_VPMAX_i_T1A1_A // VPMAX_i_T1 - when ('1', '01', '0001', _, '1') => __encoding aarch32_VBIF_T1A1_A // VBSL_T1_Q - when (_, _, '1010', '0', '1') => __encoding aarch32_VPMAX_i_T1A1_A // VPMIN_i_T1 - when (_, _, '1010', '1', _) => __UNALLOCATED - when ('1', '01', '1100', _, '0') => __encoding aarch32_SHA256H2_T1_A // SHA256H2_T1 - when ('1', '1x', '1101', _, '0') => __encoding aarch32_VABD_f_T1_A // VABD_f_T1_Q - when ('1', '1x', '1110', _, '0') => __encoding aarch32_VCGT_r_T1A1_A - when ('1', '1x', '1110', _, '1') => __encoding aarch32_VACGE_T1_A // VACGT_T1_Q - when ('1', '1x', '1111', '0', '0') => __encoding aarch32_VPMAX_f_T1_A // VPMIN_f_T1 - when ('1', '1x', '1111', _, '1') => __encoding aarch32_VMAXNM_T1_A // VMINNM_T1_Q - when ('1', _, '1000', _, '0') => __encoding aarch32_VSUB_i_T1A1_A // VSUB_i_T1_Q - when ('1', '10', '0001', _, '1') => __encoding aarch32_VBIF_T1A1_A // VBIT_T1_Q - when ('1', _, '1000', _, '1') => __encoding aarch32_VCEQ_r_T1A1_A - when ('1', _, '1001', _, '0') => __encoding aarch32_VMLA_i_T1A1_A // VMLS_i_T1_Q - when ('1', _, '1011', _, '0') => __encoding aarch32_VQRDMULH_T1A1_A // VQRDMULH_T1_Q - when ('1', '10', '1100', _, '0') => __encoding aarch32_SHA256SU1_T1_A // SHA256SU1_T1 - when ('1', _, '1011', _, '1') => __encoding aarch32_VQRDMLAH_T1_A // VQRDMLAH_T1_Q - when ('1', '11', '0001', _, '1') => __encoding aarch32_VBIF_T1A1_A // VBIF_T1_Q - when ('1', _, '1100', _, '1') => __encoding aarch32_VQRDMLSH_T1_A // VQRDMLSH_T1_Q - when ('1', _, '1111', '1', '0') => __UNALLOCATED - when (_, _, _, '1', _, '0', _) => - // t_simd_mulreg - case (29 +: 3, 28 +: 1, 23 +: 5, 22 +: 1, 20 +: 2, 12 +: 8, 10 +: 2, 7 +: 3, 6 +: 1, 5 +: 1, 4 +: 1, 0 +: 4) of - when (_, '0', _, _, '11', _, _, _, _, _, _, _) => // simd_ext - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field imm4 8 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case () of - when () => __encoding aarch32_VEXT_T1A1_A // VEXT_T1_Q - when (_, '1', _, _, '11', _, '0x', _, _, _, _, _) => // simd_2r_misc - __field D 22 +: 1 - __field size 18 +: 2 - __field opc1 16 +: 2 - __field Vd 12 +: 4 - __field opc2 7 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (size, opc1, opc2, Q) of - when (_, '00', '0000', _) => __encoding aarch32_VREV16_T1A1_A // VREV64_T1_Q - when (_, '00', '0001', _) => __encoding aarch32_VREV16_T1A1_A // VREV32_T1_Q - when (_, '00', '0010', _) => __encoding aarch32_VREV16_T1A1_A // VREV16_T1_Q - when (_, '00', '0011', _) => __UNALLOCATED - when (_, '00', '010x', _) => __encoding aarch32_VPADDL_T1A1_A // VPADDL_T1_Q - when (_, '00', '0110', '0') => __encoding aarch32_AESE_T1_A // AESE_T1 - when (_, '00', '0110', '1') => __encoding aarch32_AESD_T1_A // AESD_T1 - when (_, '00', '0111', '0') => __encoding aarch32_AESMC_T1_A // AESMC_T1 - when (_, '00', '0111', '1') => __encoding aarch32_AESIMC_T1_A // AESIMC_T1 - when (_, '00', '1000', _) => __encoding aarch32_VCLS_T1A1_A // VCLS_T1_Q - when ('00', '10', '0000', _) => __encoding aarch32_VSWP_T1A1_A // VSWP_T1_Q - when (_, '00', '1001', _) => __encoding aarch32_VCLZ_T1A1_A // VCLZ_T1_Q - when (_, '00', '1010', _) => __encoding aarch32_VCNT_T1A1_A // VCNT_T1_Q - when (_, '00', '1011', _) => __encoding aarch32_VMVN_r_T1A1_A // VMVN_r_T1_Q - when ('00', '10', '1100', '1') => __UNALLOCATED - when (_, '00', '110x', _) => __encoding aarch32_VPADAL_T1A1_A // VPADAL_T1_Q - when (_, '00', '1110', _) => __encoding aarch32_VQABS_T1A1_A // VQABS_T1_Q - when (_, '00', '1111', _) => __encoding aarch32_VQNEG_T1A1_A // VQNEG_T1_Q - when (_, '01', 'x000', _) => __encoding aarch32_VCGT_i_T1_A // VCGT_i_T1_Q - when (_, '01', 'x001', _) => __encoding aarch32_VCGE_i_T1_A // VCGE_i_T1_Q - when (_, '01', 'x010', _) => __encoding aarch32_VCEQ_i_T1_A // VCEQ_i_T1_Q - when (_, '01', 'x011', _) => __encoding aarch32_VCLE_i_T1_A // VCLE_i_T1_Q - when (_, '01', 'x100', _) => __encoding aarch32_VCLT_i_T1_A // VCLT_i_T1_Q - when (_, '01', 'x110', _) => __encoding aarch32_VABS_T1_A // VABS_T1_Q - when (_, '01', 'x111', _) => __encoding aarch32_VNEG_T1_A // VNEG_T1_Q - when (_, '01', '0101', '1') => __encoding aarch32_SHA1H_T1_A // SHA1H_T1 - when ('01', '10', '1100', '1') => __encoding aarch32_VCVT_T1A1_A // VCVT_bfs_T1 - when (_, '10', '0001', _) => __encoding aarch32_VTRN_T1A1_A // VTRN_T1_Q - when (_, '10', '0010', _) => __encoding aarch32_VUZP_T1A1_A // VUZP_T1_Q - when (_, '10', '0011', _) => __encoding aarch32_VZIP_T1A1_A // VZIP_T1_Q - when (_, '10', '0100', '0') => __encoding aarch32_VMOVN_T1A1_A // VMOVN_T1 - when (_, '10', '0100', '1') => __encoding aarch32_VQMOVN_T1A1_A // VQMOVUN_T1 - when (_, '10', '0101', _) => __encoding aarch32_VQMOVN_T1A1_A // VQMOVN_T1 - when (_, '10', '0110', '0') => __encoding aarch32_VSHLL_T2A2_A // VSHLL_T2 - when (_, '10', '0111', '0') => __encoding aarch32_SHA1SU1_T1_A // SHA1SU1_T1 - when (_, '10', '0111', '1') => __encoding aarch32_SHA256SU0_T1_A // SHA256SU0_T1 - when (_, '10', '1000', _) => __encoding aarch32_VRINTA_asimd_T1_A // VRINTN_asimd_T1_Q - when (_, '10', '1001', _) => __encoding aarch32_VRINTX_asimd_T1_A // VRINTX_asimd_T1_Q - when (_, '10', '1010', _) => __encoding aarch32_VRINTA_asimd_T1_A // VRINTA_asimd_T1_Q - when (_, '10', '1011', _) => __encoding aarch32_VRINTZ_asimd_T1_A // VRINTZ_asimd_T1_Q - when ('10', '10', '1100', '1') => __UNALLOCATED - when (_, '10', '1100', '0') => __encoding aarch32_VCVT_hs_T1A1_A // VCVT_hs_T1 - when (_, '10', '1101', _) => __encoding aarch32_VRINTA_asimd_T1_A // VRINTM_asimd_T1_Q - when (_, '10', '1110', '0') => __encoding aarch32_VCVT_hs_T1A1_A // VCVT_sh_T1 - when (_, '10', '1110', '1') => __UNALLOCATED - when (_, '10', '1111', _) => __encoding aarch32_VRINTA_asimd_T1_A // VRINTP_asimd_T1_Q - when (_, '11', '000x', _) => __encoding aarch32_VCVTA_asimd_T1_A // VCVTA_asimd_T1_Q - when (_, '11', '001x', _) => __encoding aarch32_VCVTA_asimd_T1_A // VCVTN_asimd_T1_Q - when (_, '11', '010x', _) => __encoding aarch32_VCVTA_asimd_T1_A // VCVTP_asimd_T1_Q - when (_, '11', '011x', _) => __encoding aarch32_VCVTA_asimd_T1_A // VCVTM_asimd_T1_Q - when (_, '11', '10x0', _) => __encoding aarch32_VRECPE_T1_A // VRECPE_T1_Q - when (_, '11', '10x1', _) => __encoding aarch32_VRSQRTE_T1_A // VRSQRTE_T1_Q - when ('11', '10', '1100', '1') => __UNALLOCATED - when (_, '11', '11xx', _) => __encoding aarch32_VCVT_is_T1_A // VCVT_is_T1_Q - when (_, '1', _, _, '11', _, '10', _, _, _, _, _) => // simd_tbl - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field len 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case () of - when () => __encoding aarch32_VTBL_T1A1_A // VTBX_T1 - when (_, '1', _, _, '11', _, '11', _, _, _, _, _) => // simd_dup_sc - __field D 22 +: 1 - __field imm4 16 +: 4 - __field Vd 12 +: 4 - __field opc 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (opc) of - when ('000') => __encoding aarch32_VDUP_s_T1A1_A // VDUP_s_T1_Q - when ('001') => __UNALLOCATED - when ('01x') => __UNALLOCATED - when ('1xx') => __UNALLOCATED - when (_, _, _, _, !'11', _, _, _, '0', _, _, _) => // simd_3diff - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field opc 8 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (U, opc) of - when (_, '0000') => __encoding aarch32_VADDL_T1A1_A // VADDL_T1 - when (_, '0001') => __encoding aarch32_VADDL_T1A1_A // VADDW_T1 - when (_, '0010') => __encoding aarch32_VSUBL_T1A1_A // VSUBL_T1 - when ('0', '0100') => __encoding aarch32_VADDHN_T1A1_A // VADDHN_T1 - when (_, '0011') => __encoding aarch32_VSUBL_T1A1_A // VSUBW_T1 - when ('0', '0110') => __encoding aarch32_VSUBHN_T1A1_A // VSUBHN_T1 - when ('0', '1001') => __encoding aarch32_VQDMLAL_T1A1_A // VQDMLAL_T1 - when (_, '0101') => __encoding aarch32_VABA_T2A2_A // VABAL_T1 - when ('0', '1011') => __encoding aarch32_VQDMLSL_T1A1_A // VQDMLSL_T1 - when ('0', '1101') => __encoding aarch32_VQDMULL_T1A1_A // VQDMULL_T1 - when (_, '0111') => __encoding aarch32_VABD_i_T2A2_A // VABDL_i_T1 - when (_, '1000') => __encoding aarch32_VMLA_i_T2A2_A // VMLAL_i_T1 - when (_, '1010') => __encoding aarch32_VMLA_i_T2A2_A // VMLSL_i_T1 - when ('1', '0100') => __encoding aarch32_VRADDHN_T1A1_A // VRADDHN_T1 - when ('1', '0110') => __encoding aarch32_VRSUBHN_T1A1_A // VRSUBHN_T1 - when (_, '11x0') => __encoding aarch32_VMUL_i_T2_A // VMULL_i_T1 - when ('1', '1001') => __UNALLOCATED - when ('1', '1011') => __UNALLOCATED - when ('1', '1101') => __UNALLOCATED - when (_, '1111') => __UNALLOCATED - when (_, _, _, _, !'11', _, _, _, '1', _, _, _) => // simd_2r_sc - __field Q 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field opc 8 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (Q, opc) of - when (_, '000x') => __encoding aarch32_VMLA_s_T1_A // VMLA_s_T1_Q - when ('0', '0011') => __encoding aarch32_VQDMLAL_T2A2_A // VQDMLAL_T2 - when (_, '0010') => __encoding aarch32_VMLA_s_T2A2_A // VMLAL_s_T1 - when ('0', '0111') => __encoding aarch32_VQDMLSL_T2A2_A // VQDMLSL_T2 - when (_, '010x') => __encoding aarch32_VMLA_s_T1_A // VMLS_s_T1_Q - when ('0', '1011') => __encoding aarch32_VQDMULL_T2A2_A // VQDMULL_T2 - when (_, '0110') => __encoding aarch32_VMLA_s_T2A2_A // VMLSL_s_T1 - when (_, '100x') => __encoding aarch32_VMUL_s_T1_A // VMUL_s_T1_Q - when ('1', '0011') => __UNALLOCATED - when (_, '1010') => __encoding aarch32_VMUL_s_T2A2_A // VMULL_s_T1 - when ('1', '0111') => __UNALLOCATED - when (_, '1100') => __encoding aarch32_VQDMULH_T2A2_A // VQDMULH_T2_Q - when (_, '1101') => __encoding aarch32_VQRDMULH_T2A2_A // VQRDMULH_T2_Q - when ('1', '1011') => __UNALLOCATED - when (_, '1110') => __encoding aarch32_VQRDMLAH_T2_A // VQRDMLAH_T2_Q - when (_, '1111') => __encoding aarch32_VQRDMLSH_T2_A // VQRDMLSH_T2_Q - when (_, _, _, '1', _, '1', _) => - // t_simd_12reg - case (29 +: 3, 28 +: 1, 23 +: 5, 22 +: 1, 7 +: 15, 5 +: 2, 4 +: 1, 0 +: 4) of - when (_, _, _, _, '000xxxxxxxxxxx0', _, _, _) => // simd_1r_imm - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - case (cmode, op) of - when ('0xx0', '0') => __encoding aarch32_VMOV_i_T1A1_A - when ('0xx0', '1') => __encoding aarch32_VMVN_i_T1A1_A - when ('0xx1', '0') => __encoding aarch32_VORR_i_T1A1_A - when ('0xx1', '1') => __encoding aarch32_VBIC_i_T1A1_A - when ('10x0', '0') => __encoding aarch32_VMOV_i_T1A1_A - when ('10x0', '1') => __encoding aarch32_VMVN_i_T1A1_A - when ('10x1', '0') => __encoding aarch32_VORR_i_T1A1_A - when ('10x1', '1') => __encoding aarch32_VBIC_i_T1A1_A - when ('11xx', '0') => __encoding aarch32_VMOV_i_T1A1_A - when ('110x', '1') => __encoding aarch32_VMVN_i_T1A1_A - when ('1110', '1') => __encoding aarch32_VMOV_i_T1A1_A - when ('1111', '1') => __UNALLOCATED - when (_, _, _, _, !'000xxxxxxxxxxx0', _, _, _) => // simd_2r_shift - __field U 28 +: 1 - __field D 22 +: 1 - __field imm3H 19 +: 3 - __field imm3L 16 +: 3 - __field Vd 12 +: 4 - __field opc 8 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (U, imm3H:L, imm3L, opc, Q) of - when (_, !'0000', _, '0000', _) => __encoding aarch32_VSHR_T1A1_A // VSHR_T1_Q - when (_, !'0000', _, '0001', _) => __encoding aarch32_VSRA_T1A1_A // VSRA_T1_Q - when (_, !'0000', '000', '1010', '0') => __encoding aarch32_VMOVL_T1A1_A // VMOVL_T1 - when (_, !'0000', _, '0010', _) => __encoding aarch32_VRSHR_T1A1_A // VRSHR_T1_Q - when (_, !'0000', _, '0011', _) => __encoding aarch32_VRSRA_T1A1_A // VRSRA_T1_Q - when (_, !'0000', _, '0111', _) => __encoding aarch32_VQSHL_i_T1A1_A // VQSHL_i_T1_Q - when (_, !'0000', _, '1001', '0') => __encoding aarch32_VQSHRN_T1A1_A // VQSHRN_T1 - when (_, !'0000', _, '1001', '1') => __encoding aarch32_VQRSHRN_T1A1_A // VQRSHRN_T1 - when (_, !'0000', _, '1010', '0') => __encoding aarch32_VSHLL_T1A1_A // VSHLL_T1 - when (_, !'0000', _, '11xx', _) => __encoding aarch32_VCVT_xs_T1_A // VCVT_xs_T1_Q - when ('0', !'0000', _, '0101', _) => __encoding aarch32_VSHL_i_T1A1_A // VSHL_i_T1_Q - when ('0', !'0000', _, '1000', '0') => __encoding aarch32_VSHRN_T1A1_A // VSHRN_T1 - when ('0', !'0000', _, '1000', '1') => __encoding aarch32_VRSHRN_T1A1_A // VRSHRN_T1 - when ('1', !'0000', _, '0100', _) => __encoding aarch32_VSRI_T1A1_A // VSRI_T1_Q - when ('1', !'0000', _, '0101', _) => __encoding aarch32_VSLI_T1A1_A // VSLI_T1_Q - when ('1', !'0000', _, '0110', _) => __encoding aarch32_VQSHL_i_T1A1_A // VQSHLU_i_T1_Q - when ('1', !'0000', _, '1000', '0') => __encoding aarch32_VQSHRN_T1A1_A // VQSHRUN_T1 - when ('1', !'0000', _, '1000', '1') => __encoding aarch32_VQRSHRN_T1A1_A // VQRSHRUN_T1 - when (_, '0', _, '0x', _, '10x', _, _, _) => - // simdldst_mov64 - case (25 +: 7, 21 +: 4, 12 +: 9, 10 +: 2, 0 +: 10) of - when (_, '00x0', _, _, _) => // simdfp_mov64 - __field D 22 +: 1 - __field op 20 +: 1 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field size 8 +: 2 - __field opc2 6 +: 2 - __field M 5 +: 1 - __field o3 4 +: 1 - __field Vm 0 +: 4 - case (D, op, size, opc2, o3) of - when ('0', _, _, _, _) => __UNALLOCATED - when ('1', _, _, _, '0') => __UNALLOCATED - when ('1', _, '0x', '00', '1') => __UNALLOCATED - when ('1', _, _, '01', _) => __UNALLOCATED - when ('1', '0', '10', '00', '1') => __encoding aarch32_VMOV_ss_T1A1_A // VMOV_toss_T1 - when ('1', '0', '11', '00', '1') => __encoding aarch32_VMOV_d_T1A1_A // VMOV_tod_T1 - when ('1', _, _, '1x', _) => __UNALLOCATED - when ('1', '1', '10', '00', '1') => __encoding aarch32_VMOV_ss_T1A1_A // VMOV_ss_T1 - when ('1', '1', '11', '00', '1') => __encoding aarch32_VMOV_d_T1A1_A // VMOV_d_T1 - when (_, !'00x0', _, _, _) => // simdfp_ldst - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm8 0 +: 8 - case (P, U, W, L, Rn, size, imm8) of - when ('0', '0', '1', _, _, _, _) => __UNALLOCATED - when ('0', '1', _, _, _, '0x', _) => __UNALLOCATED - when ('0', '1', _, '0', _, '10', _) => __encoding aarch32_VSTM_T2A2_A // VSTM_T2 - when ('0', '1', _, '0', _, '11', 'xxxxxxx0') => __encoding aarch32_VSTM_T1A1_A // VSTM_T1 - when ('0', '1', _, '0', _, '11', 'xxxxxxx1') => __encoding aarch32_VSTM_T1A1_A // FSTMIAX_T1 - when ('0', '1', _, '1', _, '10', _) => __encoding aarch32_VLDM_T2A2_A // VLDM_T2 - when ('0', '1', _, '1', _, '11', 'xxxxxxx0') => __encoding aarch32_VLDM_T1A1_A // VLDM_T1 - when ('0', '1', _, '1', _, '11', 'xxxxxxx1') => __encoding aarch32_VLDM_T1A1_A // FLDMIAX_T1 - when ('1', _, '0', '0', _, _, _) => __encoding aarch32_VSTR_T1_A // VSTR_T1_D - when ('1', _, '0', _, _, '00', _) => __UNALLOCATED - when ('1', _, '0', '1', !'1111', _, _) => __encoding aarch32_VLDR_T1_A // VLDR_T1_D - when ('1', '0', '1', _, _, '0x', _) => __UNALLOCATED - when ('1', '0', '1', '0', _, '10', _) => __encoding aarch32_VSTM_T2A2_A // VSTMDB_T2 - when ('1', '0', '1', '0', _, '11', 'xxxxxxx0') => __encoding aarch32_VSTM_T1A1_A // VSTMDB_T1 - when ('1', '0', '1', '0', _, '11', 'xxxxxxx1') => __encoding aarch32_VSTM_T1A1_A // FSTMDBX_T1 - when ('1', '0', '1', '1', _, '10', _) => __encoding aarch32_VLDM_T2A2_A // VLDMDB_T2 - when ('1', '0', '1', '1', _, '11', 'xxxxxxx0') => __encoding aarch32_VLDM_T1A1_A // VLDMDB_T1 - when ('1', '0', '1', '1', _, '11', 'xxxxxxx1') => __encoding aarch32_VLDM_T1A1_A // FLDMDBX_T1 - when ('1', _, '0', '1', '1111', _, _) => __encoding aarch32_VLDR_T1_A // VLDR_l_T1_D - when ('1', '1', '1', _, _, _, _) => __UNALLOCATED - when (_, '0', _, '10', _, '10x', _, '1', _) => - // fpsimd_mov32 - case (24 +: 8, 21 +: 3, 12 +: 9, 9 +: 3, 8 +: 1, 5 +: 3, 0 +: 5) of - when (_, '000', _, _, '0', _, _) => // fp_mov32 - __field op 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - case () of - when () => __encoding aarch32_VMOV_s_T1_A // VMOV_s_T1 - when (_, '111', _, _, '0', _, _) => // fp_msr - __field L 20 +: 1 - __field reg 16 +: 4 - __field Rt 12 +: 4 - case (L) of - when ('0') => __encoding aarch32_VMSR_T1A1_AS // VMSR_T1_AS - when ('1') => __encoding aarch32_VMRS_T1A1_AS // VMRS_T1_AS - when (_, _, _, _, '1', _, _) => // simd_dup_el - __field opc1 21 +: 3 - __field L 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - __field opc2 5 +: 2 - case (opc1, L, opc2) of - when ('0xx', '0', _) => __encoding aarch32_VMOV_rs_T1A1_A // VMOV_rs_T1 - when (_, '1', _) => __encoding aarch32_VMOV_sr_T1A1_A // VMOV_sr_T1 - when ('1xx', '0', '0x') => __encoding aarch32_VDUP_r_T1A1_A // VDUP_r_T1 - when ('1xx', '0', '1x') => __UNALLOCATED - when (_, '1', _, '0x', _, '1x0', _, _, _) => // simd_3sameext - __field op1 23 +: 2 - __field D 22 +: 1 - __field op2 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op3 10 +: 1 - __field op4 8 +: 1 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - case (op1, op2, op3, op4, Q, U) of - when ('x1', '0x', '0', '0', '0', '0') => __encoding aarch32_VCADD_T1_A // VCADD_T1_D - when ('x1', '0x', '0', '0', '0', '1') => __UNALLOCATED - when ('x1', '0x', '0', '0', '1', '0') => __encoding aarch32_VCADD_T1_A // VCADD_T1_Q - when ('x1', '0x', '0', '0', '1', '1') => __UNALLOCATED - when ('00', '0x', '0', '0', _, _) => __UNALLOCATED - when ('00', '0x', '0', '1', _, _) => __UNALLOCATED - when ('00', '00', '1', '0', '0', '0') => __UNALLOCATED - when ('00', '00', '1', '0', '0', '1') => __UNALLOCATED - when ('00', '00', '1', '0', '1', '0') => __encoding aarch32_VMMLA_T1_A // VMMLA_T1_Q - when ('00', '00', '1', '0', '1', '1') => __UNALLOCATED - when ('00', '00', '1', '1', '0', '0') => __encoding aarch32_VDOT_bf16_T1_A // VDOT_T1_D - when ('00', '00', '1', '1', '0', '1') => __UNALLOCATED - when ('00', '00', '1', '1', '1', '0') => __encoding aarch32_VDOT_bf16_T1_A // VDOT_T1_Q - when ('00', '00', '1', '1', '1', '1') => __UNALLOCATED - when ('00', '01', '1', '0', _, _) => __UNALLOCATED - when ('00', '01', '1', '1', _, _) => __UNALLOCATED - when ('00', '10', '0', '0', '0', '1') => __encoding aarch32_VFMAL_T1_A // VFMAL_T1_D - when ('00', '10', '0', '1', _, _) => __UNALLOCATED - when ('00', '10', '1', '0', '0', _) => __UNALLOCATED - when ('00', '10', '1', '0', '1', '0') => __encoding aarch32_MMLA_T1_A // VSMMLA_T1_Q - when ('00', '10', '1', '0', '1', '1') => __encoding aarch32_MMLA_T1_A // VUMMLA_T1_Q - when ('00', '10', '1', '1', '0', '0') => __encoding aarch32_VDOT_T1_A // VSDOT_T1_D - when ('00', '10', '1', '1', '0', '1') => __encoding aarch32_VDOT_T1_A // VUDOT_T1_D - when ('00', '10', '1', '1', '1', '0') => __encoding aarch32_VDOT_T1_A // VSDOT_T1_Q - when ('00', '10', '1', '1', '1', '1') => __encoding aarch32_VDOT_T1_A // VUDOT_T1_Q - when ('00', '11', '0', '0', _, '1') => __encoding aarch32_VFMA_bf_T1_A // VFMA_bf_T1_Q - when ('00', '11', '0', '0', '1', '1') => __encoding aarch32_VFMAL_T1_A // VFMAL_T1_Q - when ('00', '11', '0', '1', _, _) => __UNALLOCATED - when ('00', '11', '1', '0', _, _) => __UNALLOCATED - when ('00', '11', '1', '1', _, _) => __UNALLOCATED - when ('01', '10', '0', '0', _, '1') => __encoding aarch32_VFMAL_T1_A // VFMSL_T1_Q - when ('01', '10', '0', '1', _, _) => __UNALLOCATED - when ('01', '10', '1', '0', '0', _) => __UNALLOCATED - when ('01', '10', '1', '0', '1', '0') => __encoding aarch32_MMLA_T1_A // VUSMMLA_T1_Q - when ('01', '10', '1', '0', '1', '1') => __UNALLOCATED - when ('01', '10', '1', '1', '0', '0') => __encoding aarch32_VUSDOT_T1_A // VUSDOT_T1_D - when ('01', '10', '1', '1', _, '1') => __UNALLOCATED - when ('01', '10', '1', '1', '1', '0') => __encoding aarch32_VUSDOT_T1_A // VUSDOT_T1_Q - when ('01', '11', _, _, _, _) => __UNALLOCATED - when (_, '1x', '0', '0', _, '0') => __encoding aarch32_VCMLA_T1_A // VCMLA_T1_Q - when ('10', '11', _, _, _, _) => __UNALLOCATED - when ('11', '11', _, _, _, _) => __UNALLOCATED - when (_, '1', _, '10', _, '1x0', _, _, _) => // simd_2r_scext - __field op1 23 +: 1 - __field D 22 +: 1 - __field op2 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op3 10 +: 1 - __field op4 8 +: 1 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - case (op1, op2, op3, op4, Q, U) of - when ('0', _, '0', '0', _, '0') => __encoding aarch32_VCMLA_idx_T1_A // VCMLA_s_T1_QH - when ('0', '00', '0', '0', _, '1') => __encoding aarch32_VFMAL_i_T1_A // VFMAL_s_T1_Q - when ('0', '00', '0', '1', _, _) => __UNALLOCATED - when ('0', '00', '1', '0', _, _) => __UNALLOCATED - when ('0', '00', '1', '1', '0', '0') => __encoding aarch32_VDOT_bf16_i_T1_A // VDOT_s_T1_D - when ('0', '00', '1', '1', _, '1') => __UNALLOCATED - when ('0', '00', '1', '1', '1', '0') => __encoding aarch32_VDOT_bf16_i_T1_A // VDOT_s_T1_Q - when ('0', '01', '0', '0', _, '0') => __UNALLOCATED - when ('0', '01', '0', '0', '0', '1') => __encoding aarch32_VFMAL_i_T1_A // VFMSL_s_T1_D - when ('0', '01', '0', '0', '1', '1') => __encoding aarch32_VFMAL_i_T1_A // VFMSL_s_T1_Q - when ('0', '01', '0', '1', _, _) => __UNALLOCATED - when ('0', '01', '1', '0', _, _) => __UNALLOCATED - when ('0', '10', '0', _, _, _) => __UNALLOCATED - when ('0', '10', '1', '0', _, _) => __UNALLOCATED - when ('0', '10', '1', '1', '0', '0') => __encoding aarch32_VDOT_s_T1_A // VSDOT_s_T1_D - when ('0', '10', '1', '1', '0', '1') => __encoding aarch32_VDOT_s_T1_A // VUDOT_s_T1_D - when ('0', '10', '1', '1', '1', '0') => __encoding aarch32_VDOT_s_T1_A // VSDOT_s_T1_Q - when ('0', '10', '1', '1', '1', '1') => __encoding aarch32_VDOT_s_T1_A // VUDOT_s_T1_Q - when ('0', '11', '0', '0', _, '0') => __UNALLOCATED - when ('0', '11', '0', '0', _, '1') => __encoding aarch32_VFMA_bfs_T1_A // VFMA_bfs_T1_Q - when ('0', '11', '0', '1', _, _) => __UNALLOCATED - when ('0', '11', '1', _, _, _) => __UNALLOCATED - when ('1', _, '0', '0', _, '0') => __encoding aarch32_VCMLA_idx_T1_A // VCMLA_s_T1_QS - when ('1', '00', '1', '1', '0', '0') => __encoding aarch32_DOT_T1_A // VUSDOT_s_T1_D - when ('1', '00', '1', '1', '0', '1') => __encoding aarch32_DOT_T1_A // VSUDOT_s_T1_D - when ('1', '00', '1', '1', '1', '0') => __encoding aarch32_DOT_T1_A // VUSDOT_s_T1_Q - when ('1', '00', '1', '1', '1', '1') => __encoding aarch32_DOT_T1_A // VSUDOT_s_T1_Q - when ('1', _, '0', '1', _, _) => __UNALLOCATED - when ('1', '01', '1', '1', _, _) => __UNALLOCATED - when ('1', '1x', '1', '1', _, _) => __UNALLOCATED - when ('1', _, '1', '0', _, _) => __UNALLOCATED - when (_, '0100', 'xx0xx', _, _, _) => // ldstm - __field opc 23 +: 2 - __field W 21 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field P 15 +: 1 - __field M 14 +: 1 - __field register_list 0 +: 14 - case (opc, L) of - when ('00', '0') => __encoding aarch32_SRS_A1_AS - when ('00', '1') => __encoding aarch32_RFE_A1_AS - when ('01', '0') => __encoding aarch32_STM_T2_A // STM_T2 - when ('01', '1') => __encoding aarch32_LDM_T2_A // LDM_T2 - when ('10', '0') => __encoding aarch32_STMDB_T1_A // STMDB_T1 - when ('10', '1') => __encoding aarch32_LDMDB_T1_A // LDMDB_T1 - when ('11', '0') => __encoding aarch32_SRS_A1_AS - when ('11', '1') => __encoding aarch32_RFE_A1_AS - when (_, '0100', 'xx1xx', _, _, _) => - // dstd - case (25 +: 7, 21 +: 4, 20 +: 1, 16 +: 4, 8 +: 8, 5 +: 3, 0 +: 5) of - when (_, '0010', _, _, _, _, _) => // ldstex - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - case (L) of - when ('0') => __encoding aarch32_STREX_T1_A // STREX_T1 - when ('1') => __encoding aarch32_LDREX_T1_A // LDREX_T1 - when (_, '0110', '0', _, _, '000', _) => __UNPREDICTABLE - when (_, '0110', '1', _, _, '000', _) => // tblbr - __field Rn 16 +: 4 - __field H 4 +: 1 - __field Rm 0 +: 4 - case () of - when () => __encoding aarch32_TBB_T1_A // TBH_T1 - when (_, '0110', _, _, _, '01x', _) => // ldstex_bhd - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field sz 4 +: 2 - __field Rd 0 +: 4 - case (L, sz) of - when ('0', '00') => __encoding aarch32_STREXB_T1_A // STREXB_T1 - when ('0', '01') => __encoding aarch32_STREXH_T1_A // STREXH_T1 - when ('0', '10') => __UNALLOCATED - when ('0', '11') => __encoding aarch32_STREXD_T1_A // STREXD_T1 - when ('1', '00') => __encoding aarch32_LDREXB_T1_A // LDREXB_T1 - when ('1', '01') => __encoding aarch32_LDREXH_T1_A // LDREXH_T1 - when ('1', '10') => __UNALLOCATED - when ('1', '11') => __encoding aarch32_LDREXD_T1_A // LDREXD_T1 - when (_, '0110', _, _, _, '1xx', _) => // ldastl - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field op 6 +: 1 - __field sz 4 +: 2 - __field Rd 0 +: 4 - case (L, op, sz) of - when ('0', '0', '00') => __encoding aarch32_STLB_T1_A // STLB_T1 - when ('0', '0', '01') => __encoding aarch32_STLH_T1_A // STLH_T1 - when ('0', '0', '10') => __encoding aarch32_STL_T1_A // STL_T1 - when ('0', '0', '11') => __UNALLOCATED - when ('0', '1', '00') => __encoding aarch32_STLEXB_T1_A // STLEXB_T1 - when ('0', '1', '01') => __encoding aarch32_STLEXH_T1_A // STLEXH_T1 - when ('0', '1', '10') => __encoding aarch32_STLEX_T1_A // STLEX_T1 - when ('0', '1', '11') => __encoding aarch32_STLEXD_T1_A // STLEXD_T1 - when ('1', '0', '00') => __encoding aarch32_LDAB_T1_A // LDAB_T1 - when ('1', '0', '01') => __encoding aarch32_LDAH_T1_A // LDAH_T1 - when ('1', '0', '10') => __encoding aarch32_LDA_T1_A // LDA_T1 - when ('1', '0', '11') => __UNALLOCATED - when ('1', '1', '00') => __encoding aarch32_LDAEXB_T1_A // LDAEXB_T1 - when ('1', '1', '01') => __encoding aarch32_LDAEXH_T1_A // LDAEXH_T1 - when ('1', '1', '10') => __encoding aarch32_LDAEX_T1_A // LDAEX_T1 - when ('1', '1', '11') => __encoding aarch32_LDAEXD_T1_A // LDAEXD_T1 - when (_, '0x11', _, !'1111', _, _, _) => // ldstd_post - __field U 23 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field imm8 0 +: 8 - case (L) of - when ('0') => __encoding aarch32_STRD_i_T1_A // STRD_i_T1_post - when ('1') => __encoding aarch32_LDRD_i_T1_A // LDRD_i_T1_post - when (_, '1x10', _, !'1111', _, _, _) => // ldstd_imm - __field U 23 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field imm8 0 +: 8 - case (L) of - when ('0') => __encoding aarch32_STRD_i_T1_A // STRD_i_T1_off - when ('1') => __encoding aarch32_LDRD_i_T1_A // LDRD_i_T1_off - when (_, '1x11', _, !'1111', _, _, _) => // ldstd_pre - __field U 23 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field imm8 0 +: 8 - case (L) of - when ('0') => __encoding aarch32_STRD_i_T1_A // STRD_i_T1_pre - when ('1') => __encoding aarch32_LDRD_i_T1_A // LDRD_i_T1_pre - when (_, !'0xx0', _, '1111', _, _, _) => // lddlit - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field L 20 +: 1 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field imm8 0 +: 8 - case (L) of - when ('1') => __encoding aarch32_LDRD_l_T1_A // LDRD_l_T1 - when (_, '0101', _, _, _, _) => // dpint_shiftr - __field op1 21 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - case (op1, S, Rn, imm3:imm2:stype, Rd) of - when ('0000', '0', _, _, _) => __encoding aarch32_AND_r_T2_A // AND_r_T2_RRX - when ('0000', '1', _, !'0000011', !'1111') => __encoding aarch32_AND_r_T2_A // ANDS_r_T2 - when ('0000', '1', _, !'0000011', '1111') => __encoding aarch32_TST_r_T2_A // TST_r_T2 - when ('0000', '1', _, '0000011', !'1111') => __encoding aarch32_AND_r_T2_A // ANDS_r_T2_RRX - when ('0000', '1', _, '0000011', '1111') => __encoding aarch32_TST_r_T2_A // TST_r_T2_RRX - when ('0001', _, _, _, _) => __encoding aarch32_BIC_r_T2_A // BICS_r_T2_RRX - when ('0010', '0', !'1111', _, _) => __encoding aarch32_ORR_r_T2_A // ORR_r_T2_RRX - when ('0010', '0', '1111', _, _) => __encoding aarch32_MOV_r_T3_A // MOV_r_T3_RRX - when ('0010', '1', !'1111', _, _) => __encoding aarch32_ORR_r_T2_A // ORRS_r_T2_RRX - when ('0010', '1', '1111', _, _) => __encoding aarch32_MOV_r_T3_A // MOVS_r_T3_RRX - when ('0011', '0', !'1111', _, _) => __encoding aarch32_ORN_r_T1_A // ORN_r_T1_RRX - when ('0011', '0', '1111', _, _) => __encoding aarch32_MVN_r_T2_A // MVN_r_T2_RRX - when ('0011', '1', !'1111', _, _) => __encoding aarch32_ORN_r_T1_A // ORNS_r_T1_RRX - when ('0011', '1', '1111', _, _) => __encoding aarch32_MVN_r_T2_A // MVNS_r_T2_RRX - when ('0100', '0', _, _, _) => __encoding aarch32_EOR_r_T2_A // EOR_r_T2_RRX - when ('0100', '1', _, !'0000011', !'1111') => __encoding aarch32_EOR_r_T2_A // EORS_r_T2 - when ('0100', '1', _, !'0000011', '1111') => __encoding aarch32_TEQ_r_T1_A // TEQ_r_T1 - when ('0100', '1', _, '0000011', !'1111') => __encoding aarch32_EOR_r_T2_A // EORS_r_T2_RRX - when ('0100', '1', _, '0000011', '1111') => __encoding aarch32_TEQ_r_T1_A // TEQ_r_T1_RRX - when ('0101', _, _, _, _) => __UNALLOCATED - when ('0110', '0', _, 'xxxxx00', _) => __encoding aarch32_PKH_T1_A // PKHBT_T1 - when ('0110', '0', _, 'xxxxx01', _) => __UNALLOCATED - when ('0110', '0', _, 'xxxxx10', _) => __encoding aarch32_PKH_T1_A // PKHTB_T1 - when ('0110', '0', _, 'xxxxx11', _) => __UNALLOCATED - when ('0111', _, _, _, _) => __UNALLOCATED - when ('1000', '0', !'1101', _, _) => __encoding aarch32_ADD_r_T3_A // ADD_r_T3_RRX - when ('1000', '0', '1101', _, _) => __encoding aarch32_ADD_SP_r_T3_A // ADD_SP_r_T3_RRX - when ('1000', '1', !'1101', _, !'1111') => __encoding aarch32_ADD_r_T3_A // ADDS_r_T3_RRX - when ('1000', '1', '1101', _, !'1111') => __encoding aarch32_ADD_SP_r_T3_A // ADDS_SP_r_T3_RRX - when ('1000', '1', _, _, '1111') => __encoding aarch32_CMN_r_T2_A // CMN_r_T2_RRX - when ('1001', _, _, _, _) => __UNALLOCATED - when ('1010', _, _, _, _) => __encoding aarch32_ADC_r_T2_A // ADCS_r_T2_RRX - when ('1011', _, _, _, _) => __encoding aarch32_SBC_r_T2_A // SBCS_r_T2_RRX - when ('1100', _, _, _, _) => __UNALLOCATED - when ('1101', '0', !'1101', _, _) => __encoding aarch32_SUB_r_T2_A // SUB_r_T2_RRX - when ('1101', '0', '1101', _, _) => __encoding aarch32_SUB_SP_r_T1_A // SUB_SP_r_T1_RRX - when ('1101', '1', !'1101', _, !'1111') => __encoding aarch32_SUB_r_T2_A // SUBS_r_T2_RRX - when ('1101', '1', '1101', _, !'1111') => __encoding aarch32_SUB_SP_r_T1_A // SUBS_SP_r_T1_RRX - when ('1101', '1', _, _, '1111') => __encoding aarch32_CMP_r_T3_A // CMP_r_T3_RRX - when ('1110', _, _, _, _) => __encoding aarch32_RSB_r_T1_A // RSBS_r_T1_RRX - when ('1111', _, _, _, _) => __UNALLOCATED - when (_, '10xx', _, _, '1', _) => - // bcrtrl - case (27 +: 5, 26 +: 1, 22 +: 4, 20 +: 2, 16 +: 4, 15 +: 1, 12 +: 3, 11 +: 1, 8 +: 3, 6 +: 2, 5 +: 1, 0 +: 5) of - when (_, '0', '1110', '0x', _, _, '0x0', _, _, _, '0', _) => // msr_spec - __field R 20 +: 1 - __field Rn 16 +: 4 - __field mask 8 +: 4 - case () of - when () => __encoding aarch32_MSR_r_T1_AS // MSR_r_T1_AS - when (_, '0', '1110', '0x', _, _, '0x0', _, _, _, '1', _) => // msr_bank - __field R 20 +: 1 - __field Rn 16 +: 4 - __field m1 8 +: 4 - __field m 4 +: 1 - case () of - when () => __encoding aarch32_MSR_br_T1_AS // MSR_br_T1_AS - when (_, '0', '1110', '10', _, _, '0x0', _, '000', _, _, _) => // hints - __field hint 4 +: 4 - __field option 0 +: 4 - case (hint, option) of - when ('0000', '0000') => __encoding aarch32_NOP_T2_A // NOP_T2 - when ('0000', '0001') => __encoding aarch32_YIELD_T2_A // YIELD_T2 - when ('0000', '0010') => __encoding aarch32_WFE_T2_A // WFE_T2 - when ('0000', '0011') => __encoding aarch32_WFI_T2_A // WFI_T2 - when ('0000', '0100') => __encoding aarch32_SEV_T2_A // SEV_T2 - when ('0000', '0101') => __encoding aarch32_SEVL_T2_A // SEVL_T2 - when ('0000', '011x') => __NOP - when ('0000', '1xxx') => __NOP - when ('0001', '0000') => __encoding aarch32_ESB_T1_A // ESB_T1 - when ('0001', '0001') => __NOP - when ('0001', '0010') => __encoding aarch32_TSB_T1_A // TSB_T1 - when ('0001', '0011') => __NOP - when ('0001', '0100') => __encoding aarch32_CSDB_T1_A // CSDB_T1 - when ('0001', '0101') => __NOP - when ('0001', '011x') => __NOP - when ('0001', '1xxx') => __NOP - when ('001x', _) => __NOP - when ('01xx', _) => __NOP - when ('10xx', _) => __NOP - when ('110x', _) => __NOP - when ('1110', _) => __NOP - when ('1111', _) => __encoding aarch32_DBG_T1_A // DBG_T1 - when (_, '0', '1110', '10', _, _, '0x0', _, !'000', _, _, _) => // cps - __field imod 9 +: 2 - __field M 8 +: 1 - __field A 7 +: 1 - __field I 6 +: 1 - __field F 5 +: 1 - __field mode 0 +: 5 - case (imod, M) of - when ('00', '1') => __encoding aarch32_CPS_T2_AS // CPS_T2_AS - when ('01', _) => __UNALLOCATED - when ('10', _) => __encoding aarch32_CPS_T2_AS // CPSIE_T2_ASM - when ('11', _) => __encoding aarch32_CPS_T2_AS // CPSID_T2_ASM - when (_, '0', '1110', '11', _, _, '0x0', _, _, _, _, _) => // system - __field opc 4 +: 4 - __field option 0 +: 4 - case (opc, option) of - when ('000x', _) => __UNALLOCATED - when ('0010', _) => __encoding aarch32_CLREX_T1_A // CLREX_T1 - when ('0011', _) => __UNALLOCATED - when ('0100', !'0x00') => __encoding aarch32_DSB_T1_A // DSB_T1 - when ('0100', '0000') => __encoding aarch32_SSBB_T1_A // SSBB_T1 - when ('0100', '0100') => __encoding aarch32_PSSBB_T1_A // PSSBB_T1 - when ('0101', _) => __encoding aarch32_DMB_T1_A // DMB_T1 - when ('0110', _) => __encoding aarch32_ISB_T1_A // ISB_T1 - when ('0111', _) => __encoding aarch32_SB_T1_A // SB_T1 - when ('1xxx', _) => __UNALLOCATED - when (_, '0', '1111', '00', _, _, '0x0', _, _, _, _, _) => // bx_jaz - __field Rm 16 +: 4 - case () of - when () => __encoding aarch32_BXJ_T1_A // BXJ_T1 - when (_, '0', '1111', '01', _, _, '0x0', _, _, _, _, _) => // eret - __field Rn 16 +: 4 - __field imm8 0 +: 8 - case (Rn, imm8) of - when (_, !'00000000') => __encoding aarch32_SUB_i_T5_AS // SUBS_PC_T5_AS - when ('1110', '00000000') => __encoding aarch32_ERET_T1_A // ERET_T1 - when (_, '0', '1111', '1x', _, _, '0x0', _, _, _, '0', _) => // mrs_spec - __field R 20 +: 1 - __field Rd 8 +: 4 - case () of - when () => __encoding aarch32_MRS_T1_AS // MRS_T1_AS - when (_, '0', '1111', '1x', _, _, '0x0', _, _, _, '1', _) => // mrs_bank - __field R 20 +: 1 - __field m1 16 +: 4 - __field Rd 8 +: 4 - __field m 4 +: 1 - case () of - when () => __encoding aarch32_MRS_br_T1_AS // MRS_br_T1_AS - when (_, '1', '1110', '00', _, _, '000', _, _, _, _, _) => // dcps - __field imm4 16 +: 4 - __field imm10 2 +: 10 - __field opt 0 +: 2 - case (imm4, imm10, opt) of - when (!'1111', _, _) => __UNALLOCATED - when ('1111', !'0000000000', _) => __UNALLOCATED - when ('1111', '0000000000', '00') => __UNALLOCATED - when ('1111', '0000000000', '01') => __encoding aarch32_DCPS1_T1_A // DCPS1_T1 - when ('1111', '0000000000', '10') => __encoding aarch32_DCPS2_T1_A // DCPS2_T1 - when ('1111', '0000000000', '11') => __encoding aarch32_DCPS3_T1_A // DCPS3_T1 - when (_, '1', '1110', '00', _, _, '010', _, _, _, _, _) => __UNPREDICTABLE - when (_, '1', '1110', '01', _, _, '0x0', _, _, _, _, _) => __UNPREDICTABLE - when (_, '1', '1110', '1x', _, _, '0x0', _, _, _, _, _) => __UNPREDICTABLE - when (_, '1', '1111', '0x', _, _, '0x0', _, _, _, _, _) => __UNPREDICTABLE - when (_, '1', '1111', '1x', _, _, '0x0', _, _, _, _, _) => // except - __field o1 20 +: 1 - __field imm4 16 +: 4 - __field o2 13 +: 1 - __field imm12 0 +: 12 - case (o1, o2) of - when ('0', '0') => __encoding aarch32_HVC_T1_A // HVC_T1 - when ('0', '1') => __UNALLOCATED - when ('1', '0') => __encoding aarch32_SMC_T1_AS // SMC_T1_AS - when ('1', '1') => __encoding aarch32_UDF_T2_A // UDF_T2 - when (_, _, !'111x', _, _, _, '0x0', _, _, _, _, _) => // bcond - __field S 26 +: 1 - __field cond 22 +: 4 - __field imm6 16 +: 6 - __field J1 13 +: 1 - __field J2 11 +: 1 - __field imm11 0 +: 11 - case () of - when () => __encoding aarch32_B_T3_A // B_T3 - when (_, _, _, _, _, _, '0x1', _, _, _, _, _) => // b - __field S 26 +: 1 - __field imm10 16 +: 10 - __field J1 13 +: 1 - __field J2 11 +: 1 - __field imm11 0 +: 11 - case () of - when () => __encoding aarch32_B_T4_A // B_T4 - when (_, _, _, _, _, _, '1x0', _, _, _, _, _) => // blx - __field S 26 +: 1 - __field imm10 16 +: 10 - __field J1 13 +: 1 - __field J2 11 +: 1 - __field imm11 0 +: 11 - case () of - when () => __encoding aarch32_BL_i_T2_A // BL_i_T2 - when (_, _, _, _, _, _, '1x1', _, _, _, _, _) => // bl - __field S 26 +: 1 - __field imm10 16 +: 10 - __field J1 13 +: 1 - __field J2 11 +: 1 - __field imm11 0 +: 11 - case () of - when () => __encoding aarch32_BL_i_T1_A // BL_i_T1 - when (_, '10x0', _, _, '0', _) => // dpint_immm - __field i 26 +: 1 - __field op1 21 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - case (op1, S, Rn, Rd) of - when ('0000', '0', _, _) => __encoding aarch32_AND_i_T1_A // AND_i_T1 - when ('0000', '1', _, !'1111') => __encoding aarch32_AND_i_T1_A // ANDS_i_T1 - when ('0000', '1', _, '1111') => __encoding aarch32_TST_i_T1_A // TST_i_T1 - when ('0001', _, _, _) => __encoding aarch32_BIC_i_T1_A // BICS_i_T1 - when ('0010', '0', !'1111', _) => __encoding aarch32_ORR_i_T1_A // ORR_i_T1 - when ('0010', '0', '1111', _) => __encoding aarch32_MOV_i_T2_A // MOV_i_T2 - when ('0010', '1', !'1111', _) => __encoding aarch32_ORR_i_T1_A // ORRS_i_T1 - when ('0010', '1', '1111', _) => __encoding aarch32_MOV_i_T2_A // MOVS_i_T2 - when ('0011', '0', !'1111', _) => __encoding aarch32_ORN_i_T1_A // ORN_i_T1 - when ('0011', '0', '1111', _) => __encoding aarch32_MVN_i_T1_A // MVN_i_T1 - when ('0011', '1', !'1111', _) => __encoding aarch32_ORN_i_T1_A // ORNS_i_T1 - when ('0011', '1', '1111', _) => __encoding aarch32_MVN_i_T1_A // MVNS_i_T1 - when ('0100', '0', _, _) => __encoding aarch32_EOR_i_T1_A // EOR_i_T1 - when ('0100', '1', _, !'1111') => __encoding aarch32_EOR_i_T1_A // EORS_i_T1 - when ('0100', '1', _, '1111') => __encoding aarch32_TEQ_i_T1_A // TEQ_i_T1 - when ('0101', _, _, _) => __UNALLOCATED - when ('011x', _, _, _) => __UNALLOCATED - when ('1000', '0', !'1101', _) => __encoding aarch32_ADD_i_T3_A // ADD_i_T3 - when ('1000', '0', '1101', _) => __encoding aarch32_ADD_SP_i_T3_A // ADD_SP_i_T3 - when ('1000', '1', !'1101', !'1111') => __encoding aarch32_ADD_i_T3_A // ADDS_i_T3 - when ('1000', '1', '1101', !'1111') => __encoding aarch32_ADD_SP_i_T3_A // ADDS_SP_i_T3 - when ('1000', '1', _, '1111') => __encoding aarch32_CMN_i_T1_A // CMN_i_T1 - when ('1001', _, _, _) => __UNALLOCATED - when ('1010', _, _, _) => __encoding aarch32_ADC_i_T1_A // ADCS_i_T1 - when ('1011', _, _, _) => __encoding aarch32_SBC_i_T1_A // SBCS_i_T1 - when ('1100', _, _, _) => __UNALLOCATED - when ('1101', '0', !'1101', _) => __encoding aarch32_SUB_i_T3_A // SUB_i_T3 - when ('1101', '0', '1101', _) => __encoding aarch32_SUB_SP_i_T2_A // SUB_SP_i_T2 - when ('1101', '1', !'1101', !'1111') => __encoding aarch32_SUB_i_T3_A // SUBS_i_T3 - when ('1101', '1', '1101', !'1111') => __encoding aarch32_SUB_SP_i_T2_A // SUBS_SP_i_T2 - when ('1101', '1', _, '1111') => __encoding aarch32_CMP_i_T2_A // CMP_i_T2 - when ('1110', _, _, _) => __encoding aarch32_RSB_i_T2_A // RSBS_i_T2 - when ('1111', _, _, _) => __UNALLOCATED - when (_, '10x1', _, _, '0', _) => - // imm - case (27 +: 5, 26 +: 1, 25 +: 1, 24 +: 1, 23 +: 1, 21 +: 2, 20 +: 1, 16 +: 4, 15 +: 1, 0 +: 15) of - when (_, _, _, '0', _, '0x', _, _, _, _) => // dpint_imms - __field i 26 +: 1 - __field o1 23 +: 1 - __field o2 21 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - case (o1, o2, Rn) of - when ('0', '0', !'11x1') => __encoding aarch32_ADD_i_T4_A // ADD_i_T4 - when ('0', '0', '1101') => __encoding aarch32_ADD_SP_i_T4_A // ADD_SP_i_T4 - when ('0', '0', '1111') => __encoding aarch32_ADR_A1_A - when ('0', '1', _) => __UNALLOCATED - when ('1', '0', _) => __UNALLOCATED - when ('1', '1', !'11x1') => __encoding aarch32_SUB_i_T4_A // SUB_i_T4 - when ('1', '1', '1101') => __encoding aarch32_SUB_SP_i_T3_A // SUB_SP_i_T3 - when ('1', '1', '1111') => __encoding aarch32_ADR_A1_A - when (_, _, _, '0', _, '10', _, _, _, _) => // movw - __field i 26 +: 1 - __field o1 23 +: 1 - __field imm4 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - case (o1) of - when ('0') => __encoding aarch32_MOV_i_T3_A // MOV_i_T3 - when ('1') => __encoding aarch32_MOVT_T1_A // MOVT_T1 - when (_, _, _, '0', _, '11', _, _, _, _) => __UNPREDICTABLE - when (_, _, _, '1', _, _, _, _, _, _) => // sat_bit - __field op1 21 +: 3 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field widthm1 0 +: 5 - case (op1, Rn, imm3:imm2) of - when ('000', _, _) => __encoding aarch32_SSAT_T1_A // SSAT_T1_LSL - when ('001', _, !'00000') => __encoding aarch32_SSAT_T1_A // SSAT_T1_ASR - when ('001', _, '00000') => __encoding aarch32_SSAT16_T1_A // SSAT16_T1 - when ('010', _, _) => __encoding aarch32_SBFX_T1_A // SBFX_T1 - when ('011', !'1111', _) => __encoding aarch32_BFI_T1_A // BFI_T1 - when ('011', '1111', _) => __encoding aarch32_BFC_T1_A // BFC_T1 - when ('100', _, _) => __encoding aarch32_USAT_T1_A // USAT_T1_LSL - when ('101', _, !'00000') => __encoding aarch32_USAT_T1_A // USAT_T1_ASR - when ('101', _, '00000') => __encoding aarch32_USAT16_T1_A // USAT16_T1 - when ('110', _, _) => __encoding aarch32_UBFX_T1_A // UBFX_T1 - when ('111', _, _) => __UNALLOCATED - when (_, '1100', '1xxx0', _, _, _) => - // vldst - case (24 +: 8, 23 +: 1, 21 +: 2, 20 +: 1, 12 +: 8, 10 +: 2, 0 +: 10) of - when (_, '0', _, _, _, _, _) => // asimldstms - __field D 22 +: 1 - __field L 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - case (L, itype) of - when ('0', '000x') => __encoding aarch32_VST4_m_T1A1_A // VST4_m_T1_posti - when ('0', '0010') => __encoding aarch32_VST1_m_T1A1_A - when ('0', '0011') => __encoding aarch32_VST2_m_T1A1_A - when ('0', '010x') => __encoding aarch32_VST3_m_T1A1_A // VST3_m_T1_posti - when ('0', '0110') => __encoding aarch32_VST1_m_T1A1_A - when ('0', '0111') => __encoding aarch32_VST1_m_T1A1_A - when ('0', '100x') => __encoding aarch32_VST2_m_T1A1_A - when ('0', '1010') => __encoding aarch32_VST1_m_T1A1_A - when ('1', '000x') => __encoding aarch32_VLD4_m_T1A1_A // VLD4_m_T1_posti - when ('1', '0010') => __encoding aarch32_VLD1_m_T1A1_A - when ('1', '0011') => __encoding aarch32_VLD2_m_T1A1_A - when ('1', '010x') => __encoding aarch32_VLD3_m_T1A1_A // VLD3_m_T1_posti - when (_, '1011') => __UNALLOCATED - when ('1', '0110') => __encoding aarch32_VLD1_m_T1A1_A - when ('1', '0111') => __encoding aarch32_VLD1_m_T1A1_A - when (_, '11xx') => __UNALLOCATED - when ('1', '100x') => __encoding aarch32_VLD2_m_T1A1_A - when ('1', '1010') => __encoding aarch32_VLD1_m_T1A1_A - when (_, '1', _, _, _, '11', _) => // asimldall - __field D 22 +: 1 - __field L 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field N 8 +: 2 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - case (L, N, a) of - when ('0', _, _) => __UNALLOCATED - when ('1', '00', _) => __encoding aarch32_VLD1_a_T1A1_A // VLD1_a_T1_posti - when ('1', '01', _) => __encoding aarch32_VLD2_a_T1A1_A // VLD2_a_T1_posti - when ('1', '10', '0') => __encoding aarch32_VLD3_a_T1A1_A // VLD3_a_T1_posti - when ('1', '10', '1') => __UNALLOCATED - when ('1', '11', _) => __encoding aarch32_VLD4_a_T1A1_A // VLD4_a_T1_posti - when (_, '1', _, _, _, !'11', _) => // asimldstss - __field D 22 +: 1 - __field L 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field N 8 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - case (L, size, N) of - when ('0', '00', '00') => __encoding aarch32_VST1_1_T1A1_A - when ('0', '00', '01') => __encoding aarch32_VST2_1_T1A1_A - when ('0', '00', '10') => __encoding aarch32_VST3_1_T1A1_A - when ('0', '00', '11') => __encoding aarch32_VST4_1_T1A1_A - when ('0', '01', '00') => __encoding aarch32_VST1_1_T1A1_A - when ('0', '01', '01') => __encoding aarch32_VST2_1_T1A1_A - when ('0', '01', '10') => __encoding aarch32_VST3_1_T1A1_A - when ('0', '01', '11') => __encoding aarch32_VST4_1_T1A1_A - when ('0', '10', '00') => __encoding aarch32_VST1_1_T1A1_A - when ('0', '10', '01') => __encoding aarch32_VST2_1_T1A1_A - when ('0', '10', '10') => __encoding aarch32_VST3_1_T1A1_A - when ('0', '10', '11') => __encoding aarch32_VST4_1_T1A1_A - when ('1', '00', '00') => __encoding aarch32_VLD1_1_T1A1_A - when ('1', '00', '01') => __encoding aarch32_VLD2_1_T1A1_A - when ('1', '00', '10') => __encoding aarch32_VLD3_1_T1A1_A - when ('1', '00', '11') => __encoding aarch32_VLD4_1_T1A1_A - when ('1', '01', '00') => __encoding aarch32_VLD1_1_T1A1_A - when ('1', '01', '01') => __encoding aarch32_VLD2_1_T1A1_A - when ('1', '01', '10') => __encoding aarch32_VLD3_1_T1A1_A - when ('1', '01', '11') => __encoding aarch32_VLD4_1_T1A1_A - when ('1', '10', '00') => __encoding aarch32_VLD1_1_T1A1_A - when ('1', '10', '01') => __encoding aarch32_VLD2_1_T1A1_A - when ('1', '10', '10') => __encoding aarch32_VLD3_1_T1A1_A - when ('1', '10', '11') => __encoding aarch32_VLD4_1_T1A1_A - when (_, '1100', !'1xxx0', _, _, _) => - // ldst - case (25 +: 7, 23 +: 2, 21 +: 2, 20 +: 1, 16 +: 4, 12 +: 4, 6 +: 6, 0 +: 6) of - when (_, '00', _, _, !'1111', _, '000000', _) => // ldst_unsigned_reg - __field size 21 +: 2 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - case (size, L, Rt) of - when ('00', '0', _) => __encoding aarch32_STRB_r_T2_A // STRB_r_T2 - when ('00', '1', !'1111') => __encoding aarch32_LDRB_r_T2_A // LDRB_r_T2 - when ('00', '1', '1111') => __encoding aarch32_PLD_r_T1_A // PLD_r_T1 - when ('01', '0', _) => __encoding aarch32_STRH_r_T2_A // STRH_r_T2 - when ('01', '1', !'1111') => __encoding aarch32_LDRH_r_T2_A // LDRH_r_T2 - when ('01', '1', '1111') => __encoding aarch32_PLD_r_T1_A // PLDW_r_T1 - when ('10', '0', _) => __encoding aarch32_STR_r_T2_A // STR_r_T2 - when ('10', '1', _) => __encoding aarch32_LDR_r_T2_A // LDR_r_T2 - when ('11', _, _) => __UNALLOCATED - when (_, '00', _, _, !'1111', _, '000001', _) => __UNPREDICTABLE - when (_, '00', _, _, !'1111', _, '00001x', _) => __UNPREDICTABLE - when (_, '00', _, _, !'1111', _, '0001xx', _) => __UNPREDICTABLE - when (_, '00', _, _, !'1111', _, '001xxx', _) => __UNPREDICTABLE - when (_, '00', _, _, !'1111', _, '01xxxx', _) => __UNPREDICTABLE - when (_, '00', _, _, !'1111', _, '10x0xx', _) => __UNPREDICTABLE - when (_, '00', _, _, !'1111', _, '10x1xx', _) => // ldst_unsigned_post - __field size 21 +: 2 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field U 9 +: 1 - __field imm8 0 +: 8 - case (size, L) of - when ('00', '0') => __encoding aarch32_STRB_i_T3_A // STRB_i_T3_post - when ('00', '1') => __encoding aarch32_LDRB_i_T3_A // LDRB_i_T3_post - when ('01', '0') => __encoding aarch32_STRH_i_T3_A // STRH_i_T3_post - when ('01', '1') => __encoding aarch32_LDRH_i_T3_A // LDRH_i_T3_post - when ('10', '0') => __encoding aarch32_STR_i_T4_A // STR_i_T4_post - when ('10', '1') => __encoding aarch32_LDR_i_T4_A // LDR_i_T4_post - when ('11', _) => __UNALLOCATED - when (_, '00', _, _, !'1111', _, '1100xx', _) => // ldst_unsigned_nimm - __field size 21 +: 2 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - case (size, L, Rt) of - when ('00', '0', _) => __encoding aarch32_STRB_i_T3_A // STRB_i_T3_offn - when ('00', '1', !'1111') => __encoding aarch32_LDRB_i_T3_A // LDRB_i_T3_off - when ('00', '1', '1111') => __encoding aarch32_PLD_i_T2_A // PLD_i_T2 - when ('01', '0', _) => __encoding aarch32_STRH_i_T3_A // STRH_i_T3_offn - when ('01', '1', !'1111') => __encoding aarch32_LDRH_i_T3_A // LDRH_i_T3_off - when ('01', '1', '1111') => __encoding aarch32_PLD_i_T2_A // PLDW_i_T2 - when ('10', '0', _) => __encoding aarch32_STR_i_T4_A // STR_i_T4_off - when ('10', '1', _) => __encoding aarch32_LDR_i_T4_A // LDR_i_T4_off - when ('11', _, _) => __UNALLOCATED - when (_, '00', _, _, !'1111', _, '1110xx', _) => // ldst_unsigned_unpriv - __field size 21 +: 2 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - case (size, L) of - when ('00', '0') => __encoding aarch32_STRBT_T1_A // STRBT_T1 - when ('00', '1') => __encoding aarch32_LDRBT_T1_A // LDRBT_T1 - when ('01', '0') => __encoding aarch32_STRHT_T1_A // STRHT_T1 - when ('01', '1') => __encoding aarch32_LDRHT_T1_A // LDRHT_T1 - when ('10', '0') => __encoding aarch32_STRT_T1_A // STRT_T1 - when ('10', '1') => __encoding aarch32_LDRT_T1_A // LDRT_T1 - when ('11', _) => __UNALLOCATED - when (_, '00', _, _, !'1111', _, '11x1xx', _) => // ldst_unsigned_pre - __field size 21 +: 2 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field U 9 +: 1 - __field imm8 0 +: 8 - case (size, L) of - when ('00', '0') => __encoding aarch32_STRB_i_T3_A // STRB_i_T3_pre - when ('00', '1') => __encoding aarch32_LDRB_i_T3_A // LDRB_i_T3_pre - when ('01', '0') => __encoding aarch32_STRH_i_T3_A // STRH_i_T3_pre - when ('01', '1') => __encoding aarch32_LDRH_i_T3_A // LDRH_i_T3_pre - when ('10', '0') => __encoding aarch32_STR_i_T4_A // STR_i_T4_pre - when ('10', '1') => __encoding aarch32_LDR_i_T4_A // LDR_i_T4_pre - when ('11', _) => __UNALLOCATED - when (_, '01', _, _, !'1111', _, _, _) => // ldst_unsigned_pimm - __field size 21 +: 2 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - case (size, L, Rt) of - when ('00', '0', _) => __encoding aarch32_STRB_i_T2_A // STRB_i_T2 - when ('00', '1', !'1111') => __encoding aarch32_LDRB_i_T2_A // LDRB_i_T2 - when ('00', '1', '1111') => __encoding aarch32_PLD_i_T1_A // PLD_i_T1 - when ('01', '0', _) => __encoding aarch32_STRH_i_T2_A // STRH_i_T2 - when ('01', '1', !'1111') => __encoding aarch32_LDRH_i_T2_A // LDRH_i_T2 - when ('01', '1', '1111') => __encoding aarch32_PLD_i_T1_A // PLDW_i_T1 - when ('10', '0', _) => __encoding aarch32_STR_i_T3_A // STR_i_T3 - when ('10', '1', _) => __encoding aarch32_LDR_i_T3_A // LDR_i_T3 - when (_, '0x', _, _, '1111', _, _, _) => // ldlit_unsigned - __field U 23 +: 1 - __field size 21 +: 2 - __field L 20 +: 1 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - case (size, L, Rt) of - when ('0x', '1', '1111') => __encoding aarch32_PLD_l_T1_A // PLD_l_T1 - when ('00', '1', !'1111') => __encoding aarch32_LDRB_l_T1_A // LDRB_l_T1 - when ('01', '1', !'1111') => __encoding aarch32_LDRH_l_T1_A // LDRH_l_T1 - when ('10', '1', _) => __encoding aarch32_LDR_l_T2_A // LDR_l_T2 - when ('11', _, _) => __UNALLOCATED - when (_, '10', _, '1', !'1111', _, '000000', _) => // ldst_signed_reg - __field size 21 +: 2 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - case (size, Rt) of - when ('00', !'1111') => __encoding aarch32_LDRSB_r_T2_A // LDRSB_r_T2 - when ('00', '1111') => __encoding aarch32_PLI_r_T1_A // PLI_r_T1 - when ('01', !'1111') => __encoding aarch32_LDRSH_r_T2_A // LDRSH_r_T2 - when ('01', '1111') => __NOP - when ('1x', _) => __UNALLOCATED - when (_, '10', _, '1', !'1111', _, '000001', _) => __UNPREDICTABLE - when (_, '10', _, '1', !'1111', _, '00001x', _) => __UNPREDICTABLE - when (_, '10', _, '1', !'1111', _, '0001xx', _) => __UNPREDICTABLE - when (_, '10', _, '1', !'1111', _, '001xxx', _) => __UNPREDICTABLE - when (_, '10', _, '1', !'1111', _, '01xxxx', _) => __UNPREDICTABLE - when (_, '10', _, '1', !'1111', _, '10x0xx', _) => __UNPREDICTABLE - when (_, '10', _, '1', !'1111', _, '10x1xx', _) => // ldst_signed_post - __field size 21 +: 2 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field U 9 +: 1 - __field imm8 0 +: 8 - case (size) of - when ('00') => __encoding aarch32_LDRSB_i_T2_A // LDRSB_i_T2_post - when ('01') => __encoding aarch32_LDRSH_i_T2_A // LDRSH_i_T2_post - when ('1x') => __UNALLOCATED - when (_, '10', _, '1', !'1111', _, '1100xx', _) => // ldst_signed_nimm - __field size 21 +: 2 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - case (size, Rt) of - when ('00', !'1111') => __encoding aarch32_LDRSB_i_T2_A // LDRSB_i_T2_off - when ('00', '1111') => __encoding aarch32_PLI_i_T2_A // PLI_i_T2 - when ('01', !'1111') => __encoding aarch32_LDRSH_i_T2_A // LDRSH_i_T2_off - when ('01', '1111') => __NOP - when ('1x', _) => __UNALLOCATED - when (_, '10', _, '1', !'1111', _, '1110xx', _) => // ldst_signed_unpriv - __field size 21 +: 2 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - case (size) of - when ('00') => __encoding aarch32_LDRSBT_T1_A // LDRSBT_T1 - when ('01') => __encoding aarch32_LDRSHT_T1_A // LDRSHT_T1 - when ('1x') => __UNALLOCATED - when (_, '10', _, '1', !'1111', _, '11x1xx', _) => // ldst_signed_pre - __field size 21 +: 2 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field U 9 +: 1 - __field imm8 0 +: 8 - case (size) of - when ('00') => __encoding aarch32_LDRSB_i_T2_A // LDRSB_i_T2_pre - when ('01') => __encoding aarch32_LDRSH_i_T2_A // LDRSH_i_T2_pre - when ('1x') => __UNALLOCATED - when (_, '11', _, '1', !'1111', _, _, _) => // ldst_signed_pimm - __field size 21 +: 2 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - case (size, Rt) of - when ('00', !'1111') => __encoding aarch32_LDRSB_i_T1_A // LDRSB_i_T1 - when ('00', '1111') => __encoding aarch32_PLI_i_T1_A // PLI_i_T1 - when ('01', !'1111') => __encoding aarch32_LDRSH_i_T1_A // LDRSH_i_T1 - when ('01', '1111') => __NOP - when (_, '1x', _, '1', '1111', _, _, _) => // ldlit_signed - __field U 23 +: 1 - __field size 21 +: 2 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - case (size, Rt) of - when ('00', !'1111') => __encoding aarch32_LDRSB_l_T1_A // LDRSB_l_T1 - when ('00', '1111') => __encoding aarch32_PLI_i_T3_A // PLI_i_T3 - when ('01', !'1111') => __encoding aarch32_LDRSH_l_T1_A // LDRSH_l_T1 - when ('01', '1111') => __NOP - when ('1x', _) => __UNALLOCATED - when (_, '1101', '0xxxx', _, _, _) => - // reg - case (24 +: 8, 23 +: 1, 16 +: 7, 12 +: 4, 8 +: 4, 4 +: 4, 0 +: 4) of - when (_, '0', _, _, _, '0000', _) => // shiftr - __field stype 21 +: 2 - __field S 20 +: 1 - __field Rm 16 +: 4 - __field Rd 8 +: 4 - __field Rs 0 +: 4 - case () of - when () => __encoding aarch32_MOV_rr_T2_A // MOVS_rr_T2 - when (_, '0', _, _, _, '0001', _) => __UNPREDICTABLE - when (_, '0', _, _, _, '001x', _) => __UNPREDICTABLE - when (_, '0', _, _, _, '01xx', _) => __UNPREDICTABLE - when (_, '0', _, _, _, '1xxx', _) => // extendr - __field op1 21 +: 2 - __field U 20 +: 1 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - case (op1, U, Rn) of - when ('00', '0', !'1111') => __encoding aarch32_SXTAH_T1_A // SXTAH_T1 - when ('00', '0', '1111') => __encoding aarch32_SXTH_T2_A // SXTH_T2 - when ('00', '1', !'1111') => __encoding aarch32_UXTAH_T1_A // UXTAH_T1 - when ('00', '1', '1111') => __encoding aarch32_UXTH_T2_A // UXTH_T2 - when ('01', '0', !'1111') => __encoding aarch32_SXTAB16_T1_A // SXTAB16_T1 - when ('01', '0', '1111') => __encoding aarch32_SXTB16_T1_A // SXTB16_T1 - when ('01', '1', !'1111') => __encoding aarch32_UXTAB16_T1_A // UXTAB16_T1 - when ('01', '1', '1111') => __encoding aarch32_UXTB16_T1_A // UXTB16_T1 - when ('10', '0', !'1111') => __encoding aarch32_SXTAB_T1_A // SXTAB_T1 - when ('10', '0', '1111') => __encoding aarch32_SXTB_T2_A // SXTB_T2 - when ('10', '1', !'1111') => __encoding aarch32_UXTAB_T1_A // UXTAB_T1 - when ('10', '1', '1111') => __encoding aarch32_UXTB_T2_A // UXTB_T2 - when ('11', _, _) => __UNALLOCATED - when (_, '1', _, _, _, '0xxx', _) => // addsub_par - __field op1 20 +: 3 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field U 6 +: 1 - __field H 5 +: 1 - __field S 4 +: 1 - __field Rm 0 +: 4 - case (op1, U, H, S) of - when ('000', '0', '0', '0') => __encoding aarch32_SADD8_T1_A // SADD8_T1 - when ('000', '0', '0', '1') => __encoding aarch32_QADD8_T1_A // QADD8_T1 - when ('000', '0', '1', '0') => __encoding aarch32_SHADD8_T1_A // SHADD8_T1 - when ('000', '0', '1', '1') => __UNALLOCATED - when ('000', '1', '0', '0') => __encoding aarch32_UADD8_T1_A // UADD8_T1 - when ('000', '1', '0', '1') => __encoding aarch32_UQADD8_T1_A // UQADD8_T1 - when ('000', '1', '1', '0') => __encoding aarch32_UHADD8_T1_A // UHADD8_T1 - when ('000', '1', '1', '1') => __UNALLOCATED - when ('001', '0', '0', '0') => __encoding aarch32_SADD16_T1_A // SADD16_T1 - when ('001', '0', '0', '1') => __encoding aarch32_QADD16_T1_A // QADD16_T1 - when ('001', '0', '1', '0') => __encoding aarch32_SHADD16_T1_A // SHADD16_T1 - when ('001', '0', '1', '1') => __UNALLOCATED - when ('001', '1', '0', '0') => __encoding aarch32_UADD16_T1_A // UADD16_T1 - when ('001', '1', '0', '1') => __encoding aarch32_UQADD16_T1_A // UQADD16_T1 - when ('001', '1', '1', '0') => __encoding aarch32_UHADD16_T1_A // UHADD16_T1 - when ('001', '1', '1', '1') => __UNALLOCATED - when ('010', '0', '0', '0') => __encoding aarch32_SASX_T1_A // SASX_T1 - when ('010', '0', '0', '1') => __encoding aarch32_QASX_T1_A // QASX_T1 - when ('010', '0', '1', '0') => __encoding aarch32_SHASX_T1_A // SHASX_T1 - when ('010', '0', '1', '1') => __UNALLOCATED - when ('010', '1', '0', '0') => __encoding aarch32_UASX_T1_A // UASX_T1 - when ('010', '1', '0', '1') => __encoding aarch32_UQASX_T1_A // UQASX_T1 - when ('010', '1', '1', '0') => __encoding aarch32_UHASX_T1_A // UHASX_T1 - when ('010', '1', '1', '1') => __UNALLOCATED - when ('100', '0', '0', '0') => __encoding aarch32_SSUB8_T1_A // SSUB8_T1 - when ('100', '0', '0', '1') => __encoding aarch32_QSUB8_T1_A // QSUB8_T1 - when ('100', '0', '1', '0') => __encoding aarch32_SHSUB8_T1_A // SHSUB8_T1 - when ('100', '0', '1', '1') => __UNALLOCATED - when ('100', '1', '0', '0') => __encoding aarch32_USUB8_T1_A // USUB8_T1 - when ('100', '1', '0', '1') => __encoding aarch32_UQSUB8_T1_A // UQSUB8_T1 - when ('100', '1', '1', '0') => __encoding aarch32_UHSUB8_T1_A // UHSUB8_T1 - when ('100', '1', '1', '1') => __UNALLOCATED - when ('101', '0', '0', '0') => __encoding aarch32_SSUB16_T1_A // SSUB16_T1 - when ('101', '0', '0', '1') => __encoding aarch32_QSUB16_T1_A // QSUB16_T1 - when ('101', '0', '1', '0') => __encoding aarch32_SHSUB16_T1_A // SHSUB16_T1 - when ('101', '0', '1', '1') => __UNALLOCATED - when ('101', '1', '0', '0') => __encoding aarch32_USUB16_T1_A // USUB16_T1 - when ('101', '1', '0', '1') => __encoding aarch32_UQSUB16_T1_A // UQSUB16_T1 - when ('101', '1', '1', '0') => __encoding aarch32_UHSUB16_T1_A // UHSUB16_T1 - when ('101', '1', '1', '1') => __UNALLOCATED - when ('110', '0', '0', '0') => __encoding aarch32_SSAX_T1_A // SSAX_T1 - when ('110', '0', '0', '1') => __encoding aarch32_QSAX_T1_A // QSAX_T1 - when ('110', '0', '1', '0') => __encoding aarch32_SHSAX_T1_A // SHSAX_T1 - when ('110', '0', '1', '1') => __UNALLOCATED - when ('110', '1', '0', '0') => __encoding aarch32_USAX_T1_A // USAX_T1 - when ('110', '1', '0', '1') => __encoding aarch32_UQSAX_T1_A // UQSAX_T1 - when ('110', '1', '1', '0') => __encoding aarch32_UHSAX_T1_A // UHSAX_T1 - when ('110', '1', '1', '1') => __UNALLOCATED - when ('111', _, _, _) => __UNALLOCATED - when (_, '1', _, _, _, '10xx', _) => // dpint_2r - __field op1 20 +: 3 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field op2 4 +: 2 - __field Rm 0 +: 4 - case (op1, op2) of - when ('000', '00') => __encoding aarch32_QADD_T1_A // QADD_T1 - when ('000', '01') => __encoding aarch32_QDADD_T1_A // QDADD_T1 - when ('000', '10') => __encoding aarch32_QSUB_T1_A // QSUB_T1 - when ('000', '11') => __encoding aarch32_QDSUB_T1_A // QDSUB_T1 - when ('001', '00') => __encoding aarch32_REV_T2_A // REV_T2 - when ('001', '01') => __encoding aarch32_REV16_T2_A // REV16_T2 - when ('001', '10') => __encoding aarch32_RBIT_T1_A // RBIT_T1 - when ('001', '11') => __encoding aarch32_REVSH_T2_A // REVSH_T2 - when ('010', '00') => __encoding aarch32_SEL_T1_A // SEL_T1 - when ('010', '01') => __UNALLOCATED - when ('010', '1x') => __UNALLOCATED - when ('011', '00') => __encoding aarch32_CLZ_T1_A // CLZ_T1 - when ('011', '01') => __UNALLOCATED - when ('011', '1x') => __UNALLOCATED - when ('100', '00') => __encoding aarch32_CRC32_T1_A // CRC32B_T1 - when ('100', '01') => __encoding aarch32_CRC32_T1_A // CRC32H_T1 - when ('100', '10') => __encoding aarch32_CRC32_T1_A // CRC32W_T1 - when ('100', '11') => __UNPREDICTABLE - when ('101', '00') => __encoding aarch32_CRC32_T1_A // CRC32CB_T1 - when ('101', '01') => __encoding aarch32_CRC32_T1_A // CRC32CH_T1 - when ('101', '10') => __encoding aarch32_CRC32_T1_A // CRC32CW_T1 - when ('101', '11') => __UNPREDICTABLE - when ('11x', _) => __UNALLOCATED - when (_, '1', _, _, _, '11xx', _) => __UNPREDICTABLE - when (_, '1101', '10xxx', _, _, _) => - // mul - case (23 +: 9, 8 +: 15, 6 +: 2, 0 +: 6) of - when (_, _, '00', _) => // mul_abd - __field op1 20 +: 3 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field op2 4 +: 2 - __field Rm 0 +: 4 - case (op1, Ra, op2) of - when ('000', !'1111', '00') => __encoding aarch32_MLA_T1_A // MLA_T1 - when ('000', _, '01') => __encoding aarch32_MLS_T1_A // MLS_T1 - when ('000', _, '1x') => __UNALLOCATED - when ('000', '1111', '00') => __encoding aarch32_MUL_T2_A // MUL_T2 - when ('001', !'1111', '00') => __encoding aarch32_SMLABB_T1_A // SMLABB_T1 - when ('001', !'1111', '01') => __encoding aarch32_SMLABB_T1_A // SMLABT_T1 - when ('001', !'1111', '10') => __encoding aarch32_SMLABB_T1_A // SMLATB_T1 - when ('001', !'1111', '11') => __encoding aarch32_SMLABB_T1_A // SMLATT_T1 - when ('001', '1111', '00') => __encoding aarch32_SMULBB_T1_A // SMULBB_T1 - when ('001', '1111', '01') => __encoding aarch32_SMULBB_T1_A // SMULBT_T1 - when ('001', '1111', '10') => __encoding aarch32_SMULBB_T1_A // SMULTB_T1 - when ('001', '1111', '11') => __encoding aarch32_SMULBB_T1_A // SMULTT_T1 - when ('010', !'1111', '00') => __encoding aarch32_SMLAD_T1_A // SMLAD_T1 - when ('010', !'1111', '01') => __encoding aarch32_SMLAD_T1_A // SMLADX_T1 - when ('010', _, '1x') => __UNALLOCATED - when ('010', '1111', '00') => __encoding aarch32_SMUAD_T1_A // SMUAD_T1 - when ('010', '1111', '01') => __encoding aarch32_SMUAD_T1_A // SMUADX_T1 - when ('011', !'1111', '00') => __encoding aarch32_SMLAWB_T1_A // SMLAWB_T1 - when ('011', !'1111', '01') => __encoding aarch32_SMLAWB_T1_A // SMLAWT_T1 - when ('011', _, '1x') => __UNALLOCATED - when ('011', '1111', '00') => __encoding aarch32_SMULWB_T1_A // SMULWB_T1 - when ('011', '1111', '01') => __encoding aarch32_SMULWB_T1_A // SMULWT_T1 - when ('100', !'1111', '00') => __encoding aarch32_SMLSD_T1_A // SMLSD_T1 - when ('100', !'1111', '01') => __encoding aarch32_SMLSD_T1_A // SMLSDX_T1 - when ('100', _, '1x') => __UNALLOCATED - when ('100', '1111', '00') => __encoding aarch32_SMUSD_T1_A // SMUSD_T1 - when ('100', '1111', '01') => __encoding aarch32_SMUSD_T1_A // SMUSDX_T1 - when ('101', !'1111', '00') => __encoding aarch32_SMMLA_T1_A // SMMLA_T1 - when ('101', !'1111', '01') => __encoding aarch32_SMMLA_T1_A // SMMLAR_T1 - when ('101', _, '1x') => __UNALLOCATED - when ('101', '1111', '00') => __encoding aarch32_SMMUL_T1_A // SMMUL_T1 - when ('101', '1111', '01') => __encoding aarch32_SMMUL_T1_A // SMMULR_T1 - when ('110', _, '00') => __encoding aarch32_SMMLS_T1_A // SMMLS_T1 - when ('110', _, '01') => __encoding aarch32_SMMLS_T1_A // SMMLSR_T1 - when ('110', _, '1x') => __UNALLOCATED - when ('111', !'1111', '00') => __encoding aarch32_USADA8_T1_A // USADA8_T1 - when ('111', _, '01') => __UNALLOCATED - when ('111', _, '1x') => __UNALLOCATED - when ('111', '1111', '00') => __encoding aarch32_USAD8_T1_A // USAD8_T1 - when (_, _, '01', _) => __UNPREDICTABLE - when (_, _, '1x', _) => __UNPREDICTABLE - when (_, '1101', '11xxx', _, _, _) => // lmul_div - __field op1 20 +: 3 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field op2 4 +: 4 - __field Rm 0 +: 4 - case (op1, op2) of - when ('000', !'0000') => __UNALLOCATED - when ('000', '0000') => __encoding aarch32_SMULL_T1_A // SMULL_T1 - when ('001', !'1111') => __UNALLOCATED - when ('001', '1111') => __encoding aarch32_SDIV_T1_A // SDIV_T1 - when ('010', !'0000') => __UNALLOCATED - when ('010', '0000') => __encoding aarch32_UMULL_T1_A // UMULL_T1 - when ('011', !'1111') => __UNALLOCATED - when ('011', '1111') => __encoding aarch32_UDIV_T1_A // UDIV_T1 - when ('100', '0000') => __encoding aarch32_SMLAL_T1_A // SMLAL_T1 - when ('100', '0001') => __UNALLOCATED - when ('100', '001x') => __UNALLOCATED - when ('100', '01xx') => __UNALLOCATED - when ('100', '1000') => __encoding aarch32_SMLALBB_T1_A // SMLALBB_T1 - when ('100', '1001') => __encoding aarch32_SMLALBB_T1_A // SMLALBT_T1 - when ('100', '1010') => __encoding aarch32_SMLALBB_T1_A // SMLALTB_T1 - when ('100', '1011') => __encoding aarch32_SMLALBB_T1_A // SMLALTT_T1 - when ('100', '1100') => __encoding aarch32_SMLALD_T1_A // SMLALD_T1 - when ('100', '1101') => __encoding aarch32_SMLALD_T1_A // SMLALDX_T1 - when ('100', '111x') => __UNALLOCATED - when ('101', '0xxx') => __UNALLOCATED - when ('101', '10xx') => __UNALLOCATED - when ('101', '1100') => __encoding aarch32_SMLSLD_T1_A // SMLSLD_T1 - when ('101', '1101') => __encoding aarch32_SMLSLD_T1_A // SMLSLDX_T1 - when ('101', '111x') => __UNALLOCATED - when ('110', '0000') => __encoding aarch32_UMLAL_T1_A // UMLAL_T1 - when ('110', '0001') => __UNALLOCATED - when ('110', '001x') => __UNALLOCATED - when ('110', '010x') => __UNALLOCATED - when ('110', '0110') => __encoding aarch32_UMAAL_T1_A // UMAAL_T1 - when ('110', '0111') => __UNALLOCATED - when ('110', '1xxx') => __UNALLOCATED - when ('111', _) => __UNALLOCATED -__decode A32 - // A32 - case (28 +: 4, 25 +: 3, 5 +: 20, 4 +: 1, 0 +: 4) of - when (!'1111', '00x', _, _, _) => - // dp - case (28 +: 4, 26 +: 2, 25 +: 1, 20 +: 5, 8 +: 12, 7 +: 1, 5 +: 2, 4 +: 1, 0 +: 4) of - when (_, _, '0', _, _, '1', !'00', '1', _) => - // xldst - case (28 +: 4, 25 +: 3, 23 +: 2, 22 +: 1, 8 +: 14, 7 +: 1, 5 +: 2, 4 +: 1, 0 +: 4) of - when (_, _, _, '0', _, _, _, _, _) => // ldstxreg - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field o1 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field op2 5 +: 2 - __field Rm 0 +: 4 - case (P, W, o1, op2) of - when ('0', '0', '0', '01') => __encoding aarch32_STRH_r_A1_A // STRH_r_A1_post - when ('0', '0', '0', '10') => __encoding aarch32_LDRD_r_A1_A // LDRD_r_A1_post - when ('0', '0', '0', '11') => __encoding aarch32_STRD_r_A1_A // STRD_r_A1_post - when ('0', '0', '1', '01') => __encoding aarch32_LDRH_r_A1_A // LDRH_r_A1_post - when ('0', '0', '1', '10') => __encoding aarch32_LDRSB_r_A1_A // LDRSB_r_A1_post - when ('0', '0', '1', '11') => __encoding aarch32_LDRSH_r_A1_A // LDRSH_r_A1_post - when ('0', '1', '0', '01') => __encoding aarch32_STRHT_A2_A // STRHT_A2 - when ('0', '1', '0', '10') => __UNALLOCATED - when ('0', '1', '0', '11') => __UNALLOCATED - when ('0', '1', '1', '01') => __encoding aarch32_LDRHT_A2_A // LDRHT_A2 - when ('0', '1', '1', '10') => __encoding aarch32_LDRSBT_A2_A // LDRSBT_A2 - when ('0', '1', '1', '11') => __encoding aarch32_LDRSHT_A2_A // LDRSHT_A2 - when ('1', _, '0', '01') => __encoding aarch32_STRH_r_A1_A // STRH_r_A1_pre - when ('1', _, '0', '10') => __encoding aarch32_LDRD_r_A1_A // LDRD_r_A1_pre - when ('1', _, '0', '11') => __encoding aarch32_STRD_r_A1_A // STRD_r_A1_pre - when ('1', _, '1', '01') => __encoding aarch32_LDRH_r_A1_A // LDRH_r_A1_pre - when ('1', _, '1', '10') => __encoding aarch32_LDRSB_r_A1_A // LDRSB_r_A1_pre - when ('1', _, '1', '11') => __encoding aarch32_LDRSH_r_A1_A // LDRSH_r_A1_pre - when (_, _, _, '1', _, _, _, _, _) => // ldstximm - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field o1 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field op2 5 +: 2 - __field imm4L 0 +: 4 - case (P:W, o1, Rn, op2) of - when (_, '0', '1111', '10') => __encoding aarch32_LDRD_l_A1_A // LDRD_l_A1 - when (!'01', '1', '1111', '01') => __encoding aarch32_LDRH_l_A1_A // LDRH_l_A1 - when (!'01', '1', '1111', '10') => __encoding aarch32_LDRSB_l_A1_A // LDRSB_l_A1 - when (!'01', '1', '1111', '11') => __encoding aarch32_LDRSH_l_A1_A // LDRSH_l_A1 - when ('00', '0', !'1111', '10') => __encoding aarch32_LDRD_i_A1_A // LDRD_i_A1_post - when ('00', '0', _, '01') => __encoding aarch32_STRH_i_A1_A // STRH_i_A1_post - when ('00', '0', _, '11') => __encoding aarch32_STRD_i_A1_A // STRD_i_A1_post - when ('00', '1', !'1111', '01') => __encoding aarch32_LDRH_i_A1_A // LDRH_i_A1_post - when ('00', '1', !'1111', '10') => __encoding aarch32_LDRSB_i_A1_A // LDRSB_i_A1_post - when ('00', '1', !'1111', '11') => __encoding aarch32_LDRSH_i_A1_A // LDRSH_i_A1_post - when ('01', '0', !'1111', '10') => __UNALLOCATED - when ('01', '0', _, '01') => __encoding aarch32_STRHT_A1_A // STRHT_A1 - when ('01', '0', _, '11') => __UNALLOCATED - when ('01', '1', _, '01') => __encoding aarch32_LDRHT_A1_A // LDRHT_A1 - when ('01', '1', _, '10') => __encoding aarch32_LDRSBT_A1_A // LDRSBT_A1 - when ('01', '1', _, '11') => __encoding aarch32_LDRSHT_A1_A // LDRSHT_A1 - when ('10', '0', !'1111', '10') => __encoding aarch32_LDRD_i_A1_A // LDRD_i_A1_off - when ('10', '0', _, '01') => __encoding aarch32_STRH_i_A1_A // STRH_i_A1_off - when ('10', '0', _, '11') => __encoding aarch32_STRD_i_A1_A // STRD_i_A1_off - when ('10', '1', !'1111', '01') => __encoding aarch32_LDRH_i_A1_A // LDRH_i_A1_off - when ('10', '1', !'1111', '10') => __encoding aarch32_LDRSB_i_A1_A // LDRSB_i_A1_off - when ('10', '1', !'1111', '11') => __encoding aarch32_LDRSH_i_A1_A // LDRSH_i_A1_off - when ('11', '0', !'1111', '10') => __encoding aarch32_LDRD_i_A1_A // LDRD_i_A1_pre - when ('11', '0', _, '01') => __encoding aarch32_STRH_i_A1_A // STRH_i_A1_pre - when ('11', '0', _, '11') => __encoding aarch32_STRD_i_A1_A // STRD_i_A1_pre - when ('11', '1', !'1111', '01') => __encoding aarch32_LDRH_i_A1_A // LDRH_i_A1_pre - when ('11', '1', !'1111', '10') => __encoding aarch32_LDRSB_i_A1_A // LDRSB_i_A1_pre - when ('11', '1', !'1111', '11') => __encoding aarch32_LDRSH_i_A1_A // LDRSH_i_A1_pre - when (_, _, '0', '0xxxx', _, '1', '00', '1', _) => // mul_word - __field cond 28 +: 4 - __field opc 21 +: 3 - __field S 20 +: 1 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - case (opc, S) of - when ('000', _) => __encoding aarch32_MUL_A1_A // MULS_A1 - when ('001', _) => __encoding aarch32_MLA_A1_A // MLAS_A1 - when ('010', '0') => __encoding aarch32_UMAAL_A1_A // UMAAL_A1 - when ('010', '1') => __UNALLOCATED - when ('011', '0') => __encoding aarch32_MLS_A1_A // MLS_A1 - when ('011', '1') => __UNALLOCATED - when ('100', _) => __encoding aarch32_UMULL_A1_A // UMULLS_A1 - when ('101', _) => __encoding aarch32_UMLAL_A1_A // UMLALS_A1 - when ('110', _) => __encoding aarch32_SMULL_A1_A // SMULLS_A1 - when ('111', _) => __encoding aarch32_SMLAL_A1_A // SMLALS_A1 - when (_, _, '0', '1xxxx', _, '1', '00', '1', _) => - // sync - case (28 +: 4, 24 +: 4, 23 +: 1, 12 +: 11, 10 +: 2, 8 +: 2, 4 +: 4, 0 +: 4) of - when (_, _, '0', _, _, _, _, _) => __UNPREDICTABLE - when (_, _, '1', _, _, _, _, _) => // ldst_excl - __field cond 28 +: 4 - __field size 21 +: 2 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field xRd 12 +: 4 - __field ex 9 +: 1 - __field ord 8 +: 1 - __field xRt 0 +: 4 - case (size, L, ex, ord) of - when ('00', '0', '0', '0') => __encoding aarch32_STL_A1_A // STL_A1 - when ('00', '0', '0', '1') => __UNALLOCATED - when ('00', '0', '1', '0') => __encoding aarch32_STLEX_A1_A // STLEX_A1 - when ('00', '0', '1', '1') => __encoding aarch32_STREX_A1_A // STREX_A1 - when ('00', '1', '0', '0') => __encoding aarch32_LDA_A1_A // LDA_A1 - when ('00', '1', '0', '1') => __UNALLOCATED - when ('00', '1', '1', '0') => __encoding aarch32_LDAEX_A1_A // LDAEX_A1 - when ('00', '1', '1', '1') => __encoding aarch32_LDREX_A1_A // LDREX_A1 - when ('01', '0', '0', _) => __UNALLOCATED - when ('01', '0', '1', '0') => __encoding aarch32_STLEXD_A1_A // STLEXD_A1 - when ('01', '0', '1', '1') => __encoding aarch32_STREXD_A1_A // STREXD_A1 - when ('01', '1', '0', _) => __UNALLOCATED - when ('01', '1', '1', '0') => __encoding aarch32_LDAEXD_A1_A // LDAEXD_A1 - when ('01', '1', '1', '1') => __encoding aarch32_LDREXD_A1_A // LDREXD_A1 - when ('10', '0', '0', '0') => __encoding aarch32_STLB_A1_A // STLB_A1 - when ('10', '0', '0', '1') => __UNALLOCATED - when ('10', '0', '1', '0') => __encoding aarch32_STLEXB_A1_A // STLEXB_A1 - when ('10', '0', '1', '1') => __encoding aarch32_STREXB_A1_A // STREXB_A1 - when ('10', '1', '0', '0') => __encoding aarch32_LDAB_A1_A // LDAB_A1 - when ('10', '1', '0', '1') => __UNALLOCATED - when ('10', '1', '1', '0') => __encoding aarch32_LDAEXB_A1_A // LDAEXB_A1 - when ('10', '1', '1', '1') => __encoding aarch32_LDREXB_A1_A // LDREXB_A1 - when ('11', '0', '0', '0') => __encoding aarch32_STLH_A1_A // STLH_A1 - when ('11', '0', '0', '1') => __UNALLOCATED - when ('11', '0', '1', '0') => __encoding aarch32_STLEXH_A1_A // STLEXH_A1 - when ('11', '0', '1', '1') => __encoding aarch32_STREXH_A1_A // STREXH_A1 - when ('11', '1', '0', '0') => __encoding aarch32_LDAH_A1_A // LDAH_A1 - when ('11', '1', '0', '1') => __UNALLOCATED - when ('11', '1', '1', '0') => __encoding aarch32_LDAEXH_A1_A // LDAEXH_A1 - when ('11', '1', '1', '1') => __encoding aarch32_LDREXH_A1_A // LDREXH_A1 - when (_, _, '0', '10xx0', _, '0', _, _, _) => - // dpmisc - case (28 +: 4, 23 +: 5, 21 +: 2, 20 +: 1, 8 +: 12, 7 +: 1, 4 +: 3, 0 +: 4) of - when (_, _, '00', _, _, _, '001', _) => __UNPREDICTABLE - when (_, _, '00', _, _, _, '010', _) => __UNPREDICTABLE - when (_, _, '00', _, _, _, '011', _) => __UNPREDICTABLE - when (_, _, '00', _, _, _, '110', _) => __UNPREDICTABLE - when (_, _, '01', _, _, _, '001', _) => // bx_reg - __field cond 28 +: 4 - __field Rm 0 +: 4 - case () of - when () => __encoding aarch32_BX_A1_A // BX_A1 - when (_, _, '01', _, _, _, '010', _) => // bxj_reg - __field cond 28 +: 4 - __field Rm 0 +: 4 - case () of - when () => __encoding aarch32_BXJ_A1_A // BXJ_A1 - when (_, _, '01', _, _, _, '011', _) => // blx_reg - __field cond 28 +: 4 - __field Rm 0 +: 4 - case () of - when () => __encoding aarch32_BLX_r_A1_A // BLX_r_A1 - when (_, _, '01', _, _, _, '110', _) => __UNPREDICTABLE - when (_, _, '10', _, _, _, '001', _) => __UNPREDICTABLE - when (_, _, '10', _, _, _, '010', _) => __UNPREDICTABLE - when (_, _, '10', _, _, _, '011', _) => __UNPREDICTABLE - when (_, _, '10', _, _, _, '110', _) => __UNPREDICTABLE - when (_, _, '11', _, _, _, '001', _) => // clz - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - case () of - when () => __encoding aarch32_CLZ_A1_A // CLZ_A1 - when (_, _, '11', _, _, _, '010', _) => __UNPREDICTABLE - when (_, _, '11', _, _, _, '011', _) => __UNPREDICTABLE - when (_, _, '11', _, _, _, '110', _) => // eret - __field cond 28 +: 4 - case () of - when () => __encoding aarch32_ERET_A1_A // ERET_A1 - when (_, _, _, _, _, _, '111', _) => // except - __field cond 28 +: 4 - __field opc 21 +: 2 - __field imm12 8 +: 12 - __field imm4 0 +: 4 - case (opc) of - when ('00') => __encoding aarch32_HLT_A1_A // HLT_A1 - when ('01') => __encoding aarch32_BKPT_A1_A // BKPT_A1 - when ('10') => __encoding aarch32_HVC_A1_A // HVC_A1 - when ('11') => __encoding aarch32_SMC_A1_AS // SMC_A1_AS - when (_, _, _, _, _, _, '000', _) => // movsr_reg - __field cond 28 +: 4 - __field opc 21 +: 2 - __field mask 16 +: 4 - __field Rd 12 +: 4 - __field B 9 +: 1 - __field m 8 +: 1 - __field Rn 0 +: 4 - case (opc, B) of - when ('x0', '0') => __encoding aarch32_MRS_A1_AS // MRS_A1_AS - when ('x0', '1') => __encoding aarch32_MRS_br_A1_AS // MRS_br_A1_AS - when ('x1', '0') => __encoding aarch32_MSR_r_A1_AS // MSR_r_A1_AS - when ('x1', '1') => __encoding aarch32_MSR_br_A1_AS // MSR_br_A1_AS - when (_, _, _, _, _, _, '100', _) => // crc32 - __field cond 28 +: 4 - __field sz 21 +: 2 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field C 9 +: 1 - __field Rm 0 +: 4 - case (sz, C) of - when ('00', '0') => __encoding aarch32_CRC32_A1_A // CRC32B_A1 - when ('00', '1') => __encoding aarch32_CRC32_A1_A // CRC32CB_A1 - when ('01', '0') => __encoding aarch32_CRC32_A1_A // CRC32H_A1 - when ('01', '1') => __encoding aarch32_CRC32_A1_A // CRC32CH_A1 - when ('10', '0') => __encoding aarch32_CRC32_A1_A // CRC32W_A1 - when ('10', '1') => __encoding aarch32_CRC32_A1_A // CRC32CW_A1 - when ('11', _) => __UNPREDICTABLE - when (_, _, _, _, _, _, '101', _) => // intsat - __field cond 28 +: 4 - __field opc 21 +: 2 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - case (opc) of - when ('00') => __encoding aarch32_QADD_A1_A // QADD_A1 - when ('01') => __encoding aarch32_QSUB_A1_A // QSUB_A1 - when ('10') => __encoding aarch32_QDADD_A1_A // QDADD_A1 - when ('11') => __encoding aarch32_QDSUB_A1_A // QDSUB_A1 - when (_, _, '0', '10xx0', _, '1', _, '0', _) => // mul_half - __field cond 28 +: 4 - __field opc 21 +: 2 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field M 6 +: 1 - __field N 5 +: 1 - __field Rn 0 +: 4 - case (opc, M, N) of - when ('00', _, _) => __encoding aarch32_SMLABB_A1_A // SMLATT_A1 - when ('01', '0', '0') => __encoding aarch32_SMLAWB_A1_A // SMLAWB_A1 - when ('01', '0', '1') => __encoding aarch32_SMULWB_A1_A // SMULWB_A1 - when ('01', '1', '0') => __encoding aarch32_SMLAWB_A1_A // SMLAWT_A1 - when ('01', '1', '1') => __encoding aarch32_SMULWB_A1_A // SMULWT_A1 - when ('10', _, _) => __encoding aarch32_SMLALBB_A1_A // SMLALTT_A1 - when ('11', _, _) => __encoding aarch32_SMULBB_A1_A // SMULTT_A1 - when (_, _, '0', !'10xx0', _, _, _, '0', _) => - // dpregis - case (28 +: 4, 25 +: 3, 23 +: 2, 21 +: 2, 20 +: 1, 5 +: 15, 4 +: 1, 0 +: 4) of - when (_, _, '0x', _, _, _, _, _) => // intdp3reg_immsh - __field cond 28 +: 4 - __field opc 21 +: 3 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - case (opc, S, Rn) of - when ('000', _, _) => __encoding aarch32_AND_r_A1_A // ANDS_r_A1_RRX - when ('001', _, _) => __encoding aarch32_EOR_r_A1_A // EORS_r_A1_RRX - when ('010', '0', !'1101') => __encoding aarch32_SUB_r_A1_A // SUB_r_A1_RRX - when ('010', '0', '1101') => __encoding aarch32_SUB_SP_r_A1_A // SUB_SP_r_A1_RRX - when ('010', '1', !'1101') => __encoding aarch32_SUB_r_A1_A // SUBS_r_A1_RRX - when ('010', '1', '1101') => __encoding aarch32_SUB_SP_r_A1_A // SUBS_SP_r_A1_RRX - when ('011', _, _) => __encoding aarch32_RSB_r_A1_A // RSBS_r_A1_RRX - when ('100', '0', !'1101') => __encoding aarch32_ADD_r_A1_A // ADD_r_A1_RRX - when ('100', '0', '1101') => __encoding aarch32_ADD_SP_r_A1_A // ADD_SP_r_A1_RRX - when ('100', '1', !'1101') => __encoding aarch32_ADD_r_A1_A // ADDS_r_A1_RRX - when ('100', '1', '1101') => __encoding aarch32_ADD_SP_r_A1_A // ADDS_SP_r_A1_RRX - when ('101', _, _) => __encoding aarch32_ADC_r_A1_A // ADCS_r_A1_RRX - when ('110', _, _) => __encoding aarch32_SBC_r_A1_A // SBCS_r_A1_RRX - when ('111', _, _) => __encoding aarch32_RSC_r_A1_A // RSCS_r_A1_RRX - when (_, _, '10', _, '1', _, _, _) => // intdp2reg_immsh - __field cond 28 +: 4 - __field opc 21 +: 2 - __field Rn 16 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - case (opc) of - when ('00') => __encoding aarch32_TST_r_A1_A // TST_r_A1_RRX - when ('01') => __encoding aarch32_TEQ_r_A1_A // TEQ_r_A1_RRX - when ('10') => __encoding aarch32_CMP_r_A1_A // CMP_r_A1_RRX - when ('11') => __encoding aarch32_CMN_r_A1_A // CMN_r_A1_RRX - when (_, _, '11', _, _, _, _, _) => // logic3reg_immsh - __field cond 28 +: 4 - __field opc 21 +: 2 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - case (opc) of - when ('00') => __encoding aarch32_ORR_r_A1_A // ORRS_r_A1_RRX - when ('01') => __encoding aarch32_MOV_r_A1_A // MOVS_r_A1_RRX - when ('10') => __encoding aarch32_BIC_r_A1_A // BICS_r_A1_RRX - when ('11') => __encoding aarch32_MVN_r_A1_A // MVNS_r_A1_RRX - when (_, _, '0', !'10xx0', _, '0', _, '1', _) => - // dpregrs - case (28 +: 4, 25 +: 3, 23 +: 2, 21 +: 2, 20 +: 1, 8 +: 12, 7 +: 1, 5 +: 2, 4 +: 1, 0 +: 4) of - when (_, _, '0x', _, _, _, _, _, _, _) => // intdp3reg_regsh - __field cond 28 +: 4 - __field opc 21 +: 3 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - case (opc) of - when ('000') => __encoding aarch32_AND_rr_A1_A // ANDS_rr_A1 - when ('001') => __encoding aarch32_EOR_rr_A1_A // EORS_rr_A1 - when ('010') => __encoding aarch32_SUB_rr_A1_A // SUBS_rr_A1 - when ('011') => __encoding aarch32_RSB_rr_A1_A // RSBS_rr_A1 - when ('100') => __encoding aarch32_ADD_rr_A1_A // ADDS_rr_A1 - when ('101') => __encoding aarch32_ADC_rr_A1_A // ADCS_rr_A1 - when ('110') => __encoding aarch32_SBC_rr_A1_A // SBCS_rr_A1 - when ('111') => __encoding aarch32_RSC_rr_A1_A // RSCS_rr_A1 - when (_, _, '10', _, '1', _, _, _, _, _) => // intdp2reg_regsh - __field cond 28 +: 4 - __field opc 21 +: 2 - __field Rn 16 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - case (opc) of - when ('00') => __encoding aarch32_TST_rr_A1_A // TST_rr_A1 - when ('01') => __encoding aarch32_TEQ_rr_A1_A // TEQ_rr_A1 - when ('10') => __encoding aarch32_CMP_rr_A1_A // CMP_rr_A1 - when ('11') => __encoding aarch32_CMN_rr_A1_A // CMN_rr_A1 - when (_, _, '11', _, _, _, _, _, _, _) => // logic3reg_regsh - __field cond 28 +: 4 - __field opc 21 +: 2 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - case (opc) of - when ('00') => __encoding aarch32_ORR_rr_A1_A // ORRS_rr_A1 - when ('01') => __encoding aarch32_MOV_rr_A1_A // MOVS_rr_A1 - when ('10') => __encoding aarch32_BIC_rr_A1_A // BICS_rr_A1 - when ('11') => __encoding aarch32_MVN_rr_A1_A // MVNS_rr_A1 - when (_, _, '1', _, _, _, _, _, _) => - // dpimm - case (28 +: 4, 25 +: 3, 23 +: 2, 22 +: 1, 20 +: 2, 0 +: 20) of - when (_, _, '0x', _, _, _) => // intdp2reg_imm - __field cond 28 +: 4 - __field opc 21 +: 3 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - case (opc, S, Rn) of - when ('000', _, _) => __encoding aarch32_AND_i_A1_A // ANDS_i_A1 - when ('001', _, _) => __encoding aarch32_EOR_i_A1_A // EORS_i_A1 - when ('010', '0', !'11x1') => __encoding aarch32_SUB_i_A1_A // SUB_i_A1 - when ('010', '0', '1101') => __encoding aarch32_SUB_SP_i_A1_A // SUB_SP_i_A1 - when ('010', '0', '1111') => __encoding aarch32_ADR_A1_A - when ('010', '1', !'1101') => __encoding aarch32_SUB_i_A1_A // SUBS_i_A1 - when ('010', '1', '1101') => __encoding aarch32_SUB_SP_i_A1_A // SUBS_SP_i_A1 - when ('011', _, _) => __encoding aarch32_RSB_i_A1_A // RSBS_i_A1 - when ('100', '0', !'11x1') => __encoding aarch32_ADD_i_A1_A // ADD_i_A1 - when ('100', '0', '1101') => __encoding aarch32_ADD_SP_i_A1_A // ADD_SP_i_A1 - when ('100', '0', '1111') => __encoding aarch32_ADR_A1_A - when ('100', '1', !'1101') => __encoding aarch32_ADD_i_A1_A // ADDS_i_A1 - when ('100', '1', '1101') => __encoding aarch32_ADD_SP_i_A1_A // ADDS_SP_i_A1 - when ('101', _, _) => __encoding aarch32_ADC_i_A1_A // ADCS_i_A1 - when ('110', _, _) => __encoding aarch32_SBC_i_A1_A // SBCS_i_A1 - when ('111', _, _) => __encoding aarch32_RSC_i_A1_A // RSCS_i_A1 - when (_, _, '10', _, '00', _) => // movw - __field cond 28 +: 4 - __field H 22 +: 1 - __field imm4 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - case (H) of - when ('0') => __encoding aarch32_MOV_i_A2_A // MOV_i_A2 - when ('1') => __encoding aarch32_MOVT_A1_A // MOVT_A1 - when (_, _, '10', _, '10', _) => // movsr_hint_imm - __field cond 28 +: 4 - __field R 22 +: 1 - __field imm4 16 +: 4 - __field imm12 0 +: 12 - case (R:imm4, imm12) of - when (!'00000', _) => __encoding aarch32_MSR_i_A1_AS // MSR_i_A1_AS - when ('00000', 'xxxx00000000') => __encoding aarch32_NOP_A1_A // NOP_A1 - when ('00000', 'xxxx00000001') => __encoding aarch32_YIELD_A1_A // YIELD_A1 - when ('00000', 'xxxx00000010') => __encoding aarch32_WFE_A1_A // WFE_A1 - when ('00000', 'xxxx00000011') => __encoding aarch32_WFI_A1_A // WFI_A1 - when ('00000', 'xxxx00000100') => __encoding aarch32_SEV_A1_A // SEV_A1 - when ('00000', 'xxxx00000101') => __encoding aarch32_SEVL_A1_A // SEVL_A1 - when ('00000', 'xxxx0000011x') => __NOP - when ('00000', 'xxxx00001xxx') => __NOP - when ('00000', 'xxxx00010000') => __encoding aarch32_ESB_A1_A // ESB_A1 - when ('00000', 'xxxx00010001') => __NOP - when ('00000', 'xxxx00010010') => __encoding aarch32_TSB_A1_A // TSB_A1 - when ('00000', 'xxxx00010011') => __NOP - when ('00000', 'xxxx00010100') => __encoding aarch32_CSDB_A1_A // CSDB_A1 - when ('00000', 'xxxx00010101') => __NOP - when ('00000', 'xxxx00011xxx') => __NOP - when ('00000', 'xxxx0001111x') => __NOP - when ('00000', 'xxxx001xxxxx') => __NOP - when ('00000', 'xxxx01xxxxxx') => __NOP - when ('00000', 'xxxx10xxxxxx') => __NOP - when ('00000', 'xxxx110xxxxx') => __NOP - when ('00000', 'xxxx1110xxxx') => __NOP - when ('00000', 'xxxx1111xxxx') => __encoding aarch32_DBG_A1_A // DBG_A1 - when (_, _, '10', _, 'x1', _) => // intdp1reg_imm - __field cond 28 +: 4 - __field opc 21 +: 2 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - case (opc) of - when ('00') => __encoding aarch32_TST_i_A1_A // TST_i_A1 - when ('01') => __encoding aarch32_TEQ_i_A1_A // TEQ_i_A1 - when ('10') => __encoding aarch32_CMP_i_A1_A // CMP_i_A1 - when ('11') => __encoding aarch32_CMN_i_A1_A // CMN_i_A1 - when (_, _, '11', _, _, _) => // log2reg_imm - __field cond 28 +: 4 - __field opc 21 +: 2 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - case (opc) of - when ('00') => __encoding aarch32_ORR_i_A1_A // ORRS_i_A1 - when ('01') => __encoding aarch32_MOV_i_A1_A // MOVS_i_A1 - when ('10') => __encoding aarch32_BIC_i_A1_A // BICS_i_A1 - when ('11') => __encoding aarch32_MVN_i_A1_A // MVNS_i_A1 - when (!'1111', '010', _, _, _) => // ldstimm - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field o2 22 +: 1 - __field W 21 +: 1 - __field o1 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - case (P:W, o2, o1, Rn) of - when (!'01', '0', '1', '1111') => __encoding aarch32_LDR_l_A1_A // LDR_l_A1 - when (!'01', '1', '1', '1111') => __encoding aarch32_LDRB_l_A1_A // LDRB_l_A1 - when ('00', '0', '0', _) => __encoding aarch32_STR_i_A1_A // STR_i_A1_post - when ('00', '0', '1', !'1111') => __encoding aarch32_LDR_i_A1_A // LDR_i_A1_post - when ('00', '1', '0', _) => __encoding aarch32_STRB_i_A1_A // STRB_i_A1_post - when ('00', '1', '1', !'1111') => __encoding aarch32_LDRB_i_A1_A // LDRB_i_A1_post - when ('01', '0', '0', _) => __encoding aarch32_STRT_A1_A // STRT_A1 - when ('01', '0', '1', _) => __encoding aarch32_LDRT_A1_A // LDRT_A1 - when ('01', '1', '0', _) => __encoding aarch32_STRBT_A1_A // STRBT_A1 - when ('01', '1', '1', _) => __encoding aarch32_LDRBT_A1_A // LDRBT_A1 - when ('10', '0', '0', _) => __encoding aarch32_STR_i_A1_A // STR_i_A1_off - when ('10', '0', '1', !'1111') => __encoding aarch32_LDR_i_A1_A // LDR_i_A1_off - when ('10', '1', '0', _) => __encoding aarch32_STRB_i_A1_A // STRB_i_A1_off - when ('10', '1', '1', !'1111') => __encoding aarch32_LDRB_i_A1_A // LDRB_i_A1_off - when ('11', '0', '0', _) => __encoding aarch32_STR_i_A1_A // STR_i_A1_pre - when ('11', '0', '1', !'1111') => __encoding aarch32_LDR_i_A1_A // LDR_i_A1_pre - when ('11', '1', '0', _) => __encoding aarch32_STRB_i_A1_A // STRB_i_A1_pre - when ('11', '1', '1', !'1111') => __encoding aarch32_LDRB_i_A1_A // LDRB_i_A1_pre - when (!'1111', '011', _, '0', _) => // ldstreg - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field o2 22 +: 1 - __field W 21 +: 1 - __field o1 20 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - case (P, o2, W, o1) of - when ('0', '0', '0', '0') => __encoding aarch32_STR_r_A1_A // STR_r_A1_post - when ('0', '0', '0', '1') => __encoding aarch32_LDR_r_A1_A // LDR_r_A1_post - when ('0', '0', '1', '0') => __encoding aarch32_STRT_A2_A // STRT_A2 - when ('0', '0', '1', '1') => __encoding aarch32_LDRT_A2_A // LDRT_A2 - when ('0', '1', '0', '0') => __encoding aarch32_STRB_r_A1_A // STRB_r_A1_post - when ('0', '1', '0', '1') => __encoding aarch32_LDRB_r_A1_A // LDRB_r_A1_post - when ('0', '1', '1', '0') => __encoding aarch32_STRBT_A2_A // STRBT_A2 - when ('0', '1', '1', '1') => __encoding aarch32_LDRBT_A2_A // LDRBT_A2 - when ('1', '0', _, '0') => __encoding aarch32_STR_r_A1_A // STR_r_A1_pre - when ('1', '0', _, '1') => __encoding aarch32_LDR_r_A1_A // LDR_r_A1_pre - when ('1', '1', _, '0') => __encoding aarch32_STRB_r_A1_A // STRB_r_A1_pre - when ('1', '1', _, '1') => __encoding aarch32_LDRB_r_A1_A // LDRB_r_A1_pre - when (!'1111', '011', _, '1', _) => - // media - case (28 +: 4, 25 +: 3, 20 +: 5, 8 +: 12, 5 +: 3, 4 +: 1, 0 +: 4) of - when (_, _, '00xxx', _, _, _, _) => // parallel - __field cond 28 +: 4 - __field op1 20 +: 3 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field B 7 +: 1 - __field op2 5 +: 2 - __field Rm 0 +: 4 - case (op1, B, op2) of - when ('000', _, _) => __UNALLOCATED - when ('001', '0', '00') => __encoding aarch32_SADD16_A1_A // SADD16_A1 - when ('001', '0', '01') => __encoding aarch32_SASX_A1_A // SASX_A1 - when ('001', '0', '10') => __encoding aarch32_SSAX_A1_A // SSAX_A1 - when ('001', '0', '11') => __encoding aarch32_SSUB16_A1_A // SSUB16_A1 - when ('001', '1', '00') => __encoding aarch32_SADD8_A1_A // SADD8_A1 - when ('001', '1', '01') => __UNALLOCATED - when ('001', '1', '10') => __UNALLOCATED - when ('001', '1', '11') => __encoding aarch32_SSUB8_A1_A // SSUB8_A1 - when ('010', '0', '00') => __encoding aarch32_QADD16_A1_A // QADD16_A1 - when ('010', '0', '01') => __encoding aarch32_QASX_A1_A // QASX_A1 - when ('010', '0', '10') => __encoding aarch32_QSAX_A1_A // QSAX_A1 - when ('010', '0', '11') => __encoding aarch32_QSUB16_A1_A // QSUB16_A1 - when ('010', '1', '00') => __encoding aarch32_QADD8_A1_A // QADD8_A1 - when ('010', '1', '01') => __UNALLOCATED - when ('010', '1', '10') => __UNALLOCATED - when ('010', '1', '11') => __encoding aarch32_QSUB8_A1_A // QSUB8_A1 - when ('011', '0', '00') => __encoding aarch32_SHADD16_A1_A // SHADD16_A1 - when ('011', '0', '01') => __encoding aarch32_SHASX_A1_A // SHASX_A1 - when ('011', '0', '10') => __encoding aarch32_SHSAX_A1_A // SHSAX_A1 - when ('011', '0', '11') => __encoding aarch32_SHSUB16_A1_A // SHSUB16_A1 - when ('011', '1', '00') => __encoding aarch32_SHADD8_A1_A // SHADD8_A1 - when ('011', '1', '01') => __UNALLOCATED - when ('011', '1', '10') => __UNALLOCATED - when ('011', '1', '11') => __encoding aarch32_SHSUB8_A1_A // SHSUB8_A1 - when ('100', _, _) => __UNALLOCATED - when ('101', '0', '00') => __encoding aarch32_UADD16_A1_A // UADD16_A1 - when ('101', '0', '01') => __encoding aarch32_UASX_A1_A // UASX_A1 - when ('101', '0', '10') => __encoding aarch32_USAX_A1_A // USAX_A1 - when ('101', '0', '11') => __encoding aarch32_USUB16_A1_A // USUB16_A1 - when ('101', '1', '00') => __encoding aarch32_UADD8_A1_A // UADD8_A1 - when ('101', '1', '01') => __UNALLOCATED - when ('101', '1', '10') => __UNALLOCATED - when ('101', '1', '11') => __encoding aarch32_USUB8_A1_A // USUB8_A1 - when ('110', '0', '00') => __encoding aarch32_UQADD16_A1_A // UQADD16_A1 - when ('110', '0', '01') => __encoding aarch32_UQASX_A1_A // UQASX_A1 - when ('110', '0', '10') => __encoding aarch32_UQSAX_A1_A // UQSAX_A1 - when ('110', '0', '11') => __encoding aarch32_UQSUB16_A1_A // UQSUB16_A1 - when ('110', '1', '00') => __encoding aarch32_UQADD8_A1_A // UQADD8_A1 - when ('110', '1', '01') => __UNALLOCATED - when ('110', '1', '10') => __UNALLOCATED - when ('110', '1', '11') => __encoding aarch32_UQSUB8_A1_A // UQSUB8_A1 - when ('111', '0', '00') => __encoding aarch32_UHADD16_A1_A // UHADD16_A1 - when ('111', '0', '01') => __encoding aarch32_UHASX_A1_A // UHASX_A1 - when ('111', '0', '10') => __encoding aarch32_UHSAX_A1_A // UHSAX_A1 - when ('111', '0', '11') => __encoding aarch32_UHSUB16_A1_A // UHSUB16_A1 - when ('111', '1', '00') => __encoding aarch32_UHADD8_A1_A // UHADD8_A1 - when ('111', '1', '01') => __UNALLOCATED - when ('111', '1', '10') => __UNALLOCATED - when ('111', '1', '11') => __encoding aarch32_UHSUB8_A1_A // UHSUB8_A1 - when (_, _, '01000', _, '101', _, _) => // selbytes - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - case () of - when () => __encoding aarch32_SEL_A1_A // SEL_A1 - when (_, _, '01000', _, '001', _, _) => __UNPREDICTABLE - when (_, _, '01000', _, 'xx0', _, _) => // pack - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field tb 6 +: 1 - __field Rm 0 +: 4 - case () of - when () => __encoding aarch32_PKH_A1_A // PKHTB_A1 - when (_, _, '01001', _, 'x01', _, _) => __UNPREDICTABLE - when (_, _, '01001', _, 'xx0', _, _) => __UNPREDICTABLE - when (_, _, '0110x', _, 'x01', _, _) => __UNPREDICTABLE - when (_, _, '0110x', _, 'xx0', _, _) => __UNPREDICTABLE - when (_, _, '01x10', _, '001', _, _) => // sat16 - __field cond 28 +: 4 - __field U 22 +: 1 - __field sat_imm 16 +: 4 - __field Rd 12 +: 4 - __field Rn 0 +: 4 - case (U) of - when ('0') => __encoding aarch32_SSAT16_A1_A // SSAT16_A1 - when ('1') => __encoding aarch32_USAT16_A1_A // USAT16_A1 - when (_, _, '01x10', _, '101', _, _) => __UNPREDICTABLE - when (_, _, '01x11', _, 'x01', _, _) => // reverse - __field cond 28 +: 4 - __field o1 22 +: 1 - __field Rd 12 +: 4 - __field o2 7 +: 1 - __field Rm 0 +: 4 - case (o1, o2) of - when ('0', '0') => __encoding aarch32_REV_A1_A // REV_A1 - when ('0', '1') => __encoding aarch32_REV16_A1_A // REV16_A1 - when ('1', '0') => __encoding aarch32_RBIT_A1_A // RBIT_A1 - when ('1', '1') => __encoding aarch32_REVSH_A1_A // REVSH_A1 - when (_, _, '01x1x', _, 'xx0', _, _) => // sat32 - __field cond 28 +: 4 - __field U 22 +: 1 - __field sat_imm 16 +: 5 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field sh 6 +: 1 - __field Rn 0 +: 4 - case (U) of - when ('0') => __encoding aarch32_SSAT_A1_A // SSAT_A1_ASR - when ('1') => __encoding aarch32_USAT_A1_A // USAT_A1_ASR - when (_, _, '01xxx', _, '111', _, _) => __UNPREDICTABLE - when (_, _, '01xxx', _, '011', _, _) => // extend - __field cond 28 +: 4 - __field U 22 +: 1 - __field op 20 +: 2 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - case (U, op, Rn) of - when ('0', '00', !'1111') => __encoding aarch32_SXTAB16_A1_A // SXTAB16_A1 - when ('0', '00', '1111') => __encoding aarch32_SXTB16_A1_A // SXTB16_A1 - when ('0', '10', !'1111') => __encoding aarch32_SXTAB_A1_A // SXTAB_A1 - when ('0', '10', '1111') => __encoding aarch32_SXTB_A1_A // SXTB_A1 - when ('0', '11', !'1111') => __encoding aarch32_SXTAH_A1_A // SXTAH_A1 - when ('0', '11', '1111') => __encoding aarch32_SXTH_A1_A // SXTH_A1 - when ('1', '00', !'1111') => __encoding aarch32_UXTAB16_A1_A // UXTAB16_A1 - when ('1', '00', '1111') => __encoding aarch32_UXTB16_A1_A // UXTB16_A1 - when ('1', '10', !'1111') => __encoding aarch32_UXTAB_A1_A // UXTAB_A1 - when ('1', '10', '1111') => __encoding aarch32_UXTB_A1_A // UXTB_A1 - when ('1', '11', !'1111') => __encoding aarch32_UXTAH_A1_A // UXTAH_A1 - when ('1', '11', '1111') => __encoding aarch32_UXTH_A1_A // UXTH_A1 - when (_, _, '10xxx', _, _, _, _) => // smul_div - __field cond 28 +: 4 - __field op1 20 +: 3 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field op2 5 +: 3 - __field Rn 0 +: 4 - case (op1, Ra, op2) of - when ('000', !'1111', '000') => __encoding aarch32_SMLAD_A1_A // SMLAD_A1 - when ('000', !'1111', '001') => __encoding aarch32_SMLAD_A1_A // SMLADX_A1 - when ('000', !'1111', '010') => __encoding aarch32_SMLSD_A1_A // SMLSD_A1 - when ('000', !'1111', '011') => __encoding aarch32_SMLSD_A1_A // SMLSDX_A1 - when ('000', _, '1xx') => __UNALLOCATED - when ('000', '1111', '000') => __encoding aarch32_SMUAD_A1_A // SMUAD_A1 - when ('000', '1111', '001') => __encoding aarch32_SMUAD_A1_A // SMUADX_A1 - when ('000', '1111', '010') => __encoding aarch32_SMUSD_A1_A // SMUSD_A1 - when ('000', '1111', '011') => __encoding aarch32_SMUSD_A1_A // SMUSDX_A1 - when ('001', _, '000') => __encoding aarch32_SDIV_A1_A // SDIV_A1 - when ('001', _, !'000') => __UNALLOCATED - when ('010', _, _) => __UNALLOCATED - when ('011', _, '000') => __encoding aarch32_UDIV_A1_A // UDIV_A1 - when ('011', _, !'000') => __UNALLOCATED - when ('100', _, '000') => __encoding aarch32_SMLALD_A1_A // SMLALD_A1 - when ('100', _, '001') => __encoding aarch32_SMLALD_A1_A // SMLALDX_A1 - when ('100', _, '010') => __encoding aarch32_SMLSLD_A1_A // SMLSLD_A1 - when ('100', _, '011') => __encoding aarch32_SMLSLD_A1_A // SMLSLDX_A1 - when ('100', _, '1xx') => __UNALLOCATED - when ('101', !'1111', '000') => __encoding aarch32_SMMLA_A1_A // SMMLA_A1 - when ('101', !'1111', '001') => __encoding aarch32_SMMLA_A1_A // SMMLAR_A1 - when ('101', _, '01x') => __UNALLOCATED - when ('101', _, '10x') => __UNALLOCATED - when ('101', _, '110') => __encoding aarch32_SMMLS_A1_A // SMMLS_A1 - when ('101', _, '111') => __encoding aarch32_SMMLS_A1_A // SMMLSR_A1 - when ('101', '1111', '000') => __encoding aarch32_SMMUL_A1_A // SMMUL_A1 - when ('101', '1111', '001') => __encoding aarch32_SMMUL_A1_A // SMMULR_A1 - when ('11x', _, _) => __UNALLOCATED - when (_, _, '11000', _, '000', _, _) => // usad - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - case (Ra) of - when (!'1111') => __encoding aarch32_USADA8_A1_A // USADA8_A1 - when ('1111') => __encoding aarch32_USAD8_A1_A // USAD8_A1 - when (_, _, '11000', _, '100', _, _) => __UNPREDICTABLE - when (_, _, '11001', _, 'x00', _, _) => __UNPREDICTABLE - when (_, _, '1101x', _, 'x00', _, _) => __UNPREDICTABLE - when (_, _, '110xx', _, '111', _, _) => __UNPREDICTABLE - when (_, _, '1110x', _, '111', _, _) => __UNPREDICTABLE - when (_, _, '1110x', _, 'x00', _, _) => // bfi - __field cond 28 +: 4 - __field msb 16 +: 5 - __field Rd 12 +: 4 - __field lsb 7 +: 5 - __field Rn 0 +: 4 - case (Rn) of - when (!'1111') => __encoding aarch32_BFI_A1_A // BFI_A1 - when ('1111') => __encoding aarch32_BFC_A1_A // BFC_A1 - when (_, _, '11110', _, '111', _, _) => __UNPREDICTABLE - when (_, _, '11111', _, '111', _, _) => // udf - __field cond 28 +: 4 - __field imm12 8 +: 12 - __field imm4 0 +: 4 - case (cond) of - when ('0xxx') => __UNALLOCATED - when ('10xx') => __UNALLOCATED - when ('110x') => __UNALLOCATED - when ('1110') => __encoding aarch32_UDF_A1_A // UDF_A1 - when (_, _, '1111x', _, 'x00', _, _) => __UNPREDICTABLE - when (_, _, '11x0x', _, 'x10', _, _) => __UNPREDICTABLE - when (_, _, '11x1x', _, 'x10', _, _) => // bfx - __field cond 28 +: 4 - __field U 22 +: 1 - __field widthm1 16 +: 5 - __field Rd 12 +: 4 - __field lsb 7 +: 5 - __field Rn 0 +: 4 - case (U) of - when ('0') => __encoding aarch32_SBFX_A1_A // SBFX_A1 - when ('1') => __encoding aarch32_UBFX_A1_A // UBFX_A1 - when (_, _, '11xxx', _, '011', _, _) => __UNPREDICTABLE - when (_, _, '11xxx', _, 'x01', _, _) => __UNPREDICTABLE - when (_, '10x', _, _, _) => - // brblk - case (28 +: 4, 26 +: 2, 25 +: 1, 0 +: 25) of - when ('1111', _, '0', _) => // ldstexcept - __field P 24 +: 1 - __field U 23 +: 1 - __field S 22 +: 1 - __field W 21 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field op 5 +: 11 - __field mode 0 +: 5 - case (P, U, S, L) of - when (_, _, '0', '0') => __UNALLOCATED - when ('0', '0', '0', '1') => __encoding aarch32_RFE_A1_AS // RFEDA_A1_AS - when ('0', '0', '1', '0') => __encoding aarch32_SRS_A1_AS // SRSDA_A1_AS - when ('0', '1', '0', '1') => __encoding aarch32_RFE_A1_AS // RFEIA_A1_AS - when ('0', '1', '1', '0') => __encoding aarch32_SRS_A1_AS // SRSIA_A1_AS - when ('1', '0', '0', '1') => __encoding aarch32_RFE_A1_AS // RFEDB_A1_AS - when ('1', '0', '1', '0') => __encoding aarch32_SRS_A1_AS // SRSDB_A1_AS - when (_, _, '1', '1') => __UNALLOCATED - when ('1', '1', '0', '1') => __encoding aarch32_RFE_A1_AS // RFEIB_A1_AS - when ('1', '1', '1', '0') => __encoding aarch32_SRS_A1_AS // SRSIB_A1_AS - when (!'1111', _, '0', _) => // ldstm - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field op 22 +: 1 - __field W 21 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - case (P, U, op, L, register_list) of - when ('0', '0', '0', '0', _) => __encoding aarch32_STMDA_A1_A // STMDA_A1 - when ('0', '0', '0', '1', _) => __encoding aarch32_LDMDA_A1_A // LDMDA_A1 - when ('0', '1', '0', '0', _) => __encoding aarch32_STM_A1_A // STM_A1 - when ('0', '1', '0', '1', _) => __encoding aarch32_LDM_A1_A // LDM_A1 - when (_, _, '1', '0', _) => __encoding aarch32_STM_u_A1_AS // STM_u_A1_AS - when ('1', '0', '0', '0', _) => __encoding aarch32_STMDB_A1_A // STMDB_A1 - when ('1', '0', '0', '1', _) => __encoding aarch32_LDMDB_A1_A // LDMDB_A1 - when (_, _, '1', '1', '0xxxxxxxxxxxxxxx') => __encoding aarch32_LDM_u_A1_AS // LDM_u_A1_AS - when ('1', '1', '0', '0', _) => __encoding aarch32_STMIB_A1_A // STMIB_A1 - when ('1', '1', '0', '1', _) => __encoding aarch32_LDMIB_A1_A // LDMIB_A1 - when (_, _, '1', '1', '1xxxxxxxxxxxxxxx') => __encoding aarch32_LDM_e_A1_AS // LDM_e_A1_AS - when (_, _, '1', _) => // b_imm - __field cond 28 +: 4 - __field H 24 +: 1 - __field imm24 0 +: 24 - case (cond, H) of - when (!'1111', '0') => __encoding aarch32_B_A1_A // B_A1 - when (!'1111', '1') => __encoding aarch32_BL_i_A1_A - when ('1111', _) => __encoding aarch32_BL_i_A1_A - when (_, '11x', _, _, _) => - // cops_as - case (28 +: 4, 26 +: 2, 24 +: 2, 12 +: 12, 9 +: 3, 5 +: 4, 4 +: 1, 0 +: 4) of - when (_, _, '0x', _, '111', _, _, _) => - // sysldst_mov64 - case (28 +: 4, 25 +: 3, 21 +: 4, 12 +: 9, 9 +: 3, 0 +: 9) of - when (_, _, '00x0', _, _, _) => // movcpgp64 - __field cond 28 +: 4 - __field D 22 +: 1 - __field L 20 +: 1 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field cp15 8 +: 1 - __field opc1 4 +: 4 - __field CRm 0 +: 4 - case (cond, D, L) of - when (!'1111', '1', '0') => __encoding aarch32_MCRR_T1A1_A // MCRR_A1 - when (!'1111', '1', '1') => __encoding aarch32_MRRC_T1A1_A // MRRC_A1 - when (_, '0', _) => __UNALLOCATED - when ('1111', '1', _) => __UNALLOCATED - when (_, _, !'00x0', _, _, _) => // ldstcp - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field CRd 12 +: 4 - __field cp15 8 +: 1 - __field imm8 0 +: 8 - case (cond, P:U:W, D, L, Rn, CRd, cp15) of - when (!'1111', !'000', '0', _, _, !'0101', '0') => __UNALLOCATED - when (!'1111', !'000', '0', '1', '1111', '0101', '0') => __encoding aarch32_LDC_l_T1A1_A // LDC_l_A1 - when (!'1111', !'000', _, _, _, _, '1') => __UNALLOCATED - when (!'1111', !'000', '1', _, _, '0101', '0') => __UNALLOCATED - when (!'1111', '0x1', '0', '0', _, '0101', '0') => __encoding aarch32_STC_T1A1_A // STC_A1_post - when (!'1111', '0x1', '0', '1', !'1111', '0101', '0') => __encoding aarch32_LDC_i_T1A1_A // LDC_i_A1_post - when (!'1111', '010', '0', '0', _, '0101', '0') => __encoding aarch32_STC_T1A1_A // STC_A1_unind - when (!'1111', '010', '0', '1', !'1111', '0101', '0') => __encoding aarch32_LDC_i_T1A1_A // LDC_i_A1_unind - when (!'1111', '1x0', '0', '0', _, '0101', '0') => __encoding aarch32_STC_T1A1_A // STC_A1_off - when (!'1111', '1x0', '0', '1', !'1111', '0101', '0') => __encoding aarch32_LDC_i_T1A1_A // LDC_i_A1_off - when (!'1111', '1x1', '0', '0', _, '0101', '0') => __encoding aarch32_STC_T1A1_A // STC_A1_pre - when (!'1111', '1x1', '0', '1', !'1111', '0101', '0') => __encoding aarch32_LDC_i_T1A1_A // LDC_i_A1_pre - when ('1111', !'000', _, _, _, _, _) => __UNALLOCATED - when (_, _, '10', _, '10x', _, '0', _) => - // fpdp - case (28 +: 4, 24 +: 4, 20 +: 4, 16 +: 4, 12 +: 4, 10 +: 2, 8 +: 2, 7 +: 1, 6 +: 1, 5 +: 1, 4 +: 1, 0 +: 4) of - when ('1111', _, '0xxx', _, _, _, !'00', _, '0', _, _, _) => // fpcsel - __field D 22 +: 1 - __field cc 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (cc, size) of - when ('00', _) => __encoding aarch32_VSEL_A1_A // VSELEQ_A1_D - when ('01', _) => __encoding aarch32_VSEL_A1_A // VSELVS_A1_D - when (_, '01') => __UNALLOCATED - when ('10', _) => __encoding aarch32_VSEL_A1_A // VSELGE_A1_D - when ('11', _) => __encoding aarch32_VSEL_A1_A // VSELGT_A1_D - when ('1111', _, '1x00', _, _, _, !'00', _, _, _, _, _) => // fpminmaxnm - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (size, op) of - when (_, '0') => __encoding aarch32_VMAXNM_A2_A // VMAXNM_A2_D - when ('01', _) => __UNALLOCATED - when (_, '1') => __encoding aarch32_VMAXNM_A2_A // VMINNM_A2_D - when ('1111', _, '1x11', '0000', _, _, !'00', _, '1', _, _, _) => // fpextins - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (size, op) of - when ('01', _) => __UNALLOCATED - when ('10', '0') => __encoding aarch32_VMOVX_A1_A // VMOVX_A1 - when ('10', '1') => __encoding aarch32_VINS_A1_A // VINS_A1 - when ('11', _) => __UNALLOCATED - when ('1111', _, '1x11', '1xxx', _, _, !'00', _, '1', _, _, _) => // fpcvtrnd - __field D 22 +: 1 - __field o1 18 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (o1, RM, size) of - when ('0', '00', _) => __encoding aarch32_VRINTA_vfp_A1_A // VRINTA_vfp_A1_D - when ('0', '01', _) => __encoding aarch32_VRINTA_vfp_A1_A // VRINTN_vfp_A1_D - when (_, _, '01') => __UNALLOCATED - when ('0', '10', _) => __encoding aarch32_VRINTA_vfp_A1_A // VRINTP_vfp_A1_D - when ('0', '11', _) => __encoding aarch32_VRINTA_vfp_A1_A // VRINTM_vfp_A1_D - when ('1', '00', _) => __encoding aarch32_VCVTA_vfp_A1_A // VCVTA_vfp_A1_D - when ('1', '01', _) => __encoding aarch32_VCVTA_vfp_A1_A // VCVTN_vfp_A1_D - when ('1', '10', _) => __encoding aarch32_VCVTA_vfp_A1_A // VCVTP_vfp_A1_D - when ('1', '11', _) => __encoding aarch32_VCVTA_vfp_A1_A // VCVTM_vfp_A1_D - when (!'1111', _, '1x11', _, _, _, _, _, '1', _, _, _) => // fpdp2reg - __field cond 28 +: 4 - __field D 22 +: 1 - __field o1 19 +: 1 - __field opc2 16 +: 3 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field o3 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (o1, opc2, size, o3) of - when (_, _, '00', _) => __UNALLOCATED - when ('0', '000', '01', '0') => __UNALLOCATED - when ('0', '000', _, '1') => __encoding aarch32_VABS_A2_A // VABS_A2_D - when ('0', '000', '10', '0') => __encoding aarch32_VMOV_r_T2A2_A // VMOV_r_A2_S - when ('0', '000', '11', '0') => __encoding aarch32_VMOV_r_T2A2_A // VMOV_r_A2_D - when ('0', '001', _, '0') => __encoding aarch32_VNEG_A2_A // VNEG_A2_D - when ('0', '001', _, '1') => __encoding aarch32_VSQRT_A1_A // VSQRT_A1_D - when ('0', '010', _, '0') => __encoding aarch32_VCVTB_T1A1_A // VCVTB_A1_DH - when ('0', '010', '01', _) => __UNALLOCATED - when ('0', '010', _, '1') => __encoding aarch32_VCVTB_T1A1_A // VCVTT_A1_DH - when ('0', '011', '01', '0') => __encoding aarch32_VCVTB_bf16_T1A1_A // VCVTB_A1_bfs - when ('0', '011', '01', '1') => __encoding aarch32_VCVTT_T1A1_A // VCVTT_A1_bfs - when ('0', '011', '10', '0') => __encoding aarch32_VCVTB_T1A1_A // VCVTB_A1_HS - when ('0', '011', '10', '1') => __encoding aarch32_VCVTB_T1A1_A // VCVTT_A1_HS - when ('0', '011', '11', '0') => __encoding aarch32_VCVTB_T1A1_A // VCVTB_A1_HD - when ('0', '011', '11', '1') => __encoding aarch32_VCVTB_T1A1_A // VCVTT_A1_HD - when ('0', '100', _, '0') => __encoding aarch32_VCMP_A1_A - when ('0', '100', _, '1') => __encoding aarch32_VCMP_A1_A - when ('0', '101', _, '0') => __encoding aarch32_VCMP_A1_A - when ('0', '101', _, '1') => __encoding aarch32_VCMP_A1_A - when ('0', '110', _, '0') => __encoding aarch32_VRINTZ_vfp_A1_A // VRINTR_vfp_A1_D - when ('0', '110', _, '1') => __encoding aarch32_VRINTZ_vfp_A1_A // VRINTZ_vfp_A1_D - when ('0', '111', _, '0') => __encoding aarch32_VRINTX_vfp_A1_A // VRINTX_vfp_A1_D - when ('0', '111', '01', '1') => __UNALLOCATED - when ('0', '111', '10', '1') => __encoding aarch32_VCVT_ds_T1A1_A // VCVT_ds_A1 - when ('0', '111', '11', '1') => __encoding aarch32_VCVT_ds_T1A1_A // VCVT_sd_A1 - when ('1', '000', _, _) => __encoding aarch32_VCVT_iv_A1_A // VCVT_vi_A1_D - when ('1', '001', '01', _) => __UNALLOCATED - when ('1', '001', '10', _) => __UNALLOCATED - when ('1', '001', '11', '0') => __UNALLOCATED - when ('1', '001', '11', '1') => __encoding aarch32_VJCVT_A1_A // VJCVT_A1 - when ('1', '01x', _, _) => __encoding aarch32_VCVT_xv_A1_A // VCVT_toxv_A1_D - when ('1', '100', _, '0') => __encoding aarch32_VCVT_iv_A1_A // VCVTR_uiv_A1_D - when ('1', '100', _, '1') => __encoding aarch32_VCVT_iv_A1_A // VCVT_uiv_A1_D - when ('1', '101', _, '0') => __encoding aarch32_VCVT_iv_A1_A // VCVTR_siv_A1_D - when ('1', '101', _, '1') => __encoding aarch32_VCVT_iv_A1_A // VCVT_siv_A1_D - when ('1', '11x', _, _) => __encoding aarch32_VCVT_xv_A1_A // VCVT_xv_A1_D - when (!'1111', _, '1x11', _, _, _, _, _, '0', _, _, _) => // fpimm - __field cond 28 +: 4 - __field D 22 +: 1 - __field imm4H 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm4L 0 +: 4 - case (size) of - when ('00') => __UNALLOCATED - when ('01') => __encoding aarch32_VMOV_i_A2_A // VMOV_i_A2_H - when ('10') => __encoding aarch32_VMOV_i_A2_A // VMOV_i_A2_S - when ('11') => __encoding aarch32_VMOV_i_A2_A // VMOV_i_A2_D - when (!'1111', _, !'1x11', _, _, _, _, _, _, _, _, _) => // fpdp3reg - __field cond 28 +: 4 - __field o0 23 +: 1 - __field D 22 +: 1 - __field o1 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field o2 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (o0:o1, size, o2) of - when (!'111', '00', _) => __UNALLOCATED - when ('000', _, '0') => __encoding aarch32_VMLA_f_A2_A // VMLA_f_A2_D - when ('000', _, '1') => __encoding aarch32_VMLA_f_A2_A // VMLS_f_A2_D - when ('001', _, '0') => __encoding aarch32_VNMLA_A1_A // VNMLS_A1_D - when ('001', _, '1') => __encoding aarch32_VNMLA_A1_A // VNMLA_A1_D - when ('010', _, '0') => __encoding aarch32_VMUL_f_A2_A // VMUL_f_A2_D - when ('010', _, '1') => __encoding aarch32_VNMLA_A2_A // VNMUL_A1_D - when ('011', _, '0') => __encoding aarch32_VADD_f_A2_A // VADD_f_A2_D - when ('011', _, '1') => __encoding aarch32_VSUB_f_A2_A // VSUB_f_A2_D - when ('100', _, '0') => __encoding aarch32_VDIV_A1_A // VDIV_A1_D - when ('101', _, '0') => __encoding aarch32_VFNMA_A1_A // VFNMS_A1_D - when ('101', _, '1') => __encoding aarch32_VFNMA_A1_A // VFNMA_A1_D - when ('110', _, '0') => __encoding aarch32_VFMA_A2_A // VFMA_A2_D - when ('110', _, '1') => __encoding aarch32_VFMA_A2_A // VFMS_A2_D - when (_, _, '10', _, '111', _, '1', _) => // movcpgp32 - __field cond 28 +: 4 - __field opc1 21 +: 3 - __field L 20 +: 1 - __field CRn 16 +: 4 - __field Rt 12 +: 4 - __field cp15 8 +: 1 - __field opc2 5 +: 3 - __field CRm 0 +: 4 - case (cond, L) of - when (!'1111', '0') => __encoding aarch32_MCR_T1A1_A // MCR_A1 - when (!'1111', '1') => __encoding aarch32_MRC_T1A1_A // MRC_A1 - when ('1111', _) => __UNALLOCATED - when (_, _, '11', _, _, _, _, _) => - // svcall - case (28 +: 4, 24 +: 4, 0 +: 24) of - when ('1111', _, _) => __UNPREDICTABLE - when (!'1111', _, _) => // svc - __field cond 28 +: 4 - __field imm24 0 +: 24 - case () of - when () => __encoding aarch32_SVC_A1_A // SVC_A1 - when ('1111', _, '0x', _, '1x0', _, _, _) => // simd3reg_sameext - __field op1 23 +: 2 - __field D 22 +: 1 - __field op2 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op3 10 +: 1 - __field op4 8 +: 1 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - case (op1, op2, op3, op4, Q, U) of - when ('x1', '0x', '0', '0', '0', '0') => __encoding aarch32_VCADD_A1_A // VCADD_A1_D - when ('x1', '0x', '0', '0', '0', '1') => __UNALLOCATED - when ('x1', '0x', '0', '0', '1', '0') => __encoding aarch32_VCADD_A1_A // VCADD_A1_Q - when ('x1', '0x', '0', '0', '1', '1') => __UNALLOCATED - when ('00', '0x', '0', '0', _, _) => __UNALLOCATED - when ('00', '0x', '0', '1', _, _) => __UNALLOCATED - when ('00', '00', '1', '0', '0', '0') => __UNALLOCATED - when ('00', '00', '1', '0', '0', '1') => __UNALLOCATED - when ('00', '00', '1', '0', '1', '0') => __encoding aarch32_VMMLA_A1_A // VMMLA_A1_Q - when ('00', '00', '1', '0', '1', '1') => __UNALLOCATED - when ('00', '00', '1', '1', '0', '0') => __encoding aarch32_VDOT_bf16_A1_A // VDOT_A1_D - when ('00', '00', '1', '1', '0', '1') => __UNALLOCATED - when ('00', '00', '1', '1', '1', '0') => __encoding aarch32_VDOT_bf16_A1_A // VDOT_A1_Q - when ('00', '00', '1', '1', '1', '1') => __UNALLOCATED - when ('00', '01', '1', '0', _, _) => __UNALLOCATED - when ('00', '01', '1', '1', _, _) => __UNALLOCATED - when ('00', '10', '0', '0', _, '1') => __encoding aarch32_VFMAL_A1_A // VFMAL_A1_Q - when ('00', '10', '0', '1', _, _) => __UNALLOCATED - when ('00', '10', '1', '0', '0', _) => __UNALLOCATED - when ('00', '10', '1', '0', '1', '0') => __encoding aarch32_MMLA_A1_A // VSMMLA_A1_Q - when ('00', '10', '1', '0', '1', '1') => __encoding aarch32_MMLA_A1_A // VUMMLA_A1_Q - when ('00', '10', '1', '1', '0', '0') => __encoding aarch32_VDOT_A1_A // VSDOT_A1_D - when ('00', '10', '1', '1', '0', '1') => __encoding aarch32_VDOT_A1_A // VUDOT_A1_D - when ('00', '10', '1', '1', '1', '0') => __encoding aarch32_VDOT_A1_A // VSDOT_A1_Q - when ('00', '10', '1', '1', '1', '1') => __encoding aarch32_VDOT_A1_A // VUDOT_A1_Q - when ('00', '11', '0', '0', _, '1') => __encoding aarch32_VFMA_bf_A1_A // VFMA_bf_A1_Q - when ('00', '11', '0', '1', _, _) => __UNALLOCATED - when ('00', '11', '1', '0', _, _) => __UNALLOCATED - when ('00', '11', '1', '1', _, _) => __UNALLOCATED - when ('01', '10', '0', '0', _, '1') => __encoding aarch32_VFMAL_A1_A // VFMSL_A1_Q - when ('01', '10', '0', '1', _, _) => __UNALLOCATED - when ('01', '10', '1', '0', '0', _) => __UNALLOCATED - when ('01', '10', '1', '0', '1', '0') => __encoding aarch32_MMLA_A1_A // VUSMMLA_A1_Q - when ('01', '10', '1', '0', '1', '1') => __UNALLOCATED - when ('01', '10', '1', '1', '0', '0') => __encoding aarch32_VUSDOT_A1_A // VUSDOT_A1_D - when ('01', '10', '1', '1', _, '1') => __UNALLOCATED - when ('01', '10', '1', '1', '1', '0') => __encoding aarch32_VUSDOT_A1_A // VUSDOT_A1_Q - when ('01', '11', _, _, _, _) => __UNALLOCATED - when (_, '1x', '0', '0', _, '0') => __encoding aarch32_VCMLA_A1_A // VCMLA_A1_Q - when ('10', '11', _, _, _, _) => __UNALLOCATED - when ('11', '11', _, _, _, _) => __UNALLOCATED - when ('1111', _, '10', _, '1x0', _, _, _) => // simd2reg_scalarext - __field op1 23 +: 1 - __field D 22 +: 1 - __field op2 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op3 10 +: 1 - __field op4 8 +: 1 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - case (op1, op2, op3, op4, Q, U) of - when ('0', _, '0', '0', _, '0') => __encoding aarch32_VCMLA_idx_A1_A // VCMLA_s_A1_QH - when ('0', '00', '0', '0', _, '1') => __encoding aarch32_VFMAL_i_A1_A // VFMAL_s_A1_Q - when ('0', '00', '0', '1', _, _) => __UNALLOCATED - when ('0', '00', '1', '0', _, _) => __UNALLOCATED - when ('0', '00', '1', '1', '0', '0') => __encoding aarch32_VDOT_bf16_i_A1_A // VDOT_s_A1_D - when ('0', '00', '1', '1', _, '1') => __UNALLOCATED - when ('0', '00', '1', '1', '1', '0') => __encoding aarch32_VDOT_bf16_i_A1_A // VDOT_s_A1_Q - when ('0', '01', '0', '0', _, '0') => __UNALLOCATED - when ('0', '01', '0', '0', '0', '1') => __encoding aarch32_VFMAL_i_A1_A // VFMSL_s_A1_D - when ('0', '01', '0', '0', '1', '1') => __encoding aarch32_VFMAL_i_A1_A // VFMSL_s_A1_Q - when ('0', '01', '0', '1', _, _) => __UNALLOCATED - when ('0', '01', '1', '0', _, _) => __UNALLOCATED - when ('0', '10', '0', _, _, _) => __UNALLOCATED - when ('0', '10', '1', '0', _, _) => __UNALLOCATED - when ('0', '10', '1', '1', '0', '0') => __encoding aarch32_VDOT_s_A1_A // VSDOT_s_A1_D - when ('0', '10', '1', '1', '0', '1') => __encoding aarch32_VDOT_s_A1_A // VUDOT_s_A1_D - when ('0', '10', '1', '1', '1', '0') => __encoding aarch32_VDOT_s_A1_A // VSDOT_s_A1_Q - when ('0', '10', '1', '1', '1', '1') => __encoding aarch32_VDOT_s_A1_A // VUDOT_s_A1_Q - when ('0', '11', '0', '0', _, '0') => __UNALLOCATED - when ('0', '11', '0', '0', _, '1') => __encoding aarch32_VFMA_bfs_A1_A // VFMA_bfs_A1_Q - when ('0', '11', '0', '1', _, _) => __UNALLOCATED - when ('0', '11', '1', _, _, _) => __UNALLOCATED - when ('1', _, '0', '0', _, '0') => __encoding aarch32_VCMLA_idx_A1_A // VCMLA_s_A1_QS - when ('1', '00', '1', '1', '0', '0') => __encoding aarch32_DOT_A1_A // VUSDOT_s_A1_D - when ('1', '00', '1', '1', '0', '1') => __encoding aarch32_DOT_A1_A // VSUDOT_s_A1_D - when ('1', '00', '1', '1', '1', '0') => __encoding aarch32_DOT_A1_A // VUSDOT_s_A1_Q - when ('1', '00', '1', '1', '1', '1') => __encoding aarch32_DOT_A1_A // VSUDOT_s_A1_Q - when ('1', _, '0', '1', _, _) => __UNALLOCATED - when ('1', '01', '1', '1', _, _) => __UNALLOCATED - when ('1', '1x', '1', '1', _, _) => __UNALLOCATED - when ('1', _, '1', '0', _, _) => __UNALLOCATED - when (!'1111', _, '0x', _, '10x', _, _, _) => - // simdldst_mov64 - case (28 +: 4, 25 +: 3, 21 +: 4, 12 +: 9, 10 +: 2, 0 +: 10) of - when (_, _, '00x0', _, _, _) => // movsimdfpgp64 - __field cond 28 +: 4 - __field D 22 +: 1 - __field op 20 +: 1 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field size 8 +: 2 - __field opc2 6 +: 2 - __field M 5 +: 1 - __field o3 4 +: 1 - __field Vm 0 +: 4 - case (D, op, size, opc2, o3) of - when ('0', _, _, _, _) => __UNALLOCATED - when ('1', _, _, _, '0') => __UNALLOCATED - when ('1', _, '0x', '00', '1') => __UNALLOCATED - when ('1', _, _, '01', _) => __UNALLOCATED - when ('1', '0', '10', '00', '1') => __encoding aarch32_VMOV_ss_T1A1_A // VMOV_toss_A1 - when ('1', '0', '11', '00', '1') => __encoding aarch32_VMOV_d_T1A1_A // VMOV_tod_A1 - when ('1', _, _, '1x', _) => __UNALLOCATED - when ('1', '1', '10', '00', '1') => __encoding aarch32_VMOV_ss_T1A1_A // VMOV_ss_A1 - when ('1', '1', '11', '00', '1') => __encoding aarch32_VMOV_d_T1A1_A // VMOV_d_A1 - when (_, _, !'00x0', _, _, _) => // ldstsimdfp - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field L 20 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm8 0 +: 8 - case (P, U, W, L, Rn, size, imm8) of - when ('0', '0', '1', _, _, _, _) => __UNALLOCATED - when ('0', '1', _, _, _, '0x', _) => __UNALLOCATED - when ('0', '1', _, '0', _, '10', _) => __encoding aarch32_VSTM_T2A2_A // VSTM_A2 - when ('0', '1', _, '0', _, '11', 'xxxxxxx0') => __encoding aarch32_VSTM_T1A1_A // VSTM_A1 - when ('0', '1', _, '0', _, '11', 'xxxxxxx1') => __encoding aarch32_VSTM_T1A1_A // FSTMIAX_A1 - when ('0', '1', _, '1', _, '10', _) => __encoding aarch32_VLDM_T2A2_A // VLDM_A2 - when ('0', '1', _, '1', _, '11', 'xxxxxxx0') => __encoding aarch32_VLDM_T1A1_A // VLDM_A1 - when ('0', '1', _, '1', _, '11', 'xxxxxxx1') => __encoding aarch32_VLDM_T1A1_A // FLDMIAX_A1 - when ('1', _, '0', '0', _, _, _) => __encoding aarch32_VSTR_A1_A // VSTR_A1_D - when ('1', _, '0', _, _, '00', _) => __UNALLOCATED - when ('1', _, '0', '1', !'1111', _, _) => __encoding aarch32_VLDR_A1_A // VLDR_A1_D - when ('1', '0', '1', _, _, '0x', _) => __UNALLOCATED - when ('1', '0', '1', '0', _, '10', _) => __encoding aarch32_VSTM_T2A2_A // VSTMDB_A2 - when ('1', '0', '1', '0', _, '11', 'xxxxxxx0') => __encoding aarch32_VSTM_T1A1_A // VSTMDB_A1 - when ('1', '0', '1', '0', _, '11', 'xxxxxxx1') => __encoding aarch32_VSTM_T1A1_A // FSTMDBX_A1 - when ('1', '0', '1', '1', _, '10', _) => __encoding aarch32_VLDM_T2A2_A // VLDMDB_A2 - when ('1', '0', '1', '1', _, '11', 'xxxxxxx0') => __encoding aarch32_VLDM_T1A1_A // VLDMDB_A1 - when ('1', '0', '1', '1', _, '11', 'xxxxxxx1') => __encoding aarch32_VLDM_T1A1_A // FLDMDBX_A1 - when ('1', _, '0', '1', '1111', _, _) => __encoding aarch32_VLDR_A1_A // VLDR_l_A1_D - when ('1', '1', '1', _, _, _, _) => __UNALLOCATED - when (!'1111', _, '10', _, '10x', _, '1', _) => - // fpsimd_mov32 - case (28 +: 4, 24 +: 4, 21 +: 3, 12 +: 9, 10 +: 2, 8 +: 2, 5 +: 3, 0 +: 5) of - when (_, _, '000', _, _, '01', _, _) => // movfpgp16 - __field cond 28 +: 4 - __field op 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - case () of - when () => __encoding aarch32_VMOV_h_A1_A // VMOV_h_A1 - when (_, _, '000', _, _, '10', _, _) => // movfpgp32 - __field cond 28 +: 4 - __field op 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - case () of - when () => __encoding aarch32_VMOV_s_A1_A // VMOV_s_A1 - when (_, _, '111', _, _, '10', _, _) => // movfpsr - __field cond 28 +: 4 - __field L 20 +: 1 - __field reg 16 +: 4 - __field Rt 12 +: 4 - case (L) of - when ('0') => __encoding aarch32_VMSR_T1A1_AS // VMSR_A1_AS - when ('1') => __encoding aarch32_VMRS_T1A1_AS // VMRS_A1_AS - when (_, _, _, _, _, '11', _, _) => // movsimdgp - __field cond 28 +: 4 - __field opc1 21 +: 3 - __field L 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - __field opc2 5 +: 2 - case (opc1, L, opc2) of - when ('0xx', '0', _) => __encoding aarch32_VMOV_rs_T1A1_A // VMOV_rs_A1 - when (_, '1', _) => __encoding aarch32_VMOV_sr_T1A1_A // VMOV_sr_A1 - when ('1xx', '0', '0x') => __encoding aarch32_VDUP_r_T1A1_A // VDUP_r_A1 - when ('1xx', '0', '1x') => __UNALLOCATED - when ('1111', '0xx', _, _, _) => - // uncond_as - case (27 +: 5, 25 +: 2, 21 +: 4, 20 +: 1, 0 +: 20) of - when (_, '00', _, _, _) => - // uncondmisc - case (25 +: 7, 20 +: 5, 8 +: 12, 4 +: 4, 0 +: 4) of - when (_, '0xxxx', _, _, _) => __UNPREDICTABLE - when (_, '10000', _, 'xx0x', _) => // cps - __field imod 18 +: 2 - __field M 17 +: 1 - __field op 16 +: 1 - __field E 9 +: 1 - __field A 8 +: 1 - __field I 7 +: 1 - __field F 6 +: 1 - __field mode 0 +: 5 - case (imod, M, op, mode) of - when (_, _, '1', '0xxxx') => __encoding aarch32_SETEND_A1_A // SETEND_A1 - when (_, _, '0', _) => __encoding aarch32_CPS_A1_AS // CPSID_A1_ASM - when (_, _, '1', '1xxxx') => __UNALLOCATED - when (_, '10001', _, '1000', _) => __UNPREDICTABLE - when (_, '10001', _, 'x100', _) => __UNPREDICTABLE - when (_, '10001', _, 'xx01', _) => __UNPREDICTABLE - when (_, '10001', _, '0000', _) => // setpan - __field imm1 9 +: 1 - case () of - when () => __encoding aarch32_SETPAN_A1_A // SETPAN_A1 - when (_, '1000x', _, '0111', _) => __UNPREDICTABLE - when (_, '10010', _, '0111', _) => __UNALLOCATED - when (_, '10011', _, '0111', _) => __UNPREDICTABLE - when (_, '1001x', _, 'xx0x', _) => __UNPREDICTABLE - when (_, '100xx', _, '0011', _) => __UNPREDICTABLE - when (_, '100xx', _, '0x10', _) => __UNPREDICTABLE - when (_, '100xx', _, '1x1x', _) => __UNPREDICTABLE - when (_, '101xx', _, _, _) => __UNPREDICTABLE - when (_, '11xxx', _, _, _) => __UNPREDICTABLE - when (_, '01', _, _, _) => - // advsimddp - case (25 +: 7, 24 +: 1, 23 +: 1, 5 +: 18, 4 +: 1, 0 +: 4) of - when (_, _, '0', _, _, _) => // simd3reg_same - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field opc 8 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field o1 4 +: 1 - __field Vm 0 +: 4 - case (U, size, opc, Q, o1) of - when ('0', '0x', '1100', _, '1') => __encoding aarch32_VFMA_A1_A // VFMA_A1_Q - when ('0', '0x', '1101', _, '0') => __encoding aarch32_VADD_f_A1_A // VADD_f_A1_Q - when ('0', '0x', '1101', _, '1') => __encoding aarch32_VMLA_f_A1_A // VMLA_f_A1_Q - when ('0', '0x', '1110', _, '0') => __encoding aarch32_VCEQ_r_T1A1_A - when ('0', '0x', '1111', _, '0') => __encoding aarch32_VMAX_f_A1_A // VMAX_f_A1_Q - when ('0', '0x', '1111', _, '1') => __encoding aarch32_VRECPS_A1_A // VRECPS_A1_Q - when (_, _, '0000', _, '0') => __encoding aarch32_VHADD_T1A1_A // VHADD_A1_Q - when ('0', '00', '0001', _, '1') => __encoding aarch32_VAND_r_T1A1_A // VAND_r_A1_Q - when (_, _, '0000', _, '1') => __encoding aarch32_VQADD_T1A1_A // VQADD_A1_Q - when (_, _, '0001', _, '0') => __encoding aarch32_VRHADD_T1A1_A // VRHADD_A1_Q - when ('0', '00', '1100', _, '0') => __encoding aarch32_SHA1C_A1_A // SHA1C_A1 - when (_, _, '0010', _, '0') => __encoding aarch32_VHADD_T1A1_A // VHSUB_A1_Q - when ('0', '01', '0001', _, '1') => __encoding aarch32_VBIC_r_T1A1_A // VBIC_r_A1_Q - when (_, _, '0010', _, '1') => __encoding aarch32_VQSUB_T1A1_A // VQSUB_A1_Q - when (_, _, '0011', _, '0') => __encoding aarch32_VCGT_r_T1A1_A - when (_, _, '0011', _, '1') => __encoding aarch32_VCGE_r_T1A1_A - when ('0', '01', '1100', _, '0') => __encoding aarch32_SHA1P_A1_A // SHA1P_A1 - when ('0', '1x', '1100', _, '1') => __encoding aarch32_VFMA_A1_A // VFMS_A1_Q - when ('0', '1x', '1101', _, '0') => __encoding aarch32_VSUB_f_A1_A // VSUB_f_A1_Q - when ('0', '1x', '1101', _, '1') => __encoding aarch32_VMLA_f_A1_A // VMLS_f_A1_Q - when ('0', '1x', '1110', _, '0') => __UNALLOCATED - when ('0', '1x', '1111', _, '0') => __encoding aarch32_VMAX_f_A1_A // VMIN_f_A1_Q - when ('0', '1x', '1111', _, '1') => __encoding aarch32_VRSQRTS_A1_A // VRSQRTS_A1_Q - when (_, _, '0100', _, '0') => __encoding aarch32_VSHL_r_T1A1_A // VSHL_r_A1_Q - when ('0', _, '1000', _, '0') => __encoding aarch32_VADD_i_T1A1_A // VADD_i_A1_Q - when ('0', '10', '0001', _, '1') => __encoding aarch32_VORR_r_T1A1_A // VORR_r_A1_Q - when ('0', _, '1000', _, '1') => __encoding aarch32_VTST_T1A1_A // VTST_A1_Q - when (_, _, '0100', _, '1') => __encoding aarch32_VQSHL_r_T1A1_A // VQSHL_r_A1_Q - when ('0', _, '1001', _, '0') => __encoding aarch32_VMLA_i_T1A1_A // VMLA_i_A1_Q - when (_, _, '0101', _, '0') => __encoding aarch32_VRSHL_T1A1_A // VRSHL_A1_Q - when (_, _, '0101', _, '1') => __encoding aarch32_VQRSHL_T1A1_A // VQRSHL_A1_Q - when ('0', _, '1011', _, '0') => __encoding aarch32_VQDMULH_T1A1_A // VQDMULH_A1_Q - when ('0', '10', '1100', _, '0') => __encoding aarch32_SHA1M_A1_A // SHA1M_A1 - when ('0', _, '1011', _, '1') => __encoding aarch32_VPADD_i_T1A1_A // VPADD_i_A1 - when (_, _, '0110', _, '0') => __encoding aarch32_VMAX_i_T1A1_A // VMAX_i_A1_Q - when ('0', '11', '0001', _, '1') => __encoding aarch32_VORN_r_T1A1_A // VORN_r_A1_Q - when (_, _, '0110', _, '1') => __encoding aarch32_VMAX_i_T1A1_A // VMIN_i_A1_Q - when (_, _, '0111', _, '0') => __encoding aarch32_VABD_i_T1A1_A // VABD_i_A1_Q - when (_, _, '0111', _, '1') => __encoding aarch32_VABA_T1A1_A // VABA_A1_Q - when ('0', '11', '1100', _, '0') => __encoding aarch32_SHA1SU0_A1_A // SHA1SU0_A1 - when ('1', '0x', '1101', _, '0') => __encoding aarch32_VPADD_f_A1_A // VPADD_f_A1 - when ('1', '0x', '1101', _, '1') => __encoding aarch32_VMUL_f_A1_A // VMUL_f_A1_Q - when ('1', '0x', '1110', _, '0') => __encoding aarch32_VCGE_r_T1A1_A - when ('1', '0x', '1110', _, '1') => __encoding aarch32_VACGE_A1_A // VACGE_A1_Q - when ('1', '0x', '1111', '0', '0') => __encoding aarch32_VPMAX_f_A1_A // VPMAX_f_A1 - when ('1', '0x', '1111', _, '1') => __encoding aarch32_VMAXNM_A1_A // VMAXNM_A1_Q - when ('1', '00', '0001', _, '1') => __encoding aarch32_VEOR_T1A1_A // VEOR_A1_Q - when (_, _, '1001', _, '1') => __encoding aarch32_VMUL_i_T1A1_A // VMUL_i_A1_Q - when ('1', '00', '1100', _, '0') => __encoding aarch32_SHA256H_A1_A // SHA256H_A1 - when (_, _, '1010', '0', '0') => __encoding aarch32_VPMAX_i_T1A1_A // VPMAX_i_A1 - when ('1', '01', '0001', _, '1') => __encoding aarch32_VBIF_T1A1_A // VBSL_A1_Q - when (_, _, '1010', '0', '1') => __encoding aarch32_VPMAX_i_T1A1_A // VPMIN_i_A1 - when (_, _, '1010', '1', _) => __UNALLOCATED - when ('1', '01', '1100', _, '0') => __encoding aarch32_SHA256H2_A1_A // SHA256H2_A1 - when ('1', '1x', '1101', _, '0') => __encoding aarch32_VABD_f_A1_A // VABD_f_A1_Q - when ('1', '1x', '1110', _, '0') => __encoding aarch32_VCGT_r_T1A1_A - when ('1', '1x', '1110', _, '1') => __encoding aarch32_VACGE_A1_A // VACGT_A1_Q - when ('1', '1x', '1111', '0', '0') => __encoding aarch32_VPMAX_f_A1_A // VPMIN_f_A1 - when ('1', '1x', '1111', _, '1') => __encoding aarch32_VMAXNM_A1_A // VMINNM_A1_Q - when ('1', _, '1000', _, '0') => __encoding aarch32_VSUB_i_T1A1_A // VSUB_i_A1_Q - when ('1', '10', '0001', _, '1') => __encoding aarch32_VBIF_T1A1_A // VBIT_A1_Q - when ('1', _, '1000', _, '1') => __encoding aarch32_VCEQ_r_T1A1_A - when ('1', _, '1001', _, '0') => __encoding aarch32_VMLA_i_T1A1_A // VMLS_i_A1_Q - when ('1', _, '1011', _, '0') => __encoding aarch32_VQRDMULH_T1A1_A // VQRDMULH_A1_Q - when ('1', '10', '1100', _, '0') => __encoding aarch32_SHA256SU1_A1_A // SHA256SU1_A1 - when ('1', _, '1011', _, '1') => __encoding aarch32_VQRDMLAH_A1_A // VQRDMLAH_A1_Q - when ('1', '11', '0001', _, '1') => __encoding aarch32_VBIF_T1A1_A // VBIF_A1_Q - when ('1', _, '1100', _, '1') => __encoding aarch32_VQRDMLSH_A1_A // VQRDMLSH_A1_Q - when ('1', _, '1111', '1', '0') => __UNALLOCATED - when (_, _, '1', _, '0', _) => - // a_simd_mulreg - case (25 +: 7, 24 +: 1, 23 +: 1, 22 +: 1, 20 +: 2, 12 +: 8, 10 +: 2, 7 +: 3, 6 +: 1, 5 +: 1, 4 +: 1, 0 +: 4) of - when (_, '0', _, _, '11', _, _, _, _, _, _, _) => // simd3reg_ext - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field imm4 8 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case () of - when () => __encoding aarch32_VEXT_T1A1_A // VEXT_A1_Q - when (_, '1', _, _, '11', _, '0x', _, _, _, _, _) => // simd2reg_misc - __field D 22 +: 1 - __field size 18 +: 2 - __field opc1 16 +: 2 - __field Vd 12 +: 4 - __field opc2 7 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (size, opc1, opc2, Q) of - when (_, '00', '0000', _) => __encoding aarch32_VREV16_T1A1_A // VREV64_A1_Q - when (_, '00', '0001', _) => __encoding aarch32_VREV16_T1A1_A // VREV32_A1_Q - when (_, '00', '0010', _) => __encoding aarch32_VREV16_T1A1_A // VREV16_A1_Q - when (_, '00', '0011', _) => __UNALLOCATED - when (_, '00', '010x', _) => __encoding aarch32_VPADDL_T1A1_A // VPADDL_A1_Q - when (_, '00', '0110', '0') => __encoding aarch32_AESE_A1_A // AESE_A1 - when (_, '00', '0110', '1') => __encoding aarch32_AESD_A1_A // AESD_A1 - when (_, '00', '0111', '0') => __encoding aarch32_AESMC_A1_A // AESMC_A1 - when (_, '00', '0111', '1') => __encoding aarch32_AESIMC_A1_A // AESIMC_A1 - when (_, '00', '1000', _) => __encoding aarch32_VCLS_T1A1_A // VCLS_A1_Q - when ('00', '10', '0000', _) => __encoding aarch32_VSWP_T1A1_A // VSWP_A1_Q - when (_, '00', '1001', _) => __encoding aarch32_VCLZ_T1A1_A // VCLZ_A1_Q - when (_, '00', '1010', _) => __encoding aarch32_VCNT_T1A1_A // VCNT_A1_Q - when (_, '00', '1011', _) => __encoding aarch32_VMVN_r_T1A1_A // VMVN_r_A1_Q - when ('00', '10', '1100', '1') => __UNALLOCATED - when (_, '00', '110x', _) => __encoding aarch32_VPADAL_T1A1_A // VPADAL_A1_Q - when (_, '00', '1110', _) => __encoding aarch32_VQABS_T1A1_A // VQABS_A1_Q - when (_, '00', '1111', _) => __encoding aarch32_VQNEG_T1A1_A // VQNEG_A1_Q - when (_, '01', 'x000', _) => __encoding aarch32_VCGT_i_A1_A // VCGT_i_A1_Q - when (_, '01', 'x001', _) => __encoding aarch32_VCGE_i_A1_A // VCGE_i_A1_Q - when (_, '01', 'x010', _) => __encoding aarch32_VCEQ_i_A1_A // VCEQ_i_A1_Q - when (_, '01', 'x011', _) => __encoding aarch32_VCLE_i_A1_A // VCLE_i_A1_Q - when (_, '01', 'x100', _) => __encoding aarch32_VCLT_i_A1_A // VCLT_i_A1_Q - when (_, '01', 'x110', _) => __encoding aarch32_VABS_A1_A // VABS_A1_Q - when (_, '01', 'x111', _) => __encoding aarch32_VNEG_A1_A // VNEG_A1_Q - when (_, '01', '0101', '1') => __encoding aarch32_SHA1H_A1_A // SHA1H_A1 - when ('01', '10', '1100', '1') => __encoding aarch32_VCVT_T1A1_A // VCVT_bfs_A1 - when (_, '10', '0001', _) => __encoding aarch32_VTRN_T1A1_A // VTRN_A1_Q - when (_, '10', '0010', _) => __encoding aarch32_VUZP_T1A1_A // VUZP_A1_Q - when (_, '10', '0011', _) => __encoding aarch32_VZIP_T1A1_A // VZIP_A1_Q - when (_, '10', '0100', '0') => __encoding aarch32_VMOVN_T1A1_A // VMOVN_A1 - when (_, '10', '0100', '1') => __encoding aarch32_VQMOVN_T1A1_A // VQMOVUN_A1 - when (_, '10', '0101', _) => __encoding aarch32_VQMOVN_T1A1_A // VQMOVN_A1 - when (_, '10', '0110', '0') => __encoding aarch32_VSHLL_T2A2_A // VSHLL_A2 - when (_, '10', '0111', '0') => __encoding aarch32_SHA1SU1_A1_A // SHA1SU1_A1 - when (_, '10', '0111', '1') => __encoding aarch32_SHA256SU0_A1_A // SHA256SU0_A1 - when (_, '10', '1000', _) => __encoding aarch32_VRINTA_asimd_A1_A // VRINTN_asimd_A1_Q - when (_, '10', '1001', _) => __encoding aarch32_VRINTX_asimd_A1_A // VRINTX_asimd_A1_Q - when (_, '10', '1010', _) => __encoding aarch32_VRINTA_asimd_A1_A // VRINTA_asimd_A1_Q - when (_, '10', '1011', _) => __encoding aarch32_VRINTZ_asimd_A1_A // VRINTZ_asimd_A1_Q - when ('10', '10', '1100', '1') => __UNALLOCATED - when (_, '10', '1100', '0') => __encoding aarch32_VCVT_hs_T1A1_A // VCVT_hs_A1 - when (_, '10', '1101', _) => __encoding aarch32_VRINTA_asimd_A1_A // VRINTM_asimd_A1_Q - when (_, '10', '1110', '0') => __encoding aarch32_VCVT_hs_T1A1_A // VCVT_sh_A1 - when (_, '10', '1110', '1') => __UNALLOCATED - when (_, '10', '1111', _) => __encoding aarch32_VRINTA_asimd_A1_A // VRINTP_asimd_A1_Q - when (_, '11', '000x', _) => __encoding aarch32_VCVTA_asimd_A1_A // VCVTA_asimd_A1_Q - when (_, '11', '001x', _) => __encoding aarch32_VCVTA_asimd_A1_A // VCVTN_asimd_A1_Q - when (_, '11', '010x', _) => __encoding aarch32_VCVTA_asimd_A1_A // VCVTP_asimd_A1_Q - when (_, '11', '011x', _) => __encoding aarch32_VCVTA_asimd_A1_A // VCVTM_asimd_A1_Q - when (_, '11', '10x0', _) => __encoding aarch32_VRECPE_A1_A // VRECPE_A1_Q - when (_, '11', '10x1', _) => __encoding aarch32_VRSQRTE_A1_A // VRSQRTE_A1_Q - when ('11', '10', '1100', '1') => __UNALLOCATED - when (_, '11', '11xx', _) => __encoding aarch32_VCVT_is_A1_A // VCVT_is_A1_Q - when (_, '1', _, _, '11', _, '10', _, _, _, _, _) => // simd3reg_tbl - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field len 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case () of - when () => __encoding aarch32_VTBL_T1A1_A // VTBX_A1 - when (_, '1', _, _, '11', _, '11', _, _, _, _, _) => // simd2reg_dup - __field D 22 +: 1 - __field imm4 16 +: 4 - __field Vd 12 +: 4 - __field opc 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (opc) of - when ('000') => __encoding aarch32_VDUP_s_T1A1_A // VDUP_s_A1_Q - when ('001') => __UNALLOCATED - when ('01x') => __UNALLOCATED - when ('1xx') => __UNALLOCATED - when (_, _, _, _, !'11', _, _, _, '0', _, _, _) => // simd3reg_diff - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field opc 8 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (U, opc) of - when (_, '0000') => __encoding aarch32_VADDL_T1A1_A // VADDL_A1 - when (_, '0001') => __encoding aarch32_VADDL_T1A1_A // VADDW_A1 - when (_, '0010') => __encoding aarch32_VSUBL_T1A1_A // VSUBL_A1 - when ('0', '0100') => __encoding aarch32_VADDHN_T1A1_A // VADDHN_A1 - when (_, '0011') => __encoding aarch32_VSUBL_T1A1_A // VSUBW_A1 - when ('0', '0110') => __encoding aarch32_VSUBHN_T1A1_A // VSUBHN_A1 - when ('0', '1001') => __encoding aarch32_VQDMLAL_T1A1_A // VQDMLAL_A1 - when (_, '0101') => __encoding aarch32_VABA_T2A2_A // VABAL_A1 - when ('0', '1011') => __encoding aarch32_VQDMLSL_T1A1_A // VQDMLSL_A1 - when ('0', '1101') => __encoding aarch32_VQDMULL_T1A1_A // VQDMULL_A1 - when (_, '0111') => __encoding aarch32_VABD_i_T2A2_A // VABDL_i_A1 - when (_, '1000') => __encoding aarch32_VMLA_i_T2A2_A // VMLAL_i_A1 - when (_, '1010') => __encoding aarch32_VMLA_i_T2A2_A // VMLSL_i_A1 - when ('1', '0100') => __encoding aarch32_VRADDHN_T1A1_A // VRADDHN_A1 - when ('1', '0110') => __encoding aarch32_VRSUBHN_T1A1_A // VRSUBHN_A1 - when (_, '11x0') => __encoding aarch32_VMUL_i_A2_A // VMULL_i_A1 - when ('1', '1001') => __UNALLOCATED - when ('1', '1011') => __UNALLOCATED - when ('1', '1101') => __UNALLOCATED - when (_, '1111') => __UNALLOCATED - when (_, _, _, _, !'11', _, _, _, '1', _, _, _) => // simd2reg_scalar - __field Q 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field opc 8 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (Q, opc) of - when (_, '000x') => __encoding aarch32_VMLA_s_A1_A // VMLA_s_A1_Q - when ('0', '0011') => __encoding aarch32_VQDMLAL_T2A2_A // VQDMLAL_A2 - when (_, '0010') => __encoding aarch32_VMLA_s_T2A2_A // VMLAL_s_A1 - when ('0', '0111') => __encoding aarch32_VQDMLSL_T2A2_A // VQDMLSL_A2 - when (_, '010x') => __encoding aarch32_VMLA_s_A1_A // VMLS_s_A1_Q - when ('0', '1011') => __encoding aarch32_VQDMULL_T2A2_A // VQDMULL_A2 - when (_, '0110') => __encoding aarch32_VMLA_s_T2A2_A // VMLSL_s_A1 - when (_, '100x') => __encoding aarch32_VMUL_s_A1_A // VMUL_s_A1_Q - when ('1', '0011') => __UNALLOCATED - when (_, '1010') => __encoding aarch32_VMUL_s_T2A2_A // VMULL_s_A1 - when ('1', '0111') => __UNALLOCATED - when (_, '1100') => __encoding aarch32_VQDMULH_T2A2_A // VQDMULH_A2_Q - when (_, '1101') => __encoding aarch32_VQRDMULH_T2A2_A // VQRDMULH_A2_Q - when ('1', '1011') => __UNALLOCATED - when (_, '1110') => __encoding aarch32_VQRDMLAH_A2_A // VQRDMLAH_A2_Q - when (_, '1111') => __encoding aarch32_VQRDMLSH_A2_A // VQRDMLSH_A2_Q - when (_, _, '1', _, '1', _) => - // a_simd_12reg - case (25 +: 7, 24 +: 1, 23 +: 1, 22 +: 1, 7 +: 15, 5 +: 2, 4 +: 1, 0 +: 4) of - when (_, _, _, _, '000xxxxxxxxxxx0', _, _, _) => // simd1reg_imm - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - case (cmode, op) of - when ('0xx0', '0') => __encoding aarch32_VMOV_i_T1A1_A - when ('0xx0', '1') => __encoding aarch32_VMVN_i_T1A1_A - when ('0xx1', '0') => __encoding aarch32_VORR_i_T1A1_A - when ('0xx1', '1') => __encoding aarch32_VBIC_i_T1A1_A - when ('10x0', '0') => __encoding aarch32_VMOV_i_T1A1_A - when ('10x0', '1') => __encoding aarch32_VMVN_i_T1A1_A - when ('10x1', '0') => __encoding aarch32_VORR_i_T1A1_A - when ('10x1', '1') => __encoding aarch32_VBIC_i_T1A1_A - when ('11xx', '0') => __encoding aarch32_VMOV_i_T1A1_A - when ('110x', '1') => __encoding aarch32_VMVN_i_T1A1_A - when ('1110', '1') => __encoding aarch32_VMOV_i_T1A1_A - when ('1111', '1') => __UNALLOCATED - when (_, _, _, _, !'000xxxxxxxxxxx0', _, _, _) => // simd2reg_shift - __field U 24 +: 1 - __field D 22 +: 1 - __field imm3H 19 +: 3 - __field imm3L 16 +: 3 - __field Vd 12 +: 4 - __field opc 8 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - case (U, imm3H:L, imm3L, opc, Q) of - when (_, !'0000', _, '0000', _) => __encoding aarch32_VSHR_T1A1_A // VSHR_A1_Q - when (_, !'0000', _, '0001', _) => __encoding aarch32_VSRA_T1A1_A // VSRA_A1_Q - when (_, !'0000', '000', '1010', '0') => __encoding aarch32_VMOVL_T1A1_A // VMOVL_A1 - when (_, !'0000', _, '0010', _) => __encoding aarch32_VRSHR_T1A1_A // VRSHR_A1_Q - when (_, !'0000', _, '0011', _) => __encoding aarch32_VRSRA_T1A1_A // VRSRA_A1_D - when (_, !'0000', _, '0111', _) => __encoding aarch32_VQSHL_i_T1A1_A // VQSHL_i_A1_Q - when (_, !'0000', _, '1001', '0') => __encoding aarch32_VQSHRN_T1A1_A // VQSHRN_A1 - when (_, !'0000', _, '1001', '1') => __encoding aarch32_VQRSHRN_T1A1_A // VQRSHRN_A1 - when (_, !'0000', _, '1010', '0') => __encoding aarch32_VSHLL_T1A1_A // VSHLL_A1 - when (_, !'0000', _, '11xx', _) => __encoding aarch32_VCVT_xs_A1_A // VCVT_xs_A1_Q - when ('0', !'0000', _, '0101', _) => __encoding aarch32_VSHL_i_T1A1_A // VSHL_i_A1_Q - when ('0', !'0000', _, '1000', '0') => __encoding aarch32_VSHRN_T1A1_A // VSHRN_A1 - when ('0', !'0000', _, '1000', '1') => __encoding aarch32_VRSHRN_T1A1_A // VRSHRN_A1 - when ('1', !'0000', _, '0100', _) => __encoding aarch32_VSRI_T1A1_A // VSRI_A1_Q - when ('1', !'0000', _, '0101', _) => __encoding aarch32_VSLI_T1A1_A // VSLI_A1_Q - when ('1', !'0000', _, '0110', _) => __encoding aarch32_VQSHL_i_T1A1_A // VQSHLU_i_A1_Q - when ('1', !'0000', _, '1000', '0') => __encoding aarch32_VQSHRN_T1A1_A // VQSHRUN_A1 - when ('1', !'0000', _, '1000', '1') => __encoding aarch32_VQRSHRN_T1A1_A // VQRSHRUN_A1 - when (_, '1x', _, '1', _) => - // uncondhints - case (26 +: 6, 21 +: 5, 20 +: 1, 5 +: 15, 4 +: 1, 0 +: 4) of - when (_, '00xx1', _, _, _, _) => __UNALLOCATED - when (_, '01001', _, _, _, _) => __UNALLOCATED - when (_, '01011', _, _, _, _) => // barriers - __field opcode 4 +: 4 - __field option 0 +: 4 - case (opcode, option) of - when ('0000', _) => __UNPREDICTABLE - when ('0001', _) => __encoding aarch32_CLREX_A1_A // CLREX_A1 - when ('001x', _) => __UNPREDICTABLE - when ('0100', !'0x00') => __encoding aarch32_DSB_A1_A // DSB_A1 - when ('0100', '0000') => __encoding aarch32_SSBB_A1_A // SSBB_A1 - when ('0100', '0100') => __encoding aarch32_PSSBB_A1_A // PSSBB_A1 - when ('0101', _) => __encoding aarch32_DMB_A1_A // DMB_A1 - when ('0110', _) => __encoding aarch32_ISB_A1_A // ISB_A1 - when ('0111', _) => __encoding aarch32_SB_A1_A // SB_A1 - when ('1xxx', _) => __UNPREDICTABLE - when (_, '011x1', _, _, _, _) => __UNALLOCATED - when (_, '0xxx0', _, _, _, _) => // preload_imm - __field D 24 +: 1 - __field U 23 +: 1 - __field R 22 +: 1 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - case (D, R, Rn) of - when ('0', '0', _) => __NOP - when ('0', '1', _) => __encoding aarch32_PLI_i_A1_A // PLI_i_A1 - when ('1', _, '1111') => __encoding aarch32_PLD_l_A1_A // PLD_l_A1 - when ('1', '0', !'1111') => __encoding aarch32_PLD_i_A1_A // PLDW_i_A1 - when ('1', '1', !'1111') => __encoding aarch32_PLD_i_A1_A // PLD_i_A1 - when (_, '1xxx0', _, _, '0', _) => // preload_reg - __field D 24 +: 1 - __field U 23 +: 1 - __field o2 22 +: 1 - __field Rn 16 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - case (D, o2) of - when ('0', '0') => __NOP - when ('0', '1') => __encoding aarch32_PLI_r_A1_A // PLI_r_A1_RRX - when ('1', '0') => __encoding aarch32_PLD_r_A1_A // PLDW_r_A1_RRX - when ('1', '1') => __encoding aarch32_PLD_r_A1_A // PLD_r_A1_RRX - when (_, '1xxx1', _, _, '0', _) => __UNALLOCATED - when (_, '1xxxx', _, _, '1', _) => __UNPREDICTABLE - when (_, '10', _, '0', _) => - // advsimdls - case (24 +: 8, 23 +: 1, 21 +: 2, 20 +: 1, 12 +: 8, 10 +: 2, 0 +: 10) of - when (_, '0', _, _, _, _, _) => // ldstv_ms - __field D 22 +: 1 - __field L 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - case (L, itype) of - when ('0', '000x') => __encoding aarch32_VST4_m_T1A1_A // VST4_m_A1_posti - when ('0', '0010') => __encoding aarch32_VST1_m_T1A1_A - when ('0', '0011') => __encoding aarch32_VST2_m_T1A1_A - when ('0', '010x') => __encoding aarch32_VST3_m_T1A1_A // VST3_m_A1_posti - when ('0', '0110') => __encoding aarch32_VST1_m_T1A1_A - when ('0', '0111') => __encoding aarch32_VST1_m_T1A1_A - when ('0', '100x') => __encoding aarch32_VST2_m_T1A1_A - when ('0', '1010') => __encoding aarch32_VST1_m_T1A1_A - when ('1', '000x') => __encoding aarch32_VLD4_m_T1A1_A // VLD4_m_A1_posti - when ('1', '0010') => __encoding aarch32_VLD1_m_T1A1_A - when ('1', '0011') => __encoding aarch32_VLD2_m_T1A1_A - when ('1', '010x') => __encoding aarch32_VLD3_m_T1A1_A // VLD3_m_A1_posti - when (_, '1011') => __UNALLOCATED - when ('1', '0110') => __encoding aarch32_VLD1_m_T1A1_A - when ('1', '0111') => __encoding aarch32_VLD1_m_T1A1_A - when (_, '11xx') => __UNALLOCATED - when ('1', '100x') => __encoding aarch32_VLD2_m_T1A1_A - when ('1', '1010') => __encoding aarch32_VLD1_m_T1A1_A - when (_, '1', _, _, _, '11', _) => // ldv_ssall - __field D 22 +: 1 - __field L 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field N 8 +: 2 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - case (L, N, a) of - when ('0', _, _) => __UNALLOCATED - when ('1', '00', _) => __encoding aarch32_VLD1_a_T1A1_A // VLD1_a_A1_posti - when ('1', '01', _) => __encoding aarch32_VLD2_a_T1A1_A // VLD2_a_A1_posti - when ('1', '10', '0') => __encoding aarch32_VLD3_a_T1A1_A // VLD3_a_A1_posti - when ('1', '10', '1') => __UNALLOCATED - when ('1', '11', _) => __encoding aarch32_VLD4_a_T1A1_A // VLD4_a_A1_posti - when (_, '1', _, _, _, !'11', _) => // ldstv_ssone - __field D 22 +: 1 - __field L 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field N 8 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - case (L, size, N, Rm) of - when ('0', '00', '00', _) => __encoding aarch32_VST1_1_T1A1_A - when ('0', '00', '01', _) => __encoding aarch32_VST2_1_T1A1_A - when ('0', '00', '10', _) => __encoding aarch32_VST3_1_T1A1_A - when ('0', '00', '11', _) => __encoding aarch32_VST4_1_T1A1_A // VST4_1_A1_posti - when ('0', '01', '00', _) => __encoding aarch32_VST1_1_T1A1_A - when ('0', '01', '01', _) => __encoding aarch32_VST2_1_T1A1_A - when ('0', '01', '10', _) => __encoding aarch32_VST3_1_T1A1_A - when ('0', '01', '11', _) => __encoding aarch32_VST4_1_T2A2_A // VST4_1_A2_posti - when ('0', '10', '00', _) => __encoding aarch32_VST1_1_T1A1_A - when ('0', '10', '01', _) => __encoding aarch32_VST2_1_T1A1_A - when ('0', '10', '10', _) => __encoding aarch32_VST3_1_T1A1_A - when ('0', '10', '11', !'11x1') => __encoding aarch32_VST4_1_T3A3_A // VST4_1_A3_postr - when ('0', '10', '11', '1101') => __encoding aarch32_VST4_1_T3A3_A // VST4_1_A3_posti - when ('0', '10', '11', '1111') => __encoding aarch32_VST4_1_T3A3_A // VST4_1_A3_nowb - when ('1', '00', '00', _) => __encoding aarch32_VLD1_1_T1A1_A - when ('1', '00', '01', _) => __encoding aarch32_VLD2_1_T1A1_A - when ('1', '00', '10', _) => __encoding aarch32_VLD3_1_T1A1_A - when ('1', '00', '11', _) => __encoding aarch32_VLD4_1_T1A1_A - when ('1', '01', '00', _) => __encoding aarch32_VLD1_1_T1A1_A - when ('1', '01', '01', _) => __encoding aarch32_VLD2_1_T1A1_A - when ('1', '01', '10', _) => __encoding aarch32_VLD3_1_T1A1_A - when ('1', '01', '11', _) => __encoding aarch32_VLD4_1_T1A1_A - when ('1', '10', '00', _) => __encoding aarch32_VLD1_1_T1A1_A - when ('1', '10', '01', _) => __encoding aarch32_VLD2_1_T1A1_A - when ('1', '10', '10', _) => __encoding aarch32_VLD3_1_T1A1_A - when ('1', '10', '11', _) => __encoding aarch32_VLD4_1_T1A1_A - when (_, '11', _, '0', _) => __UNPREDICTABLE diff --git a/mra_tools/arch/arch_instrs.asl b/mra_tools/arch/arch_instrs.asl deleted file mode 100644 index 8f165ae5..00000000 --- a/mra_tools/arch/arch_instrs.asl +++ /dev/null @@ -1,91584 +0,0 @@ -//////////////////////////////////////////////////////////////////////// -// Proprietary Notice -// -// This document is protected by copyright and other related rights -// and the practice or implementation of the information contained in -// this document may be protected by one or more patents or pending -// patent applications. No part of this document may be reproduced in any -// form by any means without the express prior written permission of -// Arm. No license, express or implied, by estoppel or otherwise to -// any intellectual property rights is granted by this document unless -// specifically stated. -// -// Your access to the information in this document is conditional upon -// your acceptance that you will not use or permit others to use the -// information for the purposes of determining whether implementations -// infringe any third party patents. -// -// THIS DOCUMENT IS PROVIDED "AS IS". ARM PROVIDES NO REPRESENTATIONS -// AND NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT -// LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY -// QUALITY, NON-INFRINGEMENT OR FITNESS FOR A PARTICULAR PURPOSE WITH -// RESPECT TO THE DOCUMENT. For the avoidance of doubt, Arm makes no -// representation with respect to, and has undertaken no analysis to -// identify or understand the scope and content of, patents, copyrights, -// trade secrets, or other rights. -// -// This document may include technical inaccuracies or typographical -// errors. -// -// TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL ARM BE -// LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION ANY DIRECT, -// INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES, -// HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT -// OF ANY USE OF THIS DOCUMENT, EVEN IF ARM HAS BEEN ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGES. -// -// This document consists solely of commercial items. You shall be -// responsible for ensuring that any use, duplication or disclosure of -// this document complies fully with any relevant export laws and -// regulations to assure that this document or any portion thereof is not -// exported, directly or indirectly, in violation of such export -// laws. Use of the word "partner" in reference to Arm's customers is not -// intended to create or refer to any partnership relationship with any -// other company. Arm may make changes to this document at any time and -// without notice. -// -// If any of the provisions contained in these terms conflict with -// any of the provisions of any click through or signed written agreement -// covering this document with Arm, then the click through or signed -// written agreement prevails over and supersedes the conflicting -// provisions of these terms. This document may be translated into other -// languages for convenience, and you agree that if there is any conflict -// between the English version of this document and any translation, the -// terms of the English version of the Agreement shall prevail. -// -// The Arm corporate logo and words marked with (R) or (TM)(TM) -// are registered trademarks or trademarks of Arm Limited (or its -// subsidiaries) in the US and/or elsewhere. All rights reserved. Other -// brands and names mentioned in this document may be the trademarks of -// their respective owners. Please follow Arm's trademark usage -// guidelines at -// http://www.arm.com/company/policies/trademarks. -// -// Copyright (C) 2019 Arm Limited (or its affiliates). All rights reserved. -// -// Arm Limited. Company 02557590 registered in England. -// -// 110 Fulbourn Road, Cambridge, England CB1 9NJ. -// -// LES-PRE-20349 -//////////////////////////////////////////////////////////////////////// - -__instruction aarch32_VFMAL_i_A - __encoding aarch32_VFMAL_i_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field S 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x01xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - - integer d = UInt(D:Vd); - integer n = if Q == '1' then UInt(N:Vn) else UInt(Vn:N); - integer m = if Q == '1' then UInt(Vm[2:0]) else UInt(Vm[2:0]:M); - - integer index = if Q == '1' then UInt(M:Vm[3]) else UInt(Vm[3]); - integer esize = 32; - integer regs = if Q=='1' then 2 else 1; - integer datasize = if Q=='1' then 64 else 32; - boolean sub_op = S=='1'; - - __encoding aarch32_VFMAL_i_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field S 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x01xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - - integer d = UInt(D:Vd); - integer n = if Q == '1' then UInt(N:Vn) else UInt(Vn:N); - integer m = if Q == '1' then UInt(Vm[2:0]) else UInt(Vm[2:0]:M); - - integer index = if Q == '1' then UInt(M:Vm[3]) else UInt(Vm[3]); - integer esize = 32; - integer regs = if Q=='1' then 2 else 1; - integer datasize = if Q=='1' then 64 else 32; - boolean sub_op = S=='1'; - - __execute - CheckAdvSIMDEnabled(); - bits(datasize) operand1 ; - bits(datasize) operand2 ; - bits(64) operand3; - bits(64) result; - bits(esize DIV 2) element1; - bits(esize DIV 2) element2; - - if Q=='0' then - operand1 = S[n][datasize-1:0]; - operand2 = S[m][datasize-1:0]; - else - operand1 = D[n][datasize-1:0]; - operand2 = D[m][datasize-1:0]; - element2 = Elem[operand2, index, esize DIV 2]; - for r = 0 to regs-1 - operand3 = D[d+r]; - for e = 0 to 1 - element1 = Elem[operand1, 2*r+e, esize DIV 2]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAddH(Elem[operand3, e, esize], element1, element2, StandardFPSCRValue()); - D[d+r] = result; - -__instruction aarch32_VCVTA_vfp_A - __encoding aarch32_VCVTA_vfp_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111110 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '0'); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - - __encoding aarch32_VCVTA_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111110 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '0'); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = FPToFixed(S[m][15:0], 0, unsigned, FPSCR, rounding); - when 32 - S[d] = FPToFixed(S[m], 0, unsigned, FPSCR, rounding); - when 64 - S[d] = FPToFixed(D[m], 0, unsigned, FPSCR, rounding); - -__instruction aarch32_VSUBHN_A - __encoding aarch32_VSUBHN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx0110 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VSUBHN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx0110 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - result = Elem[Qin[n>>1],e,2*esize] - Elem[Qin[m>>1],e,2*esize]; - Elem[D[d],e,esize] = result[2*esize-1:esize]; - -__instruction aarch32_VST4_m_A - __encoding aarch32_VST4_m_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x00xxxx xxxx000x xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - case itype of - when '0000' - inc = 1; - when '0001' - inc = 2; - otherwise - SEE "Related encodings"; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST4_m_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x00xxxx xxxx000x xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - case itype of - when '0000' - inc = 1; - when '0001' - inc = 2; - otherwise - SEE "Related encodings"; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = TRUE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - for e = 0 to elements-1 - MemU[address, ebytes] = Elem[D[d], e]; - MemU[address+ebytes, ebytes] = Elem[D[d2],e]; - MemU[address+2*ebytes,ebytes] = Elem[D[d3],e]; - MemU[address+3*ebytes,ebytes] = Elem[D[d4],e]; - address = address + 4*ebytes; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 32; - -__instruction aarch32_VLD1_a_A - __encoding aarch32_VLD1_a_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx1100 xxxxxxxx' - __guard TRUE - __decode - if size == '11' || (size == '00' && a == '1') then UNDEFINED; - ebytes = 1 << UInt(size); regs = if T == '0' then 1 else 2; - alignment = if a == '0' then 1 else ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD1_a_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx1100 xxxxxxxx' - __guard TRUE - __decode - if size == '11' || (size == '00' && a == '1') then UNDEFINED; - ebytes = 1 << UInt(size); regs = if T == '0' then 1 else 2; - alignment = if a == '0' then 1 else ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - bits(64) replicated_element = Replicate(MemU[address,ebytes]); - for r = 0 to regs-1 - D[d+r] = replicated_element; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + ebytes; - -__instruction aarch32_VHADD_A - __encoding aarch32_VHADD_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0000 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - add = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VHADD_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0000 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - add = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Int(Elem[D[n+r],e,esize], unsigned); - op2 = Int(Elem[D[m+r],e,esize], unsigned); - result = if add then op1+op2 else op1-op2; - Elem[D[d+r],e,esize] = result[esize:1]; - -__instruction aarch32_ERET_AS - __encoding aarch32_ERET_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0001 0110xxxx xxxxxxxx 0110xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '0' - __decode - // No additional decoding required - - __encoding aarch32_ERET_T1_A - __instruction_set T32 - __opcode '11110011 11011110 10x0xxxx 00000000' - __guard TRUE - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - if !Halted() then - if PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; // UNDEFINED or NOP - else - new_pc_value = if PSTATE.EL == EL2 then ELR_hyp else R[14]; - AArch32.ExceptionReturn(new_pc_value, SPSR[]); - else // Perform DRPS operation in Debug state - if PSTATE.M == M32_User then - UNDEFINED; - elsif PSTATE.M == M32_System then - UNPREDICTABLE; // UNDEFINED or NOP - else - SynchronizeContext(); - SetPSTATEFromPSR(SPSR[]); - // PSTATE.{N,Z,C,V,Q,GE,SS,A,I,F} are not observable and ignored in Debug state, so - // behave as if UNKNOWN. - PSTATE.[N,Z,C,V,Q,GE,SS,A,I,F] = bits(13) UNKNOWN; - // In AArch32 Debug state, all instructions are T32 and unconditional. - PSTATE.IT = '00000000'; PSTATE.T = '1'; // PSTATE.J is RES0 - DLR = bits(32) UNKNOWN; DSPSR = bits(32) UNKNOWN; - UpdateEDSCRFields(); // Update EDSCR PE state flags - -__instruction aarch32_SEL_A - __encoding aarch32_SEL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1000xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SEL_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1010xxxx 1111xxxx 1000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - R[d][7:0] = if PSTATE.GE[0] == '1' then R[n][7:0] else R[m][7:0]; - R[d][15:8] = if PSTATE.GE[1] == '1' then R[n][15:8] else R[m][15:8]; - R[d][23:16] = if PSTATE.GE[2] == '1' then R[n][23:16] else R[m][23:16]; - R[d][31:24] = if PSTATE.GE[3] == '1' then R[n][31:24] else R[m][31:24]; - -__instruction aarch32_CMP_rr_A - __encoding aarch32_CMP_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0101xxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - shift_t = DecodeRegShift(stype); - if n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], NOT(shifted), '1'); - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VSUB_f_A - __encoding aarch32_VSUB_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x1xxxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSUB_f_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 0x11xxxx xxxx10xx x1x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - advsimd = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VSUB_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x1xxxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSUB_f_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 0x11xxxx xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - advsimd = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPSub(Elem[D[n+r],e,esize], Elem[D[m+r],e,esize], StandardFPSCRValue()); - else // VFP instruction - case esize of - when 16 - S[d] = Zeros(16) : FPSub(S[n][15:0], S[m][15:0], FPSCR); - when 32 - S[d] = FPSub(S[n], S[m], FPSCR); - when 64 - D[d] = FPSub(D[n], D[m], FPSCR); - -__instruction aarch32_LDRB_l_A - __encoding aarch32_LDRB_l_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx010x x1x11111 xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "LDRBT"; - t = UInt(Rt); imm32 = ZeroExtend(imm12, 32); - add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 || wback then UNPREDICTABLE; - - __encoding aarch32_LDRB_l_T1_A - __instruction_set T32 - __field U 23 +: 1 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 x0011111 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "PLD"; - t = UInt(Rt); imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - base = Align(PC,4); - address = if add then (base + imm32) else (base - imm32); - R[t] = ZeroExtend(MemU[address,1], 32); - -__instruction aarch32_ORR_rr_A - __encoding aarch32_ORR_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 100xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] OR shifted; - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VMOV_d_A - __encoding aarch32_VMOV_d_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field op 20 +: 1 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1100 010xxxxx xxxx1011 00x1xxxx' - __guard cond != '1111' - __decode - to_arm_registers = (op == '1'); t = UInt(Rt); t2 = UInt(Rt2); m = UInt(M:Vm); - if t == 15 || t2 == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if to_arm_registers && t == t2 then UNPREDICTABLE; - - __encoding aarch32_VMOV_d_T1A1_A - __instruction_set T32 - __field op 20 +: 1 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101100 010xxxxx xxxx1011 00x1xxxx' - __guard TRUE - __decode - to_arm_registers = (op == '1'); t = UInt(Rt); t2 = UInt(Rt2); m = UInt(M:Vm); - if t == 15 || t2 == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if to_arm_registers && t == t2 then UNPREDICTABLE; - - __execute __conditional - CheckVFPEnabled(TRUE); - if to_arm_registers then - R[t] = D[m][31:0]; - R[t2] = D[m][63:32]; - else - D[m][31:0] = R[t]; - D[m][63:32] = R[t2]; - -__instruction aarch32_VFNMA_A - __encoding aarch32_VFNMA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x01xxxx xxxx10xx x1x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - op1_neg = (op == '1'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VFNMA_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x01xxxx xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - op1_neg = (op == '1'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 - op16 = if op1_neg then FPNeg(S[n][15:0]) else S[n][15:0]; - S[d] = Zeros(16) : FPMulAdd(FPNeg(S[d][15:0]), op16, S[m][15:0], FPSCR); - when 32 - op32 = if op1_neg then FPNeg(S[n]) else S[n]; - S[d] = FPMulAdd(FPNeg(S[d]), op32, S[m], FPSCR); - when 64 - op64 = if op1_neg then FPNeg(D[n]) else D[n]; - D[d] = FPMulAdd(FPNeg(D[d]), op64, D[m], FPSCR); - -__instruction aarch32_YIELD_A - __encoding aarch32_YIELD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00000001' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_YIELD_T1_A - __instruction_set T16 - __opcode '10111111 00010000 00000000 00000000' - __guard TRUE - __decode - // No additional decoding required - - __encoding aarch32_YIELD_T2_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00000001' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - // No additional decoding required - - __execute __conditional - Hint_Yield(); - -__instruction aarch32_LDRB_i_A - __encoding aarch32_LDRB_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx010x x1x1xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if Rn == '1111' then SEE "LDRB (literal)"; - if P == '0' && W == '1' then SEE "LDRBT"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 || (wback && n == t) then UNPREDICTABLE; - - __encoding aarch32_LDRB_i_T1_A - __instruction_set T16 - __field imm5 22 +: 5 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '01111xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm5, 32); - index = TRUE; add = TRUE; wback = FALSE; - - __encoding aarch32_LDRB_i_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 1001xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "PLD"; - if Rn == '1111' then SEE "LDRB (literal)"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = TRUE; add = TRUE; wback = FALSE; - // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_LDRB_i_T3_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field P 10 +: 1 - __field U 9 +: 1 - __field W 8 +: 1 - __field imm8 0 +: 8 - __opcode '11111000 0001xxxx xxxx1xxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' && P == '1' && U == '0' && W == '0' then SEE "PLD, PLDW (immediate)"; - if Rn == '1111' then SEE "LDRB (literal)"; - if P == '1' && U == '1' && W == '0' then SEE "LDRBT"; - if P == '0' && W == '0' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute - if CurrentInstrSet() == InstrSet_A32 then - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - R[t] = ZeroExtend(MemU[address,1], 32); - if wback then R[n] = offset_addr; - else - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - R[t] = ZeroExtend(MemU[address,1], 32); - if wback then R[n] = offset_addr; - -__instruction aarch32_USAX_A - __encoding aarch32_USAX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0101xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_USAX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1110xxxx 1111xxxx 0100xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum = UInt(R[n][15:0]) + UInt(R[m][31:16]); - diff = UInt(R[n][31:16]) - UInt(R[m][15:0]); - R[d][15:0] = sum[15:0]; - R[d][31:16] = diff[15:0]; - PSTATE.GE[1:0] = if sum >= 0x10000 then '11' else '00'; - PSTATE.GE[3:2] = if diff >= 0 then '11' else '00'; - -__instruction aarch32_VADDL_A - __encoding aarch32_VADDL_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0001 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' || (op == '1' && Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; is_vaddw = (op == '1'); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VADDL_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0001 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' || (op == '1' && Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; is_vaddw = (op == '1'); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - if is_vaddw then - op1 = Int(Elem[Qin[n>>1],e,2*esize], unsigned); - else - op1 = Int(Elem[Din[n],e,esize], unsigned); - result = op1 + Int(Elem[Din[m],e,esize],unsigned); - Elem[Q[d>>1],e,2*esize] = result[2*esize-1:0]; - -__instruction aarch32_STRB_r_A - __encoding aarch32_STRB_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx011x x1x0xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "STRBT"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if t == 15 || m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_STRB_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '0101010x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_STRB_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111000 0000xxxx xxxx0000 00xxxxxx' - __guard TRUE - __decode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if t == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if index then offset_addr else R[n]; - MemU[address,1] = R[t][7:0]; - if wback then R[n] = offset_addr; - -__instruction aarch32_VABD_i_A - __encoding aarch32_VABD_i_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0111 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (U == '1'); long_destination = FALSE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VABD_i_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0111 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (U == '1'); long_destination = FALSE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; - op2 = Elem[Din[m+r],e,esize]; - absdiff = Abs(Int(op1,unsigned) - Int(op2,unsigned)); - if long_destination then - Elem[Q[d>>1],e,2*esize] = absdiff[2*esize-1:0]; - else - Elem[D[d+r],e,esize] = absdiff[esize-1:0]; - -__instruction aarch32_VST4_1_A - __encoding aarch32_VST4_1_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx0011 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if size != '00' then SEE "Related encodings"; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - alignment = if index_align[0] == '0' then 1 else 4; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST4_1_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx0111 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if size != '01' then SEE "Related encodings"; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 8; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST4_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx1011 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if size != '10' then SEE "Related encodings"; - if index_align[1:0] == '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[1:0] == '00' then 1 else 4 << UInt(index_align[1:0]); - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST4_1_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx0011 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if size != '00' then SEE "Related encodings"; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - alignment = if index_align[0] == '0' then 1 else 4; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST4_1_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx0111 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if size != '01' then SEE "Related encodings"; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 8; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST4_1_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx1011 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if size != '10' then SEE "Related encodings"; - if index_align[1:0] == '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[1:0] == '00' then 1 else 4 << UInt(index_align[1:0]); - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = TRUE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - MemU[address, ebytes] = Elem[D[d], index]; - MemU[address+ebytes, ebytes] = Elem[D[d2],index]; - MemU[address+2*ebytes,ebytes] = Elem[D[d3],index]; - MemU[address+3*ebytes,ebytes] = Elem[D[d4],index]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 4*ebytes; - -__instruction aarch32_VMVN_r_A - __encoding aarch32_VMVN_r_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0101 1xx0xxxx' - __guard TRUE - __decode - if size != '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMVN_r_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0101 1xx0xxxx' - __guard TRUE - __decode - if size != '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = NOT(D[m+r]); - -__instruction aarch32_QDADD_A - __encoding aarch32_QDADD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0100xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QDADD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 1001xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (doubled, sat1) = SignedSatQ(2 * SInt(R[n]), 32); - (R[d], sat2) = SignedSatQ(SInt(R[m]) + SInt(doubled), 32); - if sat1 || sat2 then - PSTATE.Q = '1'; - -__instruction aarch32_VQSUB_A - __encoding aarch32_VQSUB_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0010 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQSUB_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0010 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - diff = Int(Elem[D[n+r],e,esize], unsigned) - Int(Elem[D[m+r],e,esize], unsigned); - (Elem[D[d+r],e,esize], sat) = SatQ(diff, esize, unsigned); - if sat then FPSCR.QC = '1'; - -__instruction aarch32_UMLAL_A - __encoding aarch32_UMLAL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0000 101xxxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if dHi == dLo then UNPREDICTABLE; - - __encoding aarch32_UMLAL_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 1110xxxx xxxxxxxx 0000xxxx' - __guard TRUE - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); setflags = FALSE; - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - if dHi == dLo then UNPREDICTABLE; - - __execute __conditional - result = UInt(R[n]) * UInt(R[m]) + UInt(R[dHi]:R[dLo]); - R[dHi] = result[63:32]; - R[dLo] = result[31:0]; - if setflags then - PSTATE.N = result[63]; - PSTATE.Z = IsZeroBit(result[63:0]); - // PSTATE.C, PSTATE.V unchanged - -__instruction aarch32_SEVL_A - __encoding aarch32_SEVL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00000101' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_SEVL_T1_A - __instruction_set T16 - __opcode '10111111 01010000 00000000 00000000' - __guard TRUE - __decode - // No additional decoding required - - __encoding aarch32_SEVL_T2_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00000101' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - // No additional decoding required - - __execute __conditional - SendEventLocal(); - -__instruction aarch32_VLD3_1_A - __encoding aarch32_VLD3_1_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx0010 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD3 (single 3-element structure to all lanes)"; - if index_align[0] != '0' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD3_1_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx0110 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD3 (single 3-element structure to all lanes)"; - if index_align[0] != '0' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD3_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD3 (single 3-element structure to all lanes)"; - if index_align[1:0] != '00' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD3_1_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx0010 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD3 (single 3-element structure to all lanes)"; - if index_align[0] != '0' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD3_1_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx0110 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD3 (single 3-element structure to all lanes)"; - if index_align[0] != '0' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD3_1_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD3 (single 3-element structure to all lanes)"; - if index_align[1:0] != '00' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; - Elem[D[d], index] = MemU[address,ebytes]; - Elem[D[d2],index] = MemU[address+ebytes,ebytes]; - Elem[D[d3],index] = MemU[address+2*ebytes,ebytes]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 3*ebytes; - -__instruction aarch32_STLEXB_A - __encoding aarch32_STLEXB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1100xxxx xxxxxx10 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __encoding aarch32_STLEXB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rd 0 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 1100xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - if AArch32.ExclusiveMonitorsPass(address,1) then - MemO[address, 1] = R[t][7:0]; - R[d] = ZeroExtend('0'); - else - R[d] = ZeroExtend('1'); - -__instruction aarch32_UQADD16_A - __encoding aarch32_UQADD16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0110xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UQADD16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 0101xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = UInt(R[n][15:0]) + UInt(R[m][15:0]); - sum2 = UInt(R[n][31:16]) + UInt(R[m][31:16]); - R[d][15:0] = UnsignedSat(sum1, 16); - R[d][31:16] = UnsignedSat(sum2, 16); - -__instruction aarch32_VFMA_A - __encoding aarch32_VFMA_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x1xxxxx xxxx1100 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - advsimd = TRUE; op1_neg = (op == '1'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VFMA_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x10xxxx xxxx10xx x1x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - advsimd = FALSE; op1_neg = (op == '1'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VFMA_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x1xxxxx xxxx1100 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - advsimd = TRUE; op1_neg = (op == '1'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VFMA_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x10xxxx xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - advsimd = FALSE; op1_neg = (op == '1'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - bits(esize) op1 = Elem[D[n+r],e,esize]; - if op1_neg then op1 = FPNeg(op1); - Elem[D[d+r],e,esize] = FPMulAdd(Elem[D[d+r],e,esize], - op1, Elem[D[m+r],e,esize], StandardFPSCRValue()); - - else // VFP instruction - case esize of - when 16 - op16 = if op1_neg then FPNeg(S[n][15:0]) else S[n][15:0]; - S[d] = Zeros(16) : FPMulAdd(S[d][15:0], op16, S[m][15:0], FPSCR); - when 32 - op32 = if op1_neg then FPNeg(S[n]) else S[n]; - S[d] = FPMulAdd(S[d], op32, S[m], FPSCR); - when 64 - op64 = if op1_neg then FPNeg(D[n]) else D[n]; - D[d] = FPMulAdd(D[d], op64, D[m], FPSCR); - -__instruction aarch32_VCVTA_asimd_A - __encoding aarch32_VCVTA_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field RM 8 +: 2 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx11 xxxx0010 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCVTA_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field RM 8 +: 2 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx11 xxxx0010 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - bits(esize) result; - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPToFixed(Elem[D[m+r],e,esize], 0, unsigned, - StandardFPSCRValue(), rounding); - -__instruction aarch32_CRC32_A - __encoding aarch32_CRC32_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field sz 21 +: 2 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field C 9 +: 1 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0xx0xxxx xxxxxx0x 0100xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 8 == '0' - __decode - if ! HaveCRCExt() then UNDEFINED; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - size = 8 << UInt(sz); - crc32c = (C == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if size == 64 then UNPREDICTABLE; - if cond != '1110' then UNPREDICTABLE; - - __encoding aarch32_CRC32_T1_A - __instruction_set T32 - __field C 20 +: 1 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field sz 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 1100xxxx 1111xxxx 10xxxxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if ! HaveCRCExt() then UNDEFINED; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - size = 8 << UInt(sz); - crc32c = (C == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if size == 64 then UNPREDICTABLE; - - __execute __conditional - - acc = R[n]; // accumulator - val = R[m][size-1:0]; // input value - poly = (if crc32c then 0x1EDC6F41 else 0x04C11DB7)[31:0]; - tempacc = BitReverse(acc):Zeros(size); - tempval = BitReverse(val):Zeros(32); - // Poly32Mod2 on a bitstring does a polynomial Modulus over {0,1} operation - R[d] = BitReverse(Poly32Mod2(tempacc EOR tempval, poly)); - -__instruction aarch32_VEXT_A - __encoding aarch32_VEXT_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field imm4 8 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1x11xxxx xxxxxxxx xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if Q == '0' && imm4[3] == '1' then UNDEFINED; - quadword_operation = (Q == '1'); position = 8 * UInt(imm4); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VEXT_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field imm4 8 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1x11xxxx xxxxxxxx xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if Q == '0' && imm4[3] == '1' then UNDEFINED; - quadword_operation = (Q == '1'); position = 8 * UInt(imm4); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - if quadword_operation then - Q[d>>1] = (Q[m>>1]:Q[n>>1])[position+127:position]; - else - D[d] = (D[m]:D[n])[position+63:position]; - -__instruction aarch32_VRINTZ_vfp_A - __encoding aarch32_VRINTZ_vfp_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110110 xxxx10xx 01x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VRINTZ_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110110 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = Zeros(16) : FPRoundInt(S[m][15:0], FPSCR, rounding, exact); - when 32 - S[d] = FPRoundInt(S[m], FPSCR, rounding, exact); - when 64 - D[d] = FPRoundInt(D[m], FPSCR, rounding, exact); - -__instruction aarch32_RSB_r_A - __encoding aarch32_RSB_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 011xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_RSB_r_T1_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 110xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(NOT(R[n]), shifted, '1'); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VCVT_xv_A - __encoding aarch32_VCVT_xv_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field op 18 +: 1 - __field U 16 +: 1 - __field Vd 12 +: 4 - __field sf 8 +: 2 - __field sx 7 +: 1 - __field i 5 +: 1 - __field imm4 0 +: 4 - __opcode 'xxxx1110 1x111x1x xxxx10xx x1x0xxxx' - __guard cond != '1111' - __decode - if sf == '00' || (sf == '01' && !HaveFP16Ext()) then UNDEFINED; - if sf == '01' && cond != '1110' then UNPREDICTABLE; - to_fixed = (op == '1'); unsigned = (U == '1'); - size = if sx == '0' then 16 else 32; - frac_bits = size - UInt(imm4:i); - case sf of - when '01' fp_size = 16; d = UInt(Vd:D); - when '10' fp_size = 32; d = UInt(Vd:D); - when '11' fp_size = 64; d = UInt(D:Vd); - - if frac_bits < 0 then UNPREDICTABLE; - - __encoding aarch32_VCVT_xv_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 18 +: 1 - __field U 16 +: 1 - __field Vd 12 +: 4 - __field sf 8 +: 2 - __field sx 7 +: 1 - __field i 5 +: 1 - __field imm4 0 +: 4 - __opcode '11101110 1x111x1x xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if sf == '00' || (sf == '01' && !HaveFP16Ext()) then UNDEFINED; - if sf == '01' && InITBlock() then UNPREDICTABLE; - to_fixed = (op == '1'); unsigned = (U == '1'); - size = if sx == '0' then 16 else 32; - frac_bits = size - UInt(imm4:i); - case sf of - when '01' fp_size = 16; d = UInt(Vd:D); - when '10' fp_size = 32; d = UInt(Vd:D); - when '11' fp_size = 64; d = UInt(D:Vd); - - if frac_bits < 0 then UNPREDICTABLE; - - __execute __conditional - CheckVFPEnabled(TRUE); - if to_fixed then - bits(size) result; - case fp_size of - when 16 - result = FPToFixed(S[d][15:0], frac_bits, unsigned, FPSCR, FPRounding_ZERO); - S[d] = Extend(result, 32, unsigned); - when 32 - result = FPToFixed(S[d], frac_bits, unsigned, FPSCR, FPRounding_ZERO); - S[d] = Extend(result, 32, unsigned); - when 64 - result = FPToFixed(D[d], frac_bits, unsigned, FPSCR, FPRounding_ZERO); - D[d] = Extend(result, 64, unsigned); - else - case fp_size of - when 16 - bits(16) fp16 = FixedToFP(S[d][size-1:0], frac_bits, unsigned, FPSCR, FPRounding_TIEEVEN); - S[d] = Zeros(16):fp16; - when 32 - S[d] = FixedToFP(S[d][size-1:0], frac_bits, unsigned, FPSCR, FPRounding_TIEEVEN); - when 64 - D[d] = FixedToFP(D[d][size-1:0], frac_bits, unsigned, FPSCR, FPRounding_TIEEVEN); - -__instruction aarch32_VQRSHRN_A - __encoding aarch32_VQRSHRN_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx100x 01x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if U == '0' && op == '0' then SEE "VRSHRN"; - if Vm[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '01xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '1xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - src_unsigned = (U == '1' && op == '1'); dest_unsigned = (U == '1'); - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VQRSHRN_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx100x 01x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if U == '0' && op == '0' then SEE "VRSHRN"; - if Vm[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '01xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '1xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - src_unsigned = (U == '1' && op == '1'); dest_unsigned = (U == '1'); - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - round_const = 1 << (shift_amount - 1); - for e = 0 to elements-1 - operand = Int(Elem[Qin[m>>1],e,2*esize], src_unsigned); - (result, sat) = SatQ((operand + round_const) >> shift_amount, esize, dest_unsigned); - Elem[D[d],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_VBIF_A - __encoding aarch32_VBIF_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x10xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if op == '00' then SEE "VEOR"; - if op == '01' then operation = VBitOps_VBSL; - if op == '10' then operation = VBitOps_VBIT; - if op == '11' then operation = VBitOps_VBIF; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VBIF_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x10xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if op == '00' then SEE "VEOR"; - if op == '01' then operation = VBitOps_VBSL; - if op == '10' then operation = VBitOps_VBIT; - if op == '11' then operation = VBitOps_VBIF; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - case operation of - when VBitOps_VBIF D[d+r] = (D[d+r] AND D[m+r]) OR (D[n+r] AND NOT(D[m+r])); - when VBitOps_VBIT D[d+r] = (D[n+r] AND D[m+r]) OR (D[d+r] AND NOT(D[m+r])); - when VBitOps_VBSL D[d+r] = (D[n+r] AND D[d+r]) OR (D[m+r] AND NOT(D[d+r])); - -__instruction aarch32_VQDMULL_A - __encoding aarch32_VQDMULL_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx1101 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - scalar_form = FALSE; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 8 << UInt(size); elements = 64 DIV esize; - - __encoding aarch32_VQDMULL_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx1011 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VQDMULL_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx1101 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - scalar_form = FALSE; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 8 << UInt(size); elements = 64 DIV esize; - - __encoding aarch32_VQDMULL_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx1011 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - if scalar_form then op2 = SInt(Elem[Din[m],index,esize]); - for e = 0 to elements-1 - if !scalar_form then op2 = SInt(Elem[Din[m],e,esize]); - op1 = SInt(Elem[Din[n],e,esize]); - // The following only saturates if both op1 and op2 equal -(2^(esize-1)) - (product, sat) = SignedSatQ(2*op1*op2, 2*esize); - Elem[Q[d>>1],e,2*esize] = product; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_SMUSD_A - __encoding aarch32_SMUSD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Rm 8 +: 4 - __field M 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0000xxxx 1111xxxx 01x1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); m_swap = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SMUSD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0100xxxx 1111xxxx 000xxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); m_swap = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand2 = if m_swap then ROR(R[m],16) else R[m]; - product1 = SInt(R[n][15:0]) * SInt(operand2[15:0]); - product2 = SInt(R[n][31:16]) * SInt(operand2[31:16]); - result = product1 - product2; - R[d] = result[31:0]; - // Signed overflow cannot occur - -__instruction aarch32_VMOV_ss_A - __encoding aarch32_VMOV_ss_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field op 20 +: 1 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1100 010xxxxx xxxx1010 00x1xxxx' - __guard cond != '1111' - __decode - to_arm_registers = (op == '1'); t = UInt(Rt); t2 = UInt(Rt2); m = UInt(Vm:M); - if t == 15 || t2 == 15 || m == 31 then UNPREDICTABLE; - if to_arm_registers && t == t2 then UNPREDICTABLE; - - __encoding aarch32_VMOV_ss_T1A1_A - __instruction_set T32 - __field op 20 +: 1 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101100 010xxxxx xxxx1010 00x1xxxx' - __guard TRUE - __decode - to_arm_registers = (op == '1'); t = UInt(Rt); t2 = UInt(Rt2); m = UInt(Vm:M); - if t == 15 || t2 == 15 || m == 31 then UNPREDICTABLE; - if to_arm_registers && t == t2 then UNPREDICTABLE; - - __execute __conditional - CheckVFPEnabled(TRUE); - if to_arm_registers then - R[t] = S[m]; - R[t2] = S[m+1]; - else - S[m] = R[t]; - S[m+1] = R[t2]; - -__instruction aarch32_VORR_i_A - __encoding aarch32_VORR_i_T1A1_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx0xx1 0x01xxxx' - __guard TRUE - __decode - if cmode[0] == '0' || cmode[3:2] == '11' then SEE "VMOV (immediate)"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('0', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VORR_i_T2A2_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx10x1 0x01xxxx' - __guard TRUE - __decode - if cmode[0] == '0' || cmode[3:2] == '11' then SEE "VMOV (immediate)"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('0', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VORR_i_T1A1_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx0xx1 0x01xxxx' - __guard TRUE - __decode - if cmode[0] == '0' || cmode[3:2] == '11' then SEE "VMOV (immediate)"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('0', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VORR_i_T2A2_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx10x1 0x01xxxx' - __guard TRUE - __decode - if cmode[0] == '0' || cmode[3:2] == '11' then SEE "VMOV (immediate)"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('0', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = D[d+r] OR imm64; - -__instruction aarch32_SBC_r_A - __encoding aarch32_SBC_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 110xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_SBC_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rdn 16 +: 3 - __opcode '01000001 10xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdn); n = UInt(Rdn); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_SBC_r_T2_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 011xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], NOT(shifted), PSTATE.C); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VCVTB_A - __encoding aarch32_VCVTB_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field op 16 +: 1 - __field Vd 12 +: 4 - __field sz 8 +: 1 - __field T 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x11001x xxxx101x 01x0xxxx' - __guard cond != '1111' - __decode - uses_double = (sz == '1'); convert_from_half = (op == '0'); - lowbit = (if T == '1' then 16 else 0); - if uses_double then - if convert_from_half then - d = UInt(D:Vd); m = UInt(Vm:M); - else - d = UInt(Vd:D); m = UInt(M:Vm); - else - d = UInt(Vd:D); m = UInt(Vm:M); - - __encoding aarch32_VCVTB_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 16 +: 1 - __field Vd 12 +: 4 - __field sz 8 +: 1 - __field T 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x11001x xxxx101x 01x0xxxx' - __guard TRUE - __decode - uses_double = (sz == '1'); convert_from_half = (op == '0'); - lowbit = (if T == '1' then 16 else 0); - if uses_double then - if convert_from_half then - d = UInt(D:Vd); m = UInt(Vm:M); - else - d = UInt(Vd:D); m = UInt(M:Vm); - else - d = UInt(Vd:D); m = UInt(Vm:M); - - __execute __conditional - CheckVFPEnabled(TRUE); - bits(16) hp; - if convert_from_half then - hp = S[m][lowbit+15:lowbit]; - if uses_double then - D[d] = FPConvert(hp, FPSCR); - else - S[d] = FPConvert(hp, FPSCR); - else - if uses_double then - hp = FPConvert(D[m], FPSCR); - else - hp = FPConvert(S[m], FPSCR); - S[d][lowbit+15:lowbit] = hp; - -__instruction aarch32_BXJ_A - __encoding aarch32_BXJ_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0010xxxx xxxxxxxx 0010xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - m = UInt(Rm); - if m == 15 then UNPREDICTABLE; - - __encoding aarch32_BXJ_T1_A - __instruction_set T32 - __field Rm 16 +: 4 - __opcode '11110011 1100xxxx 10x0xxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 4 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - m = UInt(Rm); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - BXWritePC(R[m], BranchType_INDIR); - -__instruction aarch32_SHA1SU0_A - __encoding aarch32_SHA1SU0_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x11xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if !HaveSHA1Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_SHA1SU0_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x11xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA1Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - op1 = Q[d>>1]; op2 = Q[n>>1]; op3 = Q[m>>1]; - op2 = op2[63:0] : op1[127:64]; - Q[d>>1] = op1 EOR op2 EOR op3; - -__instruction aarch32_LDRH_r_A - __encoding aarch32_LDRH_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx000x x0x1xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if P == '0' && W == '1' then SEE "LDRHT"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - (shift_t, shift_n) = (SRType_LSL, 0); - if t == 15 || m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_LDRH_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '0101101x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_LDRH_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111000 0011xxxx xxxx0000 00xxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDRH (literal)"; - if Rt == '1111' then SEE "PLDW (register)"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if index then offset_addr else R[n]; - data = MemU[address,2]; - if wback then R[n] = offset_addr; - R[t] = ZeroExtend(data, 32); - -__instruction aarch32_VDOT_A - __encoding aarch32_VDOT_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if !HaveDOTPExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - boolean signed = U=='0'; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer esize = 32; - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_VDOT_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveDOTPExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - boolean signed = U=='0'; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer esize = 32; - integer regs = if Q == '1' then 2 else 1; - - __execute - bits(64) operand1; - bits(64) operand2; - bits(64) result; - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - operand1 = D[n+r]; - operand2 = D[m+r]; - result = D[d+r]; - integer element1, element2; - for e = 0 to 1 - integer res = 0; - for i = 0 to 3 - if signed then - element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = SInt(Elem[operand2, 4 * e + i, esize DIV 4]); - else - element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = UInt(Elem[operand2, 4 * e + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = Elem[result, e, esize] + res; - D[d+r] = result; - -__instruction aarch32_VQSHL_i_A - __encoding aarch32_VQSHL_i_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx011x xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if U == '0' && op == '0' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = UInt(imm6) - 8; - when '001xxxx' esize = 16; elements = 4; shift_amount = UInt(imm6) - 16; - when '01xxxxx' esize = 32; elements = 2; shift_amount = UInt(imm6) - 32; - when '1xxxxxx' esize = 64; elements = 1; shift_amount = UInt(imm6); - src_unsigned = (U == '1' && op == '1'); dest_unsigned = (U == '1'); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQSHL_i_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx011x xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if U == '0' && op == '0' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = UInt(imm6) - 8; - when '001xxxx' esize = 16; elements = 4; shift_amount = UInt(imm6) - 16; - when '01xxxxx' esize = 32; elements = 2; shift_amount = UInt(imm6) - 32; - when '1xxxxxx' esize = 64; elements = 1; shift_amount = UInt(imm6); - src_unsigned = (U == '1' && op == '1'); dest_unsigned = (U == '1'); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - operand = Int(Elem[D[m+r],e,esize], src_unsigned); - (result, sat) = SatQ(operand << shift_amount, esize, dest_unsigned); - Elem[D[d+r],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_AESMC_A - __encoding aarch32_AESMC_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0011 10x0xxxx' - __guard TRUE - __decode - if !HaveAESExt() then UNDEFINED; - if size != '00' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_AESMC_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0011 10x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAESExt() then UNDEFINED; - if size != '00' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - Q[d>>1] = AESMixColumns(Q[m>>1]); - -__instruction aarch32_BLX_r_A - __encoding aarch32_BLX_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0010xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - m = UInt(Rm); - if m == 15 then UNPREDICTABLE; - - __encoding aarch32_BLX_r_T1_A - __instruction_set T16 - __field Rm 19 +: 4 - __opcode '01000111 1xxxxxxx 00000000 00000000' - __guard TRUE - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - m = UInt(Rm); - if m == 15 then UNPREDICTABLE; - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - target = R[m]; - if CurrentInstrSet() == InstrSet_A32 then - next_instr_addr = PC - 4; - LR = next_instr_addr; - else - next_instr_addr = PC - 2; - LR = next_instr_addr[31:1] : '1'; - BXWritePC(target, BranchType_INDCALL); - -__instruction aarch32_EOR_i_A - __encoding aarch32_EOR_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 001xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = A32ExpandImm_C(imm12, PSTATE.C); - - __encoding aarch32_EOR_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x00 100xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rd == '1111' && S == '1' then SEE "TEQ (immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if (d == 15 && !setflags) || n == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = R[n] EOR imm32; - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_LDRSB_l_A - __encoding aarch32_LDRSB_l_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x11111 xxxxxxxx 1101xxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "LDRSBT"; - t = UInt(Rt); imm32 = ZeroExtend(imm4H:imm4L, 32); - add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 || wback then UNPREDICTABLE; - - __encoding aarch32_LDRSB_l_T1_A - __instruction_set T32 - __field U 23 +: 1 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111001 x0011111 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "PLI"; - t = UInt(Rt); imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - base = Align(PC,4); - address = if add then (base + imm32) else (base - imm32); - R[t] = SignExtend(MemU[address,1], 32); - -__instruction aarch32_VADD_i_A - __encoding aarch32_VADD_i_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0xxxxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VADD_i_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0xxxxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = Elem[D[n+r],e,esize] + Elem[D[m+r],e,esize]; - -__instruction aarch32_VQDMLAL_A - __encoding aarch32_VQDMLAL_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx1001 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - add = (op == '0'); - scalar_form = FALSE; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 8 << UInt(size); elements = 64 DIV esize; - - __encoding aarch32_VQDMLAL_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx0011 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - add = (op == '0'); - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VQDMLAL_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx1001 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - add = (op == '0'); - scalar_form = FALSE; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 8 << UInt(size); elements = 64 DIV esize; - - __encoding aarch32_VQDMLAL_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx0011 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - add = (op == '0'); - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - if scalar_form then op2 = SInt(Elem[Din[m],index,esize]); - for e = 0 to elements-1 - if !scalar_form then op2 = SInt(Elem[Din[m],e,esize]); - op1 = SInt(Elem[Din[n],e,esize]); - // The following only saturates if both op1 and op2 equal -(2^(esize-1)) - (product, sat1) = SignedSatQ(2*op1*op2, 2*esize); - if add then - result = SInt(Elem[Qin[d>>1],e,2*esize]) + SInt(product); - else - result = SInt(Elem[Qin[d>>1],e,2*esize]) - SInt(product); - (Elem[Q[d>>1],e,2*esize], sat2) = SignedSatQ(result, 2*esize); - if sat1 || sat2 then FPSCR.QC = '1'; - -__instruction aarch32_CMN_i_A - __encoding aarch32_CMN_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 0111xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_CMN_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field imm8 0 +: 8 - __opcode '11110x01 0001xxxx 0xxx1111 xxxxxxxx' - __guard TRUE - __decode - n = UInt(Rn); imm32 = T32ExpandImm(i:imm3:imm8); - if n == 15 then UNPREDICTABLE; - - __execute __conditional - (result, nzcv) = AddWithCarry(R[n], imm32, '0'); - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VCVTA_vfp_A - __encoding aarch32_VCVTA_vfp_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111101 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '0'); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - - __encoding aarch32_VCVTA_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111101 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '0'); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = FPToFixed(S[m][15:0], 0, unsigned, FPSCR, rounding); - when 32 - S[d] = FPToFixed(S[m], 0, unsigned, FPSCR, rounding); - when 64 - S[d] = FPToFixed(D[m], 0, unsigned, FPSCR, rounding); - -__instruction aarch32_PLD_i_A - __encoding aarch32_PLD_i_A1_A - __instruction_set A32 - __field U 23 +: 1 - __field R 22 +: 1 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - __opcode '11110101 xx01xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - if Rn == '1111' then SEE "PLD (literal)"; - n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); add = (U == '1'); is_pldw = (R == '0'); - - __encoding aarch32_PLD_i_T1_A - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 10x1xxxx 1111xxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "PLD (literal)"; - n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); add = TRUE; is_pldw = (W == '1'); - - __encoding aarch32_PLD_i_T2_A - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field imm8 0 +: 8 - __opcode '11111000 00x1xxxx 11111100 xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "PLD (literal)"; - n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); add = FALSE; is_pldw = (W == '1'); - - __execute __conditional - address = if add then (R[n] + imm32) else (R[n] - imm32); - if is_pldw then - Hint_PreloadDataForWrite(address); - else - Hint_PreloadData(address); - -__instruction aarch32_VCLT_i_A - __encoding aarch32_VCLT_i_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx01 xxxx0x10 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCLT_i_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx01 xxxx0x10 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - bits(esize) zero = FPZero('0'); - test_passed = FPCompareGT(zero, Elem[D[m+r],e,esize], StandardFPSCRValue()); - else - test_passed = (SInt(Elem[D[m+r],e,esize]) < 0); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_VMLA_s_A - __encoding aarch32_VMLA_s_A1_A - __instruction_set A32 - __field Q 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field F 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx000x x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || (F == '1' && size == '01' && !HaveFP16Ext()) then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - add = (op == '0'); floating_point = (F == '1'); long_destination = FALSE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VMLA_s_T1_A - __instruction_set T32 - __field Q 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field F 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx000x x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || (F == '1' && size == '01' && !HaveFP16Ext()) then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - add = (op == '0'); floating_point = (F == '1'); long_destination = FALSE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - op2 = Elem[Din[m],index,esize]; op2val = Int(op2, unsigned); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; op1val = Int(op1, unsigned); - if floating_point then - fp_addend = if add then FPMul(op1,op2,StandardFPSCRValue()) else FPNeg(FPMul(op1,op2,StandardFPSCRValue())); - Elem[D[d+r],e,esize] = FPAdd(Elem[Din[d+r],e,esize], fp_addend, StandardFPSCRValue()); - else - addend = if add then op1val*op2val else -op1val*op2val; - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + addend; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + addend; - -__instruction aarch32_MRRC_A - __encoding aarch32_MRRC_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field coproc 8 +: 4 - __field opc1 4 +: 4 - __field CRm 0 +: 4 - __opcode 'xxxx1100 0101xxxx xxxx111x xxxxxxxx' - __guard cond != '1111' - __decode - t = UInt(Rt); t2 = UInt(Rt2); cp = if coproc[0] == '0' then 14 else 15; - if t == 15 || t2 == 15 || t == t2 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_MRRC_T1A1_A - __instruction_set T32 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field coproc 8 +: 4 - __field opc1 4 +: 4 - __field CRm 0 +: 4 - __opcode '11101100 0101xxxx xxxx111x xxxxxxxx' - __guard TRUE - __decode - t = UInt(Rt); t2 = UInt(Rt2); cp = if coproc[0] == '0' then 14 else 15; - if t == 15 || t2 == 15 || t == t2 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - value = AArch32.SysRegRead64(cp, ThisInstr()); - R[t] = value[31:0]; - R[t2] = value[63:32]; - -__instruction aarch32_VDUP_r_A - __encoding aarch32_VDUP_r_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field B 22 +: 1 - __field Q 21 +: 1 - __field Vd 16 +: 4 - __field Rt 12 +: 4 - __field D 7 +: 1 - __field E 5 +: 1 - __opcode 'xxxx1110 1xx0xxxx xxxx1011 x0x1xxxx' - __guard cond != '1111' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if Q == '1' && Vd[0] == '1' then UNDEFINED; - d = UInt(D:Vd); t = UInt(Rt); regs = if Q == '0' then 1 else 2; - case B:E of - when '00' esize = 32; elements = 2; - when '01' esize = 16; elements = 4; - when '10' esize = 8; elements = 8; - when '11' UNDEFINED; - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_VDUP_r_T1A1_A - __instruction_set T32 - __field B 22 +: 1 - __field Q 21 +: 1 - __field Vd 16 +: 4 - __field Rt 12 +: 4 - __field D 7 +: 1 - __field E 5 +: 1 - __opcode '11101110 1xx0xxxx xxxx1011 x0x1xxxx' - __guard TRUE - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if Q == '1' && Vd[0] == '1' then UNDEFINED; - d = UInt(D:Vd); t = UInt(Rt); regs = if Q == '0' then 1 else 2; - case B:E of - when '00' esize = 32; elements = 2; - when '01' esize = 16; elements = 4; - when '10' esize = 8; elements = 8; - when '11' UNDEFINED; - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - CheckAdvSIMDEnabled(); - scalar = R[t][esize-1:0]; - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = scalar; - -__instruction aarch32_VBIF_A - __encoding aarch32_VBIF_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x01xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if op == '00' then SEE "VEOR"; - if op == '01' then operation = VBitOps_VBSL; - if op == '10' then operation = VBitOps_VBIT; - if op == '11' then operation = VBitOps_VBIF; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VBIF_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x01xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if op == '00' then SEE "VEOR"; - if op == '01' then operation = VBitOps_VBSL; - if op == '10' then operation = VBitOps_VBIT; - if op == '11' then operation = VBitOps_VBIF; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - case operation of - when VBitOps_VBIF D[d+r] = (D[d+r] AND D[m+r]) OR (D[n+r] AND NOT(D[m+r])); - when VBitOps_VBIT D[d+r] = (D[n+r] AND D[m+r]) OR (D[d+r] AND NOT(D[m+r])); - when VBitOps_VBSL D[d+r] = (D[n+r] AND D[d+r]) OR (D[m+r] AND NOT(D[d+r])); - -__instruction aarch32_SHADD16_A - __encoding aarch32_SHADD16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0011xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SHADD16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 0010xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = SInt(R[n][15:0]) + SInt(R[m][15:0]); - sum2 = SInt(R[n][31:16]) + SInt(R[m][31:16]); - R[d][15:0] = sum1[16:1]; - R[d][31:16] = sum2[16:1]; - -__instruction aarch32_VHADD_A - __encoding aarch32_VHADD_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0010 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - add = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VHADD_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0010 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - add = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Int(Elem[D[n+r],e,esize], unsigned); - op2 = Int(Elem[D[m+r],e,esize], unsigned); - result = if add then op1+op2 else op1-op2; - Elem[D[d+r],e,esize] = result[esize:1]; - -__instruction aarch32_IT_A - __encoding aarch32_IT_T1_A - __instruction_set T16 - __field firstcond 20 +: 4 - __field mask 16 +: 4 - __opcode '10111111 xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - if mask == '0000' then SEE "Related encodings"; - if firstcond == '1111' || (firstcond == '1110' && BitCount(mask) != 1) then UNPREDICTABLE; - if InITBlock() then UNPREDICTABLE; - - __execute - AArch32.CheckITEnabled(mask); - PSTATE.IT[7:0] = firstcond:mask; - ShouldAdvanceIT = FALSE; - -__instruction aarch32_SXTAH_A - __encoding aarch32_SXTAH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1011xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if Rn == '1111' then SEE "SXTH"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SXTAH_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 0000xxxx 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - if Rn == '1111' then SEE "SXTH"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d] = R[n] + SignExtend(rotated[15:0], 32); - -__instruction aarch32_MMLA_A - __encoding aarch32_MMLA_A1_A - __instruction_set A32 - __field B 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1100 x1x1xxxx' - __guard TRUE - __decode - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - - __encoding aarch32_MMLA_T1_A - __instruction_set T32 - __field B 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1100 x1x1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - - __execute - CheckAdvSIMDEnabled(); - bits(128) operand1 = Q[n>>1]; - bits(128) operand2 = Q[m>>1]; - bits(128) addend = Q[d>>1]; - - Q[d>>1] = MatMulAdd(addend, operand1, operand2, op1_unsigned, op2_unsigned); - -__instruction aarch32_CPS_AS - __encoding aarch32_CPS_A1_AS - __instruction_set A32 - __field imod 18 +: 2 - __field M 17 +: 1 - __field A 8 +: 1 - __field I 7 +: 1 - __field F 6 +: 1 - __field mode 0 +: 5 - __opcode '11110001 0000xxx0 xxxxxxxx xx0xxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __decode - if mode != '00000' && M == '0' then UNPREDICTABLE; - if (imod[1] == '1' && A:I:F == '000') || (imod[1] == '0' && A:I:F != '000') then UNPREDICTABLE; - enable = (imod == '10'); disable = (imod == '11'); changemode = (M == '1'); - affectA = (A == '1'); affectI = (I == '1'); affectF = (F == '1'); - if (imod == '00' && M == '0') || imod == '01' then UNPREDICTABLE; - - __encoding aarch32_CPS_T1_AS - __instruction_set T16 - __field im 20 +: 1 - __field A 18 +: 1 - __field I 17 +: 1 - __field F 16 +: 1 - __opcode '10110110 011xxxxx 00000000 00000000' - __guard TRUE - __unpredictable_unless 19 == '0' - __decode - if A:I:F == '000' then UNPREDICTABLE; - enable = (im == '0'); disable = (im == '1'); changemode = FALSE; - affectA = (A == '1'); affectI = (I == '1'); affectF = (F == '1'); - if InITBlock() then UNPREDICTABLE; - - __encoding aarch32_CPS_T2_AS - __instruction_set T32 - __field imod 9 +: 2 - __field M 8 +: 1 - __field A 7 +: 1 - __field I 6 +: 1 - __field F 5 +: 1 - __field mode 0 +: 5 - __opcode '11110011 1010xxxx 10x0xxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - if imod == '00' && M == '0' then SEE "Hint instructions"; - if mode != '00000' && M == '0' then UNPREDICTABLE; - if (imod[1] == '1' && A:I:F == '000') || (imod[1] == '0' && A:I:F != '000') then UNPREDICTABLE; - enable = (imod == '10'); disable = (imod == '11'); changemode = (M == '1'); - affectA = (A == '1'); affectI = (I == '1'); affectF = (F == '1'); - if imod == '01' || InITBlock() then UNPREDICTABLE; - - __execute - if CurrentInstrSet() == InstrSet_A32 then - if PSTATE.EL != EL0 then - if enable then - if affectA then PSTATE.A = '0'; - if affectI then PSTATE.I = '0'; - if affectF then PSTATE.F = '0'; - if disable then - if affectA then PSTATE.A = '1'; - if affectI then PSTATE.I = '1'; - if affectF then PSTATE.F = '1'; - if changemode then - // AArch32.WriteModeByInstr() sets PSTATE.IL to 1 if this is an illegal mode change. - AArch32.WriteModeByInstr(mode); - else - if PSTATE.EL != EL0 then - if enable then - if affectA then PSTATE.A = '0'; - if affectI then PSTATE.I = '0'; - if affectF then PSTATE.F = '0'; - if disable then - if affectA then PSTATE.A = '1'; - if affectI then PSTATE.I = '1'; - if affectF then PSTATE.F = '1'; - if changemode then - // AArch32.WriteModeByInstr() sets PSTATE.IL to 1 if this is an illegal mode change. - AArch32.WriteModeByInstr(mode); - -__instruction aarch32_SDIV_A - __encoding aarch32_SDIV_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0001xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - if d == 15 || n == 15 || m == 15 || a != 15 then UNPREDICTABLE; - - __encoding aarch32_SDIV_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 1001xxxx xxxxxxxx 1111xxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - if d == 15 || n == 15 || m == 15 || a != 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - if SInt(R[m]) == 0 then - result = 0; - else - result = RoundTowardsZero(Real(SInt(R[n])) / Real(SInt(R[m]))); - R[d] = result[31:0]; - -__instruction aarch32_VMAX_f_A - __encoding aarch32_VMAX_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x1xxxxx xxxx1111 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - maximum = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMAX_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x1xxxxx xxxx1111 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - maximum = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[n+r],e,esize]; op2 = Elem[D[m+r],e,esize]; - if maximum then - Elem[D[d+r],e,esize] = FPMax(op1, op2, StandardFPSCRValue()); - else - Elem[D[d+r],e,esize] = FPMin(op1, op2, StandardFPSCRValue()); - -__instruction aarch32_VCVTA_vfp_A - __encoding aarch32_VCVTA_vfp_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111100 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '0'); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - - __encoding aarch32_VCVTA_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111100 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '0'); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = FPToFixed(S[m][15:0], 0, unsigned, FPSCR, rounding); - when 32 - S[d] = FPToFixed(S[m], 0, unsigned, FPSCR, rounding); - when 64 - S[d] = FPToFixed(D[m], 0, unsigned, FPSCR, rounding); - -__instruction aarch32_VABA_A - __encoding aarch32_VABA_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0111 xxx1xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (U == '1'); long_destination = FALSE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VABA_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0111 xxx1xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (U == '1'); long_destination = FALSE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; - op2 = Elem[Din[m+r],e,esize]; - absdiff = Abs(Int(op1,unsigned) - Int(op2,unsigned)); - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + absdiff; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + absdiff; - -__instruction aarch32_SVC_A - __encoding aarch32_SVC_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm24 0 +: 24 - __opcode 'xxxx1111 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - imm32 = ZeroExtend(imm24, 32); - - __encoding aarch32_SVC_T1_A - __instruction_set T16 - __field imm8 16 +: 8 - __opcode '11011111 xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - imm32 = ZeroExtend(imm8, 32); - - __execute __conditional - AArch32.CheckForSVCTrap(imm32[15:0]); - AArch32.CallSupervisor(imm32[15:0]); - -__instruction aarch32_STMDB_A - __encoding aarch32_STMDB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx1001 00x0xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - - __encoding aarch32_STMDB_T1_A - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field P 15 +: 1 - __field M 14 +: 1 - __field register_list 0 +: 14 - __opcode '11101001 00x0xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - n = UInt(Rn); registers = P:M:register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 2 then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - if registers[13] == '1' then UNPREDICTABLE; - if registers[15] == '1' then UNPREDICTABLE; - - __execute __conditional - address = R[n] - 4*BitCount(registers); - for i = 0 to 14 - if registers[i] == '1' then - if i == n && wback && i != LowestSetBit(registers) then - MemA[address,4] = bits(32) UNKNOWN; // Only possible for encoding A1 - else - MemA[address,4] = R[i]; - address = address + 4; - if registers[15] == '1' then // Only possible for encoding A1 - MemA[address,4] = PCStoreValue(); - if wback then R[n] = R[n] - 4*BitCount(registers); - -__instruction aarch32_VMLA_s_A - __encoding aarch32_VMLA_s_T2A2_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0110 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); add = (op == '0'); floating_point = FALSE; long_destination = TRUE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = 1; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VMLA_s_T2A2_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0110 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); add = (op == '0'); floating_point = FALSE; long_destination = TRUE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = 1; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - op2 = Elem[Din[m],index,esize]; op2val = Int(op2, unsigned); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; op1val = Int(op1, unsigned); - if floating_point then - fp_addend = if add then FPMul(op1,op2,StandardFPSCRValue()) else FPNeg(FPMul(op1,op2,StandardFPSCRValue())); - Elem[D[d+r],e,esize] = FPAdd(Elem[Din[d+r],e,esize], fp_addend, StandardFPSCRValue()); - else - addend = if add then op1val*op2val else -op1val*op2val; - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + addend; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + addend; - -__instruction aarch32_MCR_A - __encoding aarch32_MCR_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field opc1 21 +: 3 - __field CRn 16 +: 4 - __field Rt 12 +: 4 - __field coproc 8 +: 4 - __field opc2 5 +: 3 - __field CRm 0 +: 4 - __opcode 'xxxx1110 xxx0xxxx xxxx111x xxx1xxxx' - __guard cond != '1111' - __decode - t = UInt(Rt); cp = if coproc[0] == '0' then 14 else 15; - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_MCR_T1A1_A - __instruction_set T32 - __field opc1 21 +: 3 - __field CRn 16 +: 4 - __field Rt 12 +: 4 - __field coproc 8 +: 4 - __field opc2 5 +: 3 - __field CRm 0 +: 4 - __opcode '11101110 xxx0xxxx xxxx111x xxx1xxxx' - __guard TRUE - __decode - t = UInt(Rt); cp = if coproc[0] == '0' then 14 else 15; - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - AArch32.SysRegWrite(cp, ThisInstr(), R[t]); - -__instruction aarch32_VTRN_A - __encoding aarch32_VTRN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0000 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VTRN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0000 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - h = elements DIV 2; - - for r = 0 to regs-1 - if d == m then - D[d+r] = bits(64) UNKNOWN; - else - for e = 0 to h-1 - Elem[D[d+r],2*e+1,esize] = Elem[Din[m+r],2*e,esize]; - Elem[D[m+r],2*e,esize] = Elem[Din[d+r],2*e+1,esize]; - -__instruction aarch32_VLDM_A - __encoding aarch32_VLDM_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode 'xxxx110x xxx1xxxx xxxx1011 xxxxxxx0' - __guard cond != '1111' - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VLDR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = FALSE; add = (U == '1'); wback = (W == '1'); - d = UInt(D:Vd); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - regs = UInt(imm8) DIV 2; // If UInt(imm8) is odd, see "FLDM*X". - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if imm8[0] == '1' && (d+regs) > 16 then UNPREDICTABLE; - - __encoding aarch32_VLDM_T2A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode 'xxxx110x xxx1xxxx xxxx1010 xxxxxxxx' - __guard cond != '1111' - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VLDR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = TRUE; add = (U == '1'); wback = (W == '1'); d = UInt(Vd:D); n = UInt(Rn); - imm32 = ZeroExtend(imm8:'00', 32); regs = UInt(imm8); - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || (d+regs) > 32 then UNPREDICTABLE; - - __encoding aarch32_VLDM_T1A1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode '1110110x xxx1xxxx xxxx1011 xxxxxxx0' - __guard TRUE - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VLDR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = FALSE; add = (U == '1'); wback = (W == '1'); - d = UInt(D:Vd); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - regs = UInt(imm8) DIV 2; // If UInt(imm8) is odd, see "FLDM*X". - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if imm8[0] == '1' && (d+regs) > 16 then UNPREDICTABLE; - - __encoding aarch32_VLDM_T2A2_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode '1110110x xxx1xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VLDR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = TRUE; add = (U == '1'); wback = (W == '1'); d = UInt(Vd:D); n = UInt(Rn); - imm32 = ZeroExtend(imm8:'00', 32); regs = UInt(imm8); - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || (d+regs) > 32 then UNPREDICTABLE; - - __execute __conditional - CheckVFPEnabled(TRUE); - address = if add then R[n] else R[n]-imm32; - for r = 0 to regs-1 - if single_regs then - S[d+r] = MemA[address,4]; address = address+4; - else - word1 = MemA[address,4]; word2 = MemA[address+4,4]; address = address+8; - // Combine the word-aligned words in the correct order for current endianness. - D[d+r] = if BigEndian() then word1:word2 else word2:word1; - if wback then R[n] = if add then R[n]+imm32 else R[n]-imm32; - -__instruction aarch32_AND_rr_A - __encoding aarch32_AND_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 000xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] AND shifted; - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_LDRD_i_A - __encoding aarch32_LDRD_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x0xxxx xxxxxxxx 1101xxxx' - __guard cond != '1111' - __decode - if Rn == '1111' then SEE "LDRD (literal)"; - if Rt[0] == '1' then UNPREDICTABLE; - t = UInt(Rt); t2 = t+1; n = UInt(Rn); imm32 = ZeroExtend(imm4H:imm4L, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if P == '0' && W == '1' then UNPREDICTABLE; - if wback && (n == t || n == t2) then UNPREDICTABLE; - if t2 == 15 then UNPREDICTABLE; - - __encoding aarch32_LDRD_i_T1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field imm8 0 +: 8 - __opcode '1110100x x1x1xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if P == '0' && W == '0' then SEE "Related encodings"; - if Rn == '1111' then SEE "LDRD (literal)"; - t = UInt(Rt); t2 = UInt(Rt2); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if wback && (n == t || n == t2) then UNPREDICTABLE; - if t == 15 || t2 == 15 || t == t2 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - if address == Align(address, 8) then - data = MemA[address,8]; - if BigEndian() then - R[t] = data[63:32]; - R[t2] = data[31:0]; - else - R[t] = data[31:0]; - R[t2] = data[63:32]; - else - R[t] = MemA[address,4]; - R[t2] = MemA[address+4,4]; - if wback then R[n] = offset_addr; - -__instruction aarch32_PLD_l_A - __encoding aarch32_PLD_l_A1_A - __instruction_set A32 - __field U 23 +: 1 - __field imm12 0 +: 12 - __opcode '11110101 xx011111 xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 22 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - - __encoding aarch32_PLD_l_T1_A - __instruction_set T32 - __field U 23 +: 1 - __field imm12 0 +: 12 - __opcode '11111000 x0x11111 1111xxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 21 == '0' - __decode - imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - - __execute __conditional - address = if add then (Align(PC,4) + imm32) else (Align(PC,4) - imm32); - Hint_PreloadData(address); - -__instruction aarch32_VRINTA_asimd_A - __encoding aarch32_VRINTA_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0110 1xx0xxxx' - __guard TRUE - __decode - if op[2] != op[0] then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - // Rounding encoded differently from other VCVT and VRINT instructions - rounding = FPDecodeRM(op[2]:NOT(op[1])); exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRINTA_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0110 1xx0xxxx' - __guard TRUE - __decode - if op[2] != op[0] then SEE "Related encodings"; - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - // Rounding encoded differently from other VCVT and VRINT instructions - rounding = FPDecodeRM(op[2]:NOT(op[1])); exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[m+r],e,esize]; - result = FPRoundInt(op1, StandardFPSCRValue(), rounding, exact); - Elem[D[d+r],e,esize] = result; - -__instruction aarch32_STREX_A - __encoding aarch32_STREX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1000xxxx xxxxxx11 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); imm32 = Zeros(32); // Zero offset - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __encoding aarch32_STREX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11101000 0100xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if d == n || d == t then UNPREDICTABLE; - - __execute __conditional - address = R[n] + imm32; - if AArch32.ExclusiveMonitorsPass(address,4) then - MemA[address,4] = R[t]; - R[d] = ZeroExtend('0'); - else - R[d] = ZeroExtend('1'); - -__instruction aarch32_SXTH_A - __encoding aarch32_SXTH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 10111111 xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SXTH_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '10110010 00xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); rotation = 0; - - __encoding aarch32_SXTH_T2_A - __instruction_set T32 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 00001111 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d] = SignExtend(rotated[15:0], 32); - -__instruction aarch32_CMN_r_A - __encoding aarch32_CMN_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0111xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_CMN_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rn 16 +: 3 - __opcode '01000010 11xxxxxx 00000000 00000000' - __guard TRUE - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_CMN_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 0001xxxx xxxx1111 xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], shifted, '0'); - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_LDMDB_A - __encoding aarch32_LDMDB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx1001 00x1xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - - __encoding aarch32_LDMDB_T1_A - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field P 15 +: 1 - __field M 14 +: 1 - __field register_list 0 +: 14 - __opcode '11101001 00x1xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - n = UInt(Rn); registers = P:M:register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 2 || (P == '1' && M == '1') then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - if registers[13] == '1' then UNPREDICTABLE; - if registers[15] == '1' && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - address = R[n] - 4*BitCount(registers); - for i = 0 to 14 - if registers[i] == '1' then - R[i] = MemA[address,4]; address = address + 4; - if registers[15] == '1' then - LoadWritePC(MemA[address,4]); - if wback && registers[n] == '0' then R[n] = R[n] - 4*BitCount(registers); - if wback && registers[n] == '1' then R[n] = bits(32) UNKNOWN; - -__instruction aarch32_LDRH_i_A - __encoding aarch32_LDRH_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x1xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __decode - if Rn == '1111' then SEE "LDRH (literal)"; - if P == '0' && W == '1' then SEE "LDRHT"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm4H:imm4L, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 || (wback && n == t) then UNPREDICTABLE; - - __encoding aarch32_LDRH_i_T1_A - __instruction_set T16 - __field imm5 22 +: 5 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '10001xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm5:'0', 32); - index = TRUE; add = TRUE; wback = FALSE; - - __encoding aarch32_LDRH_i_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 1011xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "PLD (immediate)"; - if Rn == '1111' then SEE "LDRH (literal)"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = TRUE; add = TRUE; wback = FALSE; - // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_LDRH_i_T3_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field P 10 +: 1 - __field U 9 +: 1 - __field W 8 +: 1 - __field imm8 0 +: 8 - __opcode '11111000 0011xxxx xxxx1xxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDRH (literal)"; - if Rt == '1111' && P == '1' && U == '0' && W == '0' then SEE "PLDW (immediate)"; - if P == '1' && U == '1' && W == '0' then SEE "LDRHT"; - if P == '0' && W == '0' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute - if CurrentInstrSet() == InstrSet_A32 then - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - data = MemU[address,2]; - if wback then R[n] = offset_addr; - R[t] = ZeroExtend(data, 32); - else - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - data = MemU[address,2]; - if wback then R[n] = offset_addr; - R[t] = ZeroExtend(data, 32); - -__instruction aarch32_VCVT_iv_A - __encoding aarch32_VCVT_iv_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field opc2 16 +: 3 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x11110x xxxx10xx 11x0xxxx' - __guard cond != '1111' - __decode - if opc2 != '000' && opc2 != '10x' then SEE "Related encodings"; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - to_integer = (opc2[2] == '1'); - if to_integer then - unsigned = (opc2[0] == '0'); - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - else - unsigned = (op == '0'); - rounding = FPRoundingMode(FPSCR); - m = UInt(Vm:M); - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __encoding aarch32_VCVT_iv_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field opc2 16 +: 3 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x11110x xxxx10xx 11x0xxxx' - __guard TRUE - __decode - if opc2 != '000' && opc2 != '10x' then SEE "Related encodings"; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - to_integer = (opc2[2] == '1'); - if to_integer then - unsigned = (opc2[0] == '0'); - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - else - unsigned = (op == '0'); - rounding = FPRoundingMode(FPSCR); - m = UInt(Vm:M); - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __execute __conditional - CheckVFPEnabled(TRUE); - if to_integer then - case esize of - when 16 - S[d] = FPToFixed(S[m][15:0], 0, unsigned, FPSCR, rounding); - when 32 - S[d] = FPToFixed(S[m], 0, unsigned, FPSCR, rounding); - when 64 - S[d] = FPToFixed(D[m], 0, unsigned, FPSCR, rounding); - else - case esize of - when 16 - bits(16) fp16 = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - S[d] = Zeros(16):fp16; - when 32 - S[d] = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - when 64 - D[d] = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - -__instruction aarch32_VTBL_A - __encoding aarch32_VTBL_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field len 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xxxx xxxx10xx xxx0xxxx' - __guard TRUE - __decode - is_vtbl = (op == '0'); length = UInt(len)+1; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - if n+length > 32 then UNPREDICTABLE; - - __encoding aarch32_VTBL_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field len 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xxxx xxxx10xx xxx0xxxx' - __guard TRUE - __decode - is_vtbl = (op == '0'); length = UInt(len)+1; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - if n+length > 32 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - - // Create 256-bit = 32-byte table variable, with zeros in entries that will not be used. - table3 = if length == 4 then D[n+3] else Zeros(64); - table2 = if length >= 3 then D[n+2] else Zeros(64); - table1 = if length >= 2 then D[n+1] else Zeros(64); - table = table3 : table2 : table1 : D[n]; - - for i = 0 to 7 - index = UInt(Elem[D[m],i,8]); - if index < 8*length then - Elem[D[d],i,8] = Elem[table,index,8]; - else - if is_vtbl then - Elem[D[d],i,8] = Zeros(8); - // else Elem[D[d],i,8] unchanged - -__instruction aarch32_VSRI_A - __encoding aarch32_VSRI_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1xxxxxxx xxxx0100 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSRI_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1xxxxxxx xxxx0100 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - mask = LSR(Ones(esize), shift_amount); - for r = 0 to regs-1 - for e = 0 to elements-1 - shifted_op = LSR(Elem[D[m+r],e,esize], shift_amount); - Elem[D[d+r],e,esize] = (Elem[D[d+r],e,esize] AND NOT(mask)) OR shifted_op; - -__instruction aarch32_TSB_A - __encoding aarch32_TSB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00010010' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - if cond != '1110' then UNPREDICTABLE; // ESB must be encoded with AL condition - - __encoding aarch32_TSB_T1_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00010010' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - if InITBlock() then UNPREDICTABLE; - - __execute __conditional - TraceSynchronizationBarrier(); - -__instruction aarch32_AND_r_A - __encoding aarch32_AND_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 000xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_AND_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rdn 16 +: 3 - __opcode '01000000 00xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdn); n = UInt(Rdn); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_AND_r_T2_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 000xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if Rd == '1111' && S == '1' then SEE "TST (register)"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if (d == 15 && !setflags) || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] AND shifted; - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_ADR_A - __encoding aarch32_ADR_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 10001111 xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); imm32 = A32ExpandImm(imm12); add = TRUE; - - __encoding aarch32_ADR_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 01001111 xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); imm32 = A32ExpandImm(imm12); add = FALSE; - - __encoding aarch32_ADR_T1_A - __instruction_set T16 - __field Rd 24 +: 3 - __field imm8 16 +: 8 - __opcode '10100xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); imm32 = ZeroExtend(imm8:'00', 32); add = TRUE; - - __encoding aarch32_ADR_T2_A - __instruction_set T32 - __field i 26 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x10 10101111 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); imm32 = ZeroExtend(i:imm3:imm8, 32); add = FALSE; - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_ADR_T3_A - __instruction_set T32 - __field i 26 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x10 00001111 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); imm32 = ZeroExtend(i:imm3:imm8, 32); add = TRUE; - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = if add then (Align(PC,4) + imm32) else (Align(PC,4) - imm32); - if d == 15 then // Can only occur for A32 encodings - ALUWritePC(result); - else - R[d] = result; - -__instruction aarch32_VZIP_A - __encoding aarch32_VZIP_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0001 1xx0xxxx' - __guard TRUE - __decode - if size == '11' || (Q == '0' && size == '10') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - quadword_operation = (Q == '1'); esize = 8 << UInt(size); - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VZIP_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0001 1xx0xxxx' - __guard TRUE - __decode - if size == '11' || (Q == '0' && size == '10') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - quadword_operation = (Q == '1'); esize = 8 << UInt(size); - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - if quadword_operation then - if d == m then - Q[d>>1] = bits(128) UNKNOWN; Q[m>>1] = bits(128) UNKNOWN; - else - bits(256) zipped_q; - for e = 0 to (128 DIV esize) - 1 - Elem[zipped_q,2*e,esize] = Elem[Q[d>>1],e,esize]; - Elem[zipped_q,2*e+1,esize] = Elem[Q[m>>1],e,esize]; - Q[d>>1] = zipped_q[127:0]; Q[m>>1] = zipped_q[255:128]; - else - if d == m then - D[d] = bits(64) UNKNOWN; D[m] = bits(64) UNKNOWN; - else - bits(128) zipped_d; - for e = 0 to (64 DIV esize) - 1 - Elem[zipped_d,2*e,esize] = Elem[D[d],e,esize]; - Elem[zipped_d,2*e+1,esize] = Elem[D[m],e,esize]; - D[d] = zipped_d[63:0]; D[m] = zipped_d[127:64]; - -__instruction aarch32_VREV16_A - __encoding aarch32_VREV16_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0001 0xx0xxxx' - __guard TRUE - __decode - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - - esize = 8 << UInt(size); - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - integer containers = 64 DIV container_size; - integer elements_per_container = container_size DIV esize; - - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VREV16_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0001 0xx0xxxx' - __guard TRUE - __decode - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - - esize = 8 << UInt(size); - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - integer containers = 64 DIV container_size; - integer elements_per_container = container_size DIV esize; - - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - - bits(64) result; - integer element; - integer rev_element; - for r = 0 to regs-1 - element = 0; - for c = 0 to containers-1 - rev_element = element + elements_per_container - 1; - for e = 0 to elements_per_container-1 - Elem[result, rev_element, esize] = Elem[D[m+r], element, esize]; - element = element + 1; - rev_element = rev_element - 1; - D[d+r] = result; - -__instruction aarch32_VDOT_bf16_A - __encoding aarch32_VDOT_bf16_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x00xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_VDOT_bf16_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x00xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32BF16Ext() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer regs = if Q == '1' then 2 else 1; - - __execute - bits(64) operand1; - bits(64) operand2; - bits(64) result; - - CheckAdvSIMDEnabled(); - - for r = 0 to regs-1 - operand1 = Din[n+r]; - operand2 = Din[m+r]; - result = Din[d+r]; - for e = 0 to 1 - bits(16) elt1_a = Elem[operand1, 2 * e + 0, 16]; - bits(16) elt1_b = Elem[operand1, 2 * e + 1, 16]; - bits(16) elt2_a = Elem[operand2, 2 * e + 0, 16]; - bits(16) elt2_b = Elem[operand2, 2 * e + 1, 16]; - bits(32) sum = BFAdd(BFMul(elt1_a, elt2_a), BFMul(elt1_b, elt2_b)); - Elem[result, e, 32] = BFAdd(Elem[result, e, 32], sum); - D[d+r] = result; - -__instruction aarch32_VLD4_a_A - __encoding aarch32_VLD4_a_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx1111 xxxxxxxx' - __guard TRUE - __decode - if size == '11' && a == '0' then UNDEFINED; - if size == '11' then - ebytes = 4; alignment = 16; - else - ebytes = 1 << UInt(size); - if size == '10' then - alignment = if a == '0' then 1 else 8; - else - alignment = if a == '0' then 1 else 4*ebytes; - inc = if T == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD4_a_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx1111 xxxxxxxx' - __guard TRUE - __decode - if size == '11' && a == '0' then UNDEFINED; - if size == '11' then - ebytes = 4; alignment = 16; - else - ebytes = 1 << UInt(size); - if size == '10' then - alignment = if a == '0' then 1 else 8; - else - alignment = if a == '0' then 1 else 4*ebytes; - inc = if T == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - D[d] = Replicate(MemU[address,ebytes]); - D[d2] = Replicate(MemU[address+ebytes,ebytes]); - D[d3] = Replicate(MemU[address+2*ebytes,ebytes]); - D[d4] = Replicate(MemU[address+3*ebytes,ebytes]); - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 4*ebytes; - -__instruction aarch32_DOT_A - __encoding aarch32_DOT_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x00xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - boolean op1_unsigned = (U == '0'); - boolean op2_unsigned = (U == '1'); - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm); - integer i = UInt(M); - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_DOT_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x00xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - boolean op1_unsigned = (U == '0'); - boolean op2_unsigned = (U == '1'); - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm); - integer i = UInt(M); - integer regs = if Q == '1' then 2 else 1; - - __execute - CheckAdvSIMDEnabled(); - bits(64) operand1; - bits(64) operand2; - bits(64) result; - - operand2 = Din[m]; - for r = 0 to regs-1 - operand1 = Din[n+r]; - result = Din[d+r]; - for e = 0 to 1 - bits(32) res = Elem[result, e, 32]; - for b = 0 to 3 - element1 = Int(Elem[operand1, 4 * e + b, 8], op1_unsigned); - element2 = Int(Elem[operand2, 4 * i + b, 8], op2_unsigned); - res = res + element1 * element2; - Elem[result, e, 32] = res; - D[d+r] = result; - -__instruction aarch32_ORN_r_A - __encoding aarch32_ORN_r_T1_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 011xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if Rn == '1111' then SEE "MVN (register)"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] OR NOT(shifted); - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_UHSAX_A - __encoding aarch32_UHSAX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0111xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UHSAX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1110xxxx 1111xxxx 0110xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum = UInt(R[n][15:0]) + UInt(R[m][31:16]); - diff = UInt(R[n][31:16]) - UInt(R[m][15:0]); - R[d][15:0] = sum[16:1]; - R[d][31:16] = diff[16:1]; - -__instruction aarch32_SMMLS_A - __encoding aarch32_SMMLS_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field R 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0101xxxx xxxxxxxx 11x1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); round = (R == '1'); - if d == 15 || n == 15 || m == 15 || a == 15 then UNPREDICTABLE; - - __encoding aarch32_SMMLS_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field R 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0110xxxx xxxxxxxx 000xxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); round = (R == '1'); - if d == 15 || n == 15 || m == 15 || a == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = (SInt(R[a]) << 32) - SInt(R[n]) * SInt(R[m]); - if round then result = result + 0x80000000; - R[d] = result[63:32]; - -__instruction aarch32_SMMLA_A - __encoding aarch32_SMMLA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field R 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0101xxxx xxxxxxxx 00x1xxxx' - __guard cond != '1111' - __decode - if Ra == '1111' then SEE "SMMUL"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); round = (R == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SMMLA_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field R 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0101xxxx xxxxxxxx 000xxxxx' - __guard TRUE - __decode - if Ra == '1111' then SEE "SMMUL"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); round = (R == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = (SInt(R[a]) << 32) + SInt(R[n]) * SInt(R[m]); - if round then result = result + 0x80000000; - R[d] = result[63:32]; - -__instruction aarch32_CMP_r_A - __encoding aarch32_CMP_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0101xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_CMP_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rn 16 +: 3 - __opcode '01000010 10xxxxxx 00000000 00000000' - __guard TRUE - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_CMP_r_T2_A - __instruction_set T16 - __field N 23 +: 1 - __field Rm 19 +: 4 - __field Rn 16 +: 3 - __opcode '01000101 xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - n = UInt(N:Rn); m = UInt(Rm); - (shift_t, shift_n) = (SRType_LSL, 0); - if n < 8 && m < 8 then UNPREDICTABLE; - if n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_CMP_r_T3_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 1011xxxx xxxx1111 xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], NOT(shifted), '1'); - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_AESIMC_A - __encoding aarch32_AESIMC_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0011 11x0xxxx' - __guard TRUE - __decode - if !HaveAESExt() then UNDEFINED; - if size != '00' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_AESIMC_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0011 11x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAESExt() then UNDEFINED; - if size != '00' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - Q[d>>1] = AESInvMixColumns(Q[m>>1]); - -__instruction aarch32_VMOVL_A - __encoding aarch32_VMOVL_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm3H 19 +: 3 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxx000 xxxx1010 00x1xxxx' - __guard TRUE - __decode - if imm3H == '000' then SEE "Related encodings"; - if imm3H != '001' && imm3H != '010' && imm3H != '100' then SEE "VSHLL"; - if Vd[0] == '1' then UNDEFINED; - esize = 8 * UInt(imm3H); - unsigned = (U == '1'); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VMOVL_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm3H 19 +: 3 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxx000 xxxx1010 00x1xxxx' - __guard TRUE - __decode - if imm3H == '000' then SEE "Related encodings"; - if imm3H != '001' && imm3H != '010' && imm3H != '100' then SEE "VSHLL"; - if Vd[0] == '1' then UNDEFINED; - esize = 8 * UInt(imm3H); - unsigned = (U == '1'); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - result = Int(Elem[Din[m],e,esize], unsigned); - Elem[Q[d>>1],e,2*esize] = result[2*esize-1:0]; - -__instruction aarch32_MLS_A - __encoding aarch32_MLS_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0000 0110xxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - if d == 15 || n == 15 || m == 15 || a == 15 then UNPREDICTABLE; - - __encoding aarch32_MLS_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 0000xxxx xxxxxxxx 0001xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - if d == 15 || n == 15 || m == 15 || a == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand1 = SInt(R[n]); // operand1 = UInt(R[n]) produces the same final results - operand2 = SInt(R[m]); // operand2 = UInt(R[m]) produces the same final results - addend = SInt(R[a]); // addend = UInt(R[a]) produces the same final results - result = addend - operand1 * operand2; - R[d] = result[31:0]; - -__instruction aarch32_QSAX_A - __encoding aarch32_QSAX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0010xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QSAX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1110xxxx 1111xxxx 0001xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum = SInt(R[n][15:0]) + SInt(R[m][31:16]); - diff = SInt(R[n][31:16]) - SInt(R[m][15:0]); - R[d][15:0] = SignedSat(sum, 16); - R[d][31:16] = SignedSat(diff, 16); - -__instruction aarch32_VABD_i_A - __encoding aarch32_VABD_i_T2A2_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0111 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); long_destination = TRUE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __encoding aarch32_VABD_i_T2A2_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0111 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); long_destination = TRUE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; - op2 = Elem[Din[m+r],e,esize]; - absdiff = Abs(Int(op1,unsigned) - Int(op2,unsigned)); - if long_destination then - Elem[Q[d>>1],e,2*esize] = absdiff[2*esize-1:0]; - else - Elem[D[d+r],e,esize] = absdiff[esize-1:0]; - -__instruction aarch32_VRINTA_asimd_A - __encoding aarch32_VRINTA_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0100 0xx0xxxx' - __guard TRUE - __decode - if op[2] != op[0] then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - // Rounding encoded differently from other VCVT and VRINT instructions - rounding = FPDecodeRM(op[2]:NOT(op[1])); exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRINTA_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0100 0xx0xxxx' - __guard TRUE - __decode - if op[2] != op[0] then SEE "Related encodings"; - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - // Rounding encoded differently from other VCVT and VRINT instructions - rounding = FPDecodeRM(op[2]:NOT(op[1])); exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[m+r],e,esize]; - result = FPRoundInt(op1, StandardFPSCRValue(), rounding, exact); - Elem[D[d+r],e,esize] = result; - -__instruction aarch32_VCVTT_A - __encoding aarch32_VCVTT_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110011 xxxx1001 11x0xxxx' - __guard cond != '1111' - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - integer d = UInt(Vd:D); - integer m = UInt(Vm:M); - - __encoding aarch32_VCVTT_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110011 xxxx1001 11x0xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - integer d = UInt(Vd:D); - integer m = UInt(Vm:M); - - __execute __conditional - CheckVFPEnabled(TRUE); - - S[d][31:16] = FPConvertBF(S[m], FPSCR); - -__instruction aarch32_VSTM_A - __encoding aarch32_VSTM_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode 'xxxx110x xxx0xxxx xxxx1011 xxxxxxx0' - __guard cond != '1111' - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VSTR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = FALSE; add = (U == '1'); wback = (W == '1'); - d = UInt(D:Vd); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - regs = UInt(imm8) DIV 2; // If UInt(imm8) is odd, see "FSTMX". - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if imm8[0] == '1' && (d+regs) > 16 then UNPREDICTABLE; - - __encoding aarch32_VSTM_T2A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode 'xxxx110x xxx0xxxx xxxx1010 xxxxxxxx' - __guard cond != '1111' - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VSTR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = TRUE; add = (U == '1'); wback = (W == '1'); d = UInt(Vd:D); n = UInt(Rn); - imm32 = ZeroExtend(imm8:'00', 32); regs = UInt(imm8); - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || (d+regs) > 32 then UNPREDICTABLE; - - __encoding aarch32_VSTM_T1A1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode '1110110x xxx0xxxx xxxx1011 xxxxxxx0' - __guard TRUE - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VSTR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = FALSE; add = (U == '1'); wback = (W == '1'); - d = UInt(D:Vd); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - regs = UInt(imm8) DIV 2; // If UInt(imm8) is odd, see "FSTMX". - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if imm8[0] == '1' && (d+regs) > 16 then UNPREDICTABLE; - - __encoding aarch32_VSTM_T2A2_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode '1110110x xxx0xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VSTR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = TRUE; add = (U == '1'); wback = (W == '1'); d = UInt(Vd:D); n = UInt(Rn); - imm32 = ZeroExtend(imm8:'00', 32); regs = UInt(imm8); - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || (d+regs) > 32 then UNPREDICTABLE; - - __execute __conditional - CheckVFPEnabled(TRUE); - address = if add then R[n] else R[n]-imm32; - for r = 0 to regs-1 - if single_regs then - MemA[address,4] = S[d+r]; address = address+4; - else - // Store as two word-aligned words in the correct order for current endianness. - MemA[address,4] = if BigEndian() then D[d+r][63:32] else D[d+r][31:0]; - MemA[address+4,4] = if BigEndian() then D[d+r][31:0] else D[d+r][63:32]; - address = address+8; - if wback then R[n] = if add then R[n]+imm32 else R[n]-imm32; - -__instruction aarch32_SMLSLD_A - __encoding aarch32_SMLSLD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field M 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0100xxxx xxxxxxxx 01x1xxxx' - __guard cond != '1111' - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); m_swap = (M == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if dHi == dLo then UNPREDICTABLE; - - __encoding aarch32_SMLSLD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 1101xxxx xxxxxxxx 110xxxxx' - __guard TRUE - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); m_swap = (M == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UPREDICTABLE for R13 - if dHi == dLo then UNPREDICTABLE; - - __execute __conditional - operand2 = if m_swap then ROR(R[m],16) else R[m]; - product1 = SInt(R[n][15:0]) * SInt(operand2[15:0]); - product2 = SInt(R[n][31:16]) * SInt(operand2[31:16]); - result = product1 - product2 + SInt(R[dHi]:R[dLo]); - R[dHi] = result[63:32]; - R[dLo] = result[31:0]; - -__instruction aarch32_ADD_i_A - __encoding aarch32_ADD_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 100xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if Rn == '1111' && S == '0' then SEE "ADR"; - if Rn == '1101' then SEE "ADD (SP plus immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_ADD_i_T1_A - __instruction_set T16 - __field imm3 22 +: 3 - __field Rn 19 +: 3 - __field Rd 16 +: 3 - __opcode '0001110x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); setflags = !InITBlock(); imm32 = ZeroExtend(imm3, 32); - - __encoding aarch32_ADD_i_T2_A - __instruction_set T16 - __field Rdn 24 +: 3 - __field imm8 16 +: 8 - __opcode '00110xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdn); n = UInt(Rdn); setflags = !InITBlock(); imm32 = ZeroExtend(imm8, 32); - - __encoding aarch32_ADD_i_T3_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x01 000xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rd == '1111' && S == '1' then SEE "CMN (immediate)"; - if Rn == '1101' then SEE "ADD (SP plus immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = T32ExpandImm(i:imm3:imm8); - if (d == 15 && !setflags) || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_ADD_i_T4_A - __instruction_set T32 - __field i 26 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x10 0000xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "ADR"; - if Rn == '1101' then SEE "ADD (SP plus immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = FALSE; imm32 = ZeroExtend(i:imm3:imm8, 32); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute - if CurrentInstrSet() == InstrSet_A32 then - (result, nzcv) = AddWithCarry(R[n], imm32, '0'); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - else - (result, nzcv) = AddWithCarry(R[n], imm32, '0'); - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_SUB_SP_r_A - __encoding aarch32_SUB_SP_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 010x1101 xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_SUB_SP_r_T1_A - __instruction_set T32 - __field S 20 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 101x1101 xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if Rd == '1111' && S == '1' then SEE "CMP (register)"; - d = UInt(Rd); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if (d == 15 && !setflags) || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(SP, NOT(shifted), '1'); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_LDAEXB_A - __encoding aarch32_LDAEXB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1101xxxx xxxxxx10 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDAEXB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 1100xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - AArch32.SetExclusiveMonitors(address, 1); - R[t] = ZeroExtend(MemO[address, 1], 32); - -__instruction aarch32_MOV_rr_A - __encoding aarch32_MOV_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 101xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __encoding aarch32_MOV_rr_T1_A - __instruction_set T16 - __field op 22 +: 4 - __field Rs 19 +: 3 - __field Rdm 16 +: 3 - __opcode '0100000x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - if !(op IN {'0010', '0011', '0100', '0111'}) then SEE "Related encodings"; - d = UInt(Rdm); m = UInt(Rdm); s = UInt(Rs); - setflags = !InITBlock(); shift_t = DecodeRegShift(op[2]:op[0]); - - __encoding aarch32_MOV_rr_T2_A - __instruction_set T32 - __field stype 21 +: 2 - __field S 20 +: 1 - __field Rm 16 +: 4 - __field Rd 8 +: 4 - __field Rs 0 +: 4 - __opcode '11111010 0xxxxxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || m == 15 || s == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shift_n = UInt(R[s][7:0]); - (result, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_LDC_l_A - __encoding aarch32_LDC_l_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field imm8 0 +: 8 - __opcode 'xxxx110x x0x11111 01011110 xxxxxxxx' - __guard cond != '1111' - __decode - if P == '0' && U == '0' && W == '0' then UNDEFINED; - index = (P == '1'); add = (U == '1'); cp = 14; imm32 = ZeroExtend(imm8:'00', 32); - if W == '1' || (P == '0' && CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - - __encoding aarch32_LDC_l_T1A1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field imm8 0 +: 8 - __opcode '1110110x x0x11111 01011110 xxxxxxxx' - __guard TRUE - __decode - if P == '0' && U == '0' && W == '0' then UNDEFINED; - index = (P == '1'); add = (U == '1'); cp = 14; imm32 = ZeroExtend(imm8:'00', 32); - if W == '1' || (P == '0' && CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - - __execute __conditional - offset_addr = if add then (Align(PC,4) + imm32) else (Align(PC,4) - imm32); - address = if index then offset_addr else Align(PC,4); - - // System register write to DBGDTRTXint. - DBGDTR_EL0[] = MemA[address,4]; - -__instruction aarch32_PLI_i_A - __encoding aarch32_PLI_i_A1_A - __instruction_set A32 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - __opcode '11110100 x101xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - - __encoding aarch32_PLI_i_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - __opcode '11111001 1001xxxx 1111xxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "encoding T3"; - n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); add = TRUE; - - __encoding aarch32_PLI_i_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm8 0 +: 8 - __opcode '11111001 0001xxxx 11111100 xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "encoding T3"; - n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); add = FALSE; - - __encoding aarch32_PLI_i_T3_A - __instruction_set T32 - __field U 23 +: 1 - __field imm12 0 +: 12 - __opcode '11111001 x0011111 1111xxxx xxxxxxxx' - __guard TRUE - __decode - n = 15; imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - - __execute __conditional - base = if n == 15 then Align(PC,4) else R[n]; - address = if add then (base + imm32) else (base - imm32); - Hint_PreloadInstr(address); - -__instruction aarch32_ESB_A - __encoding aarch32_ESB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00010000' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - if cond != '1110' then UNPREDICTABLE; // ESB must be encoded with AL condition - - __encoding aarch32_ESB_T1_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00010000' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - if InITBlock() then UNPREDICTABLE; - - __execute __conditional - - SynchronizeErrors(); - AArch32.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch32.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - -__instruction aarch32_VMVN_i_A - __encoding aarch32_VMVN_i_T1A1_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx0xx0 0x11xxxx' - __guard TRUE - __decode - if (cmode[0] == '1' && cmode[3:2] != '11') || cmode[3:1] == '111' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMVN_i_T2A2_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx10x0 0x11xxxx' - __guard TRUE - __decode - if (cmode[0] == '1' && cmode[3:2] != '11') || cmode[3:1] == '111' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMVN_i_T3A3_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx110x 0x11xxxx' - __guard TRUE - __decode - if (cmode[0] == '1' && cmode[3:2] != '11') || cmode[3:1] == '111' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMVN_i_T1A1_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx0xx0 0x11xxxx' - __guard TRUE - __decode - if (cmode[0] == '1' && cmode[3:2] != '11') || cmode[3:1] == '111' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMVN_i_T2A2_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx10x0 0x11xxxx' - __guard TRUE - __decode - if (cmode[0] == '1' && cmode[3:2] != '11') || cmode[3:1] == '111' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMVN_i_T3A3_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx110x 0x11xxxx' - __guard TRUE - __decode - if (cmode[0] == '1' && cmode[3:2] != '11') || cmode[3:1] == '111' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = NOT(imm64); - -__instruction aarch32_PLI_r_A - __encoding aarch32_PLI_r_A1_A - __instruction_set A32 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode '11110110 x101xxxx xxxxxxxx xxx0xxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - n = UInt(Rn); m = UInt(Rm); add = (U == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if m == 15 then UNPREDICTABLE; - - __encoding aarch32_PLI_r_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0001xxxx 11110000 00xxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "PLI (immediate, literal)"; - n = UInt(Rn); m = UInt(Rm); add = TRUE; - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - address = if add then (R[n] + offset) else (R[n] - offset); - Hint_PreloadInstr(address); - -__instruction aarch32_VRINTX_asimd_A - __encoding aarch32_VRINTX_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0100 1xx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPRounding_TIEEVEN; exact = TRUE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRINTX_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0100 1xx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPRounding_TIEEVEN; exact = TRUE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - if InITBlock() then UNPREDICTABLE; - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[m+r],e,esize]; - result = FPRoundInt(op1, StandardFPSCRValue(), rounding, exact); - Elem[D[d+r],e,esize] = result; - -__instruction aarch32_ADC_r_A - __encoding aarch32_ADC_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 101xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_ADC_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rdn 16 +: 3 - __opcode '01000001 01xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdn); n = UInt(Rdn); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_ADC_r_T2_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 010xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], shifted, PSTATE.C); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_SETPAN_A - __encoding aarch32_SETPAN_A1_A - __instruction_set A32 - __field imm1 9 +: 1 - __opcode '11110001 0001xxxx xxxxxxxx 0000xxxx' - __guard TRUE - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if !HavePANExt() then UNDEFINED; - value = imm1; - - __encoding aarch32_SETPAN_T1_A - __instruction_set T16 - __field imm1 19 +: 1 - __opcode '10110110 000xxxxx 00000000 00000000' - __guard TRUE - __unpredictable_unless 20 == '1' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - if InITBlock() then UNPREDICTABLE; - if !HavePANExt() then UNDEFINED; - value = imm1; - - __execute - if PSTATE.EL != EL0 then - PSTATE.PAN = value; - -__instruction aarch32_POP_A - __encoding aarch32_POP_T1_A - __instruction_set T16 - __field P 24 +: 1 - __field register_list 16 +: 8 - __opcode '1011110x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - registers = P:'0000000':register_list; UnalignedAllowed = FALSE; - if BitCount(registers) < 1 then UNPREDICTABLE; - if registers[15] == '1' && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - address = SP; - for i = 0 to 14 - if registers[i] == '1' then - R[i] = if UnalignedAllowed then MemU[address,4] else MemA[address,4]; - address = address + 4; - if registers[15] == '1' then - if UnalignedAllowed then - if address[1:0] == '00' then - LoadWritePC(MemU[address,4]); - else - UNPREDICTABLE; - else - LoadWritePC(MemA[address,4]); - if registers[13] == '0' then SP = SP + 4*BitCount(registers); - if registers[13] == '1' then SP = bits(32) UNKNOWN; - -__instruction aarch32_LDAB_A - __encoding aarch32_LDAB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1101xxxx xxxxxx00 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDAB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 1000xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - R[t] = ZeroExtend(MemO[address, 1], 32); - -__instruction aarch32_AESE_A - __encoding aarch32_AESE_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0011 00x0xxxx' - __guard TRUE - __decode - if !HaveAESExt() then UNDEFINED; - if size != '00' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_AESE_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0011 00x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAESExt() then UNDEFINED; - if size != '00' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - op1 = Q[d>>1]; op2 = Q[m>>1]; - Q[d>>1] = AESSubBytes(AESShiftRows(op1 EOR op2)); - -__instruction aarch32_VCLS_A - __encoding aarch32_VCLS_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0100 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCLS_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0100 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = CountLeadingSignBits(Elem[D[m+r],e,esize])[esize-1:0]; - -__instruction aarch32_MSR_br_AS - __encoding aarch32_MSR_br_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field R 22 +: 1 - __field M1 16 +: 4 - __field M 8 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0001 0x10xxxx xxxxxx1x 0000xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __decode - n = UInt(Rn); write_spsr = (R == '1'); - if n == 15 then UNPREDICTABLE; - SYSm = M:M1; - - __encoding aarch32_MSR_br_T1_AS - __instruction_set T32 - __field R 20 +: 1 - __field Rn 16 +: 4 - __field M1 8 +: 4 - __field M 4 +: 1 - __opcode '11110011 100xxxxx 10x0xxxx xx1xxxxx' - __guard TRUE - __unpredictable_unless 13 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - n = UInt(Rn); write_spsr = (R == '1'); - if n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - SYSm = M:M1; - - __execute __conditional - if PSTATE.EL == EL0 then - UNPREDICTABLE; - else - mode = PSTATE.M; - if write_spsr then - SPSRaccessValid(SYSm, mode); // Check for UNPREDICTABLE cases - case SYSm of - when '01110' SPSR_fiq = R[n]; - when '10000' SPSR_irq = R[n]; - when '10010' SPSR_svc = R[n]; - when '10100' SPSR_abt = R[n]; - when '10110' SPSR_und = R[n]; - when '11100' - if !ELUsingAArch32(EL3) then AArch64.MonitorModeTrap(); - SPSR_mon = R[n]; - when '11110' SPSR_hyp = R[n]; - else - BankedRegisterAccessValid(SYSm, mode); // Check for UNPREDICTABLE cases - case SYSm of - when '00xxx' // Access the User mode registers - m = UInt(SYSm[2:0]) + 8; - Rmode[m,M32_User] = R[n]; - when '01xxx' // Access the FIQ mode registers - m = UInt(SYSm[2:0]) + 8; - Rmode[m,M32_FIQ] = R[n]; - when '1000x' // Access the IRQ mode registers - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - Rmode[m,M32_IRQ] = R[n]; - when '1001x' // Access the Supervisor mode registers - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - Rmode[m,M32_Svc] = R[n]; - when '1010x' // Access the Abort mode registers - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - Rmode[m,M32_Abort] = R[n]; - when '1011x' // Access the Undefined mode registers - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - Rmode[m,M32_Undef] = R[n]; - when '1110x' // Access Monitor registers - if !ELUsingAArch32(EL3) then AArch64.MonitorModeTrap(); - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - Rmode[m,M32_Monitor] = R[n]; - when '11110' // Access ELR_hyp register - ELR_hyp = R[n]; - when '11111' // Access SP_hyp register - Rmode[13,M32_Hyp] = R[n]; - -__instruction aarch32_VRECPS_A - __encoding aarch32_VRECPS_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x0xxxxx xxxx1111 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRECPS_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x0xxxxx xxxx1111 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPRecipStep(Elem[D[n+r],e,esize], Elem[D[m+r],e,esize]); - -__instruction aarch32_VFMAL_i_A - __encoding aarch32_VFMAL_i_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field S 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x00xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - - integer d = UInt(D:Vd); - integer n = if Q == '1' then UInt(N:Vn) else UInt(Vn:N); - integer m = if Q == '1' then UInt(Vm[2:0]) else UInt(Vm[2:0]:M); - - integer index = if Q == '1' then UInt(M:Vm[3]) else UInt(Vm[3]); - integer esize = 32; - integer regs = if Q=='1' then 2 else 1; - integer datasize = if Q=='1' then 64 else 32; - boolean sub_op = S=='1'; - - __encoding aarch32_VFMAL_i_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field S 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x00xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - - integer d = UInt(D:Vd); - integer n = if Q == '1' then UInt(N:Vn) else UInt(Vn:N); - integer m = if Q == '1' then UInt(Vm[2:0]) else UInt(Vm[2:0]:M); - - integer index = if Q == '1' then UInt(M:Vm[3]) else UInt(Vm[3]); - integer esize = 32; - integer regs = if Q=='1' then 2 else 1; - integer datasize = if Q=='1' then 64 else 32; - boolean sub_op = S=='1'; - - __execute - CheckAdvSIMDEnabled(); - bits(datasize) operand1 ; - bits(datasize) operand2 ; - bits(64) operand3; - bits(64) result; - bits(esize DIV 2) element1; - bits(esize DIV 2) element2; - - if Q=='0' then - operand1 = S[n][datasize-1:0]; - operand2 = S[m][datasize-1:0]; - else - operand1 = D[n][datasize-1:0]; - operand2 = D[m][datasize-1:0]; - element2 = Elem[operand2, index, esize DIV 2]; - for r = 0 to regs-1 - operand3 = D[d+r]; - for e = 0 to 1 - element1 = Elem[operand1, 2*r+e, esize DIV 2]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAddH(Elem[operand3, e, esize], element1, element2, StandardFPSCRValue()); - D[d+r] = result; - -__instruction aarch32_VMOVX_A - __encoding aarch32_VMOVX_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x110000 xxxx1010 01x0xxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - d = UInt(Vd:D); m = UInt(Vm:M); - - __encoding aarch32_VMOVX_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x110000 xxxx1010 01x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFP16Ext() then UNDEFINED; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - d = UInt(Vd:D); m = UInt(Vm:M); - - __execute __conditional - CheckVFPEnabled(TRUE); - S[d] = Zeros(16) : S[m][31:16]; - -__instruction aarch32_VMUL_s_A - __encoding aarch32_VMUL_s_T2A2_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx1010 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); long_destination = TRUE; floating_point = FALSE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = 1; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VMUL_s_T2A2_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx1010 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); long_destination = TRUE; floating_point = FALSE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = 1; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - op2 = Elem[Din[m],index,esize]; op2val = Int(op2, unsigned); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; op1val = Int(op1, unsigned); - if floating_point then - Elem[D[d+r],e,esize] = FPMul(op1, op2, StandardFPSCRValue()); - else - if long_destination then - Elem[Q[d>>1],e,2*esize] = (op1val*op2val)[2*esize-1:0]; - else - Elem[D[d+r],e,esize] = (op1val*op2val)[esize-1:0]; - -__instruction aarch32_TST_r_A - __encoding aarch32_TST_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0001xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_TST_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rn 16 +: 3 - __opcode '01000010 00xxxxxx 00000000 00000000' - __guard TRUE - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_TST_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 0001xxxx xxxx1111 xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] AND shifted; - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VNMLA_A - __encoding aarch32_VNMLA_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 0x10xxxx xxxx10xx x1x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '01' && !HaveFP16Ext() then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - vtype = VFPNegMul_VNMUL; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VNMLA_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 0x10xxxx xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '01' && !HaveFP16Ext() then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - vtype = VFPNegMul_VNMUL; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 - product16 = FPMul(S[n][15:0], S[m][15:0], FPSCR); - case vtype of - when VFPNegMul_VNMLA S[d] = Zeros(16) : FPAdd(FPNeg(S[d][15:0]), FPNeg(product16), FPSCR); - when VFPNegMul_VNMLS S[d] = Zeros(16) : FPAdd(FPNeg(S[d][15:0]), product16, FPSCR); - when VFPNegMul_VNMUL S[d] = Zeros(16) : FPNeg(product16); - when 32 - product32 = FPMul(S[n], S[m], FPSCR); - case vtype of - when VFPNegMul_VNMLA S[d] = FPAdd(FPNeg(S[d]), FPNeg(product32), FPSCR); - when VFPNegMul_VNMLS S[d] = FPAdd(FPNeg(S[d]), product32, FPSCR); - when VFPNegMul_VNMUL S[d] = FPNeg(product32); - when 64 - product64 = FPMul(D[n], D[m], FPSCR); - case vtype of - when VFPNegMul_VNMLA D[d] = FPAdd(FPNeg(D[d]), FPNeg(product64), FPSCR); - when VFPNegMul_VNMLS D[d] = FPAdd(FPNeg(D[d]), product64, FPSCR); - when VFPNegMul_VNMUL D[d] = FPNeg(product64); - -__instruction aarch32_VCVTA_asimd_A - __encoding aarch32_VCVTA_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field RM 8 +: 2 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx11 xxxx0011 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCVTA_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field RM 8 +: 2 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx11 xxxx0011 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - bits(esize) result; - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPToFixed(Elem[D[m+r],e,esize], 0, unsigned, - StandardFPSCRValue(), rounding); - -__instruction aarch32_UMULL_A - __encoding aarch32_UMULL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0000 100xxxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if dHi == dLo then UNPREDICTABLE; - - __encoding aarch32_UMULL_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 1010xxxx xxxxxxxx 0000xxxx' - __guard TRUE - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); setflags = FALSE; - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - if dHi == dLo then UNPREDICTABLE; - - __execute __conditional - result = UInt(R[n]) * UInt(R[m]); - R[dHi] = result[63:32]; - R[dLo] = result[31:0]; - if setflags then - PSTATE.N = result[63]; - PSTATE.Z = IsZeroBit(result[63:0]); - // PSTATE.C, PSTATE.V unchanged - -__instruction aarch32_UHSUB8_A - __encoding aarch32_UHSUB8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0111xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UHSUB8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1100xxxx 1111xxxx 0110xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = UInt(R[n][7:0]) - UInt(R[m][7:0]); - diff2 = UInt(R[n][15:8]) - UInt(R[m][15:8]); - diff3 = UInt(R[n][23:16]) - UInt(R[m][23:16]); - diff4 = UInt(R[n][31:24]) - UInt(R[m][31:24]); - R[d][7:0] = diff1[8:1]; - R[d][15:8] = diff2[8:1]; - R[d][23:16] = diff3[8:1]; - R[d][31:24] = diff4[8:1]; - -__instruction aarch32_LDM_e_AS - __encoding aarch32_LDM_e_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 15 - __opcode 'xxxx100x x1x1xxxx 1xxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; - wback = (W == '1'); increment = (U == '1'); wordhigher = (P == U); - if n == 15 then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - - __execute __conditional - if PSTATE.EL == EL2 then - UNDEFINED; - elsif PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; // UNDEFINED or NOP - else - length = 4*BitCount(registers) + 4; - address = if increment then R[n] else R[n]-length; - if wordhigher then address = address+4; - - for i = 0 to 14 - if registers[i] == '1' then - R[i] = MemA[address,4]; address = address + 4; - new_pc_value = MemA[address,4]; - - if wback && registers[n] == '0' then R[n] = if increment then R[n]+length else R[n]-length; - if wback && registers[n] == '1' then R[n] = bits(32) UNKNOWN; - - AArch32.ExceptionReturn(new_pc_value, SPSR[]); - -__instruction aarch32_VINS_A - __encoding aarch32_VINS_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x110000 xxxx1010 11x0xxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - d = UInt(Vd:D); m = UInt(Vm:M); - - __encoding aarch32_VINS_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x110000 xxxx1010 11x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFP16Ext() then UNDEFINED; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - d = UInt(Vd:D); m = UInt(Vm:M); - - __execute __conditional - CheckVFPEnabled(TRUE); - S[d] = S[m][15:0] : S[d][15:0]; - -__instruction aarch32_VSHL_r_A - __encoding aarch32_VSHL_r_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0100 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSHL_r_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0100 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - shift = SInt(Elem[D[n+r],e,esize][7:0]); - result = Int(Elem[D[m+r],e,esize], unsigned) << shift; - Elem[D[d+r],e,esize] = result[esize-1:0]; - -__instruction aarch32_UXTAH_A - __encoding aarch32_UXTAH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1111xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if Rn == '1111' then SEE "UXTH"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UXTAH_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 0001xxxx 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - if Rn == '1111' then SEE "UXTH"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d] = R[n] + ZeroExtend(rotated[15:0], 32); - -__instruction aarch32_SHADD8_A - __encoding aarch32_SHADD8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0011xxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SHADD8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 0010xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = SInt(R[n][7:0]) + SInt(R[m][7:0]); - sum2 = SInt(R[n][15:8]) + SInt(R[m][15:8]); - sum3 = SInt(R[n][23:16]) + SInt(R[m][23:16]); - sum4 = SInt(R[n][31:24]) + SInt(R[m][31:24]); - R[d][7:0] = sum1[8:1]; - R[d][15:8] = sum2[8:1]; - R[d][23:16] = sum3[8:1]; - R[d][31:24] = sum4[8:1]; - -__instruction aarch32_LDAEXD_A - __encoding aarch32_LDAEXD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1011xxxx xxxxxx10 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); t2 = t + 1; n = UInt(Rn); - if Rt[0] == '1' || t2 == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDAEXD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 1111xxxx' - __guard TRUE - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); t2 = UInt(Rt2); n = UInt(Rn); - if t == 15 || t2 == 15 || t == t2 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - AArch32.SetExclusiveMonitors(address, 8); - value = MemO[address, 8]; - // Extract words from 64-bit loaded value such that R[t] is - // loaded from address and R[t2] from address+4. - R[t] = if BigEndian() then value[63:32] else value[31:0]; - R[t2] = if BigEndian() then value[31:0] else value[63:32]; - -__instruction aarch32_STRD_r_A - __encoding aarch32_STRD_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx000x x0x0xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if Rt[0] == '1' then UNPREDICTABLE; - t = UInt(Rt); t2 = t+1; n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if P == '0' && W == '1' then UNPREDICTABLE; - if t2 == 15 || m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t || n == t2) then UNPREDICTABLE; - - __execute __conditional - offset_addr = if add then (R[n] + R[m]) else (R[n] - R[m]); - address = if index then offset_addr else R[n]; - if address == Align(address, 8) then - bits(64) data; - if BigEndian() then - data[63:32] = R[t]; - data[31:0] = R[t2]; - else - data[31:0] = R[t]; - data[63:32] = R[t2]; - MemA[address,8] = data; - else - MemA[address,4] = R[t]; - MemA[address+4,4] = R[t2]; - if wback then R[n] = offset_addr; - -__instruction aarch32_BKPT_A - __encoding aarch32_BKPT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm12 8 +: 12 - __field imm4 0 +: 4 - __opcode 'xxxx0001 0010xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __decode - imm16 = imm12:imm4; - if cond != '1110' then UNPREDICTABLE; // BKPT must be encoded with AL condition - - __encoding aarch32_BKPT_T1_A - __instruction_set T16 - __field imm8 16 +: 8 - __opcode '10111110 xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - imm16 = ZeroExtend(imm8, 16); - - __execute - AArch32.SoftwareBreakpoint(imm16); - -__instruction aarch32_VPMAX_i_A - __encoding aarch32_VPMAX_i_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field op 4 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx1010 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - maximum = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VPMAX_i_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field op 4 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx1010 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - maximum = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(64) dest; - h = elements DIV 2; - - for e = 0 to h-1 - op1 = Int(Elem[D[n],2*e,esize], unsigned); - op2 = Int(Elem[D[n],2*e+1,esize], unsigned); - result = if maximum then Max(op1,op2) else Min(op1,op2); - Elem[dest,e,esize] = result[esize-1:0]; - op1 = Int(Elem[D[m],2*e,esize], unsigned); - op2 = Int(Elem[D[m],2*e+1,esize], unsigned); - result = if maximum then Max(op1,op2) else Min(op1,op2); - Elem[dest,e+h,esize] = result[esize-1:0]; - - D[d] = dest; - -__instruction aarch32_VSTR_A - __encoding aarch32_VSTR_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm8 0 +: 8 - __opcode 'xxxx1101 xx00xxxx xxxx10xx xxxxxxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - esize = 8 << UInt(size); add = (U == '1'); - imm32 = if esize == 16 then ZeroExtend(imm8:'0', 32) else ZeroExtend(imm8:'00', 32); - case size of - when '01' d = UInt(Vd:D); - when '10' d = UInt(Vd:D); - when '11' d = UInt(D:Vd); - n = UInt(Rn); - if n == 15 && CurrentInstrSet() != InstrSet_A32 then UNPREDICTABLE; - - __encoding aarch32_VSTR_T1_A - __instruction_set T32 - __field U 23 +: 1 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm8 0 +: 8 - __opcode '11101101 xx00xxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - esize = 8 << UInt(size); add = (U == '1'); - imm32 = if esize == 16 then ZeroExtend(imm8:'0', 32) else ZeroExtend(imm8:'00', 32); - case size of - when '01' d = UInt(Vd:D); - when '10' d = UInt(Vd:D); - when '11' d = UInt(D:Vd); - n = UInt(Rn); - if n == 15 && CurrentInstrSet() != InstrSet_A32 then UNPREDICTABLE; - - __execute __conditional - CheckVFPEnabled(TRUE); - address = if add then (R[n] + imm32) else (R[n] - imm32); - case esize of - when 16 - MemA[address,2] = S[d][15:0]; - when 32 - MemA[address,4] = S[d]; - when 64 - // Store as two word-aligned words in the correct order for current endianness. - MemA[address,4] = if BigEndian() then D[d][63:32] else D[d][31:0]; - MemA[address+4,4] = if BigEndian() then D[d][31:0] else D[d][63:32]; - -__instruction aarch32_LDMIB_A - __encoding aarch32_LDMIB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx1001 10x1xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - - __execute __conditional - address = R[n] + 4; - for i = 0 to 14 - if registers[i] == '1' then - R[i] = MemA[address,4]; address = address + 4; - if registers[15] == '1' then - LoadWritePC(MemA[address,4]); - if wback && registers[n] == '0' then R[n] = R[n] + 4*BitCount(registers); - if wback && registers[n] == '1' then R[n] = bits(32) UNKNOWN; - -__instruction aarch32_UDIV_A - __encoding aarch32_UDIV_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0011xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - if d == 15 || n == 15 || m == 15 || a != 15 then UNPREDICTABLE; - - __encoding aarch32_UDIV_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 1011xxxx xxxxxxxx 1111xxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - if d == 15 || n == 15 || m == 15 || a != 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - if UInt(R[m]) == 0 then - result = 0; - else - result = RoundTowardsZero(Real(UInt(R[n])) / Real(UInt(R[m]))); - R[d] = result[31:0]; - -__instruction aarch32_SMC_AS - __encoding aarch32_SMC_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field imm4 0 +: 4 - __opcode 'xxxx0001 0110xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // imm4 is for assembly/disassembly only and is ignored by hardware - - __encoding aarch32_SMC_T1_AS - __instruction_set T32 - __field imm4 16 +: 4 - __opcode '11110111 1111xxxx 1000xxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 4 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - // imm4 is for assembly/disassembly only and is ignored by hardware - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - - AArch32.CheckForSMCUndefOrTrap(); - - if !ELUsingAArch32(EL3) then - if SCR_EL3.SMD == '1' then - // SMC disabled. - UNDEFINED; - else - if SCR.SCD == '1' then - // SMC disabled - if IsSecure() then - // Executes either as a NOP or UNALLOCATED. - c = ConstrainUnpredictable(Unpredictable_SMD); - assert c IN {Constraint_NOP, Constraint_UNDEF}; - if c == Constraint_NOP then EndOfInstruction(); - UNDEFINED; - - if !ELUsingAArch32(EL3) then - AArch64.CallSecureMonitor(Zeros(16)); - else - AArch32.TakeSMCException(); - -__instruction aarch32_BX_A - __encoding aarch32_BX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0010xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - m = UInt(Rm); - - __encoding aarch32_BX_T1_A - __instruction_set T16 - __field Rm 19 +: 4 - __opcode '01000111 0xxxxxxx 00000000 00000000' - __guard TRUE - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - m = UInt(Rm); - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - BXWritePC(R[m], BranchType_INDIR); - -__instruction aarch32_SMULBB_A - __encoding aarch32_SMULBB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Rm 8 +: 4 - __field M 6 +: 1 - __field N 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0001 0110xxxx xxxxxxxx 1xx0xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - n_high = (N == '1'); m_high = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SMULBB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field N 5 +: 1 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0001xxxx 1111xxxx 00xxxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - n_high = (N == '1'); m_high = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand1 = if n_high then R[n][31:16] else R[n][15:0]; - operand2 = if m_high then R[m][31:16] else R[m][15:0]; - result = SInt(operand1) * SInt(operand2); - R[d] = result[31:0]; - // Signed overflow cannot occur - -__instruction aarch32_LDRD_r_A - __encoding aarch32_LDRD_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx000x x0x0xxxx xxxxxxxx 1101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if Rt[0] == '1' then UNPREDICTABLE; - t = UInt(Rt); t2 = t+1; n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if P == '0' && W == '1' then UNPREDICTABLE; - if t2 == 15 || m == 15 || m == t || m == t2 then UNPREDICTABLE; - if wback && (n == 15 || n == t || n == t2) then UNPREDICTABLE; - - __execute __conditional - offset_addr = if add then (R[n] + R[m]) else (R[n] - R[m]); - address = if index then offset_addr else R[n]; - if address == Align(address, 8) then - data = MemA[address,8]; - if BigEndian() then - R[t] = data[63:32]; - R[t2] = data[31:0]; - else - R[t] = data[31:0]; - R[t2] = data[63:32]; - else - R[t] = MemA[address,4]; - R[t2] = MemA[address+4,4]; - - if wback then R[n] = offset_addr; - -__instruction aarch32_VCGE_r_A - __encoding aarch32_VCGE_r_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0011 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - vtype = if U == '1' then VCGEtype_unsigned else VCGEtype_signed; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCGE_r_A2_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x0xxxxx xxxx1110 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - vtype = VCGEtype_fp; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCGE_r_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0011 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - vtype = if U == '1' then VCGEtype_unsigned else VCGEtype_signed; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCGE_r_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x0xxxxx xxxx1110 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - vtype = VCGEtype_fp; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[n+r],e,esize]; op2 = Elem[D[m+r],e,esize]; - case vtype of - when VCGEtype_signed test_passed = (SInt(op1) >= SInt(op2)); - when VCGEtype_unsigned test_passed = (UInt(op1) >= UInt(op2)); - when VCGEtype_fp test_passed = FPCompareGE(op1, op2, StandardFPSCRValue()); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_UXTB_A - __encoding aarch32_UXTB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 11101111 xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UXTB_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '10110010 11xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); rotation = 0; - - __encoding aarch32_UXTB_T2_A - __instruction_set T32 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 01011111 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d] = ZeroExtend(rotated[7:0], 32); - -__instruction aarch32_VMOV_h_A - __encoding aarch32_VMOV_h_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field op 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - __opcode 'xxxx1110 000xxxxx xxxx1001 xxx1xxxx' - __guard cond != '1111' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if !HaveFP16Ext() then UNDEFINED; - if cond != '1110' then UNPREDICTABLE; - to_arm_register = (op == '1'); t = UInt(Rt); n = UInt(Vn:N); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_VMOV_h_T1_A - __instruction_set T32 - __field op 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - __opcode '11101110 000xxxxx xxxx1001 xxx1xxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if !HaveFP16Ext() then UNDEFINED; - if InITBlock() then UNPREDICTABLE; - to_arm_register = (op == '1'); t = UInt(Rt); n = UInt(Vn:N); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - CheckVFPEnabled(TRUE); - if to_arm_register then - R[t] = Zeros(16) : S[n][15:0]; - else - S[n] = Zeros(16) : R[t][15:0]; - -__instruction aarch32_SUB_r_A - __encoding aarch32_SUB_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 010xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if Rn == '1101' then SEE "SUB (SP minus register)"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_SUB_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rd 16 +: 3 - __opcode '0001101x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_SUB_r_T2_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 101xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if Rd == '1111' && S == '1' then SEE "CMP (register)"; - if Rn == '1101' then SEE "SUB (SP minus register)"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if (d == 15 && !setflags) || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], NOT(shifted), '1'); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_SB_A - __encoding aarch32_SB_A1_A - __instruction_set A32 - __opcode '11110101 0111xxxx xxxxxxxx 0111xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - // No additional decoding required - - __encoding aarch32_SB_T1_A - __instruction_set T32 - __opcode '11110011 1011xxxx 10x0xxxx 0111xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if InITBlock() then UNPREDICTABLE; - - __execute __conditional - SpeculationBarrier(); - -__instruction aarch32_DMB_A - __encoding aarch32_DMB_A1_A - __instruction_set A32 - __field option 0 +: 4 - __opcode '11110101 0111xxxx xxxxxxxx 0101xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_DMB_T1_A - __instruction_set T32 - __field option 0 +: 4 - __opcode '11110011 1011xxxx 10x0xxxx 0101xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - // No additional decoding required - - __execute __conditional - case option of - when '0001' domain = MBReqDomain_OuterShareable; types = MBReqTypes_Reads; - when '0010' domain = MBReqDomain_OuterShareable; types = MBReqTypes_Writes; - when '0011' domain = MBReqDomain_OuterShareable; types = MBReqTypes_All; - when '0101' domain = MBReqDomain_Nonshareable; types = MBReqTypes_Reads; - when '0110' domain = MBReqDomain_Nonshareable; types = MBReqTypes_Writes; - when '0111' domain = MBReqDomain_Nonshareable; types = MBReqTypes_All; - when '1001' domain = MBReqDomain_InnerShareable; types = MBReqTypes_Reads; - when '1010' domain = MBReqDomain_InnerShareable; types = MBReqTypes_Writes; - when '1011' domain = MBReqDomain_InnerShareable; types = MBReqTypes_All; - when '1101' domain = MBReqDomain_FullSystem; types = MBReqTypes_Reads; - when '1110' domain = MBReqDomain_FullSystem; types = MBReqTypes_Writes; - otherwise domain = MBReqDomain_FullSystem; types = MBReqTypes_All; - - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then - if HCR.BSU == '11' then - domain = MBReqDomain_FullSystem; - if HCR.BSU == '10' && domain != MBReqDomain_FullSystem then - domain = MBReqDomain_OuterShareable; - if HCR.BSU == '01' && domain == MBReqDomain_Nonshareable then - domain = MBReqDomain_InnerShareable; - - DataMemoryBarrier(domain, types); - -__instruction aarch32_DCPS2_A - __encoding aarch32_DCPS2_T1_A - __instruction_set T32 - __opcode '11110111 10001111 10000000 00000010' - __guard TRUE - __decode - if !HaveEL(EL2) then UNDEFINED; - - __execute - if !Halted() || IsSecure() then UNDEFINED; - - if ELUsingAArch32(EL2) then - AArch32.WriteMode(M32_Hyp); - PSTATE.E = HSCTLR.EE; - - ELR_hyp = bits(32) UNKNOWN; - HSR = bits(32) UNKNOWN; - SPSR_hyp = bits(32) UNKNOWN; - - DLR = bits(32) UNKNOWN; - DSPSR = bits(32) UNKNOWN; - else // Targeting EL2 using AArch64 - AArch64.MaybeZeroRegisterUppers(); - MaybeZeroSVEUppers(EL2); - PSTATE.nRW = '0'; - PSTATE.SP = '1'; - PSTATE.EL = EL2; - if HavePANExt() && SCTLR_EL2.SPAN == '0' && HCR_EL2.E2H == '1' && HCR_EL2.TGE == '1' then - PSTATE.PAN = '1'; - if HaveUAOExt() then PSTATE.UAO = '0'; - - ELR_EL2 = bits(64) UNKNOWN; - ESR_EL2 = bits(32) UNKNOWN; - SPSR_EL2 = bits(32) UNKNOWN; - - DLR_EL0 = bits(64) UNKNOWN; - DSPSR_EL0 = bits(32) UNKNOWN; - - // SCTLR_EL2.IESB might be ignored in Debug state. - if HaveIESB() && SCTLR_EL2.IESB == '1' && !ConstrainUnpredictableBool(Unpredictable_IESBinDebug) then - SynchronizeErrors(); - - UpdateEDSCRFields(); // Update EDSCR PE state flags - -__instruction aarch32_VRINTA_asimd_A - __encoding aarch32_VRINTA_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0111 1xx0xxxx' - __guard TRUE - __decode - if op[2] != op[0] then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - // Rounding encoded differently from other VCVT and VRINT instructions - rounding = FPDecodeRM(op[2]:NOT(op[1])); exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRINTA_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0111 1xx0xxxx' - __guard TRUE - __decode - if op[2] != op[0] then SEE "Related encodings"; - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - // Rounding encoded differently from other VCVT and VRINT instructions - rounding = FPDecodeRM(op[2]:NOT(op[1])); exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[m+r],e,esize]; - result = FPRoundInt(op1, StandardFPSCRValue(), rounding, exact); - Elem[D[d+r],e,esize] = result; - -__instruction aarch32_VMLA_f_A - __encoding aarch32_VMLA_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x1xxxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - advsimd = TRUE; add = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMLA_f_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 0x00xxxx xxxx10xx x1x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - advsimd = FALSE; add = (op == '0'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VMLA_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x1xxxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - advsimd = TRUE; add = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMLA_f_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 0x00xxxx xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - advsimd = FALSE; add = (op == '0'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - product = FPMul(Elem[D[n+r],e,esize], Elem[D[m+r],e,esize], StandardFPSCRValue()); - addend = if add then product else FPNeg(product); - Elem[D[d+r],e,esize] = FPAdd(Elem[D[d+r],e,esize], addend, StandardFPSCRValue()); - else // VFP instruction - case esize of - when 16 - addend16 = if add then FPMul(S[n][15:0], S[m][15:0], FPSCR) else FPNeg(FPMul(S[n][15:0], S[m][15:0], FPSCR)); - S[d] = Zeros(16) : FPAdd(S[d][15:0], addend16, FPSCR); - when 32 - addend32 = if add then FPMul(S[n], S[m], FPSCR) else FPNeg(FPMul(S[n], S[m], FPSCR)); - S[d] = FPAdd(S[d], addend32, FPSCR); - when 64 - addend64 = if add then FPMul(D[n], D[m], FPSCR) else FPNeg(FPMul(D[n], D[m], FPSCR)); - D[d] = FPAdd(D[d], addend64, FPSCR); - -__instruction aarch32_VMRS_AS - __encoding aarch32_VMRS_T1A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field reg 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx1110 1111xxxx xxxx1010 xxx1xxxx' - __guard cond != '1111' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - t = UInt(Rt); - if !(reg IN {'000x', '0101', '011x', '1000'}) then UNPREDICTABLE; - if t == 15 && reg != '0001' then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_VMRS_T1A1_AS - __instruction_set T32 - __field reg 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101110 1111xxxx xxxx1010 xxx1xxxx' - __guard TRUE - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - t = UInt(Rt); - if !(reg IN {'000x', '0101', '011x', '1000'}) then UNPREDICTABLE; - if t == 15 && reg != '0001' then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - if reg == '0001' then // FPSCR - CheckVFPEnabled(TRUE); - if t == 15 then - PSTATE.[N,Z,C,V] = FPSR.[N,Z,C,V]; - else - R[t] = FPSCR; - elsif PSTATE.EL == EL0 then - UNDEFINED; // Non-FPSCR registers accessible only at PL1 or above - else - CheckVFPEnabled(FALSE); // Non-FPSCR registers are not affected by FPEXC.EN - AArch32.CheckAdvSIMDOrFPRegisterTraps(reg); - case reg of - when '0000' R[t] = FPSID; - when '0101' R[t] = MVFR2; - when '0110' R[t] = MVFR1; - when '0111' R[t] = MVFR0; - when '1000' R[t] = FPEXC; - otherwise Unreachable(); // Dealt with above or in encoding-specific pseudocode - -__instruction aarch32_VCVT_hs_A - __encoding aarch32_VCVT_hs_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx011x 00x0xxxx' - __guard TRUE - __decode - if size != '01' then UNDEFINED; - half_to_single = (op == '1'); - if half_to_single && Vd[0] == '1' then UNDEFINED; - if !half_to_single && Vm[0] == '1' then UNDEFINED; - esize = 16; elements = 4; - m = UInt(M:Vm); d = UInt(D:Vd); - - __encoding aarch32_VCVT_hs_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx011x 00x0xxxx' - __guard TRUE - __decode - if size != '01' then UNDEFINED; - half_to_single = (op == '1'); - if half_to_single && Vd[0] == '1' then UNDEFINED; - if !half_to_single && Vm[0] == '1' then UNDEFINED; - esize = 16; elements = 4; - m = UInt(M:Vm); d = UInt(D:Vd); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - if half_to_single then - Elem[Q[d>>1],e,32] = FPConvert(Elem[Din[m],e,16], StandardFPSCRValue()); - else - Elem[D[d],e,16] = FPConvert(Elem[Qin[m>>1],e,32], StandardFPSCRValue()); - -__instruction aarch32_MOV_r_A - __encoding aarch32_MOV_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 101xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_MOV_r_T1_A - __instruction_set T16 - __field D 23 +: 1 - __field Rm 19 +: 4 - __field Rd 16 +: 3 - __opcode '01000110 xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(D:Rd); m = UInt(Rm); setflags = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - if d == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __encoding aarch32_MOV_r_T2_A - __instruction_set T16 - __field op 27 +: 2 - __field imm5 22 +: 5 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '000xxxxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = DecodeImmShift(op, imm5); - if op == '00' && imm5 == '00000' && InITBlock() then UNPREDICTABLE; - - __encoding aarch32_MOV_r_T3_A - __instruction_set T32 - __field S 20 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 010x1111 xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = shifted; - if d == 15 then - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_RSC_i_A - __encoding aarch32_RSC_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 111xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = A32ExpandImm(imm12); - - __execute __conditional - (result, nzcv) = AddWithCarry(NOT(R[n]), imm32, PSTATE.C); - if d == 15 then - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_STREXB_A - __encoding aarch32_STREXB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1100xxxx xxxxxx11 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __encoding aarch32_STREXB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rd 0 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 0100xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if d == n || d == t then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - if AArch32.ExclusiveMonitorsPass(address,1) then - MemA[address,1] = R[t][7:0]; - R[d] = ZeroExtend('0'); - else - R[d] = ZeroExtend('1'); - -__instruction aarch32_SADD16_A - __encoding aarch32_SADD16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0001xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SADD16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = SInt(R[n][15:0]) + SInt(R[m][15:0]); - sum2 = SInt(R[n][31:16]) + SInt(R[m][31:16]); - R[d][15:0] = sum1[15:0]; - R[d][31:16] = sum2[15:0]; - PSTATE.GE[1:0] = if sum1 >= 0 then '11' else '00'; - PSTATE.GE[3:2] = if sum2 >= 0 then '11' else '00'; - -__instruction aarch32_REVSH_A - __encoding aarch32_REVSH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1111xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); m = UInt(Rm); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_REVSH_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '10111010 11xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); - - __encoding aarch32_REVSH_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 1011xxxx' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); n = UInt(Rn); - if m != n || d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - bits(32) result; - result[31:8] = SignExtend(R[m][7:0], 24); - result[7:0] = R[m][15:8]; - R[d] = result; - -__instruction aarch32_VRSQRTE_A - __encoding aarch32_VRSQRTE_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 8 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx11 xxxx010x 1xx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - floating_point = (F == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRSQRTE_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 8 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx11 xxxx010x 1xx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - floating_point = (F == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - Elem[D[d+r],e,esize] = FPRSqrtEstimate(Elem[D[m+r],e,esize], StandardFPSCRValue()); - else - Elem[D[d+r],e,esize] = UnsignedRSqrtEstimate(Elem[D[m+r],e,esize]); - -__instruction aarch32_VMUL_i_A - __encoding aarch32_VMUL_i_A2_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx11x0 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - unsigned = (U == '1'); polynomial = (op == '1'); long_destination = TRUE; - esize = 8 << UInt(size); elements = 64 DIV esize; - if polynomial then - if U == '1' || size == '01' then UNDEFINED; - if size == '10' then // .p64 - if !HaveBit128PMULLExt() then UNDEFINED; - esize = 64; elements = 1; - if Vd[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __encoding aarch32_VMUL_i_T2_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx11x0 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - unsigned = (U == '1'); polynomial = (op == '1'); long_destination = TRUE; - esize = 8 << UInt(size); elements = 64 DIV esize; - if polynomial then - if U == '1' || size == '01' then UNDEFINED; - if size == '10' then // .p64 - if InITBlock() then UNPREDICTABLE; - if !HaveBit128PMULLExt() then UNDEFINED; - esize = 64; elements = 1; - if Vd[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; op1val = Int(op1, unsigned); - op2 = Elem[Din[m+r],e,esize]; op2val = Int(op2, unsigned); - if polynomial then - product = PolynomialMult(op1,op2); - else - product = (op1val*op2val)[2*esize-1:0]; - if long_destination then - Elem[Q[d>>1],e,2*esize] = product; - else - Elem[D[d+r],e,esize] = product[esize-1:0]; - -__instruction aarch32_VFNMA_A - __encoding aarch32_VFNMA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x01xxxx xxxx10xx x0x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - op1_neg = (op == '1'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VFNMA_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x01xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - op1_neg = (op == '1'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 - op16 = if op1_neg then FPNeg(S[n][15:0]) else S[n][15:0]; - S[d] = Zeros(16) : FPMulAdd(FPNeg(S[d][15:0]), op16, S[m][15:0], FPSCR); - when 32 - op32 = if op1_neg then FPNeg(S[n]) else S[n]; - S[d] = FPMulAdd(FPNeg(S[d]), op32, S[m], FPSCR); - when 64 - op64 = if op1_neg then FPNeg(D[n]) else D[n]; - D[d] = FPMulAdd(FPNeg(D[d]), op64, D[m], FPSCR); - -__instruction aarch32_EOR_r_A - __encoding aarch32_EOR_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 001xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_EOR_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rdn 16 +: 3 - __opcode '01000000 01xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdn); n = UInt(Rdn); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_EOR_r_T2_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 100xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if Rd == '1111' && S == '1' then SEE "TEQ (register)"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if (d == 15 && !setflags) || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] EOR shifted; - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VSEL_A - __encoding aarch32_VSEL_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field cc 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0xxxxxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - cond = cc:(cc[1] EOR cc[0]):'0'; - - __encoding aarch32_VSEL_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field cc 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0xxxxxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - cond = cc:(cc[1] EOR cc[0]):'0'; - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = Zeros(16) : (if ConditionHolds(cond) then S[n] else S[m])[15:0]; - when 32 - S[d] = if ConditionHolds(cond) then S[n] else S[m]; - when 64 - D[d] = if ConditionHolds(cond) then D[n] else D[m]; - -__instruction aarch32_VRSHRN_A - __encoding aarch32_VRSHRN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx1000 01x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if Vm[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '01xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '1xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VRSHRN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx1000 01x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if Vm[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '01xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '1xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - round_const = 1 << (shift_amount-1); - for e = 0 to elements-1 - result = LSR(Elem[Qin[m>>1],e,2*esize] + round_const, shift_amount); - Elem[D[d],e,esize] = result[esize-1:0]; - -__instruction aarch32_DBG_A - __encoding aarch32_DBG_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field option 0 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // DBG executes as a NOP. The 'option' field is ignored - - __encoding aarch32_DBG_T1_A - __instruction_set T32 - __field option 0 +: 4 - __opcode '11110011 1010xxxx 10x0x000 1111xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - // DBG executes as a NOP. The 'option' field is ignored - - __execute __conditional - -__instruction aarch32_VSHLL_A - __encoding aarch32_VSHLL_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx1010 00x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = UInt(imm6) - 8; - when '01xxxx' esize = 16; elements = 4; shift_amount = UInt(imm6) - 16; - when '1xxxxx' esize = 32; elements = 2; shift_amount = UInt(imm6) - 32; - if shift_amount == 0 then SEE "VMOVL"; - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VSHLL_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0011 00x0xxxx' - __guard TRUE - __decode - if size == '11' || Vd[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; shift_amount = esize; - unsigned = FALSE; // Or TRUE without change of functionality - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VSHLL_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx1010 00x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = UInt(imm6) - 8; - when '01xxxx' esize = 16; elements = 4; shift_amount = UInt(imm6) - 16; - when '1xxxxx' esize = 32; elements = 2; shift_amount = UInt(imm6) - 32; - if shift_amount == 0 then SEE "VMOVL"; - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VSHLL_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0011 00x0xxxx' - __guard TRUE - __decode - if size == '11' || Vd[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; shift_amount = esize; - unsigned = FALSE; // Or TRUE without change of functionality - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - result = Int(Elem[Din[m],e,esize], unsigned) << shift_amount; - Elem[Q[d>>1],e,2*esize] = result[2*esize-1:0]; - -__instruction aarch32_QASX_A - __encoding aarch32_QASX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0010xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QASX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1010xxxx 1111xxxx 0001xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff = SInt(R[n][15:0]) - SInt(R[m][31:16]); - sum = SInt(R[n][31:16]) + SInt(R[m][15:0]); - R[d][15:0] = SignedSat(diff, 16); - R[d][31:16] = SignedSat(sum, 16); - -__instruction aarch32_VQABS_A - __encoding aarch32_VQABS_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0111 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQABS_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0111 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - result = Abs(SInt(Elem[D[m+r],e,esize])); - (Elem[D[d+r],e,esize], sat) = SignedSatQ(result, esize); - if sat then FPSCR.QC = '1'; - -__instruction aarch32_SMLALD_A - __encoding aarch32_SMLALD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field M 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0100xxxx xxxxxxxx 00x1xxxx' - __guard cond != '1111' - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); m_swap = (M == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if dHi == dLo then UNPREDICTABLE; - - __encoding aarch32_SMLALD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 1100xxxx xxxxxxxx 110xxxxx' - __guard TRUE - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); m_swap = (M == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - if dHi == dLo then UNPREDICTABLE; - - __execute __conditional - operand2 = if m_swap then ROR(R[m],16) else R[m]; - product1 = SInt(R[n][15:0]) * SInt(operand2[15:0]); - product2 = SInt(R[n][31:16]) * SInt(operand2[31:16]); - result = product1 + product2 + SInt(R[dHi]:R[dLo]); - R[dHi] = result[63:32]; - R[dLo] = result[31:0]; - -__instruction aarch32_LDRSH_i_A - __encoding aarch32_LDRSH_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x1xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __decode - if Rn == '1111' then SEE "LDRSH (literal)"; - if P == '0' && W == '1' then SEE "LDRSHT"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm4H:imm4L, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 || (wback && n == t) then UNPREDICTABLE; - - __encoding aarch32_LDRSH_i_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111001 1011xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDRSH (literal)"; - if Rt == '1111' then SEE "Related instructions"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = TRUE; add = TRUE; wback = FALSE; - // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_LDRSH_i_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field P 10 +: 1 - __field U 9 +: 1 - __field W 8 +: 1 - __field imm8 0 +: 8 - __opcode '11111001 0011xxxx xxxx1xxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDRSH (literal)"; - if Rt == '1111' && P == '1' && U == '0' && W == '0' then SEE "Related instructions"; - if P == '1' && U == '1' && W == '0' then SEE "LDRSHT"; - if P == '0' && W == '0' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - data = MemU[address,2]; - if wback then R[n] = offset_addr; - R[t] = SignExtend(data, 32); - -__instruction aarch32_SETEND_A - __encoding aarch32_SETEND_A1_A - __instruction_set A32 - __field E 9 +: 1 - __opcode '11110001 0000xxx1 xxxxxxxx 0000xxxx' - __guard TRUE - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - set_bigend = (E == '1'); - - __encoding aarch32_SETEND_T1_A - __instruction_set T16 - __field E 19 +: 1 - __opcode '10110110 010xxxxx 00000000 00000000' - __guard TRUE - __unpredictable_unless 20 == '1' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - set_bigend = (E == '1'); - if InITBlock() then UNPREDICTABLE; - - __execute - AArch32.CheckSETENDEnabled(); - PSTATE.E = if set_bigend then '1' else '0'; - -__instruction aarch32_VST4_1_A - __encoding aarch32_VST4_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx1011 xxxx1111' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if size != '10' then SEE "Related encodings"; - if index_align[1:0] == '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[1:0] == '00' then 1 else 4 << UInt(index_align[1:0]); - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = TRUE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - MemU[address, ebytes] = Elem[D[d], index]; - MemU[address+ebytes, ebytes] = Elem[D[d2],index]; - MemU[address+2*ebytes,ebytes] = Elem[D[d3],index]; - MemU[address+3*ebytes,ebytes] = Elem[D[d4],index]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 4*ebytes; - -__instruction aarch32_UQADD8_A - __encoding aarch32_UQADD8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0110xxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UQADD8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 0101xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = UInt(R[n][7:0]) + UInt(R[m][7:0]); - sum2 = UInt(R[n][15:8]) + UInt(R[m][15:8]); - sum3 = UInt(R[n][23:16]) + UInt(R[m][23:16]); - sum4 = UInt(R[n][31:24]) + UInt(R[m][31:24]); - R[d][7:0] = UnsignedSat(sum1, 8); - R[d][15:8] = UnsignedSat(sum2, 8); - R[d][23:16] = UnsignedSat(sum3, 8); - R[d][31:24] = UnsignedSat(sum4, 8); - -__instruction aarch32_STREXD_A - __encoding aarch32_STREXD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1010xxxx xxxxxx11 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); t2 = t+1; n = UInt(Rn); - if d == 15 || Rt[0] == '1' || t2 == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t || d == t2 then UNPREDICTABLE; - - __encoding aarch32_STREXD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field Rd 0 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 0111xxxx' - __guard TRUE - __decode - d = UInt(Rd); t = UInt(Rt); t2 = UInt(Rt2); n = UInt(Rn); - if d == 15 || t == 15 || t2 == 15 || n == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - if d == n || d == t || d == t2 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - // Create doubleword to store such that R[t] will be stored at address and R[t2] at address+4. - value = if BigEndian() then R[t]:R[t2] else R[t2]:R[t]; - if AArch32.ExclusiveMonitorsPass(address,8) then - MemA[address,8] = value; R[d] = ZeroExtend('0'); - else - R[d] = ZeroExtend('1'); - -__instruction aarch32_STR_r_A - __encoding aarch32_STR_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx011x x0x0xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "STRT"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_STR_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '0101000x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_STR_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111000 0100xxxx xxxx0000 00xxxxxx' - __guard TRUE - __decode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if t == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if index then offset_addr else R[n]; - if t == 15 then // Only possible for encoding A1 - data = PCStoreValue(); - else - data = R[t]; - MemU[address,4] = data; - if wback then R[n] = offset_addr; - -__instruction aarch32_STMIB_A - __encoding aarch32_STMIB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx1001 10x0xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - - __execute __conditional - address = R[n] + 4; - for i = 0 to 14 - if registers[i] == '1' then - if i == n && wback && i != LowestSetBit(registers) then - MemA[address,4] = bits(32) UNKNOWN; - else - MemA[address,4] = R[i]; - address = address + 4; - if registers[15] == '1' then - MemA[address,4] = PCStoreValue(); - if wback then R[n] = R[n] + 4*BitCount(registers); - -__instruction aarch32_VDIV_A - __encoding aarch32_VDIV_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x00xxxx xxxx10xx x0x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VDIV_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x00xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if size == '01' && InITBlock() then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = Zeros(16) : FPDiv(S[n][15:0], S[m][15:0], FPSCR); - when 32 - S[d] = FPDiv(S[n], S[m], FPSCR); - when 64 - D[d] = FPDiv(D[n], D[m], FPSCR); - -__instruction aarch32_LDRBT_A - __encoding aarch32_LDRBT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0100 x111xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); postindex = TRUE; add = (U == '1'); - register_form = FALSE; imm32 = ZeroExtend(imm12, 32); - if t == 15 || n == 15 || n == t then UNPREDICTABLE; - - __encoding aarch32_LDRBT_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 x111xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); postindex = TRUE; add = (U == '1'); - register_form = TRUE; (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if t == 15 || n == 15 || n == t || m == 15 then UNPREDICTABLE; - - __encoding aarch32_LDRBT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11111000 0001xxxx xxxx1110 xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - if Rn == '1111' then SEE "LDRB (literal)"; - t = UInt(Rt); n = UInt(Rn); postindex = FALSE; add = TRUE; - register_form = FALSE; imm32 = ZeroExtend(imm8, 32); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = if register_form then Shift(R[m], shift_t, shift_n, PSTATE.C) else imm32; - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if postindex then R[n] else offset_addr; - R[t] = ZeroExtend(MemU_unpriv[address,1],32); - if postindex then R[n] = offset_addr; - -__instruction aarch32_VEOR_A - __encoding aarch32_VEOR_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x00xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VEOR_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x00xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = D[n+r] EOR D[m+r]; - -__instruction aarch32_LDRSB_r_A - __encoding aarch32_LDRSB_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx000x x0x1xxxx xxxxxxxx 1101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if P == '0' && W == '1' then SEE "LDRSBT"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - (shift_t, shift_n) = (SRType_LSL, 0); - if t == 15 || m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_LDRSB_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '0101011x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_LDRSB_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0001xxxx xxxx0000 00xxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "PLI"; - if Rn == '1111' then SEE "LDRSB (literal)"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if index then offset_addr else R[n]; - R[t] = SignExtend(MemU[address,1], 32); - if wback then R[n] = offset_addr; - -__instruction aarch32_UADD8_A - __encoding aarch32_UADD8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0101xxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UADD8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 0100xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = UInt(R[n][7:0]) + UInt(R[m][7:0]); - sum2 = UInt(R[n][15:8]) + UInt(R[m][15:8]); - sum3 = UInt(R[n][23:16]) + UInt(R[m][23:16]); - sum4 = UInt(R[n][31:24]) + UInt(R[m][31:24]); - R[d][7:0] = sum1[7:0]; - R[d][15:8] = sum2[7:0]; - R[d][23:16] = sum3[7:0]; - R[d][31:24] = sum4[7:0]; - PSTATE.GE[0] = if sum1 >= 0x100 then '1' else '0'; - PSTATE.GE[1] = if sum2 >= 0x100 then '1' else '0'; - PSTATE.GE[2] = if sum3 >= 0x100 then '1' else '0'; - PSTATE.GE[3] = if sum4 >= 0x100 then '1' else '0'; - -__instruction aarch32_LDR_i_A - __encoding aarch32_LDR_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx010x x0x1xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if Rn == '1111' then SEE "LDR (literal)"; - if P == '0' && W == '1' then SEE "LDRT"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if wback && n == t then UNPREDICTABLE; - - __encoding aarch32_LDR_i_T1_A - __instruction_set T16 - __field imm5 22 +: 5 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '01101xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm5:'00', 32); - index = TRUE; add = TRUE; wback = FALSE; - - __encoding aarch32_LDR_i_T2_A - __instruction_set T16 - __field Rt 24 +: 3 - __field imm8 16 +: 8 - __opcode '10011xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = 13; imm32 = ZeroExtend(imm8:'00', 32); - index = TRUE; add = TRUE; wback = FALSE; - - __encoding aarch32_LDR_i_T3_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 1101xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDR (literal)"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); index = TRUE; add = TRUE; - wback = FALSE; if t == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __encoding aarch32_LDR_i_T4_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field P 10 +: 1 - __field U 9 +: 1 - __field W 8 +: 1 - __field imm8 0 +: 8 - __opcode '11111000 0101xxxx xxxx1xxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDR (literal)"; - if P == '1' && U == '1' && W == '0' then SEE "LDRT"; - if P == '0' && W == '0' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); - imm32 = ZeroExtend(imm8, 32); index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if (wback && n == t) || (t == 15 && InITBlock() && !LastInITBlock()) then UNPREDICTABLE; - - __execute - if CurrentInstrSet() == InstrSet_A32 then - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - data = MemU[address,4]; - if wback then R[n] = offset_addr; - if t == 15 then - if address[1:0] == '00' then - LoadWritePC(data); - else - UNPREDICTABLE; - else - R[t] = data; - else - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - data = MemU[address,4]; - if wback then R[n] = offset_addr; - if t == 15 then - if address[1:0] == '00' then - LoadWritePC(data); - else - UNPREDICTABLE; - else - R[t] = data; - -__instruction aarch32_SUB_i_A - __encoding aarch32_SUB_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 010xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if Rn == '1111' && S == '0' then SEE "ADR"; - if Rn == '1101' then SEE "SUB (SP minus immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_SUB_i_T1_A - __instruction_set T16 - __field imm3 22 +: 3 - __field Rn 19 +: 3 - __field Rd 16 +: 3 - __opcode '0001111x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); setflags = !InITBlock(); imm32 = ZeroExtend(imm3, 32); - - __encoding aarch32_SUB_i_T2_A - __instruction_set T16 - __field Rdn 24 +: 3 - __field imm8 16 +: 8 - __opcode '00111xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdn); n = UInt(Rdn); setflags = !InITBlock(); imm32 = ZeroExtend(imm8, 32); - - __encoding aarch32_SUB_i_T3_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x01 101xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rd == '1111' && S == '1' then SEE "CMP (immediate)"; - if Rn == '1101' then SEE "SUB (SP minus immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = T32ExpandImm(i:imm3:imm8); - if (d == 15 && !setflags) || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_SUB_i_T4_A - __instruction_set T32 - __field i 26 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x10 1010xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "ADR"; - if Rn == '1101' then SEE "SUB (SP minus immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = FALSE; imm32 = ZeroExtend(i:imm3:imm8, 32); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_SUB_i_T5_AS - __instruction_set T32 - __field Rn 16 +: 4 - __field imm8 0 +: 8 - __opcode '11110011 1101xxxx 10x0xxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - if Rn == '1110' && IsZero(imm8) then SEE "ERET"; - d = 15; n = UInt(Rn); setflags = TRUE; imm32 = ZeroExtend(imm8, 32); - if n != 14 then UNPREDICTABLE; - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - (result, nzcv) = AddWithCarry(R[n], NOT(imm32), '1'); - if d == 15 then - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VQSHRN_A - __encoding aarch32_VQSHRN_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx100x 00x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if U == '0' && op == '0' then SEE "VSHRN"; - if Vm[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '01xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '1xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - src_unsigned = (U == '1' && op == '1'); dest_unsigned = (U == '1'); - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VQSHRN_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx100x 00x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if U == '0' && op == '0' then SEE "VSHRN"; - if Vm[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '01xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '1xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - src_unsigned = (U == '1' && op == '1'); dest_unsigned = (U == '1'); - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - operand = Int(Elem[Qin[m>>1],e,2*esize], src_unsigned); - (result, sat) = SatQ(operand >> shift_amount, esize, dest_unsigned); - Elem[D[d],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_VNMLA_A - __encoding aarch32_VNMLA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 0x01xxxx xxxx10xx x1x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - vtype = if op == '1' then VFPNegMul_VNMLA else VFPNegMul_VNMLS; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VNMLA_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 0x01xxxx xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - vtype = if op == '1' then VFPNegMul_VNMLA else VFPNegMul_VNMLS; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 - product16 = FPMul(S[n][15:0], S[m][15:0], FPSCR); - case vtype of - when VFPNegMul_VNMLA S[d] = Zeros(16) : FPAdd(FPNeg(S[d][15:0]), FPNeg(product16), FPSCR); - when VFPNegMul_VNMLS S[d] = Zeros(16) : FPAdd(FPNeg(S[d][15:0]), product16, FPSCR); - when VFPNegMul_VNMUL S[d] = Zeros(16) : FPNeg(product16); - when 32 - product32 = FPMul(S[n], S[m], FPSCR); - case vtype of - when VFPNegMul_VNMLA S[d] = FPAdd(FPNeg(S[d]), FPNeg(product32), FPSCR); - when VFPNegMul_VNMLS S[d] = FPAdd(FPNeg(S[d]), product32, FPSCR); - when VFPNegMul_VNMUL S[d] = FPNeg(product32); - when 64 - product64 = FPMul(D[n], D[m], FPSCR); - case vtype of - when VFPNegMul_VNMLA D[d] = FPAdd(FPNeg(D[d]), FPNeg(product64), FPSCR); - when VFPNegMul_VNMLS D[d] = FPAdd(FPNeg(D[d]), product64, FPSCR); - when VFPNegMul_VNMUL D[d] = FPNeg(product64); - -__instruction aarch32_UMAAL_A - __encoding aarch32_UMAAL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0000 0100xxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if dHi == dLo then UNPREDICTABLE; - - __encoding aarch32_UMAAL_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 1110xxxx xxxxxxxx 0110xxxx' - __guard TRUE - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - if dHi == dLo then UNPREDICTABLE; - - __execute __conditional - result = UInt(R[n]) * UInt(R[m]) + UInt(R[dHi]) + UInt(R[dLo]); - R[dHi] = result[63:32]; - R[dLo] = result[31:0]; - -__instruction aarch32_QADD8_A - __encoding aarch32_QADD8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0010xxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QADD8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 0001xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = SInt(R[n][7:0]) + SInt(R[m][7:0]); - sum2 = SInt(R[n][15:8]) + SInt(R[m][15:8]); - sum3 = SInt(R[n][23:16]) + SInt(R[m][23:16]); - sum4 = SInt(R[n][31:24]) + SInt(R[m][31:24]); - R[d][7:0] = SignedSat(sum1, 8); - R[d][15:8] = SignedSat(sum2, 8); - R[d][23:16] = SignedSat(sum3, 8); - R[d][31:24] = SignedSat(sum4, 8); - -__instruction aarch32_QSUB8_A - __encoding aarch32_QSUB8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0010xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QSUB8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1100xxxx 1111xxxx 0001xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = SInt(R[n][7:0]) - SInt(R[m][7:0]); - diff2 = SInt(R[n][15:8]) - SInt(R[m][15:8]); - diff3 = SInt(R[n][23:16]) - SInt(R[m][23:16]); - diff4 = SInt(R[n][31:24]) - SInt(R[m][31:24]); - R[d][7:0] = SignedSat(diff1, 8); - R[d][15:8] = SignedSat(diff2, 8); - R[d][23:16] = SignedSat(diff3, 8); - R[d][31:24] = SignedSat(diff4, 8); - -__instruction aarch32_VLD2_1_A - __encoding aarch32_VLD2_1_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx0001 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD2 (single 2-element structure to all lanes)"; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - alignment = if index_align[0] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD2_1_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx0101 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD2 (single 2-element structure to all lanes)"; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 4; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD2_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx1001 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD2 (single 2-element structure to all lanes)"; - if index_align[1] != '0' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 8; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD2_1_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx0001 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD2 (single 2-element structure to all lanes)"; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - alignment = if index_align[0] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD2_1_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx0101 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD2 (single 2-element structure to all lanes)"; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 4; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD2_1_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx1001 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD2 (single 2-element structure to all lanes)"; - if index_align[1] != '0' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 8; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - Elem[D[d], index] = MemU[address,ebytes]; - Elem[D[d2],index] = MemU[address+ebytes,ebytes]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 2*ebytes; - -__instruction aarch32_VCGT_r_A - __encoding aarch32_VCGT_r_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0011 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - vtype = if U == '1' then VCGTtype_unsigned else VCGTtype_signed; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCGT_r_A2_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x1xxxxx xxxx1110 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - vtype = VCGTtype_fp; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCGT_r_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0011 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - vtype = if U == '1' then VCGTtype_unsigned else VCGTtype_signed; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCGT_r_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x1xxxxx xxxx1110 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - vtype = VCGTtype_fp; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[n+r],e,esize]; op2 = Elem[D[m+r],e,esize]; - case vtype of - when VCGTtype_signed test_passed = (SInt(op1) > SInt(op2)); - when VCGTtype_unsigned test_passed = (UInt(op1) > UInt(op2)); - when VCGTtype_fp test_passed = FPCompareGT(op1, op2, StandardFPSCRValue()); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_VSTM_A - __encoding aarch32_VSTM_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode 'xxxx110x xxx0xxxx xxxx1011 xxxxxxx1' - __guard cond != '1111' - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VSTR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = FALSE; add = (U == '1'); wback = (W == '1'); - d = UInt(D:Vd); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - regs = UInt(imm8) DIV 2; // If UInt(imm8) is odd, see "FSTMX". - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if imm8[0] == '1' && (d+regs) > 16 then UNPREDICTABLE; - - __encoding aarch32_VSTM_T1A1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode '1110110x xxx0xxxx xxxx1011 xxxxxxx1' - __guard TRUE - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VSTR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = FALSE; add = (U == '1'); wback = (W == '1'); - d = UInt(D:Vd); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - regs = UInt(imm8) DIV 2; // If UInt(imm8) is odd, see "FSTMX". - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if imm8[0] == '1' && (d+regs) > 16 then UNPREDICTABLE; - - __execute __conditional - CheckVFPEnabled(TRUE); - address = if add then R[n] else R[n]-imm32; - for r = 0 to regs-1 - if single_regs then - MemA[address,4] = S[d+r]; address = address+4; - else - // Store as two word-aligned words in the correct order for current endianness. - MemA[address,4] = if BigEndian() then D[d+r][63:32] else D[d+r][31:0]; - MemA[address+4,4] = if BigEndian() then D[d+r][31:0] else D[d+r][63:32]; - address = address+8; - if wback then R[n] = if add then R[n]+imm32 else R[n]-imm32; - -__instruction aarch32_VLDR_A - __encoding aarch32_VLDR_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm8 0 +: 8 - __opcode 'xxxx1101 xx01xxxx xxxx10xx xxxxxxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - esize = 8 << UInt(size); add = (U == '1'); - imm32 = if esize == 16 then ZeroExtend(imm8:'0', 32) else ZeroExtend(imm8:'00', 32); - case size of - when '01' d = UInt(Vd:D); - when '10' d = UInt(Vd:D); - when '11' d = UInt(D:Vd); - n = UInt(Rn); - - __encoding aarch32_VLDR_T1_A - __instruction_set T32 - __field U 23 +: 1 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm8 0 +: 8 - __opcode '11101101 xx01xxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - esize = 8 << UInt(size); add = (U == '1'); - imm32 = if esize == 16 then ZeroExtend(imm8:'0', 32) else ZeroExtend(imm8:'00', 32); - case size of - when '01' d = UInt(Vd:D); - when '10' d = UInt(Vd:D); - when '11' d = UInt(D:Vd); - n = UInt(Rn); - - __execute __conditional - CheckVFPEnabled(TRUE); - base = if n == 15 then Align(PC,4) else R[n]; - address = if add then (base + imm32) else (base - imm32); - case esize of - when 16 - S[d] = Zeros(16) : MemA[address,2]; - when 32 - S[d] = MemA[address,4]; - when 64 - word1 = MemA[address,4]; word2 = MemA[address+4,4]; - // Combine the word-aligned words in the correct order for current endianness. - D[d] = if BigEndian() then word1:word2 else word2:word1; - -__instruction aarch32_LDAH_A - __encoding aarch32_LDAH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1111xxxx xxxxxx00 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDAH_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 1001xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - R[t] = ZeroExtend(MemO[address, 2], 32); - -__instruction aarch32_SMMUL_A - __encoding aarch32_SMMUL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Rm 8 +: 4 - __field R 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0101xxxx 1111xxxx 00x1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); round = (R == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SMMUL_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field R 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0101xxxx 1111xxxx 000xxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); round = (R == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = SInt(R[n]) * SInt(R[m]); - if round then result = result + 0x80000000; - R[d] = result[63:32]; - -__instruction aarch32_STLH_A - __encoding aarch32_STLH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1110xxxx xxxxxx00 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_STLH_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 1001xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - MemO[address, 2] = R[t][15:0]; - -__instruction aarch32_VQNEG_A - __encoding aarch32_VQNEG_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0111 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQNEG_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0111 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - result = -SInt(Elem[D[m+r],e,esize]); - (Elem[D[d+r],e,esize], sat) = SignedSatQ(result, esize); - if sat then FPSCR.QC = '1'; - -__instruction aarch32_RBIT_A - __encoding aarch32_RBIT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1111xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); m = UInt(Rm); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_RBIT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 1010xxxx' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); n = UInt(Rn); - if m != n || d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - bits(32) result; - for i = 0 to 31 - result[31-i] = R[m][i]; - R[d] = result; - -__instruction aarch32_VLD2_a_A - __encoding aarch32_VLD2_a_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx1101 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - ebytes = 1 << UInt(size); - alignment = if a == '0' then 1 else 2*ebytes; - inc = if T == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD2_a_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx1101 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - ebytes = 1 << UInt(size); - alignment = if a == '0' then 1 else 2*ebytes; - inc = if T == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - D[d] = Replicate(MemU[address,ebytes]); - D[d2] = Replicate(MemU[address+ebytes,ebytes]); - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 2*ebytes; - -__instruction aarch32_SHA1H_A - __encoding aarch32_SHA1H_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx01 xxxx0010 11x0xxxx' - __guard TRUE - __decode - if !HaveSHA1Ext() then UNDEFINED; - if size != '10' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_SHA1H_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx01 xxxx0010 11x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA1Ext() then UNDEFINED; - if size != '10' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - Q[d>>1] = ZeroExtend(ROL(Q[m>>1][31:0], 30), 128); - -__instruction aarch32_LDA_A - __encoding aarch32_LDA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1001xxxx xxxxxx00 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDA_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 1010xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - R[t] = MemO[address, 4]; - -__instruction aarch32_VST2_m_A - __encoding aarch32_VST2_m_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x00xxxx xxxx100x xxxxxxxx' - __guard TRUE - __decode - regs = 1; if align == '11' then UNDEFINED; - if size == '11' then UNDEFINED; - inc = if itype == '1001' then 2 else 1; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST2_m_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x00xxxx xxxx0011 xxxxxxxx' - __guard TRUE - __decode - regs = 2; inc = 2; - if size == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST2_m_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x00xxxx xxxx100x xxxxxxxx' - __guard TRUE - __decode - regs = 1; if align == '11' then UNDEFINED; - if size == '11' then UNDEFINED; - inc = if itype == '1001' then 2 else 1; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST2_m_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x00xxxx xxxx0011 xxxxxxxx' - __guard TRUE - __decode - regs = 2; inc = 2; - if size == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2+regs > 32 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = TRUE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - for r = 0 to regs-1 - for e = 0 to elements-1 - MemU[address, ebytes] = Elem[D[d+r], e]; - MemU[address+ebytes,ebytes] = Elem[D[d2+r],e]; - address = address + 2*ebytes; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 16*regs; - -__instruction aarch32_SHA1C_A - __encoding aarch32_SHA1C_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x00xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if !HaveSHA1Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_SHA1C_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x00xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA1Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - X = Q[d>>1]; - Y = Q[n>>1][31:0]; // Note: 32 bits wide - W = Q[m>>1]; - for e = 0 to 3 - t = SHAchoose(X[63:32], X[95:64], X[127:96]); - Y = Y + ROL(X[31:0], 5) + t + Elem[W, e, 32]; - X[63:32] = ROL(X[63:32], 30); - [Y, X] = ROL(Y:X, 32); - Q[d>>1] = X; - -__instruction aarch32_STLEXH_A - __encoding aarch32_STLEXH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1110xxxx xxxxxx10 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __encoding aarch32_STLEXH_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rd 0 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 1101xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - if AArch32.ExclusiveMonitorsPass(address,2) then - MemO[address, 2] = R[t][15:0]; - R[d] = ZeroExtend('0'); - else - R[d] = ZeroExtend('1'); - -__instruction aarch32_VMLA_i_A - __encoding aarch32_VMLA_i_T2A2_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx1010 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - add = (op == '0'); long_destination = TRUE; unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __encoding aarch32_VMLA_i_T2A2_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx1010 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - add = (op == '0'); long_destination = TRUE; unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - product = Int(Elem[Din[n+r],e,esize],unsigned) * Int(Elem[Din[m+r],e,esize],unsigned); - addend = if add then product else -product; - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + addend; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + addend; - -__instruction aarch32_SMLAD_A - __encoding aarch32_SMLAD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field M 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0000xxxx xxxxxxxx 00x1xxxx' - __guard cond != '1111' - __decode - if Ra == '1111' then SEE "SMUAD"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - m_swap = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SMLAD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0010xxxx xxxxxxxx 000xxxxx' - __guard TRUE - __decode - if Ra == '1111' then SEE "SMUAD"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - m_swap = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand2 = if m_swap then ROR(R[m],16) else R[m]; - product1 = SInt(R[n][15:0]) * SInt(operand2[15:0]); - product2 = SInt(R[n][31:16]) * SInt(operand2[31:16]); - result = product1 + product2 + SInt(R[a]); - R[d] = result[31:0]; - if result != SInt(result[31:0]) then // Signed overflow - PSTATE.Q = '1'; - -__instruction aarch32_DCPS1_A - __encoding aarch32_DCPS1_T1_A - __instruction_set T32 - __opcode '11110111 10001111 10000000 00000001' - __guard TRUE - __decode - // No additional decoding required. - - __execute - if !Halted() then UNDEFINED; - - if EL2Enabled() && PSTATE.EL == EL0 then - tge = if ELUsingAArch32(EL2) then HCR.TGE else HCR_EL2.TGE; - if tge == '1' then UNDEFINED; - - if PSTATE.EL != EL0 || ELUsingAArch32(EL1) then - if PSTATE.M == M32_Monitor then SCR.NS = '0'; - if PSTATE.EL != EL2 then - AArch32.WriteMode(M32_Svc); - PSTATE.E = SCTLR.EE; - if HavePANExt() && SCTLR.SPAN == '0' then PSTATE.PAN = '1'; - LR_svc = bits(32) UNKNOWN; - SPSR_svc = bits(32) UNKNOWN; - else - PSTATE.E = HSCTLR.EE; - ELR_hyp = bits(32) UNKNOWN; - HSR = bits(32) UNKNOWN; - SPSR_hyp = bits(32) UNKNOWN; - - DLR = bits(32) UNKNOWN; - DSPSR = bits(32) UNKNOWN; - else // Targeting EL1 using AArch64 - AArch64.MaybeZeroRegisterUppers(); - MaybeZeroSVEUppers(EL1); - PSTATE.nRW = '0'; - PSTATE.SP = '1'; - PSTATE.EL = EL1; - if HavePANExt() && SCTLR_EL1.SPAN == '0' then PSTATE.PAN = '1'; - if HaveUAOExt() then PSTATE.UAO = '0'; - - ELR_EL1 = bits(64) UNKNOWN; - ESR_EL1 = bits(32) UNKNOWN; - SPSR_EL1 = bits(32) UNKNOWN; - - DLR_EL0 = bits(64) UNKNOWN; - DSPSR_EL0 = bits(32) UNKNOWN; - - // SCTLR_EL1.IESB might be ignored in Debug state. - if HaveIESB() && SCTLR_EL1.IESB == '1' && !ConstrainUnpredictableBool(Unpredictable_IESBinDebug) then - SynchronizeErrors(); - - UpdateEDSCRFields(); // Update EDSCR PE state flags - -__instruction aarch32_LDRSHT_A - __encoding aarch32_LDRSHT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx0000 x111xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); postindex = TRUE; add = (U == '1'); - register_form = FALSE; imm32 = ZeroExtend(imm4H:imm4L, 32); - if t == 15 || n == 15 || n == t then UNPREDICTABLE; - - __encoding aarch32_LDRSHT_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0000 x011xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); postindex = TRUE; add = (U == '1'); - register_form = TRUE; - if t == 15 || n == 15 || n == t || m == 15 then UNPREDICTABLE; - - __encoding aarch32_LDRSHT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11111001 0011xxxx xxxx1110 xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - if Rn == '1111' then SEE "LDRSH (literal)"; - t = UInt(Rt); n = UInt(Rn); postindex = FALSE; add = TRUE; - register_form = FALSE; imm32 = ZeroExtend(imm8, 32); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = if register_form then R[m] else imm32; - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if postindex then R[n] else offset_addr; - data = MemU_unpriv[address,2]; - if postindex then R[n] = offset_addr; - R[t] = SignExtend(data, 32); - -__instruction aarch32_VCVT_is_A - __encoding aarch32_VCVT_is_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx11 xxxx011x xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - to_integer = (op[1] == '1'); unsigned = (op[0] == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCVT_is_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx11 xxxx011x xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - to_integer = (op[1] == '1'); unsigned = (op[0] == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(esize) result; - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[m+r],e,esize]; - if to_integer then - result = FPToFixed(op1, 0, unsigned, StandardFPSCRValue(), FPRounding_ZERO); - else - result = FixedToFP(op1, 0, unsigned, StandardFPSCRValue(), FPRounding_TIEEVEN); - Elem[D[d+r],e,esize] = result; - -__instruction aarch32_AESD_A - __encoding aarch32_AESD_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0011 01x0xxxx' - __guard TRUE - __decode - if !HaveAESExt() then UNDEFINED; - if size != '00' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_AESD_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0011 01x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAESExt() then UNDEFINED; - if size != '00' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - op1 = Q[d>>1]; op2 = Q[m>>1]; - Q[d>>1] = AESInvSubBytes(AESInvShiftRows(op1 EOR op2)); - -__instruction aarch32_VLD4_1_A - __encoding aarch32_VLD4_1_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx0011 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD4 (single 4-element structure to all lanes)"; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - alignment = if index_align[0] == '0' then 1 else 4; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD4_1_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx0111 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD4 (single 4-element structure to all lanes)"; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 8; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD4_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx1011 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD4 (single 4-element structure to all lanes)"; - if index_align[1:0] == '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[1:0] == '00' then 1 else 4 << UInt(index_align[1:0]); - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD4_1_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx0011 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD4 (single 4-element structure to all lanes)"; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - alignment = if index_align[0] == '0' then 1 else 4; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD4_1_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx0111 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD4 (single 4-element structure to all lanes)"; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 8; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD4_1_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx1011 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD4 (single 4-element structure to all lanes)"; - if index_align[1:0] == '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[1:0] == '00' then 1 else 4 << UInt(index_align[1:0]); - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - Elem[D[d], index] = MemU[address,ebytes]; - Elem[D[d2],index] = MemU[address+ebytes,ebytes]; - Elem[D[d3],index] = MemU[address+2*ebytes,ebytes]; - Elem[D[d4],index] = MemU[address+3*ebytes,ebytes]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 4*ebytes; - -__instruction aarch32_VDOT_s_A - __encoding aarch32_VDOT_s_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x10xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if !HaveDOTPExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - boolean signed = (U=='0'); - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm[3:0]); - integer index = UInt(M); - integer esize = 32; - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_VDOT_s_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x10xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveDOTPExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - boolean signed = (U=='0'); - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm[3:0]); - integer index = UInt(M); - integer esize = 32; - integer regs = if Q == '1' then 2 else 1; - - __execute - bits(64) operand1; - bits(64) operand2 = D[m]; - bits(64) result; - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - operand1 = D[n+r]; - result = D[d+r]; - integer element1, element2; - for e = 0 to 1 - integer res = 0; - for i = 0 to 3 - if signed then - element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = SInt(Elem[operand2, 4 * index + i, esize DIV 4]); - else - element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = UInt(Elem[operand2, 4 * index + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = Elem[result, e, esize] + res; - D[d+r] = result; - -__instruction aarch32_SMUAD_A - __encoding aarch32_SMUAD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Rm 8 +: 4 - __field M 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0000xxxx 1111xxxx 00x1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); m_swap = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SMUAD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0010xxxx 1111xxxx 000xxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); m_swap = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand2 = if m_swap then ROR(R[m],16) else R[m]; - product1 = SInt(R[n][15:0]) * SInt(operand2[15:0]); - product2 = SInt(R[n][31:16]) * SInt(operand2[31:16]); - result = product1 + product2; - R[d] = result[31:0]; - if result != SInt(result[31:0]) then // Signed overflow - PSTATE.Q = '1'; - -__instruction aarch32_VMAX_i_A - __encoding aarch32_VMAX_i_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field op 4 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0110 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - maximum = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMAX_i_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field op 4 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0110 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - maximum = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Int(Elem[D[n+r],e,esize], unsigned); - op2 = Int(Elem[D[m+r],e,esize], unsigned); - result = if maximum then Max(op1,op2) else Min(op1,op2); - Elem[D[d+r],e,esize] = result[esize-1:0]; - -__instruction aarch32_LDRSH_l_A - __encoding aarch32_LDRSH_l_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x11111 xxxxxxxx 1111xxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "LDRSHT"; - t = UInt(Rt); imm32 = ZeroExtend(imm4H:imm4L, 32); - add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 || wback then UNPREDICTABLE; - - __encoding aarch32_LDRSH_l_T1_A - __instruction_set T32 - __field U 23 +: 1 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111001 x0111111 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "Related instructions"; - t = UInt(Rt); imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - base = Align(PC,4); - address = if add then (base + imm32) else (base - imm32); - data = MemU[address,2]; - R[t] = SignExtend(data, 32); - -__instruction aarch32_VQMOVN_A - __encoding aarch32_VQMOVN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 6 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0010 xxx0xxxx' - __guard TRUE - __decode - if op == '00' then SEE "VMOVN"; - if size == '11' || Vm[0] == '1' then UNDEFINED; - src_unsigned = (op == '11'); dest_unsigned = (op[0] == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VQMOVN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 6 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0010 xxx0xxxx' - __guard TRUE - __decode - if op == '00' then SEE "VMOVN"; - if size == '11' || Vm[0] == '1' then UNDEFINED; - src_unsigned = (op == '11'); dest_unsigned = (op[0] == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - operand = Int(Elem[Qin[m>>1],e,2*esize], src_unsigned); - (Elem[D[d],e,esize], sat) = SatQ(operand, esize, dest_unsigned); - if sat then FPSCR.QC = '1'; - -__instruction aarch32_UQASX_A - __encoding aarch32_UQASX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0110xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UQASX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1010xxxx 1111xxxx 0101xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff = UInt(R[n][15:0]) - UInt(R[m][31:16]); - sum = UInt(R[n][31:16]) + UInt(R[m][15:0]); - R[d][15:0] = UnsignedSat(diff, 16); - R[d][31:16] = UnsignedSat(sum, 16); - -__instruction aarch32_VNEG_A - __encoding aarch32_VNEG_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx01 xxxx0x11 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - advsimd = TRUE; floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VNEG_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110001 xxxx10xx 01x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - advsimd = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VNEG_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx01 xxxx0x11 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - advsimd = TRUE; floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VNEG_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110001 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - advsimd = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - Elem[D[d+r],e,esize] = FPNeg(Elem[D[m+r],e,esize]); - else - result = -SInt(Elem[D[m+r],e,esize]); - Elem[D[d+r],e,esize] = result[esize-1:0]; - else // VFP instruction - case esize of - when 16 S[d] = Zeros(16) : FPNeg(S[m][15:0]); - when 32 S[d] = FPNeg(S[m]); - when 64 D[d] = FPNeg(D[m]); - -__instruction aarch32_VCVT_ds_A - __encoding aarch32_VCVT_ds_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110111 xxxx101x 11x0xxxx' - __guard cond != '1111' - __decode - double_to_single = (size == '11'); - d = if double_to_single then UInt(Vd:D) else UInt(D:Vd); - m = if double_to_single then UInt(M:Vm) else UInt(Vm:M); - - __encoding aarch32_VCVT_ds_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110111 xxxx101x 11x0xxxx' - __guard TRUE - __decode - double_to_single = (size == '11'); - d = if double_to_single then UInt(Vd:D) else UInt(D:Vd); - m = if double_to_single then UInt(M:Vm) else UInt(Vm:M); - - __execute __conditional - CheckVFPEnabled(TRUE); - if double_to_single then - S[d] = FPConvert(D[m], FPSCR); - else - D[d] = FPConvert(S[m], FPSCR); - -__instruction aarch32_SSAT_A - __encoding aarch32_SSAT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field sat_imm 16 +: 5 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field sh 6 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0110 101xxxxx xxxxxxxx xx01xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm)+1; - (shift_t, shift_n) = DecodeImmShift(sh:'0', imm5); - if d == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_SSAT_T1_A - __instruction_set T32 - __field sh 21 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field sat_imm 0 +: 5 - __opcode '11110x11 00x0xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 26 == '0' - __unpredictable_unless 5 == '0' - __decode - if sh == '1' && (imm3:imm2) == '00000' then SEE "SSAT16"; - d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm)+1; - (shift_t, shift_n) = DecodeImmShift(sh:'0', imm3:imm2); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand = Shift(R[n], shift_t, shift_n, PSTATE.C); // PSTATE.C ignored - (result, sat) = SignedSatQ(SInt(operand), saturate_to); - R[d] = SignExtend(result, 32); - if sat then - PSTATE.Q = '1'; - -__instruction aarch32_STMDA_A - __encoding aarch32_STMDA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx1000 00x0xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - - __execute __conditional - address = R[n] - 4*BitCount(registers) + 4; - for i = 0 to 14 - if registers[i] == '1' then - if i == n && wback && i != LowestSetBit(registers) then - MemA[address,4] = bits(32) UNKNOWN; - else - MemA[address,4] = R[i]; - address = address + 4; - if registers[15] == '1' then - MemA[address,4] = PCStoreValue(); - if wback then R[n] = R[n] - 4*BitCount(registers); - -__instruction aarch32_RSB_i_A - __encoding aarch32_RSB_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 011xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_RSB_i_T1_A - __instruction_set T16 - __field Rn 19 +: 3 - __field Rd 16 +: 3 - __opcode '01000010 01xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); setflags = !InITBlock(); imm32 = Zeros(32); // immediate = #0 - - __encoding aarch32_RSB_i_T2_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x01 110xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = T32ExpandImm(i:imm3:imm8); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (result, nzcv) = AddWithCarry(NOT(R[n]), imm32, '1'); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VRSHL_A - __encoding aarch32_VRSHL_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRSHL_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - shift = SInt(Elem[D[n+r],e,esize][7:0]); - round_const = 1 << (-shift-1); // 0 for left shift, 2^(n-1) for right shift - result = (Int(Elem[D[m+r],e,esize], unsigned) + round_const) << shift; - Elem[D[d+r],e,esize] = result[esize-1:0]; - -__instruction aarch32_TEQ_r_A - __encoding aarch32_TEQ_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0011xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_TEQ_r_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 1001xxxx xxxx1111 xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] EOR shifted; - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_ORR_i_A - __encoding aarch32_ORR_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 100xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = A32ExpandImm_C(imm12, PSTATE.C); - - __encoding aarch32_ORR_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x00 010xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "MOV (immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = R[n] OR imm32; - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_SHA256H_A - __encoding aarch32_SHA256H_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x00xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if !HaveSHA256Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_SHA256H_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x00xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA256Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - X = Q[d>>1]; Y = Q[n>>1]; W = Q[m>>1]; part1 = TRUE; - Q[d>>1] = SHA256hash(X, Y, W, part1); - -__instruction aarch32_VTST_A - __encoding aarch32_VTST_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0xxxxxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VTST_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0xxxxxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - if !IsZero(Elem[D[n+r],e,esize] AND Elem[D[m+r],e,esize]) then - Elem[D[d+r],e,esize] = Ones(esize); - else - Elem[D[d+r],e,esize] = Zeros(esize); - -__instruction aarch32_MMLA_A - __encoding aarch32_MMLA_A1_A - __instruction_set A32 - __field B 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1100 x1x0xxxx' - __guard TRUE - __decode - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - - __encoding aarch32_MMLA_T1_A - __instruction_set T32 - __field B 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1100 x1x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - - __execute - CheckAdvSIMDEnabled(); - bits(128) operand1 = Q[n>>1]; - bits(128) operand2 = Q[m>>1]; - bits(128) addend = Q[d>>1]; - - Q[d>>1] = MatMulAdd(addend, operand1, operand2, op1_unsigned, op2_unsigned); - -__instruction aarch32_VORN_r_A - __encoding aarch32_VORN_r_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x11xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VORN_r_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x11xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = D[n+r] OR NOT(D[m+r]); - -__instruction aarch32_VRINTA_vfp_A - __encoding aarch32_VRINTA_vfp_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111000 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VRINTA_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111000 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = Zeros(16) : FPRoundInt(S[m][15:0], FPSCR, rounding, exact); - when 32 - S[d] = FPRoundInt(S[m], FPSCR, rounding, exact); - when 64 - D[d] = FPRoundInt(D[m], FPSCR, rounding, exact); - -__instruction aarch32_LDR_r_A - __encoding aarch32_LDR_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx011x x0x1xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "LDRT"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_LDR_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '0101100x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_LDR_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111000 0101xxxx xxxx0000 00xxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDR (literal)"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if t == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute - if CurrentInstrSet() == InstrSet_A32 then - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if index then offset_addr else R[n]; - data = MemU[address,4]; - if wback then R[n] = offset_addr; - if t == 15 then - if address[1:0] == '00' then - LoadWritePC(data); - else - UNPREDICTABLE; - else - R[t] = data; - else - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = (R[n] + offset); - address = offset_addr; - data = MemU[address,4]; - if t == 15 then - if address[1:0] == '00' then - LoadWritePC(data); - else - UNPREDICTABLE; - else - R[t] = data; - -__instruction aarch32_BIC_r_A - __encoding aarch32_BIC_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 110xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_BIC_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rdn 16 +: 3 - __opcode '01000011 10xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdn); n = UInt(Rdn); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_BIC_r_T2_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 001xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] AND NOT(shifted); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VREV16_A - __encoding aarch32_VREV16_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0000 1xx0xxxx' - __guard TRUE - __decode - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - - esize = 8 << UInt(size); - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - integer containers = 64 DIV container_size; - integer elements_per_container = container_size DIV esize; - - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VREV16_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0000 1xx0xxxx' - __guard TRUE - __decode - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - - esize = 8 << UInt(size); - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - integer containers = 64 DIV container_size; - integer elements_per_container = container_size DIV esize; - - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - - bits(64) result; - integer element; - integer rev_element; - for r = 0 to regs-1 - element = 0; - for c = 0 to containers-1 - rev_element = element + elements_per_container - 1; - for e = 0 to elements_per_container-1 - Elem[result, rev_element, esize] = Elem[D[m+r], element, esize]; - element = element + 1; - rev_element = rev_element - 1; - D[d+r] = result; - -__instruction aarch32_SUB_rr_A - __encoding aarch32_SUB_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 010xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], NOT(shifted), '1'); - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VSWP_A - __encoding aarch32_VSWP_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x110010 xxxx0000 0xx0xxxx' - __guard TRUE - __decode - if size != '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSWP_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x110010 xxxx0000 0xx0xxxx' - __guard TRUE - __decode - if size != '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - if d == m then - D[d+r] = bits(64) UNKNOWN; - else - D[d+r] = Din[m+r]; - D[m+r] = Din[d+r]; - -__instruction aarch32_ADC_i_A - __encoding aarch32_ADC_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 101xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_ADC_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x01 010xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = T32ExpandImm(i:imm3:imm8); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (result, nzcv) = AddWithCarry(R[n], imm32, PSTATE.C); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_STRD_i_A - __encoding aarch32_STRD_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x0xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __decode - if Rt[0] == '1' then UNPREDICTABLE; - t = UInt(Rt); t2 = t+1; n = UInt(Rn); imm32 = ZeroExtend(imm4H:imm4L, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if P == '0' && W == '1' then UNPREDICTABLE; - if wback && (n == 15 || n == t || n == t2) then UNPREDICTABLE; - if t2 == 15 then UNPREDICTABLE; - - __encoding aarch32_STRD_i_T1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field imm8 0 +: 8 - __opcode '1110100x x1x0xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if P == '0' && W == '0' then SEE "Related encodings"; - t = UInt(Rt); t2 = UInt(Rt2); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if wback && (n == t || n == t2) then UNPREDICTABLE; - if n == 15 || t == 15 || t2 == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - if address == Align(address, 8) then - bits(64) data; - if BigEndian() then - data[63:32] = R[t]; - data[31:0] = R[t2]; - else - data[31:0] = R[t]; - data[63:32] = R[t2]; - MemA[address,8] = data; - else - MemA[address,4] = R[t]; - MemA[address+4,4] = R[t2]; - if wback then R[n] = offset_addr; - -__instruction aarch32_VSLI_A - __encoding aarch32_VSLI_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1xxxxxxx xxxx0101 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = UInt(imm6) - 8; - when '001xxxx' esize = 16; elements = 4; shift_amount = UInt(imm6) - 16; - when '01xxxxx' esize = 32; elements = 2; shift_amount = UInt(imm6) - 32; - when '1xxxxxx' esize = 64; elements = 1; shift_amount = UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSLI_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1xxxxxxx xxxx0101 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = UInt(imm6) - 8; - when '001xxxx' esize = 16; elements = 4; shift_amount = UInt(imm6) - 16; - when '01xxxxx' esize = 32; elements = 2; shift_amount = UInt(imm6) - 32; - when '1xxxxxx' esize = 64; elements = 1; shift_amount = UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - mask = LSL(Ones(esize), shift_amount); - for r = 0 to regs-1 - for e = 0 to elements-1 - shifted_op = LSL(Elem[D[m+r],e,esize], shift_amount); - Elem[D[d+r],e,esize] = (Elem[D[d+r],e,esize] AND NOT(mask)) OR shifted_op; - -__instruction aarch32_VRSHR_A - __encoding aarch32_VRSHR_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0010 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRSHR_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0010 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - round_const = 1 << (shift_amount - 1); - for r = 0 to regs-1 - for e = 0 to elements-1 - result = (Int(Elem[D[m+r],e,esize], unsigned) + round_const) >> shift_amount; - Elem[D[d+r],e,esize] = result[esize-1:0]; - -__instruction aarch32_LDRD_l_A - __encoding aarch32_LDRD_l_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x01111 xxxxxxxx 1101xxxx' - __guard cond != '1111' - __unpredictable_unless 24 == '1' - __unpredictable_unless 21 == '0' - __decode - if Rt[0] == '1' then UNPREDICTABLE; - t = UInt(Rt); t2 = t+1; imm32 = ZeroExtend(imm4H:imm4L, 32); add = (U == '1'); - if t2 == 15 then UNPREDICTABLE; - - __encoding aarch32_LDRD_l_T1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field imm8 0 +: 8 - __opcode '1110100x x1x11111 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if P == '0' && W == '0' then SEE "Related encodings"; - t = UInt(Rt); t2 = UInt(Rt2); - imm32 = ZeroExtend(imm8:'00', 32); add = (U == '1'); - if t == 15 || t2 == 15 || t == t2 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if W == '1' then UNPREDICTABLE; - - __execute __conditional - address = if add then (Align(PC,4) + imm32) else (Align(PC,4) - imm32); - if address == Align(address, 8) then - data = MemA[address,8]; - if BigEndian() then - R[t] = data[63:32]; - R[t2] = data[31:0]; - else - R[t] = data[31:0]; - R[t2] = data[63:32]; - else - R[t] = MemA[address,4]; - R[t2] = MemA[address+4,4]; - -__instruction aarch32_MSR_r_AS - __encoding aarch32_MSR_r_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field R 22 +: 1 - __field mask 16 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0001 0x10xxxx xxxxxx0x 0000xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 8 == '0' - __decode - n = UInt(Rn); write_spsr = (R == '1'); - if mask == '0000' then UNPREDICTABLE; - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_MSR_r_T1_AS - __instruction_set T32 - __field R 20 +: 1 - __field Rn 16 +: 4 - __field mask 8 +: 4 - __opcode '11110011 100xxxxx 10x0xxxx xx0xxxxx' - __guard TRUE - __unpredictable_unless 13 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 4 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - n = UInt(Rn); write_spsr = (R == '1'); - if mask == '0000' then UNPREDICTABLE; - if n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - if write_spsr then - if PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; - else - SPSRWriteByInstr(R[n], mask); - else - // Attempts to change to an illegal mode will invoke the Illegal Execution state mechanism - CPSRWriteByInstr(R[n], mask); - -__instruction aarch32_VST1_1_A - __encoding aarch32_VST1_1_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx0000 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[0] != '0' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); alignment = 1; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VST1_1_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx0100 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[1] != '0' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - alignment = if index_align[0] == '0' then 1 else 2; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VST1_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx1000 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[2] != '0' then UNDEFINED; - if index_align[1:0] != '00' && index_align[1:0] != '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - alignment = if index_align[1:0] == '00' then 1 else 4; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VST1_1_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx0000 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[0] != '0' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); alignment = 1; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VST1_1_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx0100 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[1] != '0' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - alignment = if index_align[0] == '0' then 1 else 2; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VST1_1_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx1000 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[2] != '0' then UNDEFINED; - if index_align[1:0] != '00' && index_align[1:0] != '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - alignment = if index_align[1:0] == '00' then 1 else 4; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = TRUE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - MemU[address,ebytes] = Elem[D[d],index]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + ebytes; - -__instruction aarch32_VFMA_bf_A - __encoding aarch32_VFMA_bf_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x11xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer elements = 128 DIV 32; - integer sel = UInt(Q); - - __encoding aarch32_VFMA_bf_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x11xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32BF16Ext() then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer elements = 128 DIV 32; - integer sel = UInt(Q); - - __execute - CheckAdvSIMDEnabled(); - bits(128) operand1 = Q[n>>1]; - bits(128) operand2 = Q[m>>1]; - bits(128) operand3 = Q[d>>1]; - bits(128) result; - - for e = 0 to elements-1 - bits(32) element1 = Elem[operand1, 2 * e + sel, 16] : Zeros(16); - bits(32) element2 = Elem[operand2, 2 * e + sel, 16] : Zeros(16); - bits(32) addend = Elem[operand3, e, 32]; - Elem[result, e, 32] = FPMulAdd(addend, element1, element2, - StandardFPSCRValue()); - - Q[d>>1] = result; - -__instruction aarch32_DCPS3_A - __encoding aarch32_DCPS3_T1_A - __instruction_set T32 - __opcode '11110111 10001111 10000000 00000011' - __guard TRUE - __decode - if !HaveEL(EL3) then UNDEFINED; - - __execute - if !Halted() || EDSCR.SDD == '1' then UNDEFINED; - - if ELUsingAArch32(EL3) then - from_secure = IsSecure(); - if PSTATE.M == M32_Monitor then SCR.NS = '0'; - AArch32.WriteMode(M32_Monitor); - if HavePANExt() then - if !from_secure then - PSTATE.PAN = '0'; - elsif SCTLR.SPAN == '0' then - PSTATE.PAN = '1'; - PSTATE.E = SCTLR.EE; - - LR_mon = bits(32) UNKNOWN; - SPSR_mon = bits(32) UNKNOWN; - - DLR = bits(32) UNKNOWN; - DSPSR = bits(32) UNKNOWN; - else // Targeting EL3 using AArch64 - AArch64.MaybeZeroRegisterUppers(); - MaybeZeroSVEUppers(EL3); - PSTATE.nRW = '0'; - PSTATE.SP = '1'; - PSTATE.EL = EL3; - if HaveUAOExt() then PSTATE.UAO = '0'; - - ELR_EL3 = bits(64) UNKNOWN; - ESR_EL3 = bits(32) UNKNOWN; - SPSR_EL3 = bits(32) UNKNOWN; - - DLR_EL0 = bits(64) UNKNOWN; - DSPSR_EL0 = bits(32) UNKNOWN; - - sync_errors = HaveIESB() && SCTLR_EL3.IESB == '1'; - if HaveDoubleFaultExt() && SCR_EL3.EA == '1' && SCR_EL3.NMEA == '1' then - sync_errors = TRUE; - // SCTLR_EL3.IESB might be ignored in Debug state. - if !ConstrainUnpredictableBool(Unpredictable_IESBinDebug) then - sync_errors = FALSE; - if sync_errors then SynchronizeErrors(); - - UpdateEDSCRFields(); // Update EDSCR PE state flags - -__instruction aarch32_BFI_A - __encoding aarch32_BFI_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field msb 16 +: 5 - __field Rd 12 +: 4 - __field lsb 7 +: 5 - __field Rn 0 +: 4 - __opcode 'xxxx0111 110xxxxx xxxxxxxx x001xxxx' - __guard cond != '1111' - __decode - if Rn == '1111' then SEE "BFC"; - d = UInt(Rd); n = UInt(Rn); msbit = UInt(msb); lsbit = UInt(lsb); - if d == 15 then UNPREDICTABLE; - - __encoding aarch32_BFI_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field msb 0 +: 5 - __opcode '11110x11 0110xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 26 == '0' - __unpredictable_unless 5 == '0' - __decode - if Rn == '1111' then SEE "BFC"; - d = UInt(Rd); n = UInt(Rn); msbit = UInt(msb); lsbit = UInt(imm3:imm2); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - if msbit >= lsbit then - R[d][msbit:lsbit] = R[n][(msbit-lsbit):0]; - // Other bits of R[d] are unchanged - else - UNPREDICTABLE; - -__instruction aarch32_VREV16_A - __encoding aarch32_VREV16_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0000 0xx0xxxx' - __guard TRUE - __decode - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - - esize = 8 << UInt(size); - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - integer containers = 64 DIV container_size; - integer elements_per_container = container_size DIV esize; - - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VREV16_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0000 0xx0xxxx' - __guard TRUE - __decode - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - - esize = 8 << UInt(size); - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - integer containers = 64 DIV container_size; - integer elements_per_container = container_size DIV esize; - - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - - bits(64) result; - integer element; - integer rev_element; - for r = 0 to regs-1 - element = 0; - for c = 0 to containers-1 - rev_element = element + elements_per_container - 1; - for e = 0 to elements_per_container-1 - Elem[result, rev_element, esize] = Elem[D[m+r], element, esize]; - element = element + 1; - rev_element = rev_element - 1; - D[d+r] = result; - -__instruction aarch32_VDUP_s_A - __encoding aarch32_VDUP_s_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field imm4 16 +: 4 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xxxx xxxx1100 0xx0xxxx' - __guard TRUE - __decode - if imm4 == 'x000' then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - case imm4 of - when 'xxx1' esize = 8; elements = 8; index = UInt(imm4[3:1]); - when 'xx10' esize = 16; elements = 4; index = UInt(imm4[3:2]); - when 'x100' esize = 32; elements = 2; index = UInt(imm4[3]); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VDUP_s_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field imm4 16 +: 4 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xxxx xxxx1100 0xx0xxxx' - __guard TRUE - __decode - if imm4 == 'x000' then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - case imm4 of - when 'xxx1' esize = 8; elements = 8; index = UInt(imm4[3:1]); - when 'xx10' esize = 16; elements = 4; index = UInt(imm4[3:2]); - when 'x100' esize = 32; elements = 2; index = UInt(imm4[3]); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - scalar = Elem[D[m],index,esize]; - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = scalar; - -__instruction aarch32_ORR_r_A - __encoding aarch32_ORR_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 100xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_ORR_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rdn 16 +: 3 - __opcode '01000011 00xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdn); n = UInt(Rdn); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_ORR_r_T2_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 010xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if Rn == '1111' then SEE "Related encodings"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] OR shifted; - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VMAXNM_A - __encoding aarch32_VMAXNM_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x1xxxxx xxxx1111 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - maximum = (op == '0'); - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMAXNM_A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x00xxxx xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - advsimd = FALSE; - maximum = (op == '0'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VMAXNM_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x1xxxxx xxxx1111 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - maximum = (op == '0'); - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMAXNM_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x00xxxx xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - advsimd = FALSE; - maximum = (op == '0'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[n+r], e, esize]; op2 = Elem[D[m+r], e, esize]; - if maximum then - Elem[D[d+r], e, esize] = FPMaxNum(op1, op2, StandardFPSCRValue()); - else - Elem[D[d+r], e, esize] = FPMinNum(op1, op2, StandardFPSCRValue()); - else // VFP instruction - case esize of - when 16 - if maximum then - S[d] = Zeros(16) : FPMaxNum(S[n][15:0], S[m][15:0], FPSCR); - else - S[d] = Zeros(16) : FPMinNum(S[n][15:0], S[m][15:0], FPSCR); - when 32 - if maximum then - S[d] = FPMaxNum(S[n], S[m], FPSCR); - else - S[d] = FPMinNum(S[n], S[m], FPSCR); - when 64 - if maximum then - D[d] = FPMaxNum(D[n], D[m], FPSCR); - else - D[d] = FPMinNum(D[n], D[m], FPSCR); - -__instruction aarch32_MOV_i_A - __encoding aarch32_MOV_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 101xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - d = UInt(Rd); setflags = (S == '1'); (imm32, carry) = A32ExpandImm_C(imm12, PSTATE.C); - - __encoding aarch32_MOV_i_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm4 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 0000xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); setflags = FALSE; imm32 = ZeroExtend(imm4:imm12, 32); - if d == 15 then UNPREDICTABLE; - - __encoding aarch32_MOV_i_T1_A - __instruction_set T16 - __field Rd 24 +: 3 - __field imm8 16 +: 8 - __opcode '00100xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); setflags = !InITBlock(); imm32 = ZeroExtend(imm8, 32); carry = PSTATE.C; - - __encoding aarch32_MOV_i_T2_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x00 010x1111 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); setflags = (S == '1'); (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_MOV_i_T3_A - __instruction_set T32 - __field i 26 +: 1 - __field imm4 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x10 0100xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); setflags = FALSE; imm32 = ZeroExtend(imm4:i:imm3:imm8, 32); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = imm32; - if d == 15 then // Can only occur for encoding A1 - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VLDM_A - __encoding aarch32_VLDM_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode 'xxxx110x xxx1xxxx xxxx1011 xxxxxxx1' - __guard cond != '1111' - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VLDR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = FALSE; add = (U == '1'); wback = (W == '1'); - d = UInt(D:Vd); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - regs = UInt(imm8) DIV 2; // If UInt(imm8) is odd, see "FLDM*X". - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if imm8[0] == '1' && (d+regs) > 16 then UNPREDICTABLE; - - __encoding aarch32_VLDM_T1A1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field D 22 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field imm8 0 +: 8 - __opcode '1110110x xxx1xxxx xxxx1011 xxxxxxx1' - __guard TRUE - __decode - if P == '0' && U == '0' && W == '0' then SEE "Related encodings"; - if P == '1' && W == '0' then SEE "VLDR"; - if P == U && W == '1' then UNDEFINED; - // Remaining combinations are PUW = 010 (IA without !), 011 (IA with !), 101 (DB with !) - single_regs = FALSE; add = (U == '1'); wback = (W == '1'); - d = UInt(D:Vd); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - regs = UInt(imm8) DIV 2; // If UInt(imm8) is odd, see "FLDM*X". - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - if regs == 0 || regs > 16 || (d+regs) > 32 then UNPREDICTABLE; - if imm8[0] == '1' && (d+regs) > 16 then UNPREDICTABLE; - - __execute __conditional - CheckVFPEnabled(TRUE); - address = if add then R[n] else R[n]-imm32; - for r = 0 to regs-1 - if single_regs then - S[d+r] = MemA[address,4]; address = address+4; - else - word1 = MemA[address,4]; word2 = MemA[address+4,4]; address = address+8; - // Combine the word-aligned words in the correct order for current endianness. - D[d+r] = if BigEndian() then word1:word2 else word2:word1; - if wback then R[n] = if add then R[n]+imm32 else R[n]-imm32; - -__instruction aarch32_VMAXNM_A - __encoding aarch32_VMAXNM_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x0xxxxx xxxx1111 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - maximum = (op == '0'); - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMAXNM_A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x00xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - advsimd = FALSE; - maximum = (op == '0'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VMAXNM_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x0xxxxx xxxx1111 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - maximum = (op == '0'); - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMAXNM_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x00xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - advsimd = FALSE; - maximum = (op == '0'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[n+r], e, esize]; op2 = Elem[D[m+r], e, esize]; - if maximum then - Elem[D[d+r], e, esize] = FPMaxNum(op1, op2, StandardFPSCRValue()); - else - Elem[D[d+r], e, esize] = FPMinNum(op1, op2, StandardFPSCRValue()); - else // VFP instruction - case esize of - when 16 - if maximum then - S[d] = Zeros(16) : FPMaxNum(S[n][15:0], S[m][15:0], FPSCR); - else - S[d] = Zeros(16) : FPMinNum(S[n][15:0], S[m][15:0], FPSCR); - when 32 - if maximum then - S[d] = FPMaxNum(S[n], S[m], FPSCR); - else - S[d] = FPMinNum(S[n], S[m], FPSCR); - when 64 - if maximum then - D[d] = FPMaxNum(D[n], D[m], FPSCR); - else - D[d] = FPMinNum(D[n], D[m], FPSCR); - -__instruction aarch32_VPMAX_i_A - __encoding aarch32_VPMAX_i_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field op 4 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx1010 x0x1xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - maximum = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VPMAX_i_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field op 4 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx1010 x0x1xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - maximum = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(64) dest; - h = elements DIV 2; - - for e = 0 to h-1 - op1 = Int(Elem[D[n],2*e,esize], unsigned); - op2 = Int(Elem[D[n],2*e+1,esize], unsigned); - result = if maximum then Max(op1,op2) else Min(op1,op2); - Elem[dest,e,esize] = result[esize-1:0]; - op1 = Int(Elem[D[m],2*e,esize], unsigned); - op2 = Int(Elem[D[m],2*e+1,esize], unsigned); - result = if maximum then Max(op1,op2) else Min(op1,op2); - Elem[dest,e+h,esize] = result[esize-1:0]; - - D[d] = dest; - -__instruction aarch32_VPADD_f_A - __encoding aarch32_VPADD_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x0xxxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VPADD_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x0xxxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(64) dest; - h = elements DIV 2; - - for e = 0 to h-1 - Elem[dest,e,esize] = FPAdd(Elem[D[n],2*e,esize], Elem[D[n],2*e+1,esize], StandardFPSCRValue()); - Elem[dest,e+h,esize] = FPAdd(Elem[D[m],2*e,esize], Elem[D[m],2*e+1,esize], StandardFPSCRValue()); - - D[d] = dest; - -__instruction aarch32_UHSUB16_A - __encoding aarch32_UHSUB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0111xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UHSUB16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1101xxxx 1111xxxx 0110xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = UInt(R[n][15:0]) - UInt(R[m][15:0]); - diff2 = UInt(R[n][31:16]) - UInt(R[m][31:16]); - R[d][15:0] = diff1[16:1]; - R[d][31:16] = diff2[16:1]; - -__instruction aarch32_HLT_A - __encoding aarch32_HLT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm12 8 +: 12 - __field imm4 0 +: 4 - __opcode 'xxxx0001 0000xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __decode - if EDSCR.HDE == '0' || !HaltingAllowed() then UNDEFINED; - if cond != '1110' then UNPREDICTABLE; // HLT must be encoded with AL condition - - __encoding aarch32_HLT_T1_A - __instruction_set T16 - __field imm6 16 +: 6 - __opcode '10111010 10xxxxxx 00000000 00000000' - __guard TRUE - __decode - if EDSCR.HDE == '0' || !HaltingAllowed() then UNDEFINED; - - __execute - Halt(DebugHalt_HaltInstruction); - -__instruction aarch32_VMOV_sr_A - __encoding aarch32_VMOV_sr_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field opc1 21 +: 2 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - __field opc2 5 +: 2 - __opcode 'xxxx1110 xxx1xxxx xxxx1011 xxx1xxxx' - __guard cond != '1111' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - case U:opc1:opc2 of - when 'x1xxx' advsimd = TRUE; esize = 8; index = UInt(opc1[0]:opc2); - when 'x0xx1' advsimd = TRUE; esize = 16; index = UInt(opc1[0]:opc2[1]); - when '00x00' advsimd = FALSE; esize = 32; index = UInt(opc1[0]); - when '10x00' UNDEFINED; - when 'x0x10' UNDEFINED; - t = UInt(Rt); n = UInt(N:Vn); unsigned = (U == '1'); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_VMOV_sr_T1A1_A - __instruction_set T32 - __field U 23 +: 1 - __field opc1 21 +: 2 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - __field opc2 5 +: 2 - __opcode '11101110 xxx1xxxx xxxx1011 xxx1xxxx' - __guard TRUE - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - case U:opc1:opc2 of - when 'x1xxx' advsimd = TRUE; esize = 8; index = UInt(opc1[0]:opc2); - when 'x0xx1' advsimd = TRUE; esize = 16; index = UInt(opc1[0]:opc2[1]); - when '00x00' advsimd = FALSE; esize = 32; index = UInt(opc1[0]); - when '10x00' UNDEFINED; - when 'x0x10' UNDEFINED; - t = UInt(Rt); n = UInt(N:Vn); unsigned = (U == '1'); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if unsigned then - R[t] = ZeroExtend(Elem[D[n],index,esize], 32); - else - R[t] = SignExtend(Elem[D[n],index,esize], 32); - -__instruction aarch32_BIC_rr_A - __encoding aarch32_BIC_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 110xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] AND NOT(shifted); - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_CMP_i_A - __encoding aarch32_CMP_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 0101xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_CMP_i_T1_A - __instruction_set T16 - __field Rn 24 +: 3 - __field imm8 16 +: 8 - __opcode '00101xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); - - __encoding aarch32_CMP_i_T2_A - __instruction_set T32 - __field i 26 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field imm8 0 +: 8 - __opcode '11110x01 1011xxxx 0xxx1111 xxxxxxxx' - __guard TRUE - __decode - n = UInt(Rn); imm32 = T32ExpandImm(i:imm3:imm8); - if n == 15 then UNPREDICTABLE; - - __execute __conditional - (result, nzcv) = AddWithCarry(R[n], NOT(imm32), '1'); - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_BFC_A - __encoding aarch32_BFC_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field msb 16 +: 5 - __field Rd 12 +: 4 - __field lsb 7 +: 5 - __opcode 'xxxx0111 110xxxxx xxxxxxxx x0011111' - __guard cond != '1111' - __decode - d = UInt(Rd); msbit = UInt(msb); lsbit = UInt(lsb); - if d == 15 then UNPREDICTABLE; - - __encoding aarch32_BFC_T1_A - __instruction_set T32 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field msb 0 +: 5 - __opcode '11110x11 01101111 0xxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 26 == '0' - __unpredictable_unless 5 == '0' - __decode - d = UInt(Rd); msbit = UInt(msb); lsbit = UInt(imm3:imm2); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - if msbit >= lsbit then - R[d][msbit:lsbit] = Replicate('0', msbit-lsbit+1); - // Other bits of R[d] are unchanged - else - UNPREDICTABLE; - -__instruction aarch32_SHA256H2_A - __encoding aarch32_SHA256H2_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x01xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if !HaveSHA256Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_SHA256H2_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x01xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA256Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - X = Q[n>>1]; Y = Q[d>>1]; W = Q[m>>1]; part1 = FALSE; - Q[d>>1] = SHA256hash(X, Y, W, part1); - -__instruction aarch32_TEQ_rr_A - __encoding aarch32_TEQ_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0011xxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - shift_t = DecodeRegShift(stype); - if n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] EOR shifted; - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VQDMULH_A - __encoding aarch32_VQDMULH_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0xxxxxxx xxxx1011 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '00' || size == '11' then UNDEFINED; - scalar_form = FALSE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQDMULH_T2A2_A - __instruction_set A32 - __field Q 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx1100 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VQDMULH_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0xxxxxxx xxxx1011 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '00' || size == '11' then UNDEFINED; - scalar_form = FALSE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQDMULH_T2A2_A - __instruction_set T32 - __field Q 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx1100 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - if scalar_form then op2 = SInt(Elem[D[m],index,esize]); - for r = 0 to regs-1 - for e = 0 to elements-1 - if !scalar_form then op2 = SInt(Elem[D[m+r],e,esize]); - op1 = SInt(Elem[D[n+r],e,esize]); - // The following only saturates if both op1 and op2 equal -(2^(esize-1)) - (result, sat) = SignedSatQ((2*op1*op2) >> esize, esize); - Elem[D[d+r],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_B_A - __encoding aarch32_B_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm24 0 +: 24 - __opcode 'xxxx1010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - imm32 = SignExtend(imm24:'00', 32); - - __encoding aarch32_B_T1_A - __instruction_set T16 - __field cond 24 +: 4 - __field imm8 16 +: 8 - __opcode '1101xxxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - if cond == '1110' then SEE "UDF"; - if cond == '1111' then SEE "SVC"; - imm32 = SignExtend(imm8:'0', 32); - if InITBlock() then UNPREDICTABLE; - - __encoding aarch32_B_T2_A - __instruction_set T16 - __field imm11 16 +: 11 - __opcode '11100xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - imm32 = SignExtend(imm11:'0', 32); - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __encoding aarch32_B_T3_A - __instruction_set T32 - __field S 26 +: 1 - __field cond 22 +: 4 - __field imm6 16 +: 6 - __field J1 13 +: 1 - __field J2 11 +: 1 - __field imm11 0 +: 11 - __opcode '11110xxx xxxxxxxx 10x0xxxx xxxxxxxx' - __guard TRUE - __decode - if cond[3:1] == '111' then SEE "Related encodings"; - imm32 = SignExtend(S:J2:J1:imm6:imm11:'0', 32); - if InITBlock() then UNPREDICTABLE; - - __encoding aarch32_B_T4_A - __instruction_set T32 - __field S 26 +: 1 - __field imm10 16 +: 10 - __field J1 13 +: 1 - __field J2 11 +: 1 - __field imm11 0 +: 11 - __opcode '11110xxx xxxxxxxx 10x1xxxx xxxxxxxx' - __guard TRUE - __decode - I1 = NOT(J1 EOR S); I2 = NOT(J2 EOR S); imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32); - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - BranchWritePC(PC + imm32, BranchType_DIR); - -__instruction aarch32_SSBB_A - __encoding aarch32_SSBB_A1_A - __instruction_set A32 - __opcode '11110101 0111xxxx xxxxxxxx 01000000' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_SSBB_T1_A - __instruction_set T32 - __opcode '11110011 1011xxxx 10x0xxxx 01000000' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - if InITBlock() then UNPREDICTABLE; - - __execute __conditional - SpeculativeStoreBypassBarrierToVA(); - -__instruction aarch32_STM_A - __encoding aarch32_STM_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx1000 10x0xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - - __encoding aarch32_STM_T1_A - __instruction_set T16 - __field Rn 24 +: 3 - __field register_list 16 +: 8 - __opcode '11000xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - n = UInt(Rn); registers = '00000000':register_list; wback = TRUE; - if BitCount(registers) < 1 then UNPREDICTABLE; - - __encoding aarch32_STM_T2_A - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field P 15 +: 1 - __field M 14 +: 1 - __field register_list 0 +: 14 - __opcode '11101000 10x0xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - n = UInt(Rn); registers = P:M:register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 2 then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - if registers[13] == '1' then UNPREDICTABLE; - if registers[15] == '1' then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - for i = 0 to 14 - if registers[i] == '1' then - if i == n && wback && i != LowestSetBit(registers) then - MemA[address,4] = bits(32) UNKNOWN; // Only possible for encodings T1 and A1 - else - MemA[address,4] = R[i]; - address = address + 4; - if registers[15] == '1' then // Only possible for encoding A1 - MemA[address,4] = PCStoreValue(); - if wback then R[n] = R[n] + 4*BitCount(registers); - -__instruction aarch32_LDRT_A - __encoding aarch32_LDRT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0100 x011xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); postindex = TRUE; add = (U == '1'); - register_form = FALSE; imm32 = ZeroExtend(imm12, 32); - if t == 15 || n == 15 || n == t then UNPREDICTABLE; - - __encoding aarch32_LDRT_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 x011xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); postindex = TRUE; add = (U == '1'); - register_form = TRUE; (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if t == 15 || n == 15 || n == t || m == 15 then UNPREDICTABLE; - - __encoding aarch32_LDRT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11111000 0101xxxx xxxx1110 xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - if Rn == '1111' then SEE "LDR (literal)"; - t = UInt(Rt); n = UInt(Rn); postindex = FALSE; add = TRUE; - register_form = FALSE; imm32 = ZeroExtend(imm8, 32); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = if register_form then Shift(R[m], shift_t, shift_n, PSTATE.C) else imm32; - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if postindex then R[n] else offset_addr; - data = MemU_unpriv[address,4]; - if postindex then R[n] = offset_addr; - R[t] = data; - -__instruction aarch32_UQSUB8_A - __encoding aarch32_UQSUB8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0110xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UQSUB8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1100xxxx 1111xxxx 0101xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = UInt(R[n][7:0]) - UInt(R[m][7:0]); - diff2 = UInt(R[n][15:8]) - UInt(R[m][15:8]); - diff3 = UInt(R[n][23:16]) - UInt(R[m][23:16]); - diff4 = UInt(R[n][31:24]) - UInt(R[m][31:24]); - R[d][7:0] = UnsignedSat(diff1, 8); - R[d][15:8] = UnsignedSat(diff2, 8); - R[d][23:16] = UnsignedSat(diff3, 8); - R[d][31:24] = UnsignedSat(diff4, 8); - -__instruction aarch32_CBNZ_A - __encoding aarch32_CBNZ_T1_A - __instruction_set T16 - __field op 27 +: 1 - __field i 25 +: 1 - __field imm5 19 +: 5 - __field Rn 16 +: 3 - __opcode '1011x0x1 xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - n = UInt(Rn); imm32 = ZeroExtend(i:imm5:'0', 32); nonzero = (op == '1'); - if InITBlock() then UNPREDICTABLE; - - __execute - if nonzero != IsZero(R[n]) then - BranchWritePC(PC + imm32, BranchType_DIR); - -__instruction aarch32_WFI_A - __encoding aarch32_WFI_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00000011' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_WFI_T1_A - __instruction_set T16 - __opcode '10111111 00110000 00000000 00000000' - __guard TRUE - __decode - // No additional decoding required - - __encoding aarch32_WFI_T2_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00000011' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - // No additional decoding required - - __execute __conditional - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch32.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch32.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.M != M32_Monitor then - // Check for traps described by the Secure Monitor. - AArch32.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - -__instruction aarch32_MOVT_A - __encoding aarch32_MOVT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm4 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 0100xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); imm16 = imm4:imm12; - if d == 15 then UNPREDICTABLE; - - __encoding aarch32_MOVT_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field imm4 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x10 1100xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); imm16 = imm4:i:imm3:imm8; - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - R[d][31:16] = imm16; - // R[d][15:0] unchanged - -__instruction aarch32_VCNT_A - __encoding aarch32_VCNT_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0101 0xx0xxxx' - __guard TRUE - __decode - if size != '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8; elements = 8; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCNT_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0101 0xx0xxxx' - __guard TRUE - __decode - if size != '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8; elements = 8; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = BitCount(Elem[D[m+r],e,esize])[esize-1:0]; - -__instruction aarch32_VSRA_A - __encoding aarch32_VSRA_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSRA_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - result = Int(Elem[D[m+r],e,esize], unsigned) >> shift_amount; - Elem[D[d+r],e,esize] = Elem[D[d+r],e,esize] + result; - -__instruction aarch32_QSUB_A - __encoding aarch32_QSUB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0010xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QSUB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 1010xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (R[d], sat) = SignedSatQ(SInt(R[m]) - SInt(R[n]), 32); - if sat then - PSTATE.Q = '1'; - -__instruction aarch32_CLZ_A - __encoding aarch32_CLZ_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0110xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); m = UInt(Rm); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_CLZ_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1011xxxx 1111xxxx 1000xxxx' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); n = UInt(Rn); - if m != n || d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = CountLeadingZeroBits(R[m]); - R[d] = result[31:0]; - -__instruction aarch32_VBIC_i_A - __encoding aarch32_VBIC_i_T1A1_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx0xx1 0x11xxxx' - __guard TRUE - __decode - if cmode[0] == '0' || cmode[3:2] == '11' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VBIC_i_T2A2_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx10x1 0x11xxxx' - __guard TRUE - __decode - if cmode[0] == '0' || cmode[3:2] == '11' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VBIC_i_T1A1_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx0xx1 0x11xxxx' - __guard TRUE - __decode - if cmode[0] == '0' || cmode[3:2] == '11' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VBIC_i_T2A2_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx10x1 0x11xxxx' - __guard TRUE - __decode - if cmode[0] == '0' || cmode[3:2] == '11' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - imm64 = AdvSIMDExpandImm('1', cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = D[d+r] AND NOT(imm64); - -__instruction aarch32_VPADAL_A - __encoding aarch32_VPADAL_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0110 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (op == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VPADAL_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0110 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (op == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - h = elements DIV 2; - - for r = 0 to regs-1 - for e = 0 to h-1 - op1 = Elem[D[m+r],2*e,esize]; op2 = Elem[D[m+r],2*e+1,esize]; - result = Int(op1, unsigned) + Int(op2, unsigned); - Elem[D[d+r],e,2*esize] = Elem[D[d+r],e,2*esize] + result; - -__instruction aarch32_VRSQRTS_A - __encoding aarch32_VRSQRTS_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x1xxxxx xxxx1111 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRSQRTS_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x1xxxxx xxxx1111 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPRSqrtStep(Elem[D[n+r],e,esize], Elem[D[m+r],e,esize]); - -__instruction aarch32_VACGE_A - __encoding aarch32_VACGE_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x1xxxxx xxxx1110 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - or_equal = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VACGE_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x1xxxxx xxxx1110 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - or_equal = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = FPAbs(Elem[D[n+r],e,esize]); op2 = FPAbs(Elem[D[m+r],e,esize]); - if or_equal then - test_passed = FPCompareGE(op1, op2, StandardFPSCRValue()); - else - test_passed = FPCompareGT(op1, op2, StandardFPSCRValue()); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_VMOV_s_A - __encoding aarch32_VMOV_s_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field op 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - __opcode 'xxxx1110 000xxxxx xxxx1010 xxx1xxxx' - __guard cond != '1111' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - to_arm_register = (op == '1'); t = UInt(Rt); n = UInt(Vn:N); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_VMOV_s_T1_A - __instruction_set T32 - __field op 20 +: 1 - __field Vn 16 +: 4 - __field Rt 12 +: 4 - __field N 7 +: 1 - __opcode '11101110 000xxxxx xxxx1010 xxx1xxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - to_arm_register = (op == '1'); t = UInt(Rt); n = UInt(Vn:N); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - CheckVFPEnabled(TRUE); - if to_arm_register then - R[t] = S[n]; - else - S[n] = R[t]; - -__instruction aarch32_VST3_m_A - __encoding aarch32_VST3_m_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x00xxxx xxxx010x xxxxxxxx' - __guard TRUE - __decode - if size == '11' || align[1] == '1' then UNDEFINED; - case itype of - when '0100' - inc = 1; - when '0101' - inc = 2; - otherwise - SEE "Related encodings"; - alignment = if align[0] == '0' then 1 else 8; - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST3_m_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x00xxxx xxxx010x xxxxxxxx' - __guard TRUE - __decode - if size == '11' || align[1] == '1' then UNDEFINED; - case itype of - when '0100' - inc = 1; - when '0101' - inc = 2; - otherwise - SEE "Related encodings"; - alignment = if align[0] == '0' then 1 else 8; - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = TRUE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - for e = 0 to elements-1 - MemU[address, ebytes] = Elem[D[d], e]; - MemU[address+ebytes, ebytes] = Elem[D[d2],e]; - MemU[address+2*ebytes,ebytes] = Elem[D[d3],e]; - address = address + 3*ebytes; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 24; - -__instruction aarch32_VCMLA_idx_A - __encoding aarch32_VCMLA_idx_A1_A - __instruction_set A32 - __field S 23 +: 1 - __field D 22 +: 1 - __field rot 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 xxxxxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if !HaveFCADDExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); - m = if S=='1' then UInt(M:Vm) else UInt(Vm); - esize = 16 << UInt(S); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - elements = 64 DIV esize; - regs = if Q == '0' then 1 else 2; - index = if S=='1' then 0 else UInt(M); - - __encoding aarch32_VCMLA_idx_T1_A - __instruction_set T32 - __field S 23 +: 1 - __field D 22 +: 1 - __field rot 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 xxxxxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFCADDExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); - m = if S=='1' then UInt(M:Vm) else UInt(Vm); - esize = 16 << UInt(S); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - elements = 64 DIV esize; - regs = if Q == '0' then 1 else 2; - index = if S=='1' then 0 else UInt(M); - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - operand1 = D[n+r]; - operand2 = Din[m]; - operand3 = D[d+r]; - for e = 0 to (elements DIV 2)-1 - case rot of - when '00' - element1 = Elem[operand2,index*2,esize]; - element2 = Elem[operand1,e*2,esize]; - element3 = Elem[operand2,index*2+1,esize]; - element4 = Elem[operand1,e*2,esize]; - when '01' - element1 = FPNeg(Elem[operand2,index*2+1,esize]); - element2 = Elem[operand1,e*2+1,esize]; - element3 = Elem[operand2,index*2,esize]; - element4 = Elem[operand1,e*2+1,esize]; - when '10' - element1 = FPNeg(Elem[operand2,index*2,esize]); - element2 = Elem[operand1,e*2,esize]; - element3 = FPNeg(Elem[operand2,index*2+1,esize]); - element4 = Elem[operand1,e*2,esize]; - when '11' - element1 = Elem[operand2,index*2+1,esize]; - element2 = Elem[operand1,e*2+1,esize]; - element3 = FPNeg(Elem[operand2,index*2,esize]); - element4 = Elem[operand1,e*2+1,esize]; - result1 = FPMulAdd(Elem[operand3,e*2,esize],element2,element1, StandardFPSCRValue()); - result2 = FPMulAdd(Elem[operand3,e*2+1,esize],element4,element3,StandardFPSCRValue()); - Elem[D[d+r],e*2,esize] = result1; - Elem[D[d+r],e*2+1,esize] = result2; - -__instruction aarch32_SHSAX_A - __encoding aarch32_SHSAX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0011xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SHSAX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1110xxxx 1111xxxx 0010xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum = SInt(R[n][15:0]) + SInt(R[m][31:16]); - diff = SInt(R[n][31:16]) - SInt(R[m][15:0]); - R[d][15:0] = sum[16:1]; - R[d][31:16] = diff[16:1]; - -__instruction aarch32_SMLALBB_A - __encoding aarch32_SMLALBB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field M 6 +: 1 - __field N 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0001 0100xxxx xxxxxxxx 1xx0xxxx' - __guard cond != '1111' - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); - n_high = (N == '1'); m_high = (M == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if dHi == dLo then UNPREDICTABLE; - - __encoding aarch32_SMLALBB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field N 5 +: 1 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 1100xxxx xxxxxxxx 10xxxxxx' - __guard TRUE - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); - n_high = (N == '1'); m_high = (M == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - if dHi == dLo then UNPREDICTABLE; - - __execute __conditional - operand1 = if n_high then R[n][31:16] else R[n][15:0]; - operand2 = if m_high then R[m][31:16] else R[m][15:0]; - result = SInt(operand1) * SInt(operand2) + SInt(R[dHi]:R[dLo]); - R[dHi] = result[63:32]; - R[dLo] = result[31:0]; - -__instruction aarch32_VCMLA_A - __encoding aarch32_VCMLA_A1_A - __instruction_set A32 - __field rot 23 +: 2 - __field D 22 +: 1 - __field S 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111110x xx1xxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if !HaveFCADDExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 16 << UInt(S); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - elements = 64 DIV esize; - regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCMLA_T1_A - __instruction_set T32 - __field rot 23 +: 2 - __field D 22 +: 1 - __field S 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111110x xx1xxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFCADDExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 16 << UInt(S); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - elements = 64 DIV esize; - regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - operand1 = D[n+r]; - operand2 = D[m+r]; - operand3 = D[d+r]; - for e = 0 to (elements DIV 2)-1 - case rot of - when '00' - element1 = Elem[operand2,e*2,esize]; - element2 = Elem[operand1,e*2,esize]; - element3 = Elem[operand2,e*2+1,esize]; - element4 = Elem[operand1,e*2,esize]; - when '01' - element1 = FPNeg(Elem[operand2,e*2+1,esize]); - element2 = Elem[operand1,e*2+1,esize]; - element3 = Elem[operand2,e*2,esize]; - element4 = Elem[operand1,e*2+1,esize]; - when '10' - element1 = FPNeg(Elem[operand2,e*2,esize]); - element2 = Elem[operand1,e*2,esize]; - element3 = FPNeg(Elem[operand2,e*2+1,esize]); - element4 = Elem[operand1,e*2,esize]; - when '11' - element1 = Elem[operand2,e*2+1,esize]; - element2 = Elem[operand1,e*2+1,esize]; - element3 = FPNeg(Elem[operand2,e*2,esize]); - element4 = Elem[operand1,e*2+1,esize]; - result1 = FPMulAdd(Elem[operand3,e*2,esize],element2,element1, StandardFPSCRValue()); - result2 = FPMulAdd(Elem[operand3,e*2+1,esize],element4,element3, StandardFPSCRValue()); - Elem[D[d+r],e*2,esize] = result1; - Elem[D[d+r],e*2+1,esize] = result2; - -__instruction aarch32_LDM_A - __encoding aarch32_LDM_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx1000 10x1xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - - __encoding aarch32_LDM_T1_A - __instruction_set T16 - __field Rn 24 +: 3 - __field register_list 16 +: 8 - __opcode '11001xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - n = UInt(Rn); registers = '00000000':register_list; wback = (registers[n] == '0'); - if BitCount(registers) < 1 then UNPREDICTABLE; - - __encoding aarch32_LDM_T2_A - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field P 15 +: 1 - __field M 14 +: 1 - __field register_list 0 +: 14 - __opcode '11101000 10x1xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - n = UInt(Rn); registers = P:M:register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 2 || (P == '1' && M == '1') then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - if registers[13] == '1' then UNPREDICTABLE; - if registers[15] == '1' && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - for i = 0 to 14 - if registers[i] == '1' then - R[i] = MemA[address,4]; address = address + 4; - if registers[15] == '1' then - LoadWritePC(MemA[address,4]); - if wback && registers[n] == '0' then R[n] = R[n] + 4*BitCount(registers); - if wback && registers[n] == '1' then R[n] = bits(32) UNKNOWN; - -__instruction aarch32_VMAX_f_A - __encoding aarch32_VMAX_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x0xxxxx xxxx1111 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - maximum = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMAX_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x0xxxxx xxxx1111 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - maximum = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[n+r],e,esize]; op2 = Elem[D[m+r],e,esize]; - if maximum then - Elem[D[d+r],e,esize] = FPMax(op1, op2, StandardFPSCRValue()); - else - Elem[D[d+r],e,esize] = FPMin(op1, op2, StandardFPSCRValue()); - -__instruction aarch32_SMULL_A - __encoding aarch32_SMULL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0000 110xxxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if dHi == dLo then UNPREDICTABLE; - - __encoding aarch32_SMULL_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 1000xxxx xxxxxxxx 0000xxxx' - __guard TRUE - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); setflags = FALSE; - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - if dHi == dLo then UNPREDICTABLE; - - __execute __conditional - result = SInt(R[n]) * SInt(R[m]); - R[dHi] = result[63:32]; - R[dLo] = result[31:0]; - if setflags then - PSTATE.N = result[63]; - PSTATE.Z = IsZeroBit(result[63:0]); - // PSTATE.C, PSTATE.V unchanged - -__instruction aarch32_BIC_i_A - __encoding aarch32_BIC_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 110xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = A32ExpandImm_C(imm12, PSTATE.C); - - __encoding aarch32_BIC_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x00 001xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = R[n] AND NOT(imm32); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_SHA1SU1_A - __encoding aarch32_SHA1SU1_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0011 10x0xxxx' - __guard TRUE - __decode - if !HaveSHA1Ext() then UNDEFINED; - if size != '10' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_SHA1SU1_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0011 10x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA1Ext() then UNDEFINED; - if size != '10' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - X = Q[d>>1]; Y = Q[m>>1]; - T = X EOR LSR(Y, 32); - W0 = ROL(T[31:0], 1); - W1 = ROL(T[63:32], 1); - W2 = ROL(T[95:64], 1); - W3 = ROL(T[127:96], 1) EOR ROL(T[31:0], 2); - Q[d>>1] = W3:W2:W1:W0; - -__instruction aarch32_QADD16_A - __encoding aarch32_QADD16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0010xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QADD16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 0001xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = SInt(R[n][15:0]) + SInt(R[m][15:0]); - sum2 = SInt(R[n][31:16]) + SInt(R[m][31:16]); - R[d][15:0] = SignedSat(sum1, 16); - R[d][31:16] = SignedSat(sum2, 16); - -__instruction aarch32_VSUBL_A - __encoding aarch32_VSUBL_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0010 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' || (op == '1' && Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; is_vsubw = (op == '1'); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VSUBL_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0010 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' || (op == '1' && Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; is_vsubw = (op == '1'); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - if is_vsubw then - op1 = Int(Elem[Qin[n>>1],e,2*esize], unsigned); - else - op1 = Int(Elem[Din[n],e,esize], unsigned); - result = op1 - Int(Elem[Din[m],e,esize], unsigned); - Elem[Q[d>>1],e,2*esize] = result[2*esize-1:0]; - -__instruction aarch32_VCGT_i_A - __encoding aarch32_VCGT_i_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx01 xxxx0x00 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCGT_i_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx01 xxxx0x00 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - bits(esize) zero = FPZero('0'); - test_passed = FPCompareGT(Elem[D[m+r],e,esize], zero, StandardFPSCRValue()); - else - test_passed = (SInt(Elem[D[m+r],e,esize]) > 0); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_QADD_A - __encoding aarch32_QADD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0000xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QADD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 1000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (R[d], sat) = SignedSatQ(SInt(R[m]) + SInt(R[n]), 32); - if sat then - PSTATE.Q = '1'; - -__instruction aarch32_UADD16_A - __encoding aarch32_UADD16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0101xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UADD16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 0100xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = UInt(R[n][15:0]) + UInt(R[m][15:0]); - sum2 = UInt(R[n][31:16]) + UInt(R[m][31:16]); - R[d][15:0] = sum1[15:0]; - R[d][31:16] = sum2[15:0]; - PSTATE.GE[1:0] = if sum1 >= 0x10000 then '11' else '00'; - PSTATE.GE[3:2] = if sum2 >= 0x10000 then '11' else '00'; - -__instruction aarch32_SSUB16_A - __encoding aarch32_SSUB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0001xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SSUB16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1101xxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = SInt(R[n][15:0]) - SInt(R[m][15:0]); - diff2 = SInt(R[n][31:16]) - SInt(R[m][31:16]); - R[d][15:0] = diff1[15:0]; - R[d][31:16] = diff2[15:0]; - PSTATE.GE[1:0] = if diff1 >= 0 then '11' else '00'; - PSTATE.GE[3:2] = if diff2 >= 0 then '11' else '00'; - -__instruction aarch32_TST_rr_A - __encoding aarch32_TST_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0001xxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - shift_t = DecodeRegShift(stype); - if n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] AND shifted; - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_SHA256SU1_A - __encoding aarch32_SHA256SU1_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x10xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if !HaveSHA256Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_SHA256SU1_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x10xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA256Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - bits(128) result; - X = Q[d>>1]; Y = Q[n>>1]; Z = Q[m>>1]; - T0 = Z[31:0] : Y[127:32]; - - T1 = Z[127:64]; - for e = 0 to 1 - elt = Elem[T1, e, 32]; - elt = ROR(elt, 17) EOR ROR(elt, 19) EOR LSR(elt, 10); - elt = elt + Elem[X, e, 32] + Elem[T0, e, 32]; - Elem[result, e, 32] = elt; - - T1 = result[63:0]; - for e = 2 to 3 - elt = Elem[T1, e - 2, 32]; - elt = ROR(elt, 17) EOR ROR(elt, 19) EOR LSR(elt, 10); - elt = elt + Elem[X, e, 32] + Elem[T0, e, 32]; - Elem[result, e, 32] = elt; - - Q[d>>1] = result; - -__instruction aarch32_VFMA_bfs_A - __encoding aarch32_VFMA_bfs_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x11xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm[2:0]); - integer i = UInt(M:Vm[3]); - integer elements = 128 DIV 32; - integer sel = UInt(Q); - - __encoding aarch32_VFMA_bfs_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x11xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32BF16Ext() then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm[2:0]); - integer i = UInt(M:Vm[3]); - integer elements = 128 DIV 32; - integer sel = UInt(Q); - - __execute - CheckAdvSIMDEnabled(); - bits(128) operand1 = Q[n>>1]; - bits(64) operand2 = D[m]; - bits(128) operand3 = Q[d>>1]; - bits(128) result; - - bits(32) element2 = Elem[operand2, i, 16] : Zeros(16); - - for e = 0 to elements-1 - bits(32) element1 = Elem[operand1, 2 * e + sel, 16] : Zeros(16); - bits(32) addend = Elem[operand3, e, 32]; - Elem[result, e, 32] = FPMulAdd(addend, element1, element2, - StandardFPSCRValue()); - - Q[d>>1] = result; - -__instruction aarch32_PLD_r_A - __encoding aarch32_PLD_r_A1_A - __instruction_set A32 - __field U 23 +: 1 - __field R 22 +: 1 - __field Rn 16 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode '11110111 xx01xxxx xxxxxxxx xxx0xxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - n = UInt(Rn); m = UInt(Rm); add = (U == '1'); is_pldw = (R == '0'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if m == 15 || (n == 15 && is_pldw) then UNPREDICTABLE; - - __encoding aarch32_PLD_r_T1_A - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111000 00x1xxxx 11110000 00xxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "PLD (literal)"; - n = UInt(Rn); m = UInt(Rm); add = TRUE; is_pldw = (W == '1'); - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - address = if add then (R[n] + offset) else (R[n] - offset); - if is_pldw then - Hint_PreloadDataForWrite(address); - else - Hint_PreloadData(address); - -__instruction aarch32_SSAX_A - __encoding aarch32_SSAX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0001xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SSAX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1110xxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum = SInt(R[n][15:0]) + SInt(R[m][31:16]); - diff = SInt(R[n][31:16]) - SInt(R[m][15:0]); - R[d][15:0] = sum[15:0]; - R[d][31:16] = diff[15:0]; - PSTATE.GE[1:0] = if sum >= 0 then '11' else '00'; - PSTATE.GE[3:2] = if diff >= 0 then '11' else '00'; - -__instruction aarch32_VRSUBHN_A - __encoding aarch32_VRSUBHN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1xxxxxxx xxxx0110 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VRSUBHN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1xxxxxxx xxxx0110 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - round_const = 1 << (esize-1); - for e = 0 to elements-1 - result = Elem[Qin[n>>1],e,2*esize] - Elem[Qin[m>>1],e,2*esize] + round_const; - Elem[D[d],e,esize] = result[2*esize-1:esize]; - -__instruction aarch32_VCGE_i_A - __encoding aarch32_VCGE_i_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx01 xxxx0x00 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCGE_i_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx01 xxxx0x00 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - bits(esize) zero = FPZero('0'); - test_passed = FPCompareGE(Elem[D[m+r],e,esize], zero, StandardFPSCRValue()); - else - test_passed = (SInt(Elem[D[m+r],e,esize]) >= 0); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_RSC_r_A - __encoding aarch32_RSC_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 111xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(NOT(R[n]), shifted, PSTATE.C); - if d == 15 then - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_SMLSD_A - __encoding aarch32_SMLSD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field M 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0111 0000xxxx xxxxxxxx 01x1xxxx' - __guard cond != '1111' - __decode - if Ra == '1111' then SEE "SMUSD"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); m_swap = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SMLSD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0100xxxx xxxxxxxx 000xxxxx' - __guard TRUE - __decode - if Ra == '1111' then SEE "SMUSD"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); m_swap = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand2 = if m_swap then ROR(R[m],16) else R[m]; - product1 = SInt(R[n][15:0]) * SInt(operand2[15:0]); - product2 = SInt(R[n][31:16]) * SInt(operand2[31:16]); - result = product1 - product2 + SInt(R[a]); - R[d] = result[31:0]; - if result != SInt(result[31:0]) then // Signed overflow - PSTATE.Q = '1'; - -__instruction aarch32_LDRH_l_A - __encoding aarch32_LDRH_l_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x11111 xxxxxxxx 1011xxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "LDRHT"; - t = UInt(Rt); imm32 = ZeroExtend(imm4H:imm4L, 32); - add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 || wback then UNPREDICTABLE; - - __encoding aarch32_LDRH_l_T1_A - __instruction_set T32 - __field U 23 +: 1 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 x0111111 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "PLD (literal)"; - t = UInt(Rt); imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - base = Align(PC,4); - address = if add then (base + imm32) else (base - imm32); - data = MemU[address,2]; - R[t] = ZeroExtend(data, 32); - -__instruction aarch32_SEV_A - __encoding aarch32_SEV_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00000100' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_SEV_T1_A - __instruction_set T16 - __opcode '10111111 01000000 00000000 00000000' - __guard TRUE - __decode - // No additional decoding required - - __encoding aarch32_SEV_T2_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00000100' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - // No additional decoding required - - __execute __conditional - SendEvent(); - -__instruction aarch32_SMLAL_A - __encoding aarch32_SMLAL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field RdHi 16 +: 4 - __field RdLo 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0000 111xxxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if dHi == dLo then UNPREDICTABLE; - - __encoding aarch32_SMLAL_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field RdLo 12 +: 4 - __field RdHi 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 1100xxxx xxxxxxxx 0000xxxx' - __guard TRUE - __decode - dLo = UInt(RdLo); dHi = UInt(RdHi); n = UInt(Rn); m = UInt(Rm); setflags = FALSE; - if dLo == 15 || dHi == 15 || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - if dHi == dLo then UNPREDICTABLE; - - __execute __conditional - result = SInt(R[n]) * SInt(R[m]) + SInt(R[dHi]:R[dLo]); - R[dHi] = result[63:32]; - R[dLo] = result[31:0]; - if setflags then - PSTATE.N = result[63]; - PSTATE.Z = IsZeroBit(result[63:0]); - // PSTATE.C, PSTATE.V unchanged - -__instruction aarch32_UQSUB16_A - __encoding aarch32_UQSUB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0110xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UQSUB16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1101xxxx 1111xxxx 0101xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = UInt(R[n][15:0]) - UInt(R[m][15:0]); - diff2 = UInt(R[n][31:16]) - UInt(R[m][31:16]); - R[d][15:0] = UnsignedSat(diff1, 16); - R[d][31:16] = UnsignedSat(diff2, 16); - -__instruction aarch32_STC_A - __encoding aarch32_STC_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field imm8 0 +: 8 - __opcode 'xxxx110x x0x0xxxx 01011110 xxxxxxxx' - __guard cond != '1111' - __decode - if P == '0' && U == '0' && W == '0' then UNDEFINED; - n = UInt(Rn); cp = 14; - imm32 = ZeroExtend(imm8:'00', 32); index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - - __encoding aarch32_STC_T1A1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field imm8 0 +: 8 - __opcode '1110110x x0x0xxxx 01011110 xxxxxxxx' - __guard TRUE - __decode - if P == '0' && U == '0' && W == '0' then UNDEFINED; - n = UInt(Rn); cp = 14; - imm32 = ZeroExtend(imm8:'00', 32); index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if n == 15 && (wback || CurrentInstrSet() != InstrSet_A32) then UNPREDICTABLE; - - __execute __conditional - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - - // System register read from DBGDTRRXint. - MemA[address,4] = DBGDTR_EL0[]; - - if wback then R[n] = offset_addr; - -__instruction aarch32_VMUL_s_A - __encoding aarch32_VMUL_s_A1_A - __instruction_set A32 - __field Q 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field F 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx100x x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || (F == '1' && size == '01' && !HaveFP16Ext()) then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - floating_point = (F == '1'); long_destination = FALSE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VMUL_s_T1_A - __instruction_set T32 - __field Q 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field F 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx100x x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if size == '00' || (F == '1' && size == '01' && !HaveFP16Ext()) then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - floating_point = (F == '1'); long_destination = FALSE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - op2 = Elem[Din[m],index,esize]; op2val = Int(op2, unsigned); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; op1val = Int(op1, unsigned); - if floating_point then - Elem[D[d+r],e,esize] = FPMul(op1, op2, StandardFPSCRValue()); - else - if long_destination then - Elem[Q[d>>1],e,2*esize] = (op1val*op2val)[2*esize-1:0]; - else - Elem[D[d+r],e,esize] = (op1val*op2val)[esize-1:0]; - -__instruction aarch32_MMLA_A - __encoding aarch32_MMLA_A1_A - __instruction_set A32 - __field B 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 1x10xxxx xxxx1100 x1x0xxxx' - __guard TRUE - __decode - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - - __encoding aarch32_MMLA_T1_A - __instruction_set T32 - __field B 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 1x10xxxx xxxx1100 x1x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - - __execute - CheckAdvSIMDEnabled(); - bits(128) operand1 = Q[n>>1]; - bits(128) operand2 = Q[m>>1]; - bits(128) addend = Q[d>>1]; - - Q[d>>1] = MatMulAdd(addend, operand1, operand2, op1_unsigned, op2_unsigned); - -__instruction aarch32_VLD1_m_A - __encoding aarch32_VLD1_m_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x10xxxx xxxx0111 xxxxxxxx' - __guard TRUE - __decode - regs = 1; if align[1] == '1' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD1_m_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x10xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - regs = 2; if align == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD1_m_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x10xxxx xxxx0110 xxxxxxxx' - __guard TRUE - __decode - regs = 3; if align[1] == '1' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD1_m_T4A4_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x10xxxx xxxx0010 xxxxxxxx' - __guard TRUE - __decode - regs = 4; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD1_m_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x10xxxx xxxx0111 xxxxxxxx' - __guard TRUE - __decode - regs = 1; if align[1] == '1' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD1_m_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x10xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - regs = 2; if align == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD1_m_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x10xxxx xxxx0110 xxxxxxxx' - __guard TRUE - __decode - regs = 3; if align[1] == '1' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD1_m_T4A4_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x10xxxx xxxx0010 xxxxxxxx' - __guard TRUE - __decode - regs = 4; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - for r = 0 to regs-1 - for e = 0 to elements-1 - bits(ebytes*8) data; - if ebytes != 8 then - data = MemU[address,ebytes]; - else - - = AArch32.CheckAlignment(address, ebytes, AccType_NORMAL, iswrite); - data[31:0] = if BigEndian() then MemU[address+4,4] else MemU[address,4]; - data[63:32] = if BigEndian() then MemU[address,4] else MemU[address+4,4]; - Elem[D[d+r],e] = data; - address = address + ebytes; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 8*regs; - -__instruction aarch32_ADD_r_A - __encoding aarch32_ADD_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 100xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if Rn == '1101' then SEE "ADD (SP plus register)"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_ADD_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rd 16 +: 3 - __opcode '0001100x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_ADD_r_T2_A - __instruction_set T16 - __field DN 23 +: 1 - __field Rm 19 +: 4 - __field Rdn 16 +: 3 - __opcode '01000100 xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - if (DN:Rdn) == '1101' || Rm == '1101' then SEE "ADD (SP plus register)"; - d = UInt(DN:Rdn); n = d; m = UInt(Rm); setflags = FALSE; (shift_t, shift_n) = (SRType_LSL, 0); - if n == 15 && m == 15 then UNPREDICTABLE; - if d == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __encoding aarch32_ADD_r_T3_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 000xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if Rd == '1111' && S == '1' then SEE "CMN (register)"; - if Rn == '1101' then SEE "ADD (SP plus register)"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if (d == 15 && !setflags) || n == 15 || m == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], shifted, '0'); - if d == 15 then - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VPADDL_A - __encoding aarch32_VPADDL_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0010 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (op == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VPADDL_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0010 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (op == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - h = elements DIV 2; - - for r = 0 to regs-1 - for e = 0 to h-1 - op1 = Elem[D[m+r],2*e,esize]; op2 = Elem[D[m+r],2*e+1,esize]; - result = Int(op1, unsigned) + Int(op2, unsigned); - Elem[D[d+r],e,2*esize] = result[2*esize-1:0]; - -__instruction aarch32_SBC_rr_A - __encoding aarch32_SBC_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 110xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], NOT(shifted), PSTATE.C); - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VCMP_A - __encoding aarch32_VCMP_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field E 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110100 xxxx10xx 11x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - quiet_nan_exc = (E == '1'); with_zero = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VCMP_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field E 7 +: 1 - __opcode 'xxxx1110 1x110101 xxxx10xx 11x0xxxx' - __guard cond != '1111' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - quiet_nan_exc = (E == '1'); with_zero = TRUE; - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __encoding aarch32_VCMP_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field E 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110100 xxxx10xx 11x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - quiet_nan_exc = (E == '1'); with_zero = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VCMP_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field E 7 +: 1 - __opcode '11101110 1x110101 xxxx10xx 11x0xxxx' - __guard TRUE - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - quiet_nan_exc = (E == '1'); with_zero = TRUE; - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __execute __conditional - CheckVFPEnabled(TRUE); - bits(4) nzcv; - case esize of - when 16 - bits(16) op16 = if with_zero then FPZero('0') else S[m][15:0]; - nzcv = FPCompare(S[d][15:0], op16, quiet_nan_exc, FPSCR); - when 32 - bits(32) op32 = if with_zero then FPZero('0') else S[m]; - nzcv = FPCompare(S[d], op32, quiet_nan_exc, FPSCR); - when 64 - bits(64) op64 = if with_zero then FPZero('0') else D[m]; - nzcv = FPCompare(D[d], op64, quiet_nan_exc, FPSCR); - - FPSCR.[N,Z,C,V] = nzcv; - -__instruction aarch32_SADD8_A - __encoding aarch32_SADD8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0001xxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SADD8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = SInt(R[n][7:0]) + SInt(R[m][7:0]); - sum2 = SInt(R[n][15:8]) + SInt(R[m][15:8]); - sum3 = SInt(R[n][23:16]) + SInt(R[m][23:16]); - sum4 = SInt(R[n][31:24]) + SInt(R[m][31:24]); - R[d][7:0] = sum1[7:0]; - R[d][15:8] = sum2[7:0]; - R[d][23:16] = sum3[7:0]; - R[d][31:24] = sum4[7:0]; - PSTATE.GE[0] = if sum1 >= 0 then '1' else '0'; - PSTATE.GE[1] = if sum2 >= 0 then '1' else '0'; - PSTATE.GE[2] = if sum3 >= 0 then '1' else '0'; - PSTATE.GE[3] = if sum4 >= 0 then '1' else '0'; - -__instruction aarch32_VCVT_xs_A - __encoding aarch32_VCVT_xs_A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field op 8 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx11xx 0xx1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if op[1] == '0' && !HaveFP16Ext() then UNDEFINED; - if op[1] == '0' && imm6 == '10xxxx' then UNDEFINED; - if imm6 == '0xxxxx' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - to_fixed = (op[0] == '1'); frac_bits = 64 - UInt(imm6); - unsigned = (U == '1'); - case op[1] of - when '0' esize = 16; elements = 4; - when '1' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCVT_xs_T1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field op 8 +: 2 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx11xx 0xx1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if op[1] == '0' && !HaveFP16Ext() then UNDEFINED; - if op[1] == '0' && imm6 == '10xxxx' then UNDEFINED; - if imm6 == '0xxxxx' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - to_fixed = (op[0] == '1'); frac_bits = 64 - UInt(imm6); - unsigned = (U == '1'); - case op[1] of - when '0' esize = 16; elements = 4; - when '1' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(esize) result; - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[m+r],e,esize]; - if to_fixed then - result = FPToFixed(op1, frac_bits, unsigned, StandardFPSCRValue(), - FPRounding_ZERO); - else - result = FixedToFP(op1, frac_bits, unsigned, StandardFPSCRValue(), - FPRounding_TIEEVEN); - Elem[D[d+r],e,esize] = result; - -__instruction aarch32_VABA_A - __encoding aarch32_VABA_T2A2_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0101 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); long_destination = TRUE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __encoding aarch32_VABA_T2A2_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0101 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); long_destination = TRUE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; - op2 = Elem[Din[m+r],e,esize]; - absdiff = Abs(Int(op1,unsigned) - Int(op2,unsigned)); - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + absdiff; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + absdiff; - -__instruction aarch32_SXTAB_A - __encoding aarch32_SXTAB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1010xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if Rn == '1111' then SEE "SXTB"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SXTAB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 0100xxxx 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - if Rn == '1111' then SEE "SXTB"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d] = R[n] + SignExtend(rotated[7:0], 32); - -__instruction aarch32_VLD4_m_A - __encoding aarch32_VLD4_m_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x10xxxx xxxx000x xxxxxxxx' - __guard TRUE - __decode - case itype of - when '0000' - inc = 1; - when '0001' - inc = 2; - otherwise - SEE "Related encodings"; - if size == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD4_m_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x10xxxx xxxx000x xxxxxxxx' - __guard TRUE - __decode - case itype of - when '0000' - inc = 1; - when '0001' - inc = 2; - otherwise - SEE "Related encodings"; - if size == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; d4 = d3 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d4 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - for e = 0 to elements-1 - Elem[D[d], e] = MemU[address,ebytes]; - Elem[D[d2],e] = MemU[address+ebytes,ebytes]; - Elem[D[d3],e] = MemU[address+2*ebytes,ebytes]; - Elem[D[d4],e] = MemU[address+3*ebytes,ebytes]; - address = address + 4*ebytes; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 32; - -__instruction aarch32_VLD1_1_A - __encoding aarch32_VLD1_1_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx0000 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD1 (single element to all lanes)"; - if index_align[0] != '0' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); alignment = 1; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VLD1_1_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx0100 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD1 (single element to all lanes)"; - if index_align[1] != '0' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - alignment = if index_align[0] == '0' then 1 else 2; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VLD1_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx1000 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD1 (single element to all lanes)"; - if index_align[2] != '0' then UNDEFINED; - if index_align[1:0] != '00' && index_align[1:0] != '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - alignment = if index_align[1:0] == '00' then 1 else 4; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VLD1_1_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx0000 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD1 (single element to all lanes)"; - if index_align[0] != '0' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); alignment = 1; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VLD1_1_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx0100 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD1 (single element to all lanes)"; - if index_align[1] != '0' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - alignment = if index_align[0] == '0' then 1 else 2; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_VLD1_1_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx1000 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then SEE "VLD1 (single element to all lanes)"; - if index_align[2] != '0' then UNDEFINED; - if index_align[1:0] != '00' && index_align[1:0] != '11' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - alignment = if index_align[1:0] == '00' then 1 else 4; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - Elem[D[d],index] = MemU[address,ebytes]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + ebytes; - -__instruction aarch32_SMULWB_A - __encoding aarch32_SMULWB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Rm 8 +: 4 - __field M 6 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0001 0010xxxx xxxxxxxx 1x10xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); m_high = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SMULWB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0011xxxx 1111xxxx 000xxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); m_high = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand2 = if m_high then R[m][31:16] else R[m][15:0]; - product = SInt(R[n]) * SInt(operand2); - R[d] = product[47:16]; - // Signed overflow cannot occur - -__instruction aarch32_VQRDMLAH_A - __encoding aarch32_VQRDMLAH_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0xxxxxxx xxxx1011 xxx1xxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '00' || size == '11' then UNDEFINED; - add = TRUE; scalar_form = FALSE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQRDMLAH_A2_A - __instruction_set A32 - __field Q 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx1110 x1x0xxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - if size == '11' then SEE "Related encodings"; - if size == '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - add = TRUE; scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VQRDMLAH_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0xxxxxxx xxxx1011 xxx1xxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '00' || size == '11' then UNDEFINED; - add = TRUE; scalar_form = FALSE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQRDMLAH_T2_A - __instruction_set T32 - __field Q 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx1110 x1x0xxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - if InITBlock() then UNPREDICTABLE; - if size == '11' then SEE "Related encodings"; - if size == '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - add = TRUE; scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute - CheckAdvSIMDEnabled(); - round_const = 1 << (esize-1); - if scalar_form then op2 = SInt(Elem[D[m],index,esize]); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = SInt(Elem[D[n+r],e,esize]); - op3 = SInt(Elem[D[d+r],e,esize]) << esize; - if !scalar_form then op2 = SInt(Elem[D[m+r],e,esize]); - (result, sat) = SignedSatQ((op3 + 2*(op1*op2) + round_const) >> esize, esize); - Elem[D[d+r],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_UHADD16_A - __encoding aarch32_UHADD16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0111xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UHADD16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 0110xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = UInt(R[n][15:0]) + UInt(R[m][15:0]); - sum2 = UInt(R[n][31:16]) + UInt(R[m][31:16]); - R[d][15:0] = sum1[16:1]; - R[d][31:16] = sum2[16:1]; - -__instruction aarch32_VCVTB_A - __encoding aarch32_VCVTB_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field op 16 +: 1 - __field Vd 12 +: 4 - __field sz 8 +: 1 - __field T 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x11001x xxxx101x 11x0xxxx' - __guard cond != '1111' - __decode - uses_double = (sz == '1'); convert_from_half = (op == '0'); - lowbit = (if T == '1' then 16 else 0); - if uses_double then - if convert_from_half then - d = UInt(D:Vd); m = UInt(Vm:M); - else - d = UInt(Vd:D); m = UInt(M:Vm); - else - d = UInt(Vd:D); m = UInt(Vm:M); - - __encoding aarch32_VCVTB_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 16 +: 1 - __field Vd 12 +: 4 - __field sz 8 +: 1 - __field T 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x11001x xxxx101x 11x0xxxx' - __guard TRUE - __decode - uses_double = (sz == '1'); convert_from_half = (op == '0'); - lowbit = (if T == '1' then 16 else 0); - if uses_double then - if convert_from_half then - d = UInt(D:Vd); m = UInt(Vm:M); - else - d = UInt(Vd:D); m = UInt(M:Vm); - else - d = UInt(Vd:D); m = UInt(Vm:M); - - __execute __conditional - CheckVFPEnabled(TRUE); - bits(16) hp; - if convert_from_half then - hp = S[m][lowbit+15:lowbit]; - if uses_double then - D[d] = FPConvert(hp, FPSCR); - else - S[d] = FPConvert(hp, FPSCR); - else - if uses_double then - hp = FPConvert(D[m], FPSCR); - else - hp = FPConvert(S[m], FPSCR); - S[d][lowbit+15:lowbit] = hp; - -__instruction aarch32_VSHL_i_A - __encoding aarch32_VSHL_i_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx0101 xxx1xxxx' - __guard TRUE - __decode - if L:imm6 == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = UInt(imm6) - 8; - when '001xxxx' esize = 16; elements = 4; shift_amount = UInt(imm6) - 16; - when '01xxxxx' esize = 32; elements = 2; shift_amount = UInt(imm6) - 32; - when '1xxxxxx' esize = 64; elements = 1; shift_amount = UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSHL_i_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx0101 xxx1xxxx' - __guard TRUE - __decode - if L:imm6 == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = UInt(imm6) - 8; - when '001xxxx' esize = 16; elements = 4; shift_amount = UInt(imm6) - 16; - when '01xxxxx' esize = 32; elements = 2; shift_amount = UInt(imm6) - 32; - when '1xxxxxx' esize = 64; elements = 1; shift_amount = UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = LSL(Elem[D[m+r],e,esize], shift_amount); - -__instruction aarch32_STREXH_A - __encoding aarch32_STREXH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1110xxxx xxxxxx11 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __encoding aarch32_STREXH_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rd 0 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 0101xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if d == n || d == t then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - if AArch32.ExclusiveMonitorsPass(address,2) then - MemA[address,2] = R[t][15:0]; - R[d] = ZeroExtend('0'); - else - R[d] = ZeroExtend('1'); - -__instruction aarch32_SBFX_A - __encoding aarch32_SBFX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field widthm1 16 +: 5 - __field Rd 12 +: 4 - __field lsb 7 +: 5 - __field Rn 0 +: 4 - __opcode 'xxxx0111 101xxxxx xxxxxxxx x101xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); - lsbit = UInt(lsb); widthminus1 = UInt(widthm1); - if d == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_SBFX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field widthm1 0 +: 5 - __opcode '11110x11 0100xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 26 == '0' - __unpredictable_unless 5 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); - lsbit = UInt(imm3:imm2); widthminus1 = UInt(widthm1); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - msbit = lsbit + widthminus1; - if msbit <= 31 then - R[d] = SignExtend(R[n][msbit:lsbit], 32); - else - UNPREDICTABLE; - -__instruction aarch32_ADD_SP_r_A - __encoding aarch32_ADD_SP_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 100x1101 xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_ADD_SP_r_T1_A - __instruction_set T16 - __field DM 23 +: 1 - __field Rdm 16 +: 3 - __opcode '01000100 x1101xxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(DM:Rdm); m = UInt(DM:Rdm); setflags = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - if d == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __encoding aarch32_ADD_SP_r_T2_A - __instruction_set T16 - __field Rm 19 +: 4 - __opcode '01000100 1xxxx101 00000000 00000000' - __guard TRUE - __decode - if Rm == '1101' then SEE "encoding T1"; - d = 13; m = UInt(Rm); setflags = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_ADD_SP_r_T3_A - __instruction_set T32 - __field S 20 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101011 000x1101 xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if Rd == '1111' && S == '1' then SEE "CMN (register)"; - d = UInt(Rd); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if (d == 15 && !setflags) || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(SP, shifted, '0'); - if d == 15 then - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_LDC_i_A - __encoding aarch32_LDC_i_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field imm8 0 +: 8 - __opcode 'xxxx110x x0x1xxxx 01011110 xxxxxxxx' - __guard cond != '1111' - __decode - if Rn == '1111' then SEE "LDC (literal)"; - if P == '0' && U == '0' && W == '0' then UNDEFINED; - n = UInt(Rn); cp = 14; - imm32 = ZeroExtend(imm8:'00', 32); index = (P == '1'); add = (U == '1'); wback = (W == '1'); - - __encoding aarch32_LDC_i_T1A1_A - __instruction_set T32 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field imm8 0 +: 8 - __opcode '1110110x x0x1xxxx 01011110 xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDC (literal)"; - if P == '0' && U == '0' && W == '0' then UNDEFINED; - n = UInt(Rn); cp = 14; - imm32 = ZeroExtend(imm8:'00', 32); index = (P == '1'); add = (U == '1'); wback = (W == '1'); - - __execute __conditional - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - - // System register write to DBGDTRTXint. - DBGDTR_EL0[] = MemA[address,4]; - - if wback then R[n] = offset_addr; - -__instruction aarch32_LDRSB_i_A - __encoding aarch32_LDRSB_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x1xxxx xxxxxxxx 1101xxxx' - __guard cond != '1111' - __decode - if Rn == '1111' then SEE "LDRSB (literal)"; - if P == '0' && W == '1' then SEE "LDRSBT"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm4H:imm4L, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 || (wback && n == t) then UNPREDICTABLE; - - __encoding aarch32_LDRSB_i_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111001 1001xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "PLI"; - if Rn == '1111' then SEE "LDRSB (literal)"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = TRUE; add = TRUE; wback = FALSE; - // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_LDRSB_i_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field P 10 +: 1 - __field U 9 +: 1 - __field W 8 +: 1 - __field imm8 0 +: 8 - __opcode '11111001 0001xxxx xxxx1xxx xxxxxxxx' - __guard TRUE - __decode - if Rt == '1111' && P == '1' && U == '0' && W == '0' then SEE "PLI"; - if Rn == '1111' then SEE "LDRSB (literal)"; - if P == '1' && U == '1' && W == '0' then SEE "LDRSBT"; - if P == '0' && W == '0' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if (t == 15 && W == '1') || (wback && n == t) then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - R[t] = SignExtend(MemU[address,1], 32); - if wback then R[n] = offset_addr; - -__instruction aarch32_LDR_l_A - __encoding aarch32_LDR_l_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx010x x0x11111 xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "LDRT"; - t = UInt(Rt); imm32 = ZeroExtend(imm12, 32); - add = (U == '1'); wback = (P == '0') || (W == '1'); - if wback then UNPREDICTABLE; - - __encoding aarch32_LDR_l_T1_A - __instruction_set T16 - __field Rt 24 +: 3 - __field imm8 16 +: 8 - __opcode '01001xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); imm32 = ZeroExtend(imm8:'00', 32); add = TRUE; - - __encoding aarch32_LDR_l_T2_A - __instruction_set T32 - __field U 23 +: 1 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 x1011111 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - t = UInt(Rt); imm32 = ZeroExtend(imm12, 32); add = (U == '1'); - if t == 15 && InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - base = Align(PC,4); - address = if add then (base + imm32) else (base - imm32); - data = MemU[address,4]; - if t == 15 then - if address[1:0] == '00' then - LoadWritePC(data); - else - UNPREDICTABLE; - else - R[t] = data; - -__instruction aarch32_PUSH_A - __encoding aarch32_PUSH_T1_A - __instruction_set T16 - __field M 24 +: 1 - __field register_list 16 +: 8 - __opcode '1011010x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - registers = '0':M:'000000':register_list; UnalignedAllowed = FALSE; - if BitCount(registers) < 1 then UNPREDICTABLE; - - __execute __conditional - address = SP - 4*BitCount(registers); - for i = 0 to 14 - if registers[i] == '1' then - if i == 13 && i != LowestSetBit(registers) then // Only possible for encoding A1 - MemA[address,4] = bits(32) UNKNOWN; - else - if UnalignedAllowed then - MemU[address,4] = R[i]; - else - MemA[address,4] = R[i]; - address = address + 4; - if registers[15] == '1' then // Only possible for encoding A1 or A2 - if UnalignedAllowed then - MemU[address,4] = PCStoreValue(); - else - MemA[address,4] = PCStoreValue(); - SP = SP - 4*BitCount(registers); - -__instruction aarch32_STRHT_A - __encoding aarch32_STRHT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx0000 x110xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); postindex = TRUE; add = (U == '1'); - register_form = FALSE; imm32 = ZeroExtend(imm4H:imm4L, 32); - if t == 15 || n == 15 || n == t then UNPREDICTABLE; - - __encoding aarch32_STRHT_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0000 x010xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); postindex = TRUE; add = (U == '1'); - register_form = TRUE; - if t == 15 || n == 15 || n == t || m == 15 then UNPREDICTABLE; - - __encoding aarch32_STRHT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11111000 0010xxxx xxxx1110 xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); postindex = FALSE; add = TRUE; - register_form = FALSE; imm32 = ZeroExtend(imm8, 32); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = if register_form then R[m] else imm32; - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if postindex then R[n] else offset_addr; - MemU_unpriv[address,2] = R[t][15:0]; - if postindex then R[n] = offset_addr; - -__instruction aarch32_TEQ_i_A - __encoding aarch32_TEQ_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 0011xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); - (imm32, carry) = A32ExpandImm_C(imm12, PSTATE.C); - - __encoding aarch32_TEQ_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field imm8 0 +: 8 - __opcode '11110x00 1001xxxx 0xxx1111 xxxxxxxx' - __guard TRUE - __decode - n = UInt(Rn); - (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = R[n] EOR imm32; - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_LDAEXH_A - __encoding aarch32_LDAEXH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1111xxxx xxxxxx10 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDAEXH_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 1101xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - AArch32.SetExclusiveMonitors(address, 2); - R[t] = ZeroExtend(MemO[address, 2], 32); - -__instruction aarch32_VABS_A - __encoding aarch32_VABS_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx01 xxxx0x11 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - advsimd = TRUE; floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VABS_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110000 xxxx10xx 11x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - advsimd = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VABS_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx01 xxxx0x11 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - advsimd = TRUE; floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VABS_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110000 xxxx10xx 11x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - advsimd = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - Elem[D[d+r],e,esize] = FPAbs(Elem[D[m+r],e,esize]); - else - result = Abs(SInt(Elem[D[m+r],e,esize])); - Elem[D[d+r],e,esize] = result[esize-1:0]; - else // VFP instruction - case esize of - when 16 S[d] = Zeros(16) : FPAbs(S[m][15:0]); - when 32 S[d] = FPAbs(S[m]); - when 64 D[d] = FPAbs(D[m]); - -__instruction aarch32_VRADDHN_A - __encoding aarch32_VRADDHN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1xxxxxxx xxxx0100 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VRADDHN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1xxxxxxx xxxx0100 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - round_const = 1 << (esize-1); - for e = 0 to elements-1 - result = Elem[Qin[n>>1],e,2*esize] + Elem[Qin[m>>1],e,2*esize] + round_const; - Elem[D[d],e,esize] = result[2*esize-1:esize]; - -__instruction aarch32_LDRHT_A - __encoding aarch32_LDRHT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx0000 x111xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); postindex = TRUE; add = (U == '1'); - register_form = FALSE; imm32 = ZeroExtend(imm4H:imm4L, 32); - if t == 15 || n == 15 || n == t then UNPREDICTABLE; - - __encoding aarch32_LDRHT_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0000 x011xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); postindex = TRUE; add = (U == '1'); - register_form = TRUE; - if t == 15 || n == 15 || n == t || m == 15 then UNPREDICTABLE; - - __encoding aarch32_LDRHT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11111000 0011xxxx xxxx1110 xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - if Rn == '1111' then SEE "LDRH (literal)"; - t = UInt(Rt); n = UInt(Rn); postindex = FALSE; add = TRUE; - register_form = FALSE; imm32 = ZeroExtend(imm8, 32); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = if register_form then R[m] else imm32; - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if postindex then R[n] else offset_addr; - data = MemU_unpriv[address,2]; - if postindex then R[n] = offset_addr; - R[t] = ZeroExtend(data, 32); - -__instruction aarch32_VCLZ_A - __encoding aarch32_VCLZ_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx00 xxxx0100 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCLZ_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx00 xxxx0100 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = CountLeadingZeroBits(Elem[D[m+r],e,esize])[esize-1:0]; - -__instruction aarch32_ORN_i_A - __encoding aarch32_ORN_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x00 011xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "MVN (immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = R[n] OR NOT(imm32); - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VMOV_rs_A - __encoding aarch32_VMOV_rs_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field opc1 21 +: 2 - __field Vd 16 +: 4 - __field Rt 12 +: 4 - __field D 7 +: 1 - __field opc2 5 +: 2 - __opcode 'xxxx1110 0xx0xxxx xxxx1011 xxx1xxxx' - __guard cond != '1111' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - case opc1:opc2 of - when '1xxx' advsimd = TRUE; esize = 8; index = UInt(opc1[0]:opc2); - when '0xx1' advsimd = TRUE; esize = 16; index = UInt(opc1[0]:opc2[1]); - when '0x00' advsimd = FALSE; esize = 32; index = UInt(opc1[0]); - when '0x10' UNDEFINED; - d = UInt(D:Vd); t = UInt(Rt); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_VMOV_rs_T1A1_A - __instruction_set T32 - __field opc1 21 +: 2 - __field Vd 16 +: 4 - __field Rt 12 +: 4 - __field D 7 +: 1 - __field opc2 5 +: 2 - __opcode '11101110 0xx0xxxx xxxx1011 xxx1xxxx' - __guard TRUE - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - case opc1:opc2 of - when '1xxx' advsimd = TRUE; esize = 8; index = UInt(opc1[0]:opc2); - when '0xx1' advsimd = TRUE; esize = 16; index = UInt(opc1[0]:opc2[1]); - when '0x00' advsimd = FALSE; esize = 32; index = UInt(opc1[0]); - when '0x10' UNDEFINED; - d = UInt(D:Vd); t = UInt(Rt); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - Elem[D[d],index,esize] = R[t][esize-1:0]; - -__instruction aarch32_USUB16_A - __encoding aarch32_USUB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0101xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_USUB16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1101xxxx 1111xxxx 0100xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = UInt(R[n][15:0]) - UInt(R[m][15:0]); - diff2 = UInt(R[n][31:16]) - UInt(R[m][31:16]); - R[d][15:0] = diff1[15:0]; - R[d][31:16] = diff2[15:0]; - PSTATE.GE[1:0] = if diff1 >= 0 then '11' else '00'; - PSTATE.GE[3:2] = if diff2 >= 0 then '11' else '00'; - -__instruction aarch32_VDOT_s_A - __encoding aarch32_VDOT_s_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x10xxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if !HaveDOTPExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - boolean signed = (U=='0'); - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm[3:0]); - integer index = UInt(M); - integer esize = 32; - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_VDOT_s_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x10xxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveDOTPExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - boolean signed = (U=='0'); - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm[3:0]); - integer index = UInt(M); - integer esize = 32; - integer regs = if Q == '1' then 2 else 1; - - __execute - bits(64) operand1; - bits(64) operand2 = D[m]; - bits(64) result; - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - operand1 = D[n+r]; - result = D[d+r]; - integer element1, element2; - for e = 0 to 1 - integer res = 0; - for i = 0 to 3 - if signed then - element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = SInt(Elem[operand2, 4 * index + i, esize DIV 4]); - else - element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = UInt(Elem[operand2, 4 * index + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = Elem[result, e, esize] + res; - D[d+r] = result; - -__instruction aarch32_UBFX_A - __encoding aarch32_UBFX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field widthm1 16 +: 5 - __field Rd 12 +: 4 - __field lsb 7 +: 5 - __field Rn 0 +: 4 - __opcode 'xxxx0111 111xxxxx xxxxxxxx x101xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); - lsbit = UInt(lsb); widthminus1 = UInt(widthm1); - if d == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_UBFX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field widthm1 0 +: 5 - __opcode '11110x11 1100xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 26 == '0' - __unpredictable_unless 5 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); - lsbit = UInt(imm3:imm2); widthminus1 = UInt(widthm1); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - msbit = lsbit + widthminus1; - if msbit <= 31 then - R[d] = ZeroExtend(R[n][msbit:lsbit], 32); - else - UNPREDICTABLE; - -__instruction aarch32_VADDL_A - __encoding aarch32_VADDL_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0000 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' || (op == '1' && Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; is_vaddw = (op == '1'); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VADDL_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0000 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' || (op == '1' && Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; is_vaddw = (op == '1'); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - if is_vaddw then - op1 = Int(Elem[Qin[n>>1],e,2*esize], unsigned); - else - op1 = Int(Elem[Din[n],e,esize], unsigned); - result = op1 + Int(Elem[Din[m],e,esize],unsigned); - Elem[Q[d>>1],e,2*esize] = result[2*esize-1:0]; - -__instruction aarch32_LDREX_A - __encoding aarch32_LDREX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1001xxxx xxxxxx11 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); imm32 = Zeros(32); // Zero offset - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDREX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11101000 0101xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8:'00', 32); - if t == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - address = R[n] + imm32; - AArch32.SetExclusiveMonitors(address,4); - R[t] = MemA[address,4]; - -__instruction aarch32_MRC_A - __encoding aarch32_MRC_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field opc1 21 +: 3 - __field CRn 16 +: 4 - __field Rt 12 +: 4 - __field coproc 8 +: 4 - __field opc2 5 +: 3 - __field CRm 0 +: 4 - __opcode 'xxxx1110 xxx1xxxx xxxx111x xxx1xxxx' - __guard cond != '1111' - __decode - t = UInt(Rt); cp = if coproc[0] == '0' then 14 else 15; - // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_MRC_T1A1_A - __instruction_set T32 - __field opc1 21 +: 3 - __field CRn 16 +: 4 - __field Rt 12 +: 4 - __field coproc 8 +: 4 - __field opc2 5 +: 3 - __field CRm 0 +: 4 - __opcode '11101110 xxx1xxxx xxxx111x xxx1xxxx' - __guard TRUE - __decode - t = UInt(Rt); cp = if coproc[0] == '0' then 14 else 15; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - bits(32) value = AArch32.SysRegRead(cp, ThisInstr()); - if t != 15 then - R[t] = value; - elsif AArch32.SysRegReadCanWriteAPSR(cp, ThisInstr()) then - PSTATE.[N,Z,C,V] = value[31:28]; - // value[27:0] are not used. - else - PSTATE.[N,Z,C,V] = bits(4) UNKNOWN; - -__instruction aarch32_VRINTZ_vfp_A - __encoding aarch32_VRINTZ_vfp_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110110 xxxx10xx 11x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VRINTZ_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110110 xxxx10xx 11x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = Zeros(16) : FPRoundInt(S[m][15:0], FPSCR, rounding, exact); - when 32 - S[d] = FPRoundInt(S[m], FPSCR, rounding, exact); - when 64 - D[d] = FPRoundInt(D[m], FPSCR, rounding, exact); - -__instruction aarch32_UDF_A - __encoding aarch32_UDF_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm12 8 +: 12 - __field imm4 0 +: 4 - __opcode '11100111 1111xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __decode - imm32 = ZeroExtend(imm12:imm4, 32); - // imm32 is for assembly and disassembly only, and is ignored by hardware. - - __encoding aarch32_UDF_T1_A - __instruction_set T16 - __field imm8 16 +: 8 - __opcode '11011110 xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - imm32 = ZeroExtend(imm8, 32); - // imm32 is for assembly and disassembly only, and is ignored by hardware. - - __encoding aarch32_UDF_T2_A - __instruction_set T32 - __field imm4 16 +: 4 - __field imm12 0 +: 12 - __opcode '11110111 1111xxxx 1010xxxx xxxxxxxx' - __guard TRUE - __decode - imm32 = ZeroExtend(imm4:imm12, 32); - // imm32 is for assembly and disassembly only, and is ignored by hardware. - - __execute __conditional - UNDEFINED; - -__instruction aarch32_SXTB_A - __encoding aarch32_SXTB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 10101111 xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SXTB_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '10110010 01xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); rotation = 0; - - __encoding aarch32_SXTB_T2_A - __instruction_set T32 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 01001111 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d] = SignExtend(rotated[7:0], 32); - -__instruction aarch32_SSAT16_A - __encoding aarch32_SSAT16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field sat_imm 16 +: 4 - __field Rd 12 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0110 1010xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm)+1; - if d == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_SSAT16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field sat_imm 0 +: 4 - __opcode '11110x11 0010xxxx 0000xxxx 00xxxxxx' - __guard TRUE - __unpredictable_unless 26 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 4 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm)+1; - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (result1, sat1) = SignedSatQ(SInt(R[n][15:0]), saturate_to); - (result2, sat2) = SignedSatQ(SInt(R[n][31:16]), saturate_to); - R[d][15:0] = SignExtend(result1, 16); - R[d][31:16] = SignExtend(result2, 16); - if sat1 || sat2 then - PSTATE.Q = '1'; - -__instruction aarch32_VMOVN_A - __encoding aarch32_VMOVN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0010 00x0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VMOVN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0010 00x0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - Elem[D[d],e,esize] = Elem[Qin[m>>1],e,2*esize][esize-1:0]; - -__instruction aarch32_VMOV_i_A - __encoding aarch32_VMOV_i_T1A1_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx0xx0 0x01xxxx' - __guard TRUE - __decode - if op == '0' && cmode[0] == '1' && cmode[3:2] != '11' then SEE "VORR (immediate)"; - if op == '1' && cmode != '1110' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - single_register = FALSE; advsimd = TRUE; imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMOV_i_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field imm4H 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm4L 0 +: 4 - __opcode 'xxxx1110 1x11xxxx xxxx10xx x0x0xxxx' - __guard cond != '1111' - __unpredictable_unless 7 == '0' - __unpredictable_unless 5 == '0' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - single_register = (size != '11'); advsimd = FALSE; - bits(16) imm16; - bits(32) imm32; - bits(64) imm64; - case size of - when '01' d = UInt(Vd:D); imm16 = VFPExpandImm(imm4H:imm4L); imm32 = Zeros(16) : imm16; - when '10' d = UInt(Vd:D); imm32 = VFPExpandImm(imm4H:imm4L); - when '11' d = UInt(D:Vd); imm64 = VFPExpandImm(imm4H:imm4L); regs = 1; - - __encoding aarch32_VMOV_i_T3A3_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx10x0 0x01xxxx' - __guard TRUE - __decode - if op == '0' && cmode[0] == '1' && cmode[3:2] != '11' then SEE "VORR (immediate)"; - if op == '1' && cmode != '1110' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - single_register = FALSE; advsimd = TRUE; imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMOV_i_T4A4_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx11xx 0x01xxxx' - __guard TRUE - __decode - if op == '0' && cmode[0] == '1' && cmode[3:2] != '11' then SEE "VORR (immediate)"; - if op == '1' && cmode != '1110' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - single_register = FALSE; advsimd = TRUE; imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMOV_i_T5A5_A - __instruction_set A32 - __field i 24 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - __opcode '1111001x 1x000xxx xxxx1110 0x11xxxx' - __guard TRUE - __decode - if op == '0' && cmode[0] == '1' && cmode[3:2] != '11' then SEE "VORR (immediate)"; - if op == '1' && cmode != '1110' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - single_register = FALSE; advsimd = TRUE; imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMOV_i_T1A1_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx0xx0 0x01xxxx' - __guard TRUE - __decode - if op == '0' && cmode[0] == '1' && cmode[3:2] != '11' then SEE "VORR (immediate)"; - if op == '1' && cmode != '1110' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - single_register = FALSE; advsimd = TRUE; imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMOV_i_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field imm4H 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm4L 0 +: 4 - __opcode '11101110 1x11xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __unpredictable_unless 7 == '0' - __unpredictable_unless 5 == '0' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - single_register = (size != '11'); advsimd = FALSE; - bits(16) imm16; - bits(32) imm32; - bits(64) imm64; - case size of - when '01' d = UInt(Vd:D); imm16 = VFPExpandImm(imm4H:imm4L); imm32 = Zeros(16) : imm16; - when '10' d = UInt(Vd:D); imm32 = VFPExpandImm(imm4H:imm4L); - when '11' d = UInt(D:Vd); imm64 = VFPExpandImm(imm4H:imm4L); regs = 1; - - __encoding aarch32_VMOV_i_T3A3_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx10x0 0x01xxxx' - __guard TRUE - __decode - if op == '0' && cmode[0] == '1' && cmode[3:2] != '11' then SEE "VORR (immediate)"; - if op == '1' && cmode != '1110' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - single_register = FALSE; advsimd = TRUE; imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMOV_i_T4A4_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx11xx 0x01xxxx' - __guard TRUE - __decode - if op == '0' && cmode[0] == '1' && cmode[3:2] != '11' then SEE "VORR (immediate)"; - if op == '1' && cmode != '1110' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - single_register = FALSE; advsimd = TRUE; imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMOV_i_T5A5_A - __instruction_set T32 - __field i 28 +: 1 - __field D 22 +: 1 - __field imm3 16 +: 3 - __field Vd 12 +: 4 - __field cmode 8 +: 4 - __field Q 6 +: 1 - __field op 5 +: 1 - __field imm4 0 +: 4 - __opcode '111x1111 1x000xxx xxxx1110 0x11xxxx' - __guard TRUE - __decode - if op == '0' && cmode[0] == '1' && cmode[3:2] != '11' then SEE "VORR (immediate)"; - if op == '1' && cmode != '1110' then SEE "Related encodings"; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - single_register = FALSE; advsimd = TRUE; imm64 = AdvSIMDExpandImm(op, cmode, i:imm3:imm4); - d = UInt(D:Vd); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if single_register then - S[d] = imm32; - else - for r = 0 to regs-1 - D[d+r] = imm64; - -__instruction aarch32_STRH_i_A - __encoding aarch32_STRH_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx000x x1x0xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "STRHT"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm4H:imm4L, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_STRH_i_T1_A - __instruction_set T16 - __field imm5 22 +: 5 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '10000xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm5:'0', 32); - index = TRUE; add = TRUE; wback = FALSE; - - __encoding aarch32_STRH_i_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 1010xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = TRUE; add = TRUE; wback = FALSE; - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_STRH_i_T3_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field P 10 +: 1 - __field U 9 +: 1 - __field W 8 +: 1 - __field imm8 0 +: 8 - __opcode '11111000 0010xxxx xxxx1xxx xxxxxxxx' - __guard TRUE - __decode - if P == '1' && U == '1' && W == '0' then SEE "STRHT"; - if Rn == '1111' || (P == '0' && W == '0') then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if t == 15 || (wback && n == t) then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute - if CurrentInstrSet() == InstrSet_A32 then - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - MemU[address,2] = R[t][15:0]; - if wback then R[n] = offset_addr; - else - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - MemU[address,2] = R[t][15:0]; - if wback then R[n] = offset_addr; - -__instruction aarch32_VLD3_a_A - __encoding aarch32_VLD3_a_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - __opcode '11110100 1x10xxxx xxxx1110 xxx0xxxx' - __guard TRUE - __decode - if size == '11' || a == '1' then UNDEFINED; - ebytes = 1 << UInt(size); - inc = if T == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD3_a_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field T 5 +: 1 - __field a 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111001 1x10xxxx xxxx1110 xxx0xxxx' - __guard TRUE - __decode - if size == '11' || a == '1' then UNDEFINED; - ebytes = 1 << UInt(size); - inc = if T == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; - D[d] = Replicate(MemU[address,ebytes]); - D[d2] = Replicate(MemU[address+ebytes,ebytes]); - D[d3] = Replicate(MemU[address+2*ebytes,ebytes]); - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 3*ebytes; - -__instruction aarch32_VRINTA_vfp_A - __encoding aarch32_VRINTA_vfp_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111001 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VRINTA_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111001 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = Zeros(16) : FPRoundInt(S[m][15:0], FPSCR, rounding, exact); - when 32 - S[d] = FPRoundInt(S[m], FPSCR, rounding, exact); - when 64 - D[d] = FPRoundInt(D[m], FPSCR, rounding, exact); - -__instruction aarch32_SHSUB8_A - __encoding aarch32_SHSUB8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0011xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SHSUB8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1100xxxx 1111xxxx 0010xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = SInt(R[n][7:0]) - SInt(R[m][7:0]); - diff2 = SInt(R[n][15:8]) - SInt(R[m][15:8]); - diff3 = SInt(R[n][23:16]) - SInt(R[m][23:16]); - diff4 = SInt(R[n][31:24]) - SInt(R[m][31:24]); - R[d][7:0] = diff1[8:1]; - R[d][15:8] = diff2[8:1]; - R[d][23:16] = diff3[8:1]; - R[d][31:24] = diff4[8:1]; - -__instruction aarch32_LDREXH_A - __encoding aarch32_LDREXH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1111xxxx xxxxxx11 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDREXH_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 0101xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - address = R[n]; - AArch32.SetExclusiveMonitors(address,2); - R[t] = ZeroExtend(MemA[address,2], 32); - -__instruction aarch32_DSB_A - __encoding aarch32_DSB_A1_A - __instruction_set A32 - __field option 0 +: 4 - __opcode '11110101 0111xxxx xxxxxxxx 0100xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_DSB_T1_A - __instruction_set T32 - __field option 0 +: 4 - __opcode '11110011 1011xxxx 10x0xxxx 0100xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - // No additional decoding required - - __execute __conditional - case option of - when '0001' domain = MBReqDomain_OuterShareable; types = MBReqTypes_Reads; - when '0010' domain = MBReqDomain_OuterShareable; types = MBReqTypes_Writes; - when '0011' domain = MBReqDomain_OuterShareable; types = MBReqTypes_All; - when '0101' domain = MBReqDomain_Nonshareable; types = MBReqTypes_Reads; - when '0110' domain = MBReqDomain_Nonshareable; types = MBReqTypes_Writes; - when '0111' domain = MBReqDomain_Nonshareable; types = MBReqTypes_All; - when '1001' domain = MBReqDomain_InnerShareable; types = MBReqTypes_Reads; - when '1010' domain = MBReqDomain_InnerShareable; types = MBReqTypes_Writes; - when '1011' domain = MBReqDomain_InnerShareable; types = MBReqTypes_All; - when '1101' domain = MBReqDomain_FullSystem; types = MBReqTypes_Reads; - when '1110' domain = MBReqDomain_FullSystem; types = MBReqTypes_Writes; - otherwise - if option == '0000' then SEE "SSBB"; - elsif option == '0100' then SEE "PSSBB"; - else domain = MBReqDomain_FullSystem; types = MBReqTypes_All; - - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then - if HCR.BSU == '11' then - domain = MBReqDomain_FullSystem; - if HCR.BSU == '10' && domain != MBReqDomain_FullSystem then - domain = MBReqDomain_OuterShareable; - if HCR.BSU == '01' && domain == MBReqDomain_Nonshareable then - domain = MBReqDomain_InnerShareable; - - DataSynchronizationBarrier(domain, types); - -__instruction aarch32_REV_A - __encoding aarch32_REV_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1011xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); m = UInt(Rm); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_REV_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '10111010 00xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); - - __encoding aarch32_REV_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 1000xxxx' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); n = UInt(Rn); - if m != n || d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - bits(32) result; - result[31:24] = R[m][7:0]; - result[23:16] = R[m][15:8]; - result[15:8] = R[m][23:16]; - result[7:0] = R[m][31:24]; - R[d] = result; - -__instruction aarch32_VORR_r_A - __encoding aarch32_VORR_r_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x10xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VORR_r_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x10xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = D[n+r] OR D[m+r]; - -__instruction aarch32_VQRSHL_A - __encoding aarch32_VQRSHL_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0101 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQRSHL_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0101 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - shift = SInt(Elem[D[n+r],e,esize][7:0]); - round_const = 1 << (-1-shift); // 0 for left shift, 2^(n-1) for right shift - operand = Int(Elem[D[m+r],e,esize], unsigned); - (result, sat) = SatQ((operand + round_const) << shift, esize, unsigned); - Elem[D[d+r],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_STRH_r_A - __encoding aarch32_STRH_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx000x x0x0xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if P == '0' && W == '1' then SEE "STRHT"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - (shift_t, shift_n) = (SRType_LSL, 0); - if t == 15 || m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_STRH_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '0101001x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_STRH_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111000 0010xxxx xxxx0000 00xxxxxx' - __guard TRUE - __decode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if t == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if index then offset_addr else R[n]; - MemU[address,2] = R[t][15:0]; - if wback then R[n] = offset_addr; - -__instruction aarch32_VAND_r_A - __encoding aarch32_VAND_r_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x00xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VAND_r_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x00xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = D[n+r] AND D[m+r]; - -__instruction aarch32_STL_A - __encoding aarch32_STL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1000xxxx xxxxxx00 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_STL_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 1010xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - MemO[address, 4] = R[t]; - -__instruction aarch32_VQADD_A - __encoding aarch32_VQADD_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0000 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQADD_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0000 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - sum = Int(Elem[D[n+r],e,esize], unsigned) + Int(Elem[D[m+r],e,esize], unsigned); - (Elem[D[d+r],e,esize], sat) = SatQ(sum, esize, unsigned); - if sat then FPSCR.QC = '1'; - -__instruction aarch32_QSUB16_A - __encoding aarch32_QSUB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0010xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QSUB16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1101xxxx 1111xxxx 0001xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = SInt(R[n][15:0]) - SInt(R[m][15:0]); - diff2 = SInt(R[n][31:16]) - SInt(R[m][31:16]); - R[d][15:0] = SignedSat(diff1, 16); - R[d][31:16] = SignedSat(diff2, 16); - -__instruction aarch32_VRSRA_A - __encoding aarch32_VRSRA_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0011 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRSRA_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0011 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - round_const = 1 << (shift_amount - 1); - for r = 0 to regs-1 - for e = 0 to elements-1 - result = (Int(Elem[D[m+r],e,esize], unsigned) + round_const) >> shift_amount; - Elem[D[d+r],e,esize] = Elem[D[d+r],e,esize] + result; - -__instruction aarch32_VMLA_s_A - __encoding aarch32_VMLA_s_T2A2_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0010 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); add = (op == '0'); floating_point = FALSE; long_destination = TRUE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = 1; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VMLA_s_T2A2_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0010 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - unsigned = (U == '1'); add = (op == '0'); floating_point = FALSE; long_destination = TRUE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = 1; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - op2 = Elem[Din[m],index,esize]; op2val = Int(op2, unsigned); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; op1val = Int(op1, unsigned); - if floating_point then - fp_addend = if add then FPMul(op1,op2,StandardFPSCRValue()) else FPNeg(FPMul(op1,op2,StandardFPSCRValue())); - Elem[D[d+r],e,esize] = FPAdd(Elem[Din[d+r],e,esize], fp_addend, StandardFPSCRValue()); - else - addend = if add then op1val*op2val else -op1val*op2val; - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + addend; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + addend; - -__instruction aarch32_LDRSH_r_A - __encoding aarch32_LDRSH_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx000x x0x1xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if P == '0' && W == '1' then SEE "LDRSHT"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - (shift_t, shift_n) = (SRType_LSL, 0); - if t == 15 || m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_LDRSH_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '0101111x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_LDRSH_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0011xxxx xxxx0000 00xxxxxx' - __guard TRUE - __decode - if Rn == '1111' then SEE "LDRSH (literal)"; - if Rt == '1111' then SEE "Related instructions"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if index then offset_addr else R[n]; - data = MemU[address,2]; - if wback then R[n] = offset_addr; - R[t] = SignExtend(data, 32); - -__instruction aarch32_RSB_rr_A - __encoding aarch32_RSB_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 011xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(NOT(R[n]), shifted, '1'); - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_NOP_A - __encoding aarch32_NOP_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00000000' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_NOP_T1_A - __instruction_set T16 - __opcode '10111111 00000000 00000000 00000000' - __guard TRUE - __decode - // No additional decoding required - - __encoding aarch32_NOP_T2_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00000000' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - // No additional decoding required - - __execute __conditional - // Do nothing - -__instruction aarch32_VCVT_iv_A - __encoding aarch32_VCVT_iv_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field opc2 16 +: 3 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x111000 xxxx10xx x1x0xxxx' - __guard cond != '1111' - __decode - if opc2 != '000' && opc2 != '10x' then SEE "Related encodings"; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - to_integer = (opc2[2] == '1'); - if to_integer then - unsigned = (opc2[0] == '0'); - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - else - unsigned = (op == '0'); - rounding = FPRoundingMode(FPSCR); - m = UInt(Vm:M); - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __encoding aarch32_VCVT_iv_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field opc2 16 +: 3 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x111000 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if opc2 != '000' && opc2 != '10x' then SEE "Related encodings"; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - to_integer = (opc2[2] == '1'); - if to_integer then - unsigned = (opc2[0] == '0'); - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - else - unsigned = (op == '0'); - rounding = FPRoundingMode(FPSCR); - m = UInt(Vm:M); - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __execute __conditional - CheckVFPEnabled(TRUE); - if to_integer then - case esize of - when 16 - S[d] = FPToFixed(S[m][15:0], 0, unsigned, FPSCR, rounding); - when 32 - S[d] = FPToFixed(S[m], 0, unsigned, FPSCR, rounding); - when 64 - S[d] = FPToFixed(D[m], 0, unsigned, FPSCR, rounding); - else - case esize of - when 16 - bits(16) fp16 = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - S[d] = Zeros(16):fp16; - when 32 - S[d] = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - when 64 - D[d] = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - -__instruction aarch32_SUB_SP_i_A - __encoding aarch32_SUB_SP_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 010x1101 xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); setflags = (S == '1'); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_SUB_SP_i_T1_A - __instruction_set T16 - __field imm7 16 +: 7 - __opcode '10110000 1xxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = 13; setflags = FALSE; imm32 = ZeroExtend(imm7:'00', 32); - - __encoding aarch32_SUB_SP_i_T2_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x01 101x1101 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rd == '1111' && S == '1' then SEE "CMP (immediate)"; - d = UInt(Rd); setflags = (S == '1'); imm32 = T32ExpandImm(i:imm3:imm8); - if d == 15 && !setflags then UNPREDICTABLE; - - __encoding aarch32_SUB_SP_i_T3_A - __instruction_set T32 - __field i 26 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x10 10101101 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); setflags = FALSE; imm32 = ZeroExtend(i:imm3:imm8, 32); - if d == 15 then UNPREDICTABLE; - - __execute __conditional - (result, nzcv) = AddWithCarry(SP, NOT(imm32), '1'); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VSUB_i_A - __encoding aarch32_VSUB_i_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0xxxxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSUB_i_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0xxxxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = Elem[D[n+r],e,esize] - Elem[D[m+r],e,esize]; - -__instruction aarch32_SHASX_A - __encoding aarch32_SHASX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0011xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SHASX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1010xxxx 1111xxxx 0010xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff = SInt(R[n][15:0]) - SInt(R[m][31:16]); - sum = SInt(R[n][31:16]) + SInt(R[m][15:0]); - R[d][15:0] = diff[16:1]; - R[d][31:16] = sum[16:1]; - -__instruction aarch32_SHA1M_A - __encoding aarch32_SHA1M_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x10xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if !HaveSHA1Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_SHA1M_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x10xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA1Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - X = Q[d>>1]; - Y = Q[n>>1][31:0]; // Note: 32 bits wide - W = Q[m>>1]; - for e = 0 to 3 - t = SHAmajority(X[63:32], X[95:64], X[127:96]); - Y = Y + ROL(X[31:0], 5) + t + Elem[W, e, 32]; - X[63:32] = ROL(X[63:32], 30); - [Y, X] = ROL(Y:X, 32); - Q[d>>1] = X; - -__instruction aarch32_SMLABB_A - __encoding aarch32_SMLABB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field M 6 +: 1 - __field N 5 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0001 0000xxxx xxxxxxxx 1xx0xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - n_high = (N == '1'); m_high = (M == '1'); - if d == 15 || n == 15 || m == 15 || a == 15 then UNPREDICTABLE; - - __encoding aarch32_SMLABB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field N 5 +: 1 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0001xxxx xxxxxxxx 00xxxxxx' - __guard TRUE - __decode - if Ra == '1111' then SEE "SMULBB, SMULBT, SMULTB, SMULTT"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - n_high = (N == '1'); m_high = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand1 = if n_high then R[n][31:16] else R[n][15:0]; - operand2 = if m_high then R[m][31:16] else R[m][15:0]; - result = SInt(operand1) * SInt(operand2) + SInt(R[a]); - R[d] = result[31:0]; - if result != SInt(result[31:0]) then // Signed overflow - PSTATE.Q = '1'; - -__instruction aarch32_VCEQ_r_A - __encoding aarch32_VCEQ_r_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0xxxxxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - int_operation = TRUE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCEQ_r_A2_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x0xxxxx xxxx1110 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - int_operation = FALSE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCEQ_r_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0xxxxxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - int_operation = TRUE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCEQ_r_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x0xxxxx xxxx1110 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - int_operation = FALSE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[n+r],e,esize]; op2 = Elem[D[m+r],e,esize]; - if int_operation then - test_passed = (op1 == op2); - else - test_passed = FPCompareEQ(op1, op2, StandardFPSCRValue()); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_SBC_i_A - __encoding aarch32_SBC_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 110xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_SBC_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x01 011xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); imm32 = T32ExpandImm(i:imm3:imm8); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (result, nzcv) = AddWithCarry(R[n], NOT(imm32), PSTATE.C); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VRINTZ_asimd_A - __encoding aarch32_VRINTZ_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0101 1xx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPRounding_ZERO; exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRINTZ_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0101 1xx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPRounding_ZERO; exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - if InITBlock() then UNPREDICTABLE; - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[m+r],e,esize]; - result = FPRoundInt(op1, StandardFPSCRValue(), rounding, exact); - Elem[D[d+r],e,esize] = result; - -__instruction aarch32_UASX_A - __encoding aarch32_UASX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0101xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UASX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1010xxxx 1111xxxx 0100xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff = UInt(R[n][15:0]) - UInt(R[m][31:16]); - sum = UInt(R[n][31:16]) + UInt(R[m][15:0]); - R[d][15:0] = diff[15:0]; - R[d][31:16] = sum[15:0]; - PSTATE.GE[1:0] = if diff >= 0 then '11' else '00'; - PSTATE.GE[3:2] = if sum >= 0x10000 then '11' else '00'; - -__instruction aarch32_STLEXD_A - __encoding aarch32_STLEXD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1010xxxx xxxxxx10 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); t2 = t+1; n = UInt(Rn); - if d == 15 || Rt[0] == '1' || t2 == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t || d == t2 then UNPREDICTABLE; - - __encoding aarch32_STLEXD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __field Rd 0 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 1111xxxx' - __guard TRUE - __decode - d = UInt(Rd); t = UInt(Rt); t2 = UInt(Rt2); n = UInt(Rn); - if d == 15 || t == 15 || t2 == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t || d == t2 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - // Create doubleword to store such that R[t] will be stored at address and R[t2] at address+4. - value = if BigEndian() then R[t]:R[t2] else R[t2]:R[t]; - if AArch32.ExclusiveMonitorsPass(address, 8) then - MemO[address, 8] = value; - R[d] = ZeroExtend('0'); - else - R[d] = ZeroExtend('1'); - -__instruction aarch32_VACGE_A - __encoding aarch32_VACGE_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x0xxxxx xxxx1110 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - or_equal = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VACGE_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x0xxxxx xxxx1110 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - or_equal = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = FPAbs(Elem[D[n+r],e,esize]); op2 = FPAbs(Elem[D[m+r],e,esize]); - if or_equal then - test_passed = FPCompareGE(op1, op2, StandardFPSCRValue()); - else - test_passed = FPCompareGT(op1, op2, StandardFPSCRValue()); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_VRHADD_A - __encoding aarch32_VRHADD_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0001 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRHADD_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0001 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Int(Elem[D[n+r],e,esize], unsigned); - op2 = Int(Elem[D[m+r],e,esize], unsigned); - result = op1 + op2 + 1; - Elem[D[d+r],e,esize] = result[esize:1]; - -__instruction aarch32_SASX_A - __encoding aarch32_SASX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0001xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SASX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1010xxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff = SInt(R[n][15:0]) - SInt(R[m][31:16]); - sum = SInt(R[n][31:16]) + SInt(R[m][15:0]); - R[d][15:0] = diff[15:0]; - R[d][31:16] = sum[15:0]; - PSTATE.GE[1:0] = if diff >= 0 then '11' else '00'; - PSTATE.GE[3:2] = if sum >= 0 then '11' else '00'; - -__instruction aarch32_ADD_rr_A - __encoding aarch32_ADD_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 100xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], shifted, '0'); - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VSHR_A - __encoding aarch32_VSHR_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0000 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VSHR_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field L 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0000 xxx1xxxx' - __guard TRUE - __decode - if (L:imm6) == '0000xxx' then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - case L:imm6 of - when '0001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '001xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '01xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - when '1xxxxxx' esize = 64; elements = 1; shift_amount = 64 - UInt(imm6); - unsigned = (U == '1'); d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - result = Int(Elem[D[m+r],e,esize], unsigned) >> shift_amount; - Elem[D[d+r],e,esize] = result[esize-1:0]; - -__instruction aarch32_STRBT_A - __encoding aarch32_STRBT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0100 x110xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); postindex = TRUE; add = (U == '1'); - register_form = FALSE; imm32 = ZeroExtend(imm12, 32); - if t == 15 || n == 15 || n == t then UNPREDICTABLE; - - __encoding aarch32_STRBT_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 x110xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); postindex = TRUE; add = (U == '1'); - register_form = TRUE; (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if t == 15 || n == 15 || n == t || m == 15 then UNPREDICTABLE; - - __encoding aarch32_STRBT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11111000 0000xxxx xxxx1110 xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); postindex = FALSE; add = TRUE; - register_form = FALSE; imm32 = ZeroExtend(imm8, 32); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = if register_form then Shift(R[m], shift_t, shift_n, PSTATE.C) else imm32; - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if postindex then R[n] else offset_addr; - MemU_unpriv[address,1] = R[t][7:0]; - if postindex then R[n] = offset_addr; - -__instruction aarch32_UQSAX_A - __encoding aarch32_UQSAX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0110xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UQSAX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1110xxxx 1111xxxx 0101xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum = UInt(R[n][15:0]) + UInt(R[m][31:16]); - diff = UInt(R[n][31:16]) - UInt(R[m][15:0]); - R[d][15:0] = UnsignedSat(sum, 16); - R[d][31:16] = UnsignedSat(diff, 16); - -__instruction aarch32_VCVTA_asimd_A - __encoding aarch32_VCVTA_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field RM 8 +: 2 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx11 xxxx0001 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCVTA_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field RM 8 +: 2 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx11 xxxx0001 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - bits(esize) result; - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPToFixed(Elem[D[m+r],e,esize], 0, unsigned, - StandardFPSCRValue(), rounding); - -__instruction aarch32_LDREXD_A - __encoding aarch32_LDREXD_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1011xxxx xxxxxx11 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); t2 = t + 1; n = UInt(Rn); - if Rt[0] == '1' || t2 == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDREXD_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rt2 8 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 0111xxxx' - __guard TRUE - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); t2 = UInt(Rt2); n = UInt(Rn); - if t == 15 || t2 == 15 || t == t2 || n == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - address = R[n]; - AArch32.SetExclusiveMonitors(address,8); - value = MemA[address,8]; - // Extract words from 64-bit loaded value such that R[t] is - // loaded from address and R[t2] from address+4. - R[t] = if BigEndian() then value[63:32] else value[31:0]; - R[t2] = if BigEndian() then value[31:0] else value[63:32]; - -__instruction aarch32_VUSDOT_A - __encoding aarch32_VUSDOT_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 1x10xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_VUSDOT_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 1x10xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer regs = if Q == '1' then 2 else 1; - - __execute - CheckAdvSIMDEnabled(); - bits(64) operand1; - bits(64) operand2; - bits(64) result; - - for r = 0 to regs-1 - operand1 = Din[n+r]; - operand2 = Din[m+r]; - result = Din[d+r]; - for e = 0 to 1 - bits(32) res = Elem[result, e, 32]; - for b = 0 to 3 - element1 = UInt(Elem[operand1, 4 * e + b, 8]); - element2 = SInt(Elem[operand2, 4 * e + b, 8]); - res = res + element1 * element2; - Elem[result, e, 32] = res; - D[d+r] = result; - -__instruction aarch32_VDOT_A - __encoding aarch32_VDOT_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if !HaveDOTPExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - boolean signed = U=='0'; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer esize = 32; - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_VDOT_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveDOTPExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - boolean signed = U=='0'; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer esize = 32; - integer regs = if Q == '1' then 2 else 1; - - __execute - bits(64) operand1; - bits(64) operand2; - bits(64) result; - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - operand1 = D[n+r]; - operand2 = D[m+r]; - result = D[d+r]; - integer element1, element2; - for e = 0 to 1 - integer res = 0; - for i = 0 to 3 - if signed then - element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = SInt(Elem[operand2, 4 * e + i, esize DIV 4]); - else - element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = UInt(Elem[operand2, 4 * e + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = Elem[result, e, esize] + res; - D[d+r] = result; - -__instruction aarch32_VCVT_A - __encoding aarch32_VCVT_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x110110 xxxx0110 01x0xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - if Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer m = UInt(M:Vm); - - __encoding aarch32_VCVT_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x110110 xxxx0110 01x0xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - if Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(128) operand; - bits(64) result; - operand = Q[m>>1]; - for e = 0 to 3 - bits(32) op = Elem[operand, e, 32]; - Elem[result, e, 16] = FPConvertBF(op, StandardFPSCRValue()); - D[d] = result; - -__instruction aarch32_UXTB16_A - __encoding aarch32_UXTB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 11001111 xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UXTB16_T1_A - __instruction_set T32 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 00111111 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d][15:0] = ZeroExtend(rotated[7:0], 16); - R[d][31:16] = ZeroExtend(rotated[23:16], 16); - -__instruction aarch32_VRECPE_A - __encoding aarch32_VRECPE_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 8 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx11 xxxx010x 0xx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - floating_point = (F == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRECPE_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 8 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx11 xxxx010x 0xx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - floating_point = (F == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - Elem[D[d+r],e,esize] = FPRecipEstimate(Elem[D[m+r],e,esize], StandardFPSCRValue()); - else - Elem[D[d+r],e,esize] = UnsignedRecipEstimate(Elem[D[m+r],e,esize]); - -__instruction aarch32_VMOV_r_A - __encoding aarch32_VMOV_r_T2A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110000 xxxx101x 01x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - single_register = (size == '10'); advsimd = FALSE; - if single_register then - d = UInt(Vd:D); m = UInt(Vm:M); - else - d = UInt(D:Vd); m = UInt(M:Vm); regs = 1; - - __encoding aarch32_VMOV_r_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110000 xxxx101x 01x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - single_register = (size == '10'); advsimd = FALSE; - if single_register then - d = UInt(Vd:D); m = UInt(Vm:M); - else - d = UInt(D:Vd); m = UInt(M:Vm); regs = 1; - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if single_register then - S[d] = S[m]; - else - for r = 0 to regs-1 - D[d+r] = D[m+r]; - -__instruction aarch32_PSSBB_A - __encoding aarch32_PSSBB_A1_A - __instruction_set A32 - __opcode '11110101 0111xxxx xxxxxxxx 01000100' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_PSSBB_T1_A - __instruction_set T32 - __opcode '11110011 1011xxxx 10x0xxxx 01000100' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - if InITBlock() then UNPREDICTABLE; - - __execute __conditional - SpeculativeStoreBypassBarrierToPA(); - -__instruction aarch32_VJCVT_A - __encoding aarch32_VJCVT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x111001 xxxx1011 11x0xxxx' - __guard cond != '1111' - __decode - if !HaveFJCVTZSExt() then UNDEFINED; - if cond != '1110' then UNPREDICTABLE; - d = UInt(Vd:D); m = UInt(M:Vm); - - __encoding aarch32_VJCVT_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x111001 xxxx1011 11x0xxxx' - __guard TRUE - __decode - if !HaveFJCVTZSExt() then UNDEFINED; - if InITBlock() then UNPREDICTABLE; - d = UInt(Vd:D); m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - bits(64) fltval = D[m]; - bits(32) intval; - bit Z; - (intval, Z) = FPToFixedJS(fltval, FPSCR, FALSE); - FPSCR[31:28] = '0':Z:'00'; - S[d] = intval; - -__instruction aarch32_VRINTX_vfp_A - __encoding aarch32_VRINTX_vfp_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110111 xxxx10xx 01x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - exact = TRUE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VRINTX_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110111 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - exact = TRUE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - rounding = FPRoundingMode(FPSCR); - case esize of - when 16 - S[d] = Zeros(16) : FPRoundInt(S[m][15:0], FPSCR, rounding, exact); - when 32 - S[d] = FPRoundInt(S[m], FPSCR, rounding, exact); - when 64 - D[d] = FPRoundInt(D[m], FPSCR, rounding, exact); - -__instruction aarch32_VCMP_A - __encoding aarch32_VCMP_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field E 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110100 xxxx10xx 01x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - quiet_nan_exc = (E == '1'); with_zero = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VCMP_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field E 7 +: 1 - __opcode 'xxxx1110 1x110101 xxxx10xx 01x0xxxx' - __guard cond != '1111' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - quiet_nan_exc = (E == '1'); with_zero = TRUE; - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __encoding aarch32_VCMP_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field E 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110100 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - quiet_nan_exc = (E == '1'); with_zero = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VCMP_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field E 7 +: 1 - __opcode '11101110 1x110101 xxxx10xx 01x0xxxx' - __guard TRUE - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - quiet_nan_exc = (E == '1'); with_zero = TRUE; - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __execute __conditional - CheckVFPEnabled(TRUE); - bits(4) nzcv; - case esize of - when 16 - bits(16) op16 = if with_zero then FPZero('0') else S[m][15:0]; - nzcv = FPCompare(S[d][15:0], op16, quiet_nan_exc, FPSCR); - when 32 - bits(32) op32 = if with_zero then FPZero('0') else S[m]; - nzcv = FPCompare(S[d], op32, quiet_nan_exc, FPSCR); - when 64 - bits(64) op64 = if with_zero then FPZero('0') else D[m]; - nzcv = FPCompare(D[d], op64, quiet_nan_exc, FPSCR); - - FPSCR.[N,Z,C,V] = nzcv; - -__instruction aarch32_TST_i_A - __encoding aarch32_TST_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 0001xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); - (imm32, carry) = A32ExpandImm_C(imm12, PSTATE.C); - - __encoding aarch32_TST_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field imm8 0 +: 8 - __opcode '11110x00 0001xxxx 0xxx1111 xxxxxxxx' - __guard TRUE - __decode - n = UInt(Rn); - (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = R[n] AND imm32; - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_LDAEX_A - __encoding aarch32_LDAEX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1001xxxx xxxxxx10 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDAEX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 1110xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - AArch32.SetExclusiveMonitors(address, 4); - R[t] = MemO[address, 4]; - -__instruction aarch32_MVN_i_A - __encoding aarch32_MVN_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 111xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - d = UInt(Rd); setflags = (S == '1'); - (imm32, carry) = A32ExpandImm_C(imm12, PSTATE.C); - - __encoding aarch32_MVN_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x00 011x1111 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); setflags = (S == '1'); - (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = NOT(imm32); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VFMA_A - __encoding aarch32_VFMA_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x0xxxxx xxxx1100 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - advsimd = TRUE; op1_neg = (op == '1'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VFMA_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x10xxxx xxxx10xx x0x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - advsimd = FALSE; op1_neg = (op == '1'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VFMA_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x0xxxxx xxxx1100 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - advsimd = TRUE; op1_neg = (op == '1'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VFMA_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x10xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - advsimd = FALSE; op1_neg = (op == '1'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - bits(esize) op1 = Elem[D[n+r],e,esize]; - if op1_neg then op1 = FPNeg(op1); - Elem[D[d+r],e,esize] = FPMulAdd(Elem[D[d+r],e,esize], - op1, Elem[D[m+r],e,esize], StandardFPSCRValue()); - - else // VFP instruction - case esize of - when 16 - op16 = if op1_neg then FPNeg(S[n][15:0]) else S[n][15:0]; - S[d] = Zeros(16) : FPMulAdd(S[d][15:0], op16, S[m][15:0], FPSCR); - when 32 - op32 = if op1_neg then FPNeg(S[n]) else S[n]; - S[d] = FPMulAdd(S[d], op32, S[m], FPSCR); - when 64 - op64 = if op1_neg then FPNeg(D[n]) else D[n]; - D[d] = FPMulAdd(D[d], op64, D[m], FPSCR); - -__instruction aarch32_WFE_A - __encoding aarch32_WFE_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00000010' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_WFE_T1_A - __instruction_set T16 - __opcode '10111111 00100000 00000000 00000000' - __guard TRUE - __decode - // No additional decoding required - - __encoding aarch32_WFE_T2_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00000010' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - // No additional decoding required - - __execute __conditional - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch32.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch32.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.M != M32_Monitor then - // Check for traps described by the Secure Monitor. - AArch32.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - -__instruction aarch32_VQRDMULH_A - __encoding aarch32_VQRDMULH_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0xxxxxxx xxxx1011 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '00' || size == '11' then UNDEFINED; - scalar_form = FALSE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQRDMULH_T2A2_A - __instruction_set A32 - __field Q 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx1101 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VQRDMULH_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0xxxxxxx xxxx1011 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '00' || size == '11' then UNDEFINED; - scalar_form = FALSE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQRDMULH_T2A2_A - __instruction_set T32 - __field Q 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx1101 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - round_const = 1 << (esize-1); - if scalar_form then op2 = SInt(Elem[D[m],index,esize]); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = SInt(Elem[D[n+r],e,esize]); - if !scalar_form then op2 = SInt(Elem[D[m+r],e,esize]); - (result, sat) = SignedSatQ((2*op1*op2 + round_const) >> esize, esize); - Elem[D[d+r],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_UHASX_A - __encoding aarch32_UHASX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0111xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UHASX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1010xxxx 1111xxxx 0110xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff = UInt(R[n][15:0]) - UInt(R[m][31:16]); - sum = UInt(R[n][31:16]) + UInt(R[m][15:0]); - R[d][15:0] = diff[16:1]; - R[d][31:16] = sum[16:1]; - -__instruction aarch32_RSC_rr_A - __encoding aarch32_RSC_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 111xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(NOT(R[n]), shifted, PSTATE.C); - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VCVT_iv_A - __encoding aarch32_VCVT_iv_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field opc2 16 +: 3 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x11110x xxxx10xx 01x0xxxx' - __guard cond != '1111' - __decode - if opc2 != '000' && opc2 != '10x' then SEE "Related encodings"; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - to_integer = (opc2[2] == '1'); - if to_integer then - unsigned = (opc2[0] == '0'); - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - else - unsigned = (op == '0'); - rounding = FPRoundingMode(FPSCR); - m = UInt(Vm:M); - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __encoding aarch32_VCVT_iv_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field opc2 16 +: 3 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x11110x xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if opc2 != '000' && opc2 != '10x' then SEE "Related encodings"; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - to_integer = (opc2[2] == '1'); - if to_integer then - unsigned = (opc2[0] == '0'); - rounding = if op == '1' then FPRounding_ZERO else FPRoundingMode(FPSCR); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - else - unsigned = (op == '0'); - rounding = FPRoundingMode(FPSCR); - m = UInt(Vm:M); - case size of - when '01' esize = 16; d = UInt(Vd:D); - when '10' esize = 32; d = UInt(Vd:D); - when '11' esize = 64; d = UInt(D:Vd); - - __execute __conditional - CheckVFPEnabled(TRUE); - if to_integer then - case esize of - when 16 - S[d] = FPToFixed(S[m][15:0], 0, unsigned, FPSCR, rounding); - when 32 - S[d] = FPToFixed(S[m], 0, unsigned, FPSCR, rounding); - when 64 - S[d] = FPToFixed(D[m], 0, unsigned, FPSCR, rounding); - else - case esize of - when 16 - bits(16) fp16 = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - S[d] = Zeros(16):fp16; - when 32 - S[d] = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - when 64 - D[d] = FixedToFP(S[m], 0, unsigned, FPSCR, rounding); - -__instruction aarch32_VST1_m_A - __encoding aarch32_VST1_m_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x00xxxx xxxx0111 xxxxxxxx' - __guard TRUE - __decode - regs = 1; if align[1] == '1' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST1_m_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x00xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - regs = 2; if align == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST1_m_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x00xxxx xxxx0110 xxxxxxxx' - __guard TRUE - __decode - regs = 3; if align[1] == '1' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST1_m_T4A4_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x00xxxx xxxx0010 xxxxxxxx' - __guard TRUE - __decode - regs = 4; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST1_m_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x00xxxx xxxx0111 xxxxxxxx' - __guard TRUE - __decode - regs = 1; if align[1] == '1' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST1_m_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x00xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - regs = 2; if align == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST1_m_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x00xxxx xxxx0110 xxxxxxxx' - __guard TRUE - __decode - regs = 3; if align[1] == '1' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VST1_m_T4A4_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x00xxxx xxxx0010 xxxxxxxx' - __guard TRUE - __decode - regs = 4; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d+regs > 32 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = TRUE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - for r = 0 to regs-1 - for e = 0 to elements-1 - if ebytes != 8 then - MemU[address,ebytes] = Elem[D[d+r],e]; - else - - = AArch32.CheckAlignment(address, ebytes, AccType_NORMAL, iswrite); - bits(64) data = Elem[D[d+r],e]; - MemU[address,4] = if BigEndian() then data[63:32] else data[31:0]; - MemU[address+4,4] = if BigEndian() then data[31:0] else data[63:32]; - address = address + ebytes; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 8*regs; - -__instruction aarch32_LDMDA_A - __encoding aarch32_LDMDA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx1000 00x1xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - n = UInt(Rn); registers = register_list; wback = (W == '1'); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - if wback && registers[n] == '1' then UNPREDICTABLE; - - __execute __conditional - address = R[n] - 4*BitCount(registers) + 4; - for i = 0 to 14 - if registers[i] == '1' then - R[i] = MemA[address,4]; address = address + 4; - if registers[15] == '1' then - LoadWritePC(MemA[address,4]); - if wback && registers[n] == '0' then R[n] = R[n] - 4*BitCount(registers); - if wback && registers[n] == '1' then R[n] = bits(32) UNKNOWN; - -__instruction aarch32_VMUL_f_A - __encoding aarch32_VMUL_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x0xxxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMUL_f_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 0x10xxxx xxxx10xx x0x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - advsimd = FALSE; - - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VMUL_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x0xxxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if sz == '1' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMUL_f_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 0x10xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if size == '01' && InITBlock() then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - advsimd = FALSE; - - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPMul(Elem[D[n+r],e,esize], Elem[D[m+r],e,esize], StandardFPSCRValue()); - else // VFP instruction - case esize of - when 16 - S[d] = Zeros(16) : FPMul(S[n][15:0], S[m][15:0], FPSCR); - when 32 - S[d] = FPMul(S[n], S[m], FPSCR); - when 64 - D[d] = FPMul(D[n], D[m], FPSCR); - -__instruction aarch32_VMLA_f_A - __encoding aarch32_VMLA_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x0xxxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - advsimd = TRUE; add = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMLA_f_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 0x00xxxx xxxx10xx x0x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - advsimd = FALSE; add = (op == '0'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VMLA_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x0xxxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - advsimd = TRUE; add = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMLA_f_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 0x00xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - advsimd = FALSE; add = (op == '0'); - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - product = FPMul(Elem[D[n+r],e,esize], Elem[D[m+r],e,esize], StandardFPSCRValue()); - addend = if add then product else FPNeg(product); - Elem[D[d+r],e,esize] = FPAdd(Elem[D[d+r],e,esize], addend, StandardFPSCRValue()); - else // VFP instruction - case esize of - when 16 - addend16 = if add then FPMul(S[n][15:0], S[m][15:0], FPSCR) else FPNeg(FPMul(S[n][15:0], S[m][15:0], FPSCR)); - S[d] = Zeros(16) : FPAdd(S[d][15:0], addend16, FPSCR); - when 32 - addend32 = if add then FPMul(S[n], S[m], FPSCR) else FPNeg(FPMul(S[n], S[m], FPSCR)); - S[d] = FPAdd(S[d], addend32, FPSCR); - when 64 - addend64 = if add then FPMul(D[n], D[m], FPSCR) else FPNeg(FPMul(D[n], D[m], FPSCR)); - D[d] = FPAdd(D[d], addend64, FPSCR); - -__instruction aarch32_VMMLA_A - __encoding aarch32_VMMLA_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x00xxxx xxxx1100 x1x0xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer regs = 2; - - __encoding aarch32_VMMLA_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x00xxxx xxxx1100 x1x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32BF16Ext() then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(M:Vm); - integer regs = 2; - - __execute - CheckAdvSIMDEnabled(); - - bits(128) op1 = Q[n>>1]; - bits(128) op2 = Q[m>>1]; - bits(128) acc = Q[d>>1]; - - Q[d>>1] = BFMatMulAdd(acc, op1, op2); - -__instruction aarch32_HVC_AS - __encoding aarch32_HVC_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm12 8 +: 12 - __field imm4 0 +: 4 - __opcode 'xxxx0001 0100xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __decode - if cond != '1110' then UNPREDICTABLE; - imm16 = imm12:imm4; - - __encoding aarch32_HVC_T1_A - __instruction_set T32 - __field imm4 16 +: 4 - __field imm12 0 +: 12 - __opcode '11110111 1110xxxx 1000xxxx xxxxxxxx' - __guard TRUE - __decode - imm16 = imm4:imm12; - if InITBlock() then UNPREDICTABLE; - - __execute - if !HaveEL(EL2) || PSTATE.EL == EL0 || (IsSecure() && !IsSecureEL2Enabled()) then - UNDEFINED; - - if HaveEL(EL3) then - if ELUsingAArch32(EL3) && SCR.HCE == '0' && PSTATE.EL == EL2 then - UNPREDICTABLE; - else - hvc_enable = SCR_GEN[].HCE; - else - hvc_enable = if ELUsingAArch32(EL2) then NOT(HCR.HCD) else NOT(HCR_EL2.HCD); - - if hvc_enable == '0' then - UNDEFINED; - else - AArch32.CallHypervisor(imm16); - -__instruction aarch32_UXTAB16_A - __encoding aarch32_UXTAB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1100xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if Rn == '1111' then SEE "UXTB16"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UXTAB16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 0011xxxx 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - if Rn == '1111' then SEE "UXTB16"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d][15:0] = R[n][15:0] + ZeroExtend(rotated[7:0], 16); - R[d][31:16] = R[n][31:16] + ZeroExtend(rotated[23:16], 16); - -__instruction aarch32_SHSUB16_A - __encoding aarch32_SHSUB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0011xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SHSUB16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1101xxxx 1111xxxx 0010xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = SInt(R[n][15:0]) - SInt(R[m][15:0]); - diff2 = SInt(R[n][31:16]) - SInt(R[m][31:16]); - R[d][15:0] = diff1[16:1]; - R[d][31:16] = diff2[16:1]; - -__instruction aarch32_ISB_A - __encoding aarch32_ISB_A1_A - __instruction_set A32 - __field option 0 +: 4 - __opcode '11110101 0111xxxx xxxxxxxx 0110xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - // No additional decoding required - - __encoding aarch32_ISB_T1_A - __instruction_set T32 - __field option 0 +: 4 - __opcode '11110011 1011xxxx 10x0xxxx 0110xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - // No additional decoding required - - __execute __conditional - InstructionSynchronizationBarrier(); - -__instruction aarch32_VLD3_m_A - __encoding aarch32_VLD3_m_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x10xxxx xxxx010x xxxxxxxx' - __guard TRUE - __decode - case itype of - when '0100' - inc = 1; - when '0101' - inc = 2; - otherwise - SEE "Related encodings"; - if size == '11' || align[1] == '1' then UNDEFINED; - alignment = if align[0] == '0' then 1 else 8; - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VLD3_m_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x10xxxx xxxx010x xxxxxxxx' - __guard TRUE - __decode - case itype of - when '0100' - inc = 1; - when '0101' - inc = 2; - otherwise - SEE "Related encodings"; - if size == '11' || align[1] == '1' then UNDEFINED; - alignment = if align[0] == '0' then 1 else 8; - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - for e = 0 to elements-1 - Elem[D[d], e] = MemU[address,ebytes]; - Elem[D[d2],e] = MemU[address+ebytes,ebytes]; - Elem[D[d3],e] = MemU[address+2*ebytes,ebytes]; - address = address + 3*ebytes; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 24; - -__instruction aarch32_TBB_A - __encoding aarch32_TBB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field H 4 +: 1 - __field Rm 0 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 000xxxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); is_tbh = (H == '1'); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - if is_tbh then - halfwords = UInt(MemU[R[n]+LSL(R[m],1), 2]); - else - halfwords = UInt(MemU[R[n]+R[m], 1]); - BranchWritePC(PC + 2*halfwords, BranchType_INDIR); - -__instruction aarch32_MRS_AS - __encoding aarch32_MRS_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field R 22 +: 1 - __field Rd 12 +: 4 - __opcode 'xxxx0001 0x00xxxx xxxxxx0x 0000xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - d = UInt(Rd); read_spsr = (R == '1'); - if d == 15 then UNPREDICTABLE; - - __encoding aarch32_MRS_T1_AS - __instruction_set T32 - __field R 20 +: 1 - __field Rd 8 +: 4 - __opcode '11110011 111xxxxx 10x0xxxx xx0xxxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 4 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - d = UInt(Rd); read_spsr = (R == '1'); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - if read_spsr then - if PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; - else - R[d] = SPSR[]; - else - // CPSR has same bit assignments as SPSR, but with the IT, J, SS, IL, and T bits masked out. - bits(32) mask = '11111000 00001111 00000011 11011111'; - if HavePANExt() then - mask[22] = '1'; - - if HaveDITExt() then - mask[21] = '1'; - psr_val = GetPSRFromPSTATE() AND mask; - if PSTATE.EL == EL0 then - // If accessed from User mode return UNKNOWN values for E, A, I, F bits, bits[9:6], - // and for the M field, bits[4:0] - psr_val[22] = bits(1) UNKNOWN; - psr_val[9:6] = bits(4) UNKNOWN; - psr_val[4:0] = bits(5) UNKNOWN; - R[d] = psr_val; - -__instruction aarch32_MCRR_A - __encoding aarch32_MCRR_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field coproc 8 +: 4 - __field opc1 4 +: 4 - __field CRm 0 +: 4 - __opcode 'xxxx1100 0100xxxx xxxx111x xxxxxxxx' - __guard cond != '1111' - __decode - t = UInt(Rt); t2 = UInt(Rt2); cp = if coproc[0] == '0' then 14 else 15; - if t == 15 || t2 == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_MCRR_T1A1_A - __instruction_set T32 - __field Rt2 16 +: 4 - __field Rt 12 +: 4 - __field coproc 8 +: 4 - __field opc1 4 +: 4 - __field CRm 0 +: 4 - __opcode '11101100 0100xxxx xxxx111x xxxxxxxx' - __guard TRUE - __decode - t = UInt(Rt); t2 = UInt(Rt2); cp = if coproc[0] == '0' then 14 else 15; - if t == 15 || t2 == 15 then UNPREDICTABLE; - // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - value = R[t2]:R[t]; - AArch32.SysRegWrite64(cp, ThisInstr(), value); - -__instruction aarch32_STRB_i_A - __encoding aarch32_STRB_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx010x x1x0xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "STRBT"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if t == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_STRB_i_T1_A - __instruction_set T16 - __field imm5 22 +: 5 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '01110xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm5, 32); - index = TRUE; add = TRUE; wback = FALSE; - - __encoding aarch32_STRB_i_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 1000xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = TRUE; add = TRUE; wback = FALSE; - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_STRB_i_T3_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field P 10 +: 1 - __field U 9 +: 1 - __field W 8 +: 1 - __field imm8 0 +: 8 - __opcode '11111000 0000xxxx xxxx1xxx xxxxxxxx' - __guard TRUE - __decode - if P == '1' && U == '1' && W == '0' then SEE "STRBT"; - if Rn == '1111' || (P == '0' && W == '0') then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if t == 15 || (wback && n == t) then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute - if CurrentInstrSet() == InstrSet_A32 then - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - MemU[address,1] = R[t][7:0]; - if wback then R[n] = offset_addr; - else - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - MemU[address,1] = R[t][7:0]; - if wback then R[n] = offset_addr; - -__instruction aarch32_DOT_A - __encoding aarch32_DOT_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x00xxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - boolean op1_unsigned = (U == '0'); - boolean op2_unsigned = (U == '1'); - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm); - integer i = UInt(M); - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_DOT_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field U 4 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x00xxxx xxxx1101 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32Int8MatMulExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - boolean op1_unsigned = (U == '0'); - boolean op2_unsigned = (U == '1'); - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm); - integer i = UInt(M); - integer regs = if Q == '1' then 2 else 1; - - __execute - CheckAdvSIMDEnabled(); - bits(64) operand1; - bits(64) operand2; - bits(64) result; - - operand2 = Din[m]; - for r = 0 to regs-1 - operand1 = Din[n+r]; - result = Din[d+r]; - for e = 0 to 1 - bits(32) res = Elem[result, e, 32]; - for b = 0 to 3 - element1 = Int(Elem[operand1, 4 * e + b, 8], op1_unsigned); - element2 = Int(Elem[operand2, 4 * i + b, 8], op2_unsigned); - res = res + element1 * element2; - Elem[result, e, 32] = res; - D[d+r] = result; - -__instruction aarch32_MVN_rr_A - __encoding aarch32_MVN_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 111xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = NOT(shifted); - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_STM_u_AS - __encoding aarch32_STM_u_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 16 - __opcode 'xxxx100x x1x0xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 21 == '0' - __decode - n = UInt(Rn); registers = register_list; increment = (U == '1'); wordhigher = (P == U); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - - __execute __conditional - if PSTATE.EL == EL2 then - UNDEFINED; - elsif PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; - else - length = 4*BitCount(registers); - address = if increment then R[n] else R[n]-length; - if wordhigher then address = address+4; - for i = 0 to 14 - if registers[i] == '1' then // Store User mode register - MemA[address,4] = Rmode[i, M32_User]; - address = address + 4; - if registers[15] == '1' then - MemA[address,4] = PCStoreValue(); - -__instruction aarch32_USUB8_A - __encoding aarch32_USUB8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0101xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_USUB8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1100xxxx 1111xxxx 0100xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = UInt(R[n][7:0]) - UInt(R[m][7:0]); - diff2 = UInt(R[n][15:8]) - UInt(R[m][15:8]); - diff3 = UInt(R[n][23:16]) - UInt(R[m][23:16]); - diff4 = UInt(R[n][31:24]) - UInt(R[m][31:24]); - R[d][7:0] = diff1[7:0]; - R[d][15:8] = diff2[7:0]; - R[d][23:16] = diff3[7:0]; - R[d][31:24] = diff4[7:0]; - PSTATE.GE[0] = if diff1 >= 0 then '1' else '0'; - PSTATE.GE[1] = if diff2 >= 0 then '1' else '0'; - PSTATE.GE[2] = if diff3 >= 0 then '1' else '0'; - PSTATE.GE[3] = if diff4 >= 0 then '1' else '0'; - -__instruction aarch32_LDRSBT_A - __encoding aarch32_LDRSBT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm4H 8 +: 4 - __field imm4L 0 +: 4 - __opcode 'xxxx0000 x111xxxx xxxxxxxx 1101xxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); postindex = TRUE; add = (U == '1'); - register_form = FALSE; imm32 = ZeroExtend(imm4H:imm4L, 32); - if t == 15 || n == 15 || n == t then UNPREDICTABLE; - - __encoding aarch32_LDRSBT_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0000 x011xxxx xxxxxxxx 1101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); postindex = TRUE; add = (U == '1'); - register_form = TRUE; - if t == 15 || n == 15 || n == t || m == 15 then UNPREDICTABLE; - - __encoding aarch32_LDRSBT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11111001 0001xxxx xxxx1110 xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - if Rn == '1111' then SEE "LDRSB (literal)"; - t = UInt(Rt); n = UInt(Rn); postindex = FALSE; add = TRUE; - register_form = FALSE; imm32 = ZeroExtend(imm8, 32); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = if register_form then R[m] else imm32; - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if postindex then R[n] else offset_addr; - R[t] = SignExtend(MemU_unpriv[address,1], 32); - if postindex then R[n] = offset_addr; - -__instruction aarch32_VCVTB_bf16_A - __encoding aarch32_VCVTB_bf16_T1A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110011 xxxx1001 01x0xxxx' - __guard cond != '1111' - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - integer d = UInt(Vd:D); - integer m = UInt(Vm:M); - - __encoding aarch32_VCVTB_bf16_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110011 xxxx1001 01x0xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - integer d = UInt(Vd:D); - integer m = UInt(Vm:M); - - __execute __conditional - CheckVFPEnabled(TRUE); - - S[d][15:0] = FPConvertBF(S[m], FPSCR); - -__instruction aarch32_VFMAL_A - __encoding aarch32_VFMAL_A1_A - __instruction_set A32 - __field S 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 1x10xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - - integer d = UInt(D:Vd); - integer n = if Q == '1' then UInt(N:Vn) else UInt(Vn:N); - integer m = if Q == '1' then UInt(M:Vm) else UInt(Vm:M); - integer esize = 32; - integer regs = if Q=='1' then 2 else 1; - integer datasize = if Q=='1' then 64 else 32; - boolean sub_op = S=='1'; - - __encoding aarch32_VFMAL_T1_A - __instruction_set T32 - __field S 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 1x10xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - - integer d = UInt(D:Vd); - integer n = if Q == '1' then UInt(N:Vn) else UInt(Vn:N); - integer m = if Q == '1' then UInt(M:Vm) else UInt(Vm:M); - integer esize = 32; - integer regs = if Q=='1' then 2 else 1; - integer datasize = if Q=='1' then 64 else 32; - boolean sub_op = S=='1'; - - __execute - CheckAdvSIMDEnabled(); - bits(datasize) operand1 ; - bits(datasize) operand2 ; - bits(64) operand3; - bits(64) result; - bits(esize DIV 2) element1; - bits(esize DIV 2) element2; - - if Q=='0' then - operand1 = S[n][datasize-1:0]; - operand2 = S[m][datasize-1:0]; - else - operand1 = D[n][datasize-1:0]; - operand2 = D[m][datasize-1:0]; - for r = 0 to regs-1 - operand3 = D[d+r]; - for e = 0 to 1 - element1 = Elem[operand1, 2*r+e, esize DIV 2]; - element2 = Elem[operand2, 2*r+e, esize DIV 2]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAddH(Elem[operand3, e, esize], element1, element2, StandardFPSCRValue()); - D[d+r] = result; - -__instruction aarch32_EOR_rr_A - __encoding aarch32_EOR_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 001xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = R[n] EOR shifted; - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_ADD_SP_i_A - __encoding aarch32_ADD_SP_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 100x1101 xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); setflags = (S == '1'); imm32 = A32ExpandImm(imm12); - - __encoding aarch32_ADD_SP_i_T1_A - __instruction_set T16 - __field Rd 24 +: 3 - __field imm8 16 +: 8 - __opcode '10101xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); setflags = FALSE; imm32 = ZeroExtend(imm8:'00', 32); - - __encoding aarch32_ADD_SP_i_T2_A - __instruction_set T16 - __field imm7 16 +: 7 - __opcode '10110000 0xxxxxxx 00000000 00000000' - __guard TRUE - __decode - d = 13; setflags = FALSE; imm32 = ZeroExtend(imm7:'00', 32); - - __encoding aarch32_ADD_SP_i_T3_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x01 000x1101 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rd == '1111' && S == '1' then SEE "CMN (immediate)"; - d = UInt(Rd); setflags = (S == '1'); imm32 = T32ExpandImm(i:imm3:imm8); - if d == 15 && !setflags then UNPREDICTABLE; - - __encoding aarch32_ADD_SP_i_T4_A - __instruction_set T32 - __field i 26 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x10 00001101 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - d = UInt(Rd); setflags = FALSE; imm32 = ZeroExtend(i:imm3:imm8, 32); - if d == 15 then UNPREDICTABLE; - - __execute __conditional - (result, nzcv) = AddWithCarry(SP, imm32, '0'); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_SSUB8_A - __encoding aarch32_SSUB8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0001xxxx xxxxxxxx 1111xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SSUB8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1100xxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - diff1 = SInt(R[n][7:0]) - SInt(R[m][7:0]); - diff2 = SInt(R[n][15:8]) - SInt(R[m][15:8]); - diff3 = SInt(R[n][23:16]) - SInt(R[m][23:16]); - diff4 = SInt(R[n][31:24]) - SInt(R[m][31:24]); - R[d][7:0] = diff1[7:0]; - R[d][15:8] = diff2[7:0]; - R[d][23:16] = diff3[7:0]; - R[d][31:24] = diff4[7:0]; - PSTATE.GE[0] = if diff1 >= 0 then '1' else '0'; - PSTATE.GE[1] = if diff2 >= 0 then '1' else '0'; - PSTATE.GE[2] = if diff3 >= 0 then '1' else '0'; - PSTATE.GE[3] = if diff4 >= 0 then '1' else '0'; - -__instruction aarch32_LDM_u_AS - __encoding aarch32_LDM_u_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field register_list 0 +: 15 - __opcode 'xxxx100x x1x1xxxx 0xxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 21 == '0' - __decode - n = UInt(Rn); registers = register_list; increment = (U == '1'); wordhigher = (P == U); - if n == 15 || BitCount(registers) < 1 then UNPREDICTABLE; - - __execute __conditional - if PSTATE.EL == EL2 then UNDEFINED; - elsif PSTATE.M IN {M32_User,M32_System} then UNPREDICTABLE; - else - length = 4*BitCount(registers); - address = if increment then R[n] else R[n]-length; - if wordhigher then address = address+4; - for i = 0 to 14 - if registers[i] == '1' then // Load User mode register - Rmode[i, M32_User] = MemA[address,4]; address = address + 4; - -__instruction aarch32_MSR_i_AS - __encoding aarch32_MSR_i_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field R 22 +: 1 - __field mask 16 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0011 0x10xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __decode - if mask == '0000' && R == '0' then SEE "Related encodings"; - imm32 = A32ExpandImm(imm12); write_spsr = (R == '1'); - if mask == '0000' then UNPREDICTABLE; - - __execute __conditional - if write_spsr then - if PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; - else - SPSRWriteByInstr(imm32, mask); - else - // Attempts to change to an illegal mode will invoke the Illegal Execution state mechanism - CPSRWriteByInstr(imm32, mask); - -__instruction aarch32_USAT16_A - __encoding aarch32_USAT16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field sat_imm 16 +: 4 - __field Rd 12 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0110 1110xxxx xxxxxxxx 0011xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm); - if d == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_USAT16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field sat_imm 0 +: 4 - __opcode '11110x11 1010xxxx 0000xxxx 00xxxxxx' - __guard TRUE - __unpredictable_unless 26 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 4 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (result1, sat1) = UnsignedSatQ(SInt(R[n][15:0]), saturate_to); - (result2, sat2) = UnsignedSatQ(SInt(R[n][31:16]), saturate_to); - R[d][15:0] = ZeroExtend(result1, 16); - R[d][31:16] = ZeroExtend(result2, 16); - if sat1 || sat2 then - PSTATE.Q = '1'; - -__instruction aarch32_VLD2_m_A - __encoding aarch32_VLD2_m_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x10xxxx xxxx100x xxxxxxxx' - __guard TRUE - __decode - regs = 1; if align == '11' then UNDEFINED; - if size == '11' then UNDEFINED; - inc = if itype == '1001' then 2 else 1; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD2_m_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11110100 0x10xxxx xxxx0011 xxxxxxxx' - __guard TRUE - __decode - regs = 2; inc = 2; - if size == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD2_m_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field itype 8 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x10xxxx xxxx100x xxxxxxxx' - __guard TRUE - __decode - regs = 1; if align == '11' then UNDEFINED; - if size == '11' then UNDEFINED; - inc = if itype == '1001' then 2 else 1; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2+regs > 32 then UNPREDICTABLE; - - __encoding aarch32_VLD2_m_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 6 +: 2 - __field align 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111001 0x10xxxx xxxx0011 xxxxxxxx' - __guard TRUE - __decode - regs = 2; inc = 2; - if size == '11' then UNDEFINED; - alignment = if align == '00' then 1 else 4 << UInt(align); - ebytes = 1 << UInt(size); elements = 8 DIV ebytes; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2+regs > 32 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = FALSE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r], e] = MemU[address,ebytes]; - Elem[D[d2+r],e] = MemU[address+ebytes,ebytes]; - address = address + 2*ebytes; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 16*regs; - -__instruction aarch32_VCEQ_i_A - __encoding aarch32_VCEQ_i_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx01 xxxx0x01 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCEQ_i_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx01 xxxx0x01 0xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - bits(esize) zero = FPZero('0'); - test_passed = FPCompareEQ(Elem[D[m+r],e,esize], zero, StandardFPSCRValue()); - else - test_passed = (Elem[D[m+r],e,esize] == Zeros(esize)); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_USADA8_A - __encoding aarch32_USADA8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0111 1000xxxx xxxxxxxx 0001xxxx' - __guard cond != '1111' - __decode - if Ra == '1111' then SEE "USAD8"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_USADA8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 0111xxxx xxxxxxxx 0000xxxx' - __guard TRUE - __decode - if Ra == '1111' then SEE "USAD8"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - absdiff1 = Abs(UInt(R[n][7:0]) - UInt(R[m][7:0])); - absdiff2 = Abs(UInt(R[n][15:8]) - UInt(R[m][15:8])); - absdiff3 = Abs(UInt(R[n][23:16]) - UInt(R[m][23:16])); - absdiff4 = Abs(UInt(R[n][31:24]) - UInt(R[m][31:24])); - result = UInt(R[a]) + absdiff1 + absdiff2 + absdiff3 + absdiff4; - R[d] = result[31:0]; - -__instruction aarch32_VMLA_i_A - __encoding aarch32_VMLA_i_T1A1_A - __instruction_set A32 - __field op 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0xxxxxxx xxxx1001 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - add = (op == '0'); long_destination = FALSE; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMLA_i_T1A1_A - __instruction_set T32 - __field op 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0xxxxxxx xxxx1001 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - add = (op == '0'); long_destination = FALSE; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - product = Int(Elem[Din[n+r],e,esize],unsigned) * Int(Elem[Din[m+r],e,esize],unsigned); - addend = if add then product else -product; - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + addend; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + addend; - -__instruction aarch32_SMLAWB_A - __encoding aarch32_SMLAWB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field M 6 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0001 0010xxxx xxxxxxxx 1x00xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); m_high = (M == '1'); - if d == 15 || n == 15 || m == 15 || a == 15 then UNPREDICTABLE; - - __encoding aarch32_SMLAWB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field M 4 +: 1 - __field Rm 0 +: 4 - __opcode '11111011 0011xxxx xxxxxxxx 000xxxxx' - __guard TRUE - __decode - if Ra == '1111' then SEE "SMULWB, SMULWT"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); m_high = (M == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand2 = if m_high then R[m][31:16] else R[m][15:0]; - result = SInt(R[n]) * SInt(operand2) + (SInt(R[a]) << 16); - R[d] = result[47:16]; - if (result >> 16) != SInt(R[d]) then // Signed overflow - PSTATE.Q = '1'; - -__instruction aarch32_VSQRT_A - __encoding aarch32_VSQRT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 1x110001 xxxx10xx 11x0xxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VSQRT_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 1x110001 xxxx10xx 11x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 S[d] = Zeros(16) : FPSqrt(S[m][15:0], FPSCR); - when 32 S[d] = FPSqrt(S[m], FPSCR); - when 64 D[d] = FPSqrt(D[m], FPSCR); - -__instruction aarch32_STR_i_A - __encoding aarch32_STR_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx010x x0x0xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "STRT"; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_STR_i_T1_A - __instruction_set T16 - __field imm5 22 +: 5 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '01100xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm5:'00', 32); - index = TRUE; add = TRUE; wback = FALSE; - - __encoding aarch32_STR_i_T2_A - __instruction_set T16 - __field Rt 24 +: 3 - __field imm8 16 +: 8 - __opcode '10010xxx xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = 13; imm32 = ZeroExtend(imm8:'00', 32); - index = TRUE; add = TRUE; wback = FALSE; - - __encoding aarch32_STR_i_T3_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode '11111000 1100xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm12, 32); - index = TRUE; add = TRUE; wback = FALSE; - if t == 15 then UNPREDICTABLE; - - __encoding aarch32_STR_i_T4_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field P 10 +: 1 - __field U 9 +: 1 - __field W 8 +: 1 - __field imm8 0 +: 8 - __opcode '11111000 0100xxxx xxxx1xxx xxxxxxxx' - __guard TRUE - __decode - if P == '1' && U == '1' && W == '0' then SEE "STRT"; - if Rn == '1111' || (P == '0' && W == '0') then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); imm32 = ZeroExtend(imm8, 32); - index = (P == '1'); add = (U == '1'); wback = (W == '1'); - if t == 15 || (wback && n == t) then UNPREDICTABLE; - - __execute - if CurrentInstrSet() == InstrSet_A32 then - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - MemU[address,4] = if t == 15 then PCStoreValue() else R[t]; - if wback then R[n] = offset_addr; - else - offset_addr = if add then (R[n] + imm32) else (R[n] - imm32); - address = if index then offset_addr else R[n]; - MemU[address,4] = R[t]; - if wback then R[n] = offset_addr; - -__instruction aarch32_LDRB_r_A - __encoding aarch32_LDRB_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx011x x1x1xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if P == '0' && W == '1' then SEE "LDRBT"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = (P == '1'); add = (U == '1'); wback = (P == '0') || (W == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if t == 15 || m == 15 then UNPREDICTABLE; - if wback && (n == 15 || n == t) then UNPREDICTABLE; - - __encoding aarch32_LDRB_r_T1_A - __instruction_set T16 - __field Rm 22 +: 3 - __field Rn 19 +: 3 - __field Rt 16 +: 3 - __opcode '0101110x xxxxxxxx 00000000 00000000' - __guard TRUE - __decode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_LDRB_r_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm2 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111000 0001xxxx xxxx0000 00xxxxxx' - __guard TRUE - __decode - if Rt == '1111' then SEE "PLD"; - if Rn == '1111' then SEE "LDRB (literal)"; - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); - index = TRUE; add = TRUE; wback = FALSE; - (shift_t, shift_n) = (SRType_LSL, UInt(imm2)); - if m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = Shift(R[m], shift_t, shift_n, PSTATE.C); - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if index then offset_addr else R[n]; - R[t] = ZeroExtend(MemU[address,1],32); - if wback then R[n] = offset_addr; - -__instruction aarch32_MRS_br_AS - __encoding aarch32_MRS_br_A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field R 22 +: 1 - __field M1 16 +: 4 - __field Rd 12 +: 4 - __field M 8 +: 1 - __opcode 'xxxx0001 0x00xxxx xxxxxx1x 0000xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - d = UInt(Rd); read_spsr = (R == '1'); - if d == 15 then UNPREDICTABLE; - SYSm = M:M1; - - __encoding aarch32_MRS_br_T1_AS - __instruction_set T32 - __field R 20 +: 1 - __field M1 16 +: 4 - __field Rd 8 +: 4 - __field M 4 +: 1 - __opcode '11110011 111xxxxx 10x0xxxx xx1xxxxx' - __guard TRUE - __unpredictable_unless 13 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - d = UInt(Rd); read_spsr = (R == '1'); - if d == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - SYSm = M:M1; - - __execute __conditional - if PSTATE.EL == EL0 then - UNPREDICTABLE; - else - mode = PSTATE.M; - if read_spsr then - SPSRaccessValid(SYSm, mode); // Check for UNPREDICTABLE cases - case SYSm of - when '01110' R[d] = SPSR_fiq; - when '10000' R[d] = SPSR_irq; - when '10010' R[d] = SPSR_svc; - when '10100' R[d] = SPSR_abt; - when '10110' R[d] = SPSR_und; - when '11100' - if !ELUsingAArch32(EL3) then AArch64.MonitorModeTrap(); - R[d] = SPSR_mon; - when '11110' R[d] = SPSR_hyp; - else - BankedRegisterAccessValid(SYSm, mode); // Check for UNPREDICTABLE cases - case SYSm of - when '00xxx' // Access the User mode registers - m = UInt(SYSm[2:0]) + 8; - R[d] = Rmode[m,M32_User]; - when '01xxx' // Access the FIQ mode registers - m = UInt(SYSm[2:0]) + 8; - R[d] = Rmode[m,M32_FIQ]; - when '1000x' // Access the IRQ mode registers - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - R[d] = Rmode[m,M32_IRQ]; - when '1001x' // Access the Supervisor mode registers - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - R[d] = Rmode[m,M32_Svc]; - when '1010x' // Access the Abort mode registers - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - R[d] = Rmode[m,M32_Abort]; - when '1011x' // Access the Undefined mode registers - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - R[d] = Rmode[m,M32_Undef]; - when '1110x' // Access Monitor registers - if !ELUsingAArch32(EL3) then AArch64.MonitorModeTrap(); - m = 14 - UInt(SYSm[0]); // LR when SYSm[0] == 0, otherwise SP - R[d] = Rmode[m,M32_Monitor]; - when '11110' // Access ELR_hyp register - R[d] = ELR_hyp; - when '11111' // Access SP_hyp register - R[d] = Rmode[13,M32_Hyp]; - -__instruction aarch32_VMUL_i_A - __encoding aarch32_VMUL_i_T1A1_A - __instruction_set A32 - __field op 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx1001 xxx1xxxx' - __guard TRUE - __decode - if size == '11' || (op == '1' && size != '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - polynomial = (op == '1'); long_destination = FALSE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMUL_i_T1A1_A - __instruction_set T32 - __field op 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx1001 xxx1xxxx' - __guard TRUE - __decode - if size == '11' || (op == '1' && size != '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - polynomial = (op == '1'); long_destination = FALSE; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; op1val = Int(op1, unsigned); - op2 = Elem[Din[m+r],e,esize]; op2val = Int(op2, unsigned); - if polynomial then - product = PolynomialMult(op1,op2); - else - product = (op1val*op2val)[2*esize-1:0]; - if long_destination then - Elem[Q[d>>1],e,2*esize] = product; - else - Elem[D[d+r],e,esize] = product[esize-1:0]; - -__instruction aarch32_VBIC_r_A - __encoding aarch32_VBIC_r_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x01xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VBIC_r_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x01xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - D[d+r] = D[n+r] AND NOT(D[m+r]); - -__instruction aarch32_SHA256SU0_A - __encoding aarch32_SHA256SU0_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0011 11x0xxxx' - __guard TRUE - __decode - if !HaveSHA256Ext() then UNDEFINED; - if size != '10' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_SHA256SU0_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0011 11x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA256Ext() then UNDEFINED; - if size != '10' then UNDEFINED; - if Vd[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - bits(128) result; - X = Q[d>>1]; Y = Q[m>>1]; - T = Y[31:0] : X[127:32]; - for e = 0 to 3 - elt = Elem[T, e, 32]; - elt = ROR(elt, 7) EOR ROR(elt, 18) EOR LSR(elt, 3); - Elem[result, e, 32] = elt + Elem[X, e, 32]; - Q[d>>1] = result; - -__instruction aarch32_VMSR_AS - __encoding aarch32_VMSR_T1A1_AS - __instruction_set A32 - __field cond 28 +: 4 - __field reg 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx1110 1110xxxx xxxx1010 xxx1xxxx' - __guard cond != '1111' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - t = UInt(Rt); - if reg != '000x' && reg != '1000' then UNPREDICTABLE; - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __encoding aarch32_VMSR_T1A1_AS - __instruction_set T32 - __field reg 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101110 1110xxxx xxxx1010 xxx1xxxx' - __guard TRUE - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - t = UInt(Rt); - if reg != '000x' && reg != '1000' then UNPREDICTABLE; - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - if reg == '0001' then // FPSCR - CheckVFPEnabled(TRUE); - FPSCR = R[t]; - elsif PSTATE.EL == EL0 then - UNDEFINED; // Non-FPSCR registers accessible only at PL1 or above - else - CheckVFPEnabled(FALSE); // Non-FPSCR registers are not affected by FPEXC.EN - case reg of - when '0000' // VMSR access to FPSID is ignored - when '1000' FPEXC = R[t]; - otherwise Unreachable(); // Dealt with above or in encoding-specific pseudocode - -__instruction aarch32_VPMAX_f_A - __encoding aarch32_VPMAX_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x1xxxxx xxxx1111 x0x0xxxx' - __guard TRUE - __decode - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - maximum = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VPMAX_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x1xxxxx xxxx1111 x0x0xxxx' - __guard TRUE - __decode - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - maximum = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(64) dest; - h = elements DIV 2; - - for e = 0 to h-1 - op1 = Elem[D[n],2*e,esize]; op2 = Elem[D[n],2*e+1,esize]; - Elem[dest,e,esize] = if maximum then FPMax(op1,op2,StandardFPSCRValue()) else FPMin(op1,op2,StandardFPSCRValue()); - op1 = Elem[D[m],2*e,esize]; op2 = Elem[D[m],2*e+1,esize]; - Elem[dest,e+h,esize] = if maximum then FPMax(op1,op2,StandardFPSCRValue()) else FPMin(op1,op2,StandardFPSCRValue()); - - D[d] = dest; - -__instruction aarch32_CSDB_A - __encoding aarch32_CSDB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __opcode 'xxxx0011 00100000 xxxxxxxx 00010100' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if cond != '1110' then UNPREDICTABLE; // CSDB must be encoded with AL condition - - __encoding aarch32_CSDB_T1_A - __instruction_set T32 - __opcode '11110011 1010xxxx 10x0x000 00010100' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '0' - __decode - if InITBlock() then UNPREDICTABLE; - - __execute __conditional - - ConsumptionOfSpeculativeDataBarrier(); - -__instruction aarch32_MUL_A - __encoding aarch32_MUL_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 16 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0000 000xxxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = (S == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_MUL_T1_A - __instruction_set T16 - __field Rn 19 +: 3 - __field Rdm 16 +: 3 - __opcode '01000011 01xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rdm); n = UInt(Rn); m = UInt(Rdm); setflags = !InITBlock(); - - __encoding aarch32_MUL_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 0000xxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); setflags = FALSE; - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand1 = SInt(R[n]); // operand1 = UInt(R[n]) produces the same final results - operand2 = SInt(R[m]); // operand2 = UInt(R[m]) produces the same final results - result = operand1 * operand2; - R[d] = result[31:0]; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result[31:0]); - // PSTATE.C, PSTATE.V unchanged - -__instruction aarch32_VPADD_i_A - __encoding aarch32_VPADD_i_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0xxxxxxx xxxx1011 xxx1xxxx' - __guard TRUE - __decode - if size == '11' || Q == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VPADD_i_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0xxxxxxx xxxx1011 xxx1xxxx' - __guard TRUE - __decode - if size == '11' || Q == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(64) dest; - h = elements DIV 2; - - for e = 0 to h-1 - Elem[dest,e,esize] = Elem[D[n],2*e,esize] + Elem[D[n],2*e+1,esize]; - Elem[dest,e+h,esize] = Elem[D[m],2*e,esize] + Elem[D[m],2*e+1,esize]; - - D[d] = dest; - -__instruction aarch32_VQDMLSL_A - __encoding aarch32_VQDMLSL_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx1011 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - add = (op == '0'); - scalar_form = FALSE; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 8 << UInt(size); elements = 64 DIV esize; - - __encoding aarch32_VQDMLSL_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx0111 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - add = (op == '0'); - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VQDMLSL_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx1011 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - add = (op == '0'); - scalar_form = FALSE; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 8 << UInt(size); elements = 64 DIV esize; - - __encoding aarch32_VQDMLSL_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx0111 x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || Vd[0] == '1' then UNDEFINED; - add = (op == '0'); - scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - if scalar_form then op2 = SInt(Elem[Din[m],index,esize]); - for e = 0 to elements-1 - if !scalar_form then op2 = SInt(Elem[Din[m],e,esize]); - op1 = SInt(Elem[Din[n],e,esize]); - // The following only saturates if both op1 and op2 equal -(2^(esize-1)) - (product, sat1) = SignedSatQ(2*op1*op2, 2*esize); - if add then - result = SInt(Elem[Qin[d>>1],e,2*esize]) + SInt(product); - else - result = SInt(Elem[Qin[d>>1],e,2*esize]) - SInt(product); - (Elem[Q[d>>1],e,2*esize], sat2) = SignedSatQ(result, 2*esize); - if sat1 || sat2 then FPSCR.QC = '1'; - -__instruction aarch32_STRT_A - __encoding aarch32_STRT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0100 x010xxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); postindex = TRUE; add = (U == '1'); - register_form = FALSE; imm32 = ZeroExtend(imm12, 32); - if n == 15 || n == t then UNPREDICTABLE; - - __encoding aarch32_STRT_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 x010xxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - t = UInt(Rt); n = UInt(Rn); m = UInt(Rm); postindex = TRUE; add = (U == '1'); - register_form = TRUE; (shift_t, shift_n) = DecodeImmShift(stype, imm5); - if n == 15 || n == t || m == 15 then UNPREDICTABLE; - - __encoding aarch32_STRT_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field imm8 0 +: 8 - __opcode '11111000 0100xxxx xxxx1110 xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL2 then UNPREDICTABLE; // Hyp mode - if Rn == '1111' then UNDEFINED; - t = UInt(Rt); n = UInt(Rn); postindex = FALSE; add = TRUE; - register_form = FALSE; imm32 = ZeroExtend(imm8, 32); - if t == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - offset = if register_form then Shift(R[m], shift_t, shift_n, PSTATE.C) else imm32; - offset_addr = if add then (R[n] + offset) else (R[n] - offset); - address = if postindex then R[n] else offset_addr; - if t == 15 then // Only possible for encodings A1 and A2 - data = PCStoreValue(); - else - data = R[t]; - MemU_unpriv[address,4] = data; - if postindex then R[n] = offset_addr; - -__instruction aarch32_VSHRN_A - __encoding aarch32_VSHRN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx1000 00x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if Vm[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '01xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '1xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VSHRN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field imm6 16 +: 6 - __field Vd 12 +: 4 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx1000 00x1xxxx' - __guard TRUE - __decode - if imm6 == '000xxx' then SEE "Related encodings"; - if Vm[0] == '1' then UNDEFINED; - case imm6 of - when '001xxx' esize = 8; elements = 8; shift_amount = 16 - UInt(imm6); - when '01xxxx' esize = 16; elements = 4; shift_amount = 32 - UInt(imm6); - when '1xxxxx' esize = 32; elements = 2; shift_amount = 64 - UInt(imm6); - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - result = LSR(Elem[Qin[m>>1],e,2*esize], shift_amount); - Elem[D[d],e,esize] = result[esize-1:0]; - -__instruction aarch32_STLEX_A - __encoding aarch32_STLEX_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1000xxxx xxxxxx10 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __encoding aarch32_STLEX_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __field Rd 0 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 1110xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); t = UInt(Rt); n = UInt(Rn); - if d == 15 || t == 15 || n == 15 then UNPREDICTABLE; - if d == n || d == t then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - if AArch32.ExclusiveMonitorsPass(address,4) then - MemO[address, 4] = R[t]; - R[d] = ZeroExtend('0'); - else - R[d] = ZeroExtend('1'); - -__instruction aarch32_UXTH_A - __encoding aarch32_UXTH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 11111111 xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UXTH_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '10110010 10xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); rotation = 0; - - __encoding aarch32_UXTH_T2_A - __instruction_set T32 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 00011111 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d] = ZeroExtend(rotated[15:0], 32); - -__instruction aarch32_MVN_r_A - __encoding aarch32_MVN_r_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 111xxxxx xxxxxxxx xxx0xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '0' - __unpredictable_unless 18 == '0' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm5); - - __encoding aarch32_MVN_r_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '01000011 11xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); setflags = !InITBlock(); - (shift_t, shift_n) = (SRType_LSL, 0); - - __encoding aarch32_MVN_r_T2_A - __instruction_set T32 - __field S 20 +: 1 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field stype 4 +: 2 - __field Rm 0 +: 4 - __opcode '11101010 011x1111 xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); setflags = (S == '1'); - (shift_t, shift_n) = DecodeImmShift(stype, imm3:imm2); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (shifted, carry) = Shift_C(R[m], shift_t, shift_n, PSTATE.C); - result = NOT(shifted); - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_BL_i_A - __encoding aarch32_BL_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field imm24 0 +: 24 - __opcode 'xxxx1011 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - imm32 = SignExtend(imm24:'00', 32); targetInstrSet = InstrSet_A32; - - __encoding aarch32_BL_i_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field H 24 +: 1 - __field imm24 0 +: 24 - __opcode '1111101x xxxxxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - imm32 = SignExtend(imm24:H:'0', 32); targetInstrSet = InstrSet_T32; - - __encoding aarch32_BL_i_T1_A - __instruction_set T32 - __field S 26 +: 1 - __field imm10 16 +: 10 - __field J1 13 +: 1 - __field J2 11 +: 1 - __field imm11 0 +: 11 - __opcode '11110xxx xxxxxxxx 11x1xxxx xxxxxxxx' - __guard TRUE - __decode - I1 = NOT(J1 EOR S); I2 = NOT(J2 EOR S); imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32); - targetInstrSet = InstrSet_T32; - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __encoding aarch32_BL_i_T2_A - __instruction_set T32 - __field S 26 +: 1 - __field imm10H 16 +: 10 - __field J1 13 +: 1 - __field J2 11 +: 1 - __field imm10L 1 +: 10 - __field H 0 +: 1 - __opcode '11110xxx xxxxxxxx 11x0xxxx xxxxxxxx' - __guard TRUE - __decode - if H == '1' then UNDEFINED; - I1 = NOT(J1 EOR S); I2 = NOT(J2 EOR S); imm32 = SignExtend(S:I1:I2:imm10H:imm10L:'00', 32); - targetInstrSet = InstrSet_A32; - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - if CurrentInstrSet() == InstrSet_A32 then - LR = PC - 4; - else - LR = PC[31:1] : '1'; - if targetInstrSet == InstrSet_A32 then - targetAddress = Align(PC,4) + imm32; - else - targetAddress = PC + imm32; - SelectInstrSet(targetInstrSet); - BranchWritePC(targetAddress, BranchType_DIRCALL); - -__instruction aarch32_VSUBL_A - __encoding aarch32_VSUBL_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx0011 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' || (op == '1' && Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; is_vsubw = (op == '1'); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VSUBL_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx0011 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' || (op == '1' && Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; is_vsubw = (op == '1'); - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - if is_vsubw then - op1 = Int(Elem[Qin[n>>1],e,2*esize], unsigned); - else - op1 = Int(Elem[Din[n],e,esize], unsigned); - result = op1 - Int(Elem[Din[m],e,esize], unsigned); - Elem[Q[d>>1],e,2*esize] = result[2*esize-1:0]; - -__instruction aarch32_VCVTA_vfp_A - __encoding aarch32_VCVTA_vfp_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111111 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '0'); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - - __encoding aarch32_VCVTA_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field op 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111111 xxxx10xx x1x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '0'); - d = UInt(Vd:D); - case size of - when '01' esize = 16; m = UInt(Vm:M); - when '10' esize = 32; m = UInt(Vm:M); - when '11' esize = 64; m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = FPToFixed(S[m][15:0], 0, unsigned, FPSCR, rounding); - when 32 - S[d] = FPToFixed(S[m], 0, unsigned, FPSCR, rounding); - when 64 - S[d] = FPToFixed(D[m], 0, unsigned, FPSCR, rounding); - -__instruction aarch32_VRINTA_asimd_A - __encoding aarch32_VRINTA_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0101 0xx0xxxx' - __guard TRUE - __decode - if op[2] != op[0] then SEE "Related encodings"; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - // Rounding encoded differently from other VCVT and VRINT instructions - rounding = FPDecodeRM(op[2]:NOT(op[1])); exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VRINTA_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field op 7 +: 3 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0101 0xx0xxxx' - __guard TRUE - __decode - if op[2] != op[0] then SEE "Related encodings"; - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - // Rounding encoded differently from other VCVT and VRINT instructions - rounding = FPDecodeRM(op[2]:NOT(op[1])); exact = FALSE; - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[m+r],e,esize]; - result = FPRoundInt(op1, StandardFPSCRValue(), rounding, exact); - Elem[D[d+r],e,esize] = result; - -__instruction aarch32_VNMLA_A - __encoding aarch32_VNMLA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 0x01xxxx xxxx10xx x0x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - vtype = if op == '1' then VFPNegMul_VNMLA else VFPNegMul_VNMLS; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VNMLA_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field op 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 0x01xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - vtype = if op == '1' then VFPNegMul_VNMLA else VFPNegMul_VNMLS; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckVFPEnabled(TRUE); - case esize of - when 16 - product16 = FPMul(S[n][15:0], S[m][15:0], FPSCR); - case vtype of - when VFPNegMul_VNMLA S[d] = Zeros(16) : FPAdd(FPNeg(S[d][15:0]), FPNeg(product16), FPSCR); - when VFPNegMul_VNMLS S[d] = Zeros(16) : FPAdd(FPNeg(S[d][15:0]), product16, FPSCR); - when VFPNegMul_VNMUL S[d] = Zeros(16) : FPNeg(product16); - when 32 - product32 = FPMul(S[n], S[m], FPSCR); - case vtype of - when VFPNegMul_VNMLA S[d] = FPAdd(FPNeg(S[d]), FPNeg(product32), FPSCR); - when VFPNegMul_VNMLS S[d] = FPAdd(FPNeg(S[d]), product32, FPSCR); - when VFPNegMul_VNMUL S[d] = FPNeg(product32); - when 64 - product64 = FPMul(D[n], D[m], FPSCR); - case vtype of - when VFPNegMul_VNMLA D[d] = FPAdd(FPNeg(D[d]), FPNeg(product64), FPSCR); - when VFPNegMul_VNMLS D[d] = FPAdd(FPNeg(D[d]), product64, FPSCR); - when VFPNegMul_VNMUL D[d] = FPNeg(product64); - -__instruction aarch32_REV16_A - __encoding aarch32_REV16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1011xxxx xxxxxxxx 1011xxxx' - __guard cond != '1111' - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); m = UInt(Rm); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_REV16_T1_A - __instruction_set T16 - __field Rm 19 +: 3 - __field Rd 16 +: 3 - __opcode '10111010 01xxxxxx 00000000 00000000' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); - - __encoding aarch32_REV16_T2_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1001xxxx 1111xxxx 1001xxxx' - __guard TRUE - __decode - d = UInt(Rd); m = UInt(Rm); n = UInt(Rn); - if m != n || d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - bits(32) result; - result[31:24] = R[m][23:16]; - result[23:16] = R[m][31:24]; - result[15:8] = R[m][7:0]; - result[7:0] = R[m][15:8]; - R[d] = result; - -__instruction aarch32_SXTAB16_A - __encoding aarch32_SXTAB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1000xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if Rn == '1111' then SEE "SXTB16"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SXTAB16_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 0010xxxx 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - if Rn == '1111' then SEE "SXTB16"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d][15:0] = R[n][15:0] + SignExtend(rotated[7:0], 16); - R[d][31:16] = R[n][31:16] + SignExtend(rotated[23:16], 16); - -__instruction aarch32_VST2_1_A - __encoding aarch32_VST2_1_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx0001 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - alignment = if index_align[0] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST2_1_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx0101 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 4; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST2_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx1001 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[1] != '0' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 8; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST2_1_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx0001 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - alignment = if index_align[0] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST2_1_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx0101 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 4; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST2_1_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx1001 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[1] != '0' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - alignment = if index_align[0] == '0' then 1 else 8; - d = UInt(D:Vd); d2 = d + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d2 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; iswrite = TRUE; - - = AArch32.CheckAlignment(address, alignment, AccType_VEC, iswrite); - MemU[address, ebytes] = Elem[D[d], index]; - MemU[address+ebytes,ebytes] = Elem[D[d2],index]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 2*ebytes; - -__instruction aarch32_VRINTA_vfp_A - __encoding aarch32_VRINTA_vfp_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111011 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VRINTA_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111011 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = Zeros(16) : FPRoundInt(S[m][15:0], FPSCR, rounding, exact); - when 32 - S[d] = FPRoundInt(S[m], FPSCR, rounding, exact); - when 64 - D[d] = FPRoundInt(D[m], FPSCR, rounding, exact); - -__instruction aarch32_SRS_AS - __encoding aarch32_SRS_A1_AS - __instruction_set A32 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field mode 0 +: 5 - __opcode '1111100x x1x0xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '1' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __decode - wback = (W == '1'); increment = (U == '1'); wordhigher = (P == U); - - __encoding aarch32_SRS_T1_AS - __instruction_set T32 - __field W 21 +: 1 - __field mode 0 +: 5 - __opcode '11101000 00x0xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __decode - wback = (W == '1'); increment = FALSE; wordhigher = FALSE; - - __encoding aarch32_SRS_T2_AS - __instruction_set T32 - __field W 21 +: 1 - __field mode 0 +: 5 - __opcode '11101001 10x0xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '0' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __decode - wback = (W == '1'); increment = TRUE; wordhigher = FALSE; - - __execute - if CurrentInstrSet() == InstrSet_A32 then - if PSTATE.EL == EL2 then // UNDEFINED at EL2 - UNDEFINED; - - // Check for UNPREDICTABLE cases. The definition of UNPREDICTABLE does not permit these - // to be security holes - if PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; - elsif mode == M32_Hyp then // Check for attempt to access Hyp mode SP - UNPREDICTABLE; - elsif mode == M32_Monitor then // Check for attempt to access Monitor mode SP - if !HaveEL(EL3) || !IsSecure() then - UNPREDICTABLE; - elsif !ELUsingAArch32(EL3) then - AArch64.MonitorModeTrap(); - elsif BadMode(mode) then - UNPREDICTABLE; - - base = Rmode[13,mode]; - address = if increment then base else base-8; - if wordhigher then address = address+4; - MemA[address,4] = LR; - MemA[address+4,4] = SPSR[]; - if wback then Rmode[13,mode] = if increment then base+8 else base-8; - else - if PSTATE.EL == EL2 then // UNDEFINED at EL2 - UNDEFINED; - - // Check for UNPREDICTABLE cases. The definition of UNPREDICTABLE does not permit these - // to be security holes - if PSTATE.M IN {M32_User,M32_System} then - UNPREDICTABLE; - elsif mode == M32_Hyp then // Check for attempt to access Hyp mode SP - UNPREDICTABLE; - elsif mode == M32_Monitor then // Check for attempt to access Monitor mode SP - if !HaveEL(EL3) || !IsSecure() then - UNPREDICTABLE; - elsif !ELUsingAArch32(EL3) then - AArch64.MonitorModeTrap(); - elsif BadMode(mode) then - UNPREDICTABLE; - - base = Rmode[13,mode]; - address = if increment then base else base-8; - if wordhigher then address = address+4; - MemA[address,4] = LR; - MemA[address+4,4] = SPSR[]; - if wback then Rmode[13,mode] = if increment then base+8 else base-8; - -__instruction aarch32_USAD8_A - __encoding aarch32_USAD8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 16 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0111 1000xxxx 1111xxxx 0001xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_USAD8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 0111xxxx 1111xxxx 0000xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - absdiff1 = Abs(UInt(R[n][7:0]) - UInt(R[m][7:0])); - absdiff2 = Abs(UInt(R[n][15:8]) - UInt(R[m][15:8])); - absdiff3 = Abs(UInt(R[n][23:16]) - UInt(R[m][23:16])); - absdiff4 = Abs(UInt(R[n][31:24]) - UInt(R[m][31:24])); - result = absdiff1 + absdiff2 + absdiff3 + absdiff4; - R[d] = result[31:0]; - -__instruction aarch32_VUZP_A - __encoding aarch32_VUZP_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx10 xxxx0001 0xx0xxxx' - __guard TRUE - __decode - if size == '11' || (Q == '0' && size == '10') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - quadword_operation = (Q == '1'); esize = 8 << UInt(size); - d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VUZP_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx10 xxxx0001 0xx0xxxx' - __guard TRUE - __decode - if size == '11' || (Q == '0' && size == '10') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - quadword_operation = (Q == '1'); esize = 8 << UInt(size); - d = UInt(D:Vd); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - if quadword_operation then - if d == m then - Q[d>>1] = bits(128) UNKNOWN; Q[m>>1] = bits(128) UNKNOWN; - else - zipped_q = Q[m>>1]:Q[d>>1]; - for e = 0 to (128 DIV esize) - 1 - Elem[Q[d>>1],e,esize] = Elem[zipped_q,2*e,esize]; - Elem[Q[m>>1],e,esize] = Elem[zipped_q,2*e+1,esize]; - else - if d == m then - D[d] = bits(64) UNKNOWN; D[m] = bits(64) UNKNOWN; - else - zipped_d = D[m]:D[d]; - for e = 0 to (64 DIV esize) - 1 - Elem[D[d],e,esize] = Elem[zipped_d,2*e,esize]; - Elem[D[m],e,esize] = Elem[zipped_d,2*e+1,esize]; - -__instruction aarch32_UXTAB_A - __encoding aarch32_UXTAB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1110xxxx xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - if Rn == '1111' then SEE "UXTB"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UXTAB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 0101xxxx 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - if Rn == '1111' then SEE "UXTB"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d] = R[n] + ZeroExtend(rotated[7:0], 32); - -__instruction aarch32_VMLA_i_A - __encoding aarch32_VMLA_i_T1A1_A - __instruction_set A32 - __field op 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0xxxxxxx xxxx1001 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - add = (op == '0'); long_destination = FALSE; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMLA_i_T1A1_A - __instruction_set T32 - __field op 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0xxxxxxx xxxx1001 xxx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - add = (op == '0'); long_destination = FALSE; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - product = Int(Elem[Din[n+r],e,esize],unsigned) * Int(Elem[Din[m+r],e,esize],unsigned); - addend = if add then product else -product; - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + addend; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + addend; - -__instruction aarch32_AND_i_A - __encoding aarch32_AND_i_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm12 0 +: 12 - __opcode 'xxxx0010 000xxxxx xxxxxxxx xxxxxxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = A32ExpandImm_C(imm12, PSTATE.C); - - __encoding aarch32_AND_i_T1_A - __instruction_set T32 - __field i 26 +: 1 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm8 0 +: 8 - __opcode '11110x00 000xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if Rd == '1111' && S == '1' then SEE "TST (immediate)"; - d = UInt(Rd); n = UInt(Rn); setflags = (S == '1'); - (imm32, carry) = T32ExpandImm_C(i:imm3:imm8, PSTATE.C); - if (d == 15 && !setflags) || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - result = R[n] AND imm32; - if d == 15 then // Can only occur for A32 encoding - if setflags then - ALUExceptionReturn(result); - else - ALUWritePC(result); - else - R[d] = result; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result); - PSTATE.C = carry; - // PSTATE.V unchanged - -__instruction aarch32_VMLA_i_A - __encoding aarch32_VMLA_i_T2A2_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx1000 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - add = (op == '0'); long_destination = TRUE; unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __encoding aarch32_VMLA_i_T2A2_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 9 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx1000 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vd[0] == '1' then UNDEFINED; - add = (op == '0'); long_destination = TRUE; unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = 1; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - product = Int(Elem[Din[n+r],e,esize],unsigned) * Int(Elem[Din[m+r],e,esize],unsigned); - addend = if add then product else -product; - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + addend; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + addend; - -__instruction aarch32_USAT_A - __encoding aarch32_USAT_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field sat_imm 16 +: 5 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field sh 6 +: 1 - __field Rn 0 +: 4 - __opcode 'xxxx0110 111xxxxx xxxxxxxx xx01xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm); - (shift_t, shift_n) = DecodeImmShift(sh:'0', imm5); - if d == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_USAT_T1_A - __instruction_set T32 - __field sh 21 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field sat_imm 0 +: 5 - __opcode '11110x11 10x0xxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 26 == '0' - __unpredictable_unless 5 == '0' - __decode - if sh == '1' && (imm3:imm2) == '00000' then SEE "USAT16"; - d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm); - (shift_t, shift_n) = DecodeImmShift(sh:'0', imm3:imm2); - if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand = Shift(R[n], shift_t, shift_n, PSTATE.C); // PSTATE.C ignored - (result, sat) = UnsignedSatQ(SInt(operand), saturate_to); - R[d] = ZeroExtend(result, 32); - if sat then - PSTATE.Q = '1'; - -__instruction aarch32_VQRDMLSH_A - __encoding aarch32_VQRDMLSH_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0xxxxxxx xxxx1100 xxx1xxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '00' || size == '11' then UNDEFINED; - add = FALSE; scalar_form = FALSE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQRDMLSH_A2_A - __instruction_set A32 - __field Q 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx1111 x1x0xxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - if size == '11' then SEE "Related encodings"; - if size == '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - add = FALSE; scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VQRDMLSH_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0xxxxxxx xxxx1100 xxx1xxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '00' || size == '11' then UNDEFINED; - add = FALSE; scalar_form = FALSE; esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQRDMLSH_T2_A - __instruction_set T32 - __field Q 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx1111 x1x0xxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - if InITBlock() then UNPREDICTABLE; - if size == '11' then SEE "Related encodings"; - if size == '00' then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - add = FALSE; scalar_form = TRUE; d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute - CheckAdvSIMDEnabled(); - round_const = 1 << (esize-1); - if scalar_form then op2 = SInt(Elem[D[m],index,esize]); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = SInt(Elem[D[n+r],e,esize]); - op3 = SInt(Elem[D[d+r],e,esize]) << esize; - if !scalar_form then op2 = SInt(Elem[D[m+r],e,esize]); - (result, sat) = SignedSatQ((op3 - 2*(op1*op2) + round_const) >> esize, esize); - Elem[D[d+r],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_VMLA_s_A - __encoding aarch32_VMLA_s_A1_A - __instruction_set A32 - __field Q 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field F 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 1xxxxxxx xxxx010x x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || (F == '1' && size == '01' && !HaveFP16Ext()) then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - add = (op == '0'); floating_point = (F == '1'); long_destination = FALSE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __encoding aarch32_VMLA_s_T1_A - __instruction_set T32 - __field Q 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field op 10 +: 1 - __field F 8 +: 1 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 1xxxxxxx xxxx010x x1x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if size == '00' || (F == '1' && size == '01' && !HaveFP16Ext()) then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = FALSE; // "Don't care" value: TRUE produces same functionality - add = (op == '0'); floating_point = (F == '1'); long_destination = FALSE; - d = UInt(D:Vd); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - if size == '01' then esize = 16; elements = 4; m = UInt(Vm[2:0]); index = UInt(M:Vm[3]); - if size == '10' then esize = 32; elements = 2; m = UInt(Vm); index = UInt(M); - - __execute __conditional - CheckAdvSIMDEnabled(); - op2 = Elem[Din[m],index,esize]; op2val = Int(op2, unsigned); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[Din[n+r],e,esize]; op1val = Int(op1, unsigned); - if floating_point then - fp_addend = if add then FPMul(op1,op2,StandardFPSCRValue()) else FPNeg(FPMul(op1,op2,StandardFPSCRValue())); - Elem[D[d+r],e,esize] = FPAdd(Elem[Din[d+r],e,esize], fp_addend, StandardFPSCRValue()); - else - addend = if add then op1val*op2val else -op1val*op2val; - if long_destination then - Elem[Q[d>>1],e,2*esize] = Elem[Qin[d>>1],e,2*esize] + addend; - else - Elem[D[d+r],e,esize] = Elem[Din[d+r],e,esize] + addend; - -__instruction aarch32_VRINTA_vfp_A - __encoding aarch32_VRINTA_vfp_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111010 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __encoding aarch32_VRINTA_vfp_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field RM 16 +: 2 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 1x111010 xxxx10xx 01x0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - rounding = FPDecodeRM(RM); exact = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); m = UInt(M:Vm); - - __execute - CheckVFPEnabled(TRUE); - case esize of - when 16 - S[d] = Zeros(16) : FPRoundInt(S[m][15:0], FPSCR, rounding, exact); - when 32 - S[d] = FPRoundInt(S[m], FPSCR, rounding, exact); - when 64 - D[d] = FPRoundInt(D[m], FPSCR, rounding, exact); - -__instruction aarch32_STLB_A - __encoding aarch32_STLB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 0 +: 4 - __opcode 'xxxx0001 1100xxxx xxxxxx00 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_STLB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1100xxxx xxxxxxxx 1000xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __execute __conditional - address = R[n]; - MemO[address, 1] = R[t][7:0]; - -__instruction aarch32_CMN_rr_A - __encoding aarch32_CMN_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0111xxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __decode - n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - shift_t = DecodeRegShift(stype); - if n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], shifted, '0'); - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_VCADD_A - __encoding aarch32_VCADD_A1_A - __instruction_set A32 - __field rot 24 +: 1 - __field D 22 +: 1 - __field S 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111110x 1x0xxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if !HaveFCADDExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 16 << UInt(S); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - elements = 64 DIV esize; - regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCADD_T1_A - __instruction_set T32 - __field rot 24 +: 1 - __field D 22 +: 1 - __field S 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111110x 1x0xxxxx xxxx1000 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFCADDExt() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - esize = 16 << UInt(S); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - elements = 64 DIV esize; - regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - operand1 = D[n+r]; - operand2 = D[m+r]; - operand3 = D[d+r]; - for e = 0 to (elements DIV 2)-1 - case rot of - when '0' - element1 = FPNeg(Elem[operand2,e*2+1,esize]); - element3 = Elem[operand2,e*2,esize]; - when '1' - element1 = Elem[operand2,e*2+1,esize]; - element3 = FPNeg(Elem[operand2,e*2,esize]); - result1 = FPAdd(Elem[operand1,e*2,esize],element1,StandardFPSCRValue()); - result2 = FPAdd(Elem[operand1,e*2+1,esize],element3,StandardFPSCRValue()); - Elem[D[d+r],e*2,esize] = result1; - Elem[D[d+r],e*2+1,esize] = result2; - -__instruction aarch32_VCLE_i_A - __encoding aarch32_VCLE_i_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx01 xxxx0x01 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCLE_i_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field F 10 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx01 xxxx0x01 1xx0xxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if F == '1' && ((size == '01' && !HaveFP16Ext()) || size == '00') then UNDEFINED; - if F == '1' && size == '01' && InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - floating_point = (F == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - if floating_point then - bits(esize) zero = FPZero('0'); - test_passed = FPCompareGE(zero, Elem[D[m+r],e,esize], StandardFPSCRValue()); - else - test_passed = (SInt(Elem[D[m+r],e,esize]) <= 0); - Elem[D[d+r],e,esize] = if test_passed then Ones(esize) else Zeros(esize); - -__instruction aarch32_VABD_f_A - __encoding aarch32_VABD_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x1xxxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VABD_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x1xxxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Elem[D[n+r],e,esize]; op2 = Elem[D[m+r],e,esize]; - Elem[D[d+r],e,esize] = FPAbs(FPSub(op1,op2,StandardFPSCRValue())); - -__instruction aarch32_MLA_A - __encoding aarch32_MLA_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rd 16 +: 4 - __field Ra 12 +: 4 - __field Rm 8 +: 4 - __field Rn 0 +: 4 - __opcode 'xxxx0000 001xxxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); setflags = (S == '1'); - if d == 15 || n == 15 || m == 15 || a == 15 then UNPREDICTABLE; - - __encoding aarch32_MLA_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Ra 12 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111011 0000xxxx xxxxxxxx 0000xxxx' - __guard TRUE - __decode - if Ra == '1111' then SEE "MUL"; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); a = UInt(Ra); setflags = FALSE; - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand1 = SInt(R[n]); // operand1 = UInt(R[n]) produces the same final results - operand2 = SInt(R[m]); // operand2 = UInt(R[m]) produces the same final results - addend = SInt(R[a]); // addend = UInt(R[a]) produces the same final results - result = operand1 * operand2 + addend; - R[d] = result[31:0]; - if setflags then - PSTATE.N = result[31]; - PSTATE.Z = IsZeroBit(result[31:0]); - // PSTATE.C, PSTATE.V unchanged - -__instruction aarch32_SHA1P_A - __encoding aarch32_SHA1P_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x01xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if !HaveSHA1Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_SHA1P_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x01xxxx xxxx1100 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveSHA1Ext() then UNDEFINED; - if Q != '1' then UNDEFINED; - if Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckCryptoEnabled32(); - X = Q[d>>1]; - Y = Q[n>>1][31:0]; // Note: 32 bits wide - W = Q[m>>1]; - for e = 0 to 3 - t = SHAparity(X[63:32], X[95:64], X[127:96]); - Y = Y + ROL(X[31:0], 5) + t + Elem[W, e, 32]; - X[63:32] = ROL(X[63:32], 30); - [Y, X] = ROL(Y:X, 32); - Q[d>>1] = X; - -__instruction aarch32_QDSUB_A - __encoding aarch32_QDSUB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0110xxxx xxxxxxxx 0101xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_QDSUB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 1011xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - (doubled, sat1) = SignedSatQ(2 * SInt(R[n]), 32); - (R[d], sat2) = SignedSatQ(SInt(R[m]) - SInt(doubled), 32); - if sat1 || sat2 then - PSTATE.Q = '1'; - -__instruction aarch32_VDOT_bf16_i_A - __encoding aarch32_VDOT_bf16_i_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x00xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if !HaveAArch32BF16Ext() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm); - integer i = UInt(M); - integer regs = if Q == '1' then 2 else 1; - - __encoding aarch32_VDOT_bf16_i_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111110 0x00xxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveAArch32BF16Ext() then UNDEFINED; - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1') then UNDEFINED; - integer d = UInt(D:Vd); - integer n = UInt(N:Vn); - integer m = UInt(Vm); - integer i = UInt(M); - integer regs = if Q == '1' then 2 else 1; - - __execute - bits(64) operand1; - bits(64) operand2; - bits(64) result; - - CheckAdvSIMDEnabled(); - - operand2 = Din[m]; - for r = 0 to regs-1 - operand1 = Din[n+r]; - result = Din[d+r]; - for e = 0 to 1 - bits(16) elt1_a = Elem[operand1, 2 * e + 0, 16]; - bits(16) elt1_b = Elem[operand1, 2 * e + 1, 16]; - bits(16) elt2_a = Elem[operand2, 2 * i + 0, 16]; - bits(16) elt2_b = Elem[operand2, 2 * i + 1, 16]; - bits(32) sum = BFAdd(BFMul(elt1_a, elt2_a), BFMul(elt1_b, elt2_b)); - Elem[result, e, 32] = BFAdd(Elem[result, e, 32], sum); - D[d+r] = result; - -__instruction aarch32_VQSHL_r_A - __encoding aarch32_VQSHL_r_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0100 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VQSHL_r_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0100 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1' || Vn[0] == '1') then UNDEFINED; - unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); m = UInt(M:Vm); n = UInt(N:Vn); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - shift = SInt(Elem[D[n+r],e,esize][7:0]); - operand = Int(Elem[D[m+r],e,esize], unsigned); - (result,sat) = SatQ(operand << shift, esize, unsigned); - Elem[D[d+r],e,esize] = result; - if sat then FPSCR.QC = '1'; - -__instruction aarch32_VBIF_A - __encoding aarch32_VBIF_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x11xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if op == '00' then SEE "VEOR"; - if op == '01' then operation = VBitOps_VBSL; - if op == '10' then operation = VBitOps_VBIT; - if op == '11' then operation = VBitOps_VBIF; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VBIF_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x11xxxx xxxx0001 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if op == '00' then SEE "VEOR"; - if op == '01' then operation = VBitOps_VBSL; - if op == '10' then operation = VBitOps_VBIT; - if op == '11' then operation = VBitOps_VBIF; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - case operation of - when VBitOps_VBIF D[d+r] = (D[d+r] AND D[m+r]) OR (D[n+r] AND NOT(D[m+r])); - when VBitOps_VBIT D[d+r] = (D[n+r] AND D[m+r]) OR (D[d+r] AND NOT(D[m+r])); - when VBitOps_VBSL D[d+r] = (D[n+r] AND D[d+r]) OR (D[m+r] AND NOT(D[d+r])); - -__instruction aarch32_VPMAX_f_A - __encoding aarch32_VPMAX_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 0x0xxxxx xxxx1111 x0x0xxxx' - __guard TRUE - __decode - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - maximum = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VPMAX_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field op 21 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 0x0xxxxx xxxx1111 x0x0xxxx' - __guard TRUE - __decode - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - maximum = (op == '0'); - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - bits(64) dest; - h = elements DIV 2; - - for e = 0 to h-1 - op1 = Elem[D[n],2*e,esize]; op2 = Elem[D[n],2*e+1,esize]; - Elem[dest,e,esize] = if maximum then FPMax(op1,op2,StandardFPSCRValue()) else FPMin(op1,op2,StandardFPSCRValue()); - op1 = Elem[D[m],2*e,esize]; op2 = Elem[D[m],2*e+1,esize]; - Elem[dest,e+h,esize] = if maximum then FPMax(op1,op2,StandardFPSCRValue()) else FPMin(op1,op2,StandardFPSCRValue()); - - D[d] = dest; - -__instruction aarch32_VLDR_A - __encoding aarch32_VLDR_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field U 23 +: 1 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm8 0 +: 8 - __opcode 'xxxx1101 xx011111 xxxx10xx xxxxxxxx' - __guard cond != '1111' - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - esize = 8 << UInt(size); add = (U == '1'); - imm32 = if esize == 16 then ZeroExtend(imm8:'0', 32) else ZeroExtend(imm8:'00', 32); - case size of - when '01' d = UInt(Vd:D); - when '10' d = UInt(Vd:D); - when '11' d = UInt(D:Vd); - n = UInt(Rn); - - __encoding aarch32_VLDR_T1_A - __instruction_set T32 - __field U 23 +: 1 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field imm8 0 +: 8 - __opcode '11101101 xx011111 xxxx10xx xxxxxxxx' - __guard TRUE - __decode - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - esize = 8 << UInt(size); add = (U == '1'); - imm32 = if esize == 16 then ZeroExtend(imm8:'0', 32) else ZeroExtend(imm8:'00', 32); - case size of - when '01' d = UInt(Vd:D); - when '10' d = UInt(Vd:D); - when '11' d = UInt(D:Vd); - n = UInt(Rn); - - __execute __conditional - CheckVFPEnabled(TRUE); - base = if n == 15 then Align(PC,4) else R[n]; - address = if add then (base + imm32) else (base - imm32); - case esize of - when 16 - S[d] = Zeros(16) : MemA[address,2]; - when 32 - S[d] = MemA[address,4]; - when 64 - word1 = MemA[address,4]; word2 = MemA[address+4,4]; - // Combine the word-aligned words in the correct order for current endianness. - D[d] = if BigEndian() then word1:word2 else word2:word1; - -__instruction aarch32_VST3_1_A - __encoding aarch32_VST3_1_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx0010 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[0] != '0' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST3_1_T2A2_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx0110 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[0] != '0' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST3_1_T3A3_A - __instruction_set A32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11110100 1x00xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[1:0] != '00' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST3_1_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx0010 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[0] != '0' then UNDEFINED; - ebytes = 1; index = UInt(index_align[3:1]); inc = 1; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST3_1_T2A2_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx0110 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[0] != '0' then UNDEFINED; - ebytes = 2; index = UInt(index_align[3:2]); - inc = if index_align[1] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __encoding aarch32_VST3_1_T3A3_A - __instruction_set T32 - __field D 22 +: 1 - __field Rn 16 +: 4 - __field Vd 12 +: 4 - __field size 10 +: 2 - __field index_align 4 +: 4 - __field Rm 0 +: 4 - __opcode '11111001 1x00xxxx xxxx1010 xxxxxxxx' - __guard TRUE - __decode - if size == '11' then UNDEFINED; - if index_align[1:0] != '00' then UNDEFINED; - ebytes = 4; index = UInt(index_align[3]); - inc = if index_align[2] == '0' then 1 else 2; - d = UInt(D:Vd); d2 = d + inc; d3 = d2 + inc; n = UInt(Rn); m = UInt(Rm); - wback = (m != 15); register_index = (m != 15 && m != 13); - if n == 15 || d3 > 31 then UNPREDICTABLE; - - __execute __conditional - CheckAdvSIMDEnabled(); - address = R[n]; - MemU[address, ebytes] = Elem[D[d], index]; - MemU[address+ebytes, ebytes] = Elem[D[d2],index]; - MemU[address+2*ebytes,ebytes] = Elem[D[d3],index]; - if wback then - if register_index then - R[n] = R[n] + R[m]; - else - R[n] = R[n] + 3*ebytes; - -__instruction aarch32_ADC_rr_A - __encoding aarch32_ADC_rr_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rs 8 +: 4 - __field stype 5 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0000 101xxxxx xxxxxxxx 0xx1xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); s = UInt(Rs); - setflags = (S == '1'); shift_t = DecodeRegShift(stype); - if d == 15 || n == 15 || m == 15 || s == 15 then UNPREDICTABLE; - - __execute __conditional - shift_n = UInt(R[s][7:0]); - shifted = Shift(R[m], shift_t, shift_n, PSTATE.C); - (result, nzcv) = AddWithCarry(R[n], shifted, PSTATE.C); - R[d] = result; - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - -__instruction aarch32_LDREXB_A - __encoding aarch32_LDREXB_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode 'xxxx0001 1101xxxx xxxxxx11 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; - - __encoding aarch32_LDREXB_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rt 12 +: 4 - __opcode '11101000 1101xxxx xxxxxxxx 0100xxxx' - __guard TRUE - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - t = UInt(Rt); n = UInt(Rn); - if t == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - address = R[n]; - AArch32.SetExclusiveMonitors(address,1); - R[t] = ZeroExtend(MemA[address,1], 32); - -__instruction aarch32_CLREX_A - __encoding aarch32_CLREX_A1_A - __instruction_set A32 - __opcode '11110101 0111xxxx xxxxxxxx 0001xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '1' - __unpredictable_unless 12 == '1' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - // No additional decoding required - - __encoding aarch32_CLREX_T1_A - __instruction_set T32 - __opcode '11110011 1011xxxx 10x0xxxx 0010xxxx' - __guard TRUE - __unpredictable_unless 19 == '1' - __unpredictable_unless 18 == '1' - __unpredictable_unless 17 == '1' - __unpredictable_unless 16 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __unpredictable_unless 3 == '1' - __unpredictable_unless 2 == '1' - __unpredictable_unless 1 == '1' - __unpredictable_unless 0 == '1' - __decode - // No additional decoding required - - __execute __conditional - ClearExclusiveLocal(ProcessorID()); - -__instruction aarch32_VADDHN_A - __encoding aarch32_VADDHN_T1A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 1xxxxxxx xxxx0100 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VADDHN_T1A1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 1xxxxxxx xxxx0100 x0x0xxxx' - __guard TRUE - __decode - if size == '11' then SEE "Related encodings"; - if Vn[0] == '1' || Vm[0] == '1' then UNDEFINED; - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDEnabled(); - for e = 0 to elements-1 - result = Elem[Qin[n>>1],e,2*esize] + Elem[Qin[m>>1],e,2*esize]; - Elem[D[d],e,esize] = result[2*esize-1:esize]; - -__instruction aarch32_PKH_A - __encoding aarch32_PKH_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field imm5 7 +: 5 - __field tb 6 +: 1 - __field Rm 0 +: 4 - __opcode 'xxxx0110 1000xxxx xxxxxxxx xx01xxxx' - __guard cond != '1111' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); tbform = (tb == '1'); - (shift_t, shift_n) = DecodeImmShift(tb:'0', imm5); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_PKH_T1_A - __instruction_set T32 - __field S 20 +: 1 - __field Rn 16 +: 4 - __field imm3 12 +: 3 - __field Rd 8 +: 4 - __field imm2 6 +: 2 - __field tb 5 +: 1 - __field T 4 +: 1 - __field Rm 0 +: 4 - __opcode '11101010 1100xxxx xxxxxxxx xxx0xxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __decode - if S == '1' || T == '1' then UNDEFINED; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); tbform = (tb == '1'); - (shift_t, shift_n) = DecodeImmShift(tb:'0', imm3:imm2); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - operand2 = Shift(R[m], shift_t, shift_n, PSTATE.C); // PSTATE.C ignored - R[d][15:0] = if tbform then operand2[15:0] else R[n][15:0]; - R[d][31:16] = if tbform then R[n][31:16] else operand2[31:16]; - -__instruction aarch32_RFE_AS - __encoding aarch32_RFE_A1_AS - __instruction_set A32 - __field P 24 +: 1 - __field U 23 +: 1 - __field W 21 +: 1 - __field Rn 16 +: 4 - __opcode '1111100x x0x1xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '0' - __unpredictable_unless 14 == '0' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 4 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - n = UInt(Rn); - wback = (W == '1'); increment = (U == '1'); wordhigher = (P == U); - if n == 15 then UNPREDICTABLE; - - __encoding aarch32_RFE_T1_AS - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __opcode '11101000 00x1xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 4 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - n = UInt(Rn); wback = (W == '1'); increment = FALSE; wordhigher = FALSE; - if n == 15 then UNPREDICTABLE; - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __encoding aarch32_RFE_T2_AS - __instruction_set T32 - __field W 21 +: 1 - __field Rn 16 +: 4 - __opcode '11101001 10x1xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __unpredictable_unless 15 == '1' - __unpredictable_unless 14 == '1' - __unpredictable_unless 13 == '0' - __unpredictable_unless 12 == '0' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __unpredictable_unless 7 == '0' - __unpredictable_unless 6 == '0' - __unpredictable_unless 5 == '0' - __unpredictable_unless 4 == '0' - __unpredictable_unless 3 == '0' - __unpredictable_unless 2 == '0' - __unpredictable_unless 1 == '0' - __unpredictable_unless 0 == '0' - __decode - n = UInt(Rn); wback = (W == '1'); increment = TRUE; wordhigher = FALSE; - if n == 15 then UNPREDICTABLE; - if InITBlock() && !LastInITBlock() then UNPREDICTABLE; - - __execute __conditional - if PSTATE.EL == EL2 then - UNDEFINED; - elsif PSTATE.EL == EL0 then - UNPREDICTABLE; // UNDEFINED or NOP - else - address = if increment then R[n] else R[n]-8; - if wordhigher then address = address+4; - new_pc_value = MemA[address,4]; - spsr = MemA[address+4,4]; - if wback then R[n] = if increment then R[n]+8 else R[n]-8; - AArch32.ExceptionReturn(new_pc_value, spsr); - -__instruction aarch32_VCVTA_asimd_A - __encoding aarch32_VCVTA_asimd_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field RM 8 +: 2 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110011 1x11xx11 xxxx0000 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VCVTA_asimd_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field size 18 +: 2 - __field Vd 12 +: 4 - __field RM 8 +: 2 - __field op 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111111 1x11xx11 xxxx0000 xxx0xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if Q == '1' && (Vd[0] == '1' || Vm[0] == '1') then UNDEFINED; - if (size == '01' && !HaveFP16Ext()) || size IN {'00', '11'} then UNDEFINED; - rounding = FPDecodeRM(RM); unsigned = (op == '1'); - case size of - when '01' esize = 16; elements = 4; - when '10' esize = 32; elements = 2; - d = UInt(D:Vd); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute - CheckAdvSIMDEnabled(); - bits(esize) result; - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPToFixed(Elem[D[m+r],e,esize], 0, unsigned, - StandardFPSCRValue(), rounding); - -__instruction aarch32_VADD_f_A - __encoding aarch32_VADD_f_A1_A - __instruction_set A32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11110010 0x0xxxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VADD_f_A2_A - __instruction_set A32 - __field cond 28 +: 4 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode 'xxxx1110 0x11xxxx xxxx10xx x0x0xxxx' - __guard cond != '1111' - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && cond != '1110' then UNPREDICTABLE; - advsimd = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __encoding aarch32_VADD_f_T1_A - __instruction_set T32 - __field D 22 +: 1 - __field sz 20 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101111 0x0xxxxx xxxx1101 xxx0xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if sz == '1' && !HaveFP16Ext() then UNDEFINED; - if sz == '1' && InITBlock() then UNPREDICTABLE; - advsimd = TRUE; - case sz of - when '0' esize = 32; elements = 2; - when '1' esize = 16; elements = 4; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VADD_f_T2_A - __instruction_set T32 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field size 8 +: 2 - __field N 7 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11101110 0x11xxxx xxxx10xx x0x0xxxx' - __guard TRUE - __decode - if FPSCR.Len != '000' || FPSCR.Stride != '00' then UNDEFINED; - if size == '00' || (size == '01' && !HaveFP16Ext()) then UNDEFINED; - if size == '01' && InITBlock() then UNPREDICTABLE; - advsimd = FALSE; - case size of - when '01' esize = 16; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '10' esize = 32; d = UInt(Vd:D); n = UInt(Vn:N); m = UInt(Vm:M); - when '11' esize = 64; d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); - - __execute __conditional - CheckAdvSIMDOrVFPEnabled(TRUE, advsimd); - if advsimd then // Advanced SIMD instruction - for r = 0 to regs-1 - for e = 0 to elements-1 - Elem[D[d+r],e,esize] = FPAdd(Elem[D[n+r],e,esize], Elem[D[m+r],e,esize], - StandardFPSCRValue()); - else // VFP instruction - case esize of - when 16 - S[d] = Zeros(16) : FPAdd(S[n][15:0], S[m][15:0], FPSCR); - when 32 - S[d] = FPAdd(S[n], S[m], FPSCR); - when 64 - D[d] = FPAdd(D[n], D[m], FPSCR); - -__instruction aarch32_SXTB16_A - __encoding aarch32_SXTB16_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rd 12 +: 4 - __field rotate 10 +: 2 - __field Rm 0 +: 4 - __opcode 'xxxx0110 10001111 xxxxxxxx 0111xxxx' - __guard cond != '1111' - __unpredictable_unless 9 == '0' - __unpredictable_unless 8 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_SXTB16_T1_A - __instruction_set T32 - __field Rd 8 +: 4 - __field rotate 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 00101111 1111xxxx 1xxxxxxx' - __guard TRUE - __unpredictable_unless 6 == '0' - __decode - d = UInt(Rd); m = UInt(Rm); rotation = UInt(rotate:'000'); - if d == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - rotated = ROR(R[m], rotation); - R[d][15:0] = SignExtend(rotated[7:0], 16); - R[d][31:16] = SignExtend(rotated[23:16], 16); - -__instruction aarch32_VFMAL_A - __encoding aarch32_VFMAL_A1_A - __instruction_set A32 - __field S 23 +: 1 - __field D 22 +: 1 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x10xxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - - integer d = UInt(D:Vd); - integer n = if Q == '1' then UInt(N:Vn) else UInt(Vn:N); - integer m = if Q == '1' then UInt(M:Vm) else UInt(Vm:M); - integer esize = 32; - integer regs = if Q=='1' then 2 else 1; - integer datasize = if Q=='1' then 64 else 32; - boolean sub_op = S=='1'; - - __encoding aarch32_VFMAL_T1_A - __instruction_set T32 - __field S 23 +: 1 - __field D 22 +: 1 - __field op2 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field Vm 0 +: 4 - __opcode '11111100 0x1xxxxx xxxx1000 xxx1xxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - if Q == '1' && Vd[0] == '1' then UNDEFINED; - - integer d = UInt(D:Vd); - integer n = if Q == '1' then UInt(N:Vn) else UInt(Vn:N); - integer m = if Q == '1' then UInt(M:Vm) else UInt(Vm:M); - integer esize = 32; - integer regs = if Q=='1' then 2 else 1; - integer datasize = if Q=='1' then 64 else 32; - boolean sub_op = S=='1'; - - __execute - CheckAdvSIMDEnabled(); - bits(datasize) operand1 ; - bits(datasize) operand2 ; - bits(64) operand3; - bits(64) result; - bits(esize DIV 2) element1; - bits(esize DIV 2) element2; - - if Q=='0' then - operand1 = S[n][datasize-1:0]; - operand2 = S[m][datasize-1:0]; - else - operand1 = D[n][datasize-1:0]; - operand2 = D[m][datasize-1:0]; - for r = 0 to regs-1 - operand3 = D[d+r]; - for e = 0 to 1 - element1 = Elem[operand1, 2*r+e, esize DIV 2]; - element2 = Elem[operand2, 2*r+e, esize DIV 2]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAddH(Elem[operand3, e, esize], element1, element2, StandardFPSCRValue()); - D[d+r] = result; - -__instruction aarch32_UHADD8_A - __encoding aarch32_UHADD8_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field Rm 0 +: 4 - __opcode 'xxxx0110 0111xxxx xxxxxxxx 1001xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '1' - __unpredictable_unless 10 == '1' - __unpredictable_unless 9 == '1' - __unpredictable_unless 8 == '1' - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - - __encoding aarch32_UHADD8_T1_A - __instruction_set T32 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field Rm 0 +: 4 - __opcode '11111010 1000xxxx 1111xxxx 0110xxxx' - __guard TRUE - __decode - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 - - __execute __conditional - sum1 = UInt(R[n][7:0]) + UInt(R[m][7:0]); - sum2 = UInt(R[n][15:8]) + UInt(R[m][15:8]); - sum3 = UInt(R[n][23:16]) + UInt(R[m][23:16]); - sum4 = UInt(R[n][31:24]) + UInt(R[m][31:24]); - R[d][7:0] = sum1[8:1]; - R[d][15:8] = sum2[8:1]; - R[d][23:16] = sum3[8:1]; - R[d][31:24] = sum4[8:1]; - -__instruction aarch32_VMAX_i_A - __encoding aarch32_VMAX_i_T1A1_A - __instruction_set A32 - __field U 24 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field op 4 +: 1 - __field Vm 0 +: 4 - __opcode '1111001x 0xxxxxxx xxxx0110 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - maximum = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __encoding aarch32_VMAX_i_T1A1_A - __instruction_set T32 - __field U 28 +: 1 - __field D 22 +: 1 - __field size 20 +: 2 - __field Vn 16 +: 4 - __field Vd 12 +: 4 - __field N 7 +: 1 - __field Q 6 +: 1 - __field M 5 +: 1 - __field op 4 +: 1 - __field Vm 0 +: 4 - __opcode '111x1111 0xxxxxxx xxxx0110 xxx1xxxx' - __guard TRUE - __decode - if Q == '1' && (Vd[0] == '1' || Vn[0] == '1' || Vm[0] == '1') then UNDEFINED; - if size == '11' then UNDEFINED; - maximum = (op == '0'); unsigned = (U == '1'); - esize = 8 << UInt(size); elements = 64 DIV esize; - d = UInt(D:Vd); n = UInt(N:Vn); m = UInt(M:Vm); regs = if Q == '0' then 1 else 2; - - __execute __conditional - CheckAdvSIMDEnabled(); - for r = 0 to regs-1 - for e = 0 to elements-1 - op1 = Int(Elem[D[n+r],e,esize], unsigned); - op2 = Int(Elem[D[m+r],e,esize], unsigned); - result = if maximum then Max(op1,op2) else Min(op1,op2); - Elem[D[d+r],e,esize] = result[esize-1:0]; - -__instruction aarch32_CRC32_A - __encoding aarch32_CRC32_A1_A - __instruction_set A32 - __field cond 28 +: 4 - __field sz 21 +: 2 - __field Rn 16 +: 4 - __field Rd 12 +: 4 - __field C 9 +: 1 - __field Rm 0 +: 4 - __opcode 'xxxx0001 0xx0xxxx xxxxxx1x 0100xxxx' - __guard cond != '1111' - __unpredictable_unless 11 == '0' - __unpredictable_unless 10 == '0' - __unpredictable_unless 8 == '0' - __decode - if ! HaveCRCExt() then UNDEFINED; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - size = 8 << UInt(sz); - crc32c = (C == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if size == 64 then UNPREDICTABLE; - if cond != '1110' then UNPREDICTABLE; - - __encoding aarch32_CRC32_T1_A - __instruction_set T32 - __field C 20 +: 1 - __field Rn 16 +: 4 - __field Rd 8 +: 4 - __field sz 4 +: 2 - __field Rm 0 +: 4 - __opcode '11111010 1101xxxx 1111xxxx 10xxxxxx' - __guard TRUE - __decode - if InITBlock() then UNPREDICTABLE; - if ! HaveCRCExt() then UNDEFINED; - d = UInt(Rd); n = UInt(Rn); m = UInt(Rm); - size = 8 << UInt(sz); - crc32c = (C == '1'); - if d == 15 || n == 15 || m == 15 then UNPREDICTABLE; - if size == 64 then UNPREDICTABLE; - - __execute __conditional - - acc = R[n]; // accumulator - val = R[m][size-1:0]; // input value - poly = (if crc32c then 0x1EDC6F41 else 0x04C11DB7)[31:0]; - tempacc = BitReverse(acc):Zeros(size); - tempval = BitReverse(val):Zeros(32); - // Poly32Mod2 on a bitstring does a polynomial Modulus over {0,1} operation - R[d] = BitReverse(Poly32Mod2(tempacc EOR tempval, poly)); - -__instruction LDNT1B_Z_P_BR_Contiguous - __encoding LDNT1B_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 000xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(64) offset; - bits(PL) mask = P[g]; - bits(VL) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = X[m]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_STREAM]; - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction BFMLALB_Z_ZZZ__ - __encoding BFMLALB_Z_ZZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 111xxxxx 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 32; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(32) element1 = Elem[operand1, 2 * e + 0, 16] : Zeros(16); - bits(32) element2 = Elem[operand2, 2 * e + 0, 16] : Zeros(16); - bits(32) element3 = Elem[operand3, e, 32]; - Elem[result, e, 32] = FPMulAdd(element3, element1, element2, FPCR); - - Z[da] = result; - -__instruction aarch64_branch_unconditional_immediate - __encoding aarch64_branch_unconditional_immediate - __instruction_set A64 - __field op 31 +: 1 - __field imm26 0 +: 26 - __opcode 'x00101xx xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - BranchType branch_type = if op == '1' then BranchType_DIRCALL else BranchType_DIR; - bits(64) offset = SignExtend(imm26:'00', 64); - - __execute - if branch_type == BranchType_DIRCALL then X[30] = PC[] + 4; - - BranchTo(PC[] + offset, branch_type); - -__instruction aarch64_memory_atomicops_cas_single - __encoding aarch64_memory_atomicops_cas_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x1xxxxx x11111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer n = UInt(Rn); - integer t = UInt(Rt); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if L == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if o0 == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) comparevalue; - bits(datasize) newvalue; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - comparevalue = X[s]; - newvalue = X[t]; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomicCompareAndSwap(address, comparevalue, newvalue, ldacctype, stacctype); - - X[s] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_element_mat_mul_int_dotp - __encoding aarch64_vector_arithmetic_binary_element_mat_mul_int_dotp - __instruction_set A64 - __field Q 30 +: 1 - __field US 23 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 x0xxxxxx 1111x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveInt8MatMulExt() then UNDEFINED; - boolean op1_unsigned = (US == '1'); - boolean op2_unsigned = (US == '0'); - integer n = UInt(Rn); - integer m = UInt(M:Rm); - integer d = UInt(Rd); - integer i = UInt(H:L); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 32; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - - for e = 0 to elements-1 - bits(32) res = Elem[operand3, e, 32]; - for b = 0 to 3 - integer element1 = Int(Elem[operand1, 4 * e + b, 8], op1_unsigned); - integer element2 = Int(Elem[operand2, 4 * i + b, 8], op2_unsigned); - res = res + element1 * element2; - Elem[result, e, 32] = res; - V[d] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction aarch64_vector_arithmetic_unary_fp16_round - __encoding aarch64_vector_arithmetic_unary_fp16_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 100x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_arithmetic_unary_float_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundInt(element, FPCR, rounding, exact); - - V[d] = result; - -__instruction aarch64_float_arithmetic_round_frint_32_64 - __encoding aarch64_float_arithmetic_round_frint_32_64 - __instruction_set A64 - __field ftype 22 +: 2 - __field op 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10100x x10000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFrintExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '1x' UNDEFINED; - - integer intsize = if op[1] == '0' then 32 else 64; - - FPRounding rounding = if op[0] == '0' then FPRounding_ZERO else FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundIntN(operand, FPCR, rounding, intsize); - - V[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction PRFW_I_P_BZ_S_x32_scaled - __encoding PRFW_I_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000100 0x1xxxxx 010xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 32; - boolean offs_unsigned = (xs == '0'); - integer scale = 2; - - __encoding PRFW_I_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 0x1xxxxx 010xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 32; - boolean offs_unsigned = (xs == '0'); - integer scale = 2; - - __encoding PRFW_I_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 011xxxxx 110xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) addr; - bits(VL) offset; - - if n == 31 then - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - -__instruction aarch64_vector_crypto_sha3op_sha1_sched0 - __encoding aarch64_vector_crypto_sha3op_sha1_sched0 - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 000xxxxx 001100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if !HaveSHA1Ext() then UNDEFINED; - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) operand1 = V[d]; - bits(128) operand2 = V[n]; - bits(128) operand3 = V[m]; - bits(128) result; - - result = operand2[63:0] : operand1[127:64]; - result = result EOR operand1 EOR operand3; - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_float_widen - __encoding aarch64_vector_arithmetic_unary_float_widen - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 0x100001 011110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16 << UInt(sz); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = Vpart[n, part]; - bits(2*datasize) result; - - for e = 0 to elements-1 - Elem[result, e, 2*esize] = FPConvert(Elem[operand, e, esize], FPCR); - - V[d] = result; - -__instruction aarch64_branch_unconditional_eret - __encoding aarch64_branch_unconditional_eret - __instruction_set A64 - __field A 11 +: 1 - __field M 10 +: 1 - __field Rn 5 +: 5 - __field op4 0 +: 5 - __opcode '11010110 10011111 0000xxxx xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL0 then UNDEFINED; - boolean pac = (A == '1'); - boolean use_key_a = (M == '0'); - - if !pac && op4 != '00000' then - UNDEFINED; - elsif pac && (!HavePACExt() || op4 != '11111') then - UNDEFINED; - - if Rn != '11111' then - UNDEFINED; - - __execute - AArch64.CheckForERetTrap(pac, use_key_a); - bits(64) target = ELR[]; - boolean auth_then_branch = TRUE; - - if pac then - if use_key_a then - target = AuthIA(ELR[], SP[], auth_then_branch); - else - target = AuthIB(ELR[], SP[], auth_then_branch); - - AArch64.ExceptionReturn(target, SPSR[]); - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction LD2W_Z_P_BI_Contiguous - __encoding LD2W_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0010xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_shift_left_sat_sisd - __encoding aarch64_vector_shift_left_sat_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 011x01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - - integer shift = UInt(immh:immb) - esize; - - boolean src_unsigned; - boolean dst_unsigned; - case op:U of - when '00' UNDEFINED; - when '01' src_unsigned = FALSE; dst_unsigned = TRUE; - when '10' src_unsigned = FALSE; dst_unsigned = FALSE; - when '11' src_unsigned = TRUE; dst_unsigned = TRUE; - - __encoding aarch64_vector_shift_left_sat_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 011x01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = UInt(immh:immb) - esize; - - boolean src_unsigned; - boolean dst_unsigned; - case op:U of - when '00' UNDEFINED; - when '01' src_unsigned = FALSE; dst_unsigned = TRUE; - when '10' src_unsigned = FALSE; dst_unsigned = FALSE; - when '11' src_unsigned = TRUE; dst_unsigned = TRUE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = Int(Elem[operand, e, esize], src_unsigned) << shift; - (Elem[result, e, esize], sat) = SatQ(element, esize, dst_unsigned); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction BFMLALT_Z_ZZZi__ - __encoding BFMLALT_Z_ZZZi__ - __instruction_set A64 - __field i3h 19 +: 2 - __field Zm 16 +: 3 - __field i3l 11 +: 1 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 111xxxxx 0100x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - integer index = UInt(i3h:i3l); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 32; - integer eltspersegment = 128 DIV 32; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = 2 * segmentbase + index; - bits(32) element1 = Elem[operand1, 2 * e + 1, 16] : Zeros(16); - bits(32) element2 = Elem[operand2, s, 16] : Zeros(16); - bits(32) element3 = Elem[operand3, e, 32]; - Elem[result, e, 32] = FPMulAdd(element3, element1, element2, FPCR); - - Z[da] = result; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_bfmmla - __encoding aarch64_vector_bfmmla - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01101110 010xxxxx 111011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(128) op1 = V[n]; - bits(128) op2 = V[m]; - bits(128) acc = V[d]; - - V[d] = BFMatMulAdd(acc, op1, op2); - -__instruction SUBR_Z_ZI__ - __encoding SUBR_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx100011 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer imm = UInt(imm8); - if sh == '1' then imm = imm << 8; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = UInt(Elem[operand1, e, esize]); - Elem[result, e, esize] = (imm - element1)[esize-1:0]; - - Z[dn] = result; - -__instruction BFCVT_Z_P_Z_S2BF - __encoding BFCVT_Z_P_Z_S2BF - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 10001010 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 32; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(32) element = Elem[operand, e, 32]; - if ElemP[mask, e, 32] == '1' then - Elem[result, 2*e, 16] = FPConvertBF(element, FPCR); - Elem[result, 2*e+1, 16] = Zeros(); - - Z[d] = result; - -__instruction aarch64_integer_logical_shiftedreg - __encoding aarch64_integer_logical_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - boolean invert = (N == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - X[d] = result; - -__instruction aarch64_integer_arithmetic_address_pc_rel - __encoding aarch64_integer_arithmetic_address_pc_rel - __instruction_set A64 - __field op 31 +: 1 - __field immlo 29 +: 2 - __field immhi 5 +: 19 - __field Rd 0 +: 5 - __opcode 'xxx10000 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - boolean page = (op == '1'); - bits(64) imm; - - if page then - imm = SignExtend(immhi:immlo:Zeros(12), 64); - else - imm = SignExtend(immhi:immlo, 64); - - __execute - bits(64) base = PC[]; - - if page then - base[11:0] = Zeros(12); - - X[d] = base + imm; - -__instruction INDEX_Z_RR__ - __encoding INDEX_Z_RR__ - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 010011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(esize) operand1 = X[n]; - integer element1 = SInt(operand1); - bits(esize) operand2 = X[m]; - integer element2 = SInt(operand2); - bits(VL) result; - - for e = 0 to elements-1 - integer index = element1 + e * element2; - Elem[result, e, esize] = index[esize-1:0]; - - Z[d] = result; - -__instruction aarch64_memory_pair_simdfp_no_alloc - __encoding aarch64_memory_pair_simdfp_no_alloc - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101100 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_VECSTREAM; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if opc == '11' then UNDEFINED; - integer scale = 2 + UInt(opc); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data1 = V[t]; - data2 = V[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - V[t] = data1; - V[t2] = data2; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_integer_tags_mcgettagarray - __encoding aarch64_integer_tags_mcgettagarray - __instruction_set A64 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 11100000 000000xx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Xt); - integer n = UInt(Xn); - - __execute - if PSTATE.EL == EL0 then - UNDEFINED; - - bits(64) data = Zeros(64); - bits(64) address; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - integer size = 4*(2^(UInt(GMID_EL1.BS))); - address = Align(address,size); - integer count = size >> LOG2_TAG_GRANULE; - integer index = UInt(address[LOG2_TAG_GRANULE+3:LOG2_TAG_GRANULE]); - - for i = 0 to count-1 - bits(4) tag = AArch64.MemTag[address, AccType_NORMAL]; - data[(index*4)+3:index*4] = tag; - address = address + TAG_GRANULE; - index = index + 1; - - X[t] = data; - -__instruction UZP1_Z_ZZ__ - __encoding UZP1_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 011010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 0; - - __encoding UZP1_Z_ZZ_Q - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 101xxxxx 000010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer esize = 128; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 0; - - __encoding UZP2_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 011011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 1; - - __encoding UZP2_Z_ZZ_Q - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 101xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer esize = 128; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 1; - - __execute - CheckSVEEnabled(); - if VL < esize * 2 then UNDEFINED; - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result = Zeros(); - - bits(VL*2) zipped = operand2:operand1; - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[zipped, 2*e+part, esize]; - - Z[d] = result; - -__instruction UQINCW_R_RS_UW - __encoding UQINCW_R_RS_UW - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1010xxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQINCW_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1011xxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 + (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_vector_shift_right_sisd - __encoding aarch64_vector_shift_right_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __encoding aarch64_vector_shift_right_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - operand2 = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element = (Int(Elem[operand, e, esize], unsigned) + round_const) >> shift; - Elem[result, e, esize] = Elem[operand2, e, esize] + element[esize-1:0]; - - V[d] = result; - -__instruction BFMMLA_Z_ZZZ__ - __encoding BFMMLA_Z_ZZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 011xxxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer segments = VL DIV 128; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - bits(128) op1, op2; - bits(128) res, addend; - - for s = 0 to segments-1 - op1 = Elem[operand1, s, 128]; - op2 = Elem[operand2, s, 128]; - addend = Elem[operand3, s, 128]; - res = BFMatMulAdd(addend, op1, op2); - Elem[result, s, 128] = res; - - Z[da] = result; - -__instruction aarch64_vector_reduce_int_max - __encoding aarch64_vector_reduce_int_max - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 16 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx11000x 101010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '100' then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean min = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - integer maxmin; - integer element; - - maxmin = Int(Elem[operand, 0, esize], unsigned); - for e = 1 to elements-1 - element = Int(Elem[operand, e, esize], unsigned); - maxmin = if min then Min(maxmin, element) else Max(maxmin, element); - - V[d] = maxmin[esize-1:0]; - -__instruction aarch64_integer_shift_variable - __encoding aarch64_integer_shift_variable - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field op2 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011010 110xxxxx 0010xxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - ShiftType shift_type = DecodeShift(op2); - - __execute - bits(datasize) result; - bits(datasize) operand2 = X[m]; - - result = ShiftReg(n, shift_type, UInt(operand2) MOD datasize); - X[d] = result; - -__instruction LD1ROH_Z_P_BR_Contiguous - __encoding LD1ROH_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 101xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - - __execute - CheckSVEEnabled(); - if VL < 256 then UNDEFINED; - integer elements = 256 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low bits only - bits(64) offset; - bits(256) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - offset = X[m]; - - addr = base + UInt(offset) * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = ZeroExtend(Replicate(result, VL DIV 256), VL); - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla - __encoding aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla - __instruction_set A64 - __field U 29 +: 1 - __field Rm 16 +: 5 - __field B 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x01110 100xxxxx 1010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveInt8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(128) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(128) addend = V[d]; - - V[d] = MatMulAdd(addend, operand1, operand2, op1_unsigned, op2_unsigned); - -__instruction aarch64_integer_arithmetic_mul_widening_32_64 - __encoding aarch64_integer_arithmetic_mul_widening_32_64 - __instruction_set A64 - __field U 23 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '10011011 x01xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer a = UInt(Ra); - integer destsize = 64; - integer datasize = 32; - boolean sub_op = (o0 == '1'); - boolean unsigned = (U == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(destsize) operand3 = X[a]; - - integer result; - - if sub_op then - result = Int(operand3, unsigned) - (Int(operand1, unsigned) * Int(operand2, unsigned)); - else - result = Int(operand3, unsigned) + (Int(operand1, unsigned) * Int(operand2, unsigned)); - - X[d] = result[63:0]; - -__instruction aarch64_integer_conditional_select - __encoding aarch64_integer_conditional_select - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field o2 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xx011010 100xxxxx xxxx0xxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - bits(4) condition = cond; - boolean else_inv = (op == '1'); - boolean else_inc = (o2 == '1'); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - - if ConditionHolds(condition) then - result = operand1; - else - result = operand2; - if else_inv then result = NOT(result); - if else_inc then result = result + 1; - - X[d] = result; - -__instruction aarch64_vector_reduce_fp16_maxnm_sisd - __encoding aarch64_vector_reduce_fp16_maxnm_sisd - __instruction_set A64 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx110000 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - if sz == '1' then UNDEFINED; - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = if o1 == '1' then ReduceOp_FMINNUM else ReduceOp_FMAXNUM; - - __encoding aarch64_vector_reduce_fp_maxnm_sisd - __instruction_set A64 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 xx110000 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = if o1 == '1' then ReduceOp_FMINNUM else ReduceOp_FMAXNUM; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction FCMLA_Z_P_ZZZ__ - __encoding FCMLA_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field rot 13 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 xx0xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - integer sel_a = UInt(rot[0]); - integer sel_b = UInt(NOT(rot[0])); - boolean neg_i = (rot[1] == '1'); - boolean neg_r = (rot[0] != rot[1]); - - __execute - CheckSVEEnabled(); - integer pairs = VL DIV (2 * esize); - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for p = 0 to pairs-1 - addend_r = Elem[operand3, 2 * p + 0, esize]; - addend_i = Elem[operand3, 2 * p + 1, esize]; - elt1_a = Elem[operand1, 2 * p + sel_a, esize]; - elt2_a = Elem[operand2, 2 * p + sel_a, esize]; - elt2_b = Elem[operand2, 2 * p + sel_b, esize]; - if ElemP[mask, 2 * p + 0, esize] == '1' then - if neg_r then elt2_a = FPNeg(elt2_a); - addend_r = FPMulAdd(addend_r, elt1_a, elt2_a, FPCR); - if ElemP[mask, 2 * p + 1, esize] == '1' then - if neg_i then elt2_b = FPNeg(elt2_b); - addend_i = FPMulAdd(addend_i, elt1_a, elt2_b, FPCR); - Elem[result, 2 * p + 0, esize] = addend_r; - Elem[result, 2 * p + 1, esize] = addend_i; - - Z[da] = result; - -__instruction aarch64_vector_arithmetic_unary_add_pairwise - __encoding aarch64_vector_arithmetic_unary_add_pairwise - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 0x1010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV (2*esize); - boolean acc = (op == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - bits(2*esize) sum; - integer op1; - integer op2; - - if acc then result = V[d]; - for e = 0 to elements-1 - op1 = Int(Elem[operand, 2*e+0, esize], unsigned); - op2 = Int(Elem[operand, 2*e+1, esize], unsigned); - sum = (op1 + op2)[2*esize-1:0]; - if acc then - Elem[result, e, 2*esize] = Elem[result, e, 2*esize] + sum; - else - Elem[result, e, 2*esize] = sum; - - V[d] = result; - -__instruction LD3H_Z_P_BI_Contiguous - __encoding LD3H_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1100xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction SMIN_Z_ZI__ - __encoding SMIN_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx101010 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - boolean unsigned = FALSE; - integer imm = Int(imm8, unsigned); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - Elem[result, e, esize] = Min(element1, imm)[esize-1:0]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_pair - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_pair - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1010x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - integer element1; - integer element2; - integer maxmin; - - for e = 0 to elements-1 - element1 = Int(Elem[concat, 2*e, esize], unsigned); - element2 = Int(Elem[concat, (2*e)+1, esize], unsigned); - maxmin = if minimum then Min(element1, element2) else Max(element1, element2); - Elem[result, e, esize] = maxmin[esize-1:0]; - - V[d] = result; - -__instruction aarch64_vector_crypto_sm4_sm4enc - __encoding aarch64_vector_crypto_sm4_sm4enc - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 11000000 100001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM4Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vn = V[n]; - bits(32) intval; - bits(8) sboxout; - bits(128) roundresult; - bits(32) roundkey; - - roundresult=V[d]; - for index = 0 to 3 - roundkey = Elem[Vn,index,32]; - - intval = roundresult[127:96] EOR roundresult[95:64] EOR roundresult[63:32] EOR roundkey; - - for i = 0 to 3 - Elem[intval,i,8] = Sbox(Elem[intval,i,8]); - - intval = intval EOR ROL(intval,2) EOR ROL(intval,10) EOR ROL(intval,18) EOR ROL(intval,24); - intval = intval EOR roundresult[31:0]; - - roundresult[31:0] = roundresult[63:32]; - roundresult[63:32] = roundresult[95:64]; - roundresult[95:64] = roundresult[127:96]; - roundresult[127:96] = intval; - V[d] = roundresult; - -__instruction aarch64_vector_arithmetic_binary_uniform_mat_mul_int_usdot - __encoding aarch64_vector_arithmetic_binary_uniform_mat_mul_int_usdot - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 100xxxxx 100111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveInt8MatMulExt() then UNDEFINED; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 32; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - - for e = 0 to elements-1 - bits(32) res = Elem[operand3, e, 32]; - for b = 0 to 3 - integer element1 = UInt(Elem[operand1, 4 * e + b, 8]); - integer element2 = SInt(Elem[operand2, 4 * e + b, 8]); - res = res + element1 * element2; - Elem[result, e, 32] = res; - - V[d] = result; - -__instruction ST4H_Z_P_BI_Contiguous - __encoding ST4H_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 1111xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction aarch64_vector_arithmetic_unary_special_sqrt_est_int - __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_int - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 1x100001 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz == '1' then UNDEFINED; - integer esize = 32; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(32) element; - - for e = 0 to elements-1 - element = Elem[operand, e, 32]; - Elem[result, e, 32] = UnsignedRSqrtEstimate(element); - - V[d] = result; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction WHILELO_P_P_RR__ - __encoding WHILELO_P_P_RR__ - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field sf 12 +: 1 - __field Rn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx1xxxxx 000x11xx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer rsize = 32 << UInt(sf); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Pd); - boolean unsigned = TRUE; - SVECmp op = Cmp_LT; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = Ones(PL); - bits(rsize) operand1 = X[n]; - bits(rsize) operand2 = X[m]; - bits(PL) result; - boolean last = TRUE; - - for e = 0 to elements-1 - boolean cond; - case op of - when Cmp_LT cond = (Int(operand1, unsigned) < Int(operand2, unsigned)); - when Cmp_LE cond = (Int(operand1, unsigned) <= Int(operand2, unsigned)); - - last = last && cond; - ElemP[result, e, esize] = if last then '1' else '0'; - operand1 = operand1 + 1; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_vector_shift_left_sisd - __encoding aarch64_vector_shift_left_sisd - __instruction_set A64 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 0xxxxxxx 010101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = UInt(immh:immb) - esize; - - __encoding aarch64_vector_shift_left_simd - __instruction_set A64 - __field Q 30 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 0xxxxxxx 010101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = UInt(immh:immb) - esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - for e = 0 to elements-1 - Elem[result, e, esize] = LSL(Elem[operand, e, esize], shift); - - V[d] = result; - -__instruction LASTA_R_P_Z__ - __encoding LASTA_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00000101 xx100000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer rsize = if esize < 64 then 32 else 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Rd); - boolean isBefore = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(rsize) result; - integer last = LastActiveElement(mask, esize); - - if isBefore then - if last < 0 then last = elements - 1; - else - last = last + 1; - if last >= elements then last = 0; - result = ZeroExtend(Elem[operand, last, esize]); - - X[d] = result; - -__instruction aarch64_vector_shift_left_sat_sisd - __encoding aarch64_vector_shift_left_sat_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 011x01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - - integer shift = UInt(immh:immb) - esize; - - boolean src_unsigned; - boolean dst_unsigned; - case op:U of - when '00' UNDEFINED; - when '01' src_unsigned = FALSE; dst_unsigned = TRUE; - when '10' src_unsigned = FALSE; dst_unsigned = FALSE; - when '11' src_unsigned = TRUE; dst_unsigned = TRUE; - - __encoding aarch64_vector_shift_left_sat_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 011x01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = UInt(immh:immb) - esize; - - boolean src_unsigned; - boolean dst_unsigned; - case op:U of - when '00' UNDEFINED; - when '01' src_unsigned = FALSE; dst_unsigned = TRUE; - when '10' src_unsigned = FALSE; dst_unsigned = FALSE; - when '11' src_unsigned = TRUE; dst_unsigned = TRUE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = Int(Elem[operand, e, esize], src_unsigned) << shift; - (Elem[result, e, esize], sat) = SatQ(element, esize, dst_unsigned); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_integer_shift_variable - __encoding aarch64_integer_shift_variable - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field op2 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011010 110xxxxx 0010xxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - ShiftType shift_type = DecodeShift(op2); - - __execute - bits(datasize) result; - bits(datasize) operand2 = X[m]; - - result = ShiftReg(n, shift_type, UInt(operand2) MOD datasize); - X[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp16_sisd - __instruction_set A64 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 00xxxxxx 0x01x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - boolean sub_op = (o2 == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 1xxxxxxx 0x01x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi = M; - case sz:L of - when '0x' index = UInt(H:L); - when '10' index = UInt(H); - when '11' UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - boolean sub_op = (o2 == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 00xxxxxx 0x01x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (o2 == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 1xxxxxxx 0x01x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi = M; - case sz:L of - when '0x' index = UInt(H:L); - when '10' index = UInt(H); - when '11' UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2 = Elem[operand2, index, esize]; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAdd(Elem[operand3, e, esize], element1, element2, FPCR); - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 101101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' || size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean rounding = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 101101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' || size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean rounding = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer round_const = if rounding then 1 << (esize - 1) else 0; - integer element1; - integer element2; - integer product; - boolean sat; - - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element2 = SInt(Elem[operand2, e, esize]); - product = (2 * element1 * element2) + round_const; - (Elem[result, e, esize], sat) = SignedSatQ(product >> esize, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction aarch64_vector_arithmetic_binary_uniform_add_saturating_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_add_saturating_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_add_saturating_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer sum; - boolean sat; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - sum = element1 + element2; - (Elem[result, e, esize], sat) = SatQ(sum, esize, unsigned); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_branch_unconditional_eret - __encoding aarch64_branch_unconditional_eret - __instruction_set A64 - __field A 11 +: 1 - __field M 10 +: 1 - __field Rn 5 +: 5 - __field op4 0 +: 5 - __opcode '11010110 10011111 0000xxxx xxxxxxxx' - __guard TRUE - __decode - if PSTATE.EL == EL0 then UNDEFINED; - boolean pac = (A == '1'); - boolean use_key_a = (M == '0'); - - if !pac && op4 != '00000' then - UNDEFINED; - elsif pac && (!HavePACExt() || op4 != '11111') then - UNDEFINED; - - if Rn != '11111' then - UNDEFINED; - - __execute - AArch64.CheckForERetTrap(pac, use_key_a); - bits(64) target = ELR[]; - boolean auth_then_branch = TRUE; - - if pac then - if use_key_a then - target = AuthIA(ELR[], SP[], auth_then_branch); - else - target = AuthIB(ELR[], SP[], auth_then_branch); - - AArch64.ExceptionReturn(target, SPSR[]); - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_fp16_fused - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_fused - __instruction_set A64 - __field Q 30 +: 1 - __field a 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 x10xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (a == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_fused - __instruction_set A64 - __field Q 30 +: 1 - __field op 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 110011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAdd(Elem[operand3, e, esize], element1, element2, FPCR); - - V[d] = result; - -__instruction INDEX_Z_RI__ - __encoding INDEX_Z_RI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm5 16 +: 5 - __field Rn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 010001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Rn); - integer d = UInt(Zd); - integer imm = SInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(esize) operand1 = X[n]; - integer element1 = SInt(operand1); - bits(VL) result; - - for e = 0 to elements-1 - integer index = element1 + e * imm; - Elem[result, e, esize] = index[esize-1:0]; - - Z[d] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_integer_arithmetic_cnt - __encoding aarch64_integer_arithmetic_cnt - __instruction_set A64 - __field sf 31 +: 1 - __field op 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x1011010 11000000 00010xxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - CountOp opcode = if op == '0' then CountOp_CLZ else CountOp_CLS; - - __execute - integer result; - bits(datasize) operand1 = X[n]; - - if opcode == CountOp_CLZ then - result = CountLeadingZeroBits(operand1); - else - result = CountLeadingSignBits(operand1); - - X[d] = result[datasize-1:0]; - -__instruction DUP_Z_Zi__ - __encoding DUP_Z_Zi__ - __instruction_set A64 - __field imm2 22 +: 2 - __field tsz 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 001000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - bits(7) imm = imm2:tsz; - case tsz of - when '00000' UNDEFINED; - when '10000' esize = 128; index = UInt(imm[6:5]); - when 'x1000' esize = 64; index = UInt(imm[6:4]); - when 'xx100' esize = 32; index = UInt(imm[6:3]); - when 'xxx10' esize = 16; index = UInt(imm[6:2]); - when 'xxxx1' esize = 8; index = UInt(imm[6:1]); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) result; - bits(esize) element; - - if index >= elements then - element = Zeros(); - else - element = Elem[operand1, index, esize]; - result = Replicate(element); - - Z[d] = result; - -__instruction FRSQRTS_Z_ZZ__ - __encoding FRSQRTS_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx0xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPRSqrtStepFused(element1, element2); - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_single - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_single - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer maxmin; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - maxmin = if minimum then Min(element1, element2) else Max(element1, element2); - Elem[result, e, esize] = maxmin[esize-1:0]; - - V[d] = result; - -__instruction LD3H_Z_P_BR_Contiguous - __encoding LD3H_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 110xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction STR_P_BI__ - __encoding STR_P_BI__ - __instruction_set A64 - __field imm9h 16 +: 6 - __field imm9l 10 +: 3 - __field Rn 5 +: 5 - __field Pt 0 +: 4 - __opcode '11100101 10xxxxxx 000xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Pt); - integer n = UInt(Rn); - integer imm = SInt(imm9h:imm9l); - - __execute - CheckSVEEnabled(); - integer elements = PL DIV 8; - bits(PL) src; - bits(64) base; - integer offset = imm * elements; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - src = P[t]; - boolean aligned = AArch64.CheckAlignment(base + offset, 2, AccType_NORMAL, TRUE); - for e = 0 to elements-1 - AArch64.MemSingle[base + offset, 1, AccType_NORMAL, aligned] = Elem[src, e, 8]; - offset = offset + 1; - -__instruction MOVPRFX_Z_P_Z__ - __encoding MOVPRFX_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field M 16 +: 1 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx01000x 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean merging = (M == '1'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) dest = Z[d]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element; - elsif merging then - Elem[result, e, esize] = Elem[dest, e, esize]; - else - Elem[result, e, esize] = Zeros(); - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 001101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_1985 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - - if minimum then - Elem[result, e, esize] = FPMin(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMax(element1, element2, FPCR); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_int - __encoding aarch64_vector_arithmetic_binary_element_mul_int - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 xxxxxxxx 1000x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - bits(esize) product; - - element2 = UInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = UInt(Elem[operand1, e, esize]); - product = (element1 * element2)[esize-1:0]; - Elem[result, e, esize] = product; - - V[d] = result; - -__instruction FMAX_Z_P_ZS__ - __encoding FMAX_Z_P_ZS__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - __opcode '01100101 xx011110 100xxx00 00xxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - bits(esize) imm = if i1 == '0' then Zeros() else FPOne('0'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMax(element1, imm, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_integer_crc - __encoding aarch64_integer_crc - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field C 12 +: 1 - __field sz 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011010 110xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveCRCExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sf == '1' && sz != '11' then UNDEFINED; - if sf == '0' && sz == '11' then UNDEFINED; - integer size = 8 << UInt(sz); // 2-bit size field -> 8, 16, 32, 64 - boolean crc32c = (C == '1'); - - __execute - bits(32) acc = X[n]; // accumulator - bits(size) val = X[m]; // input value - bits(32) poly = (if crc32c then 0x1EDC6F41 else 0x04C11DB7)[31:0]; - - bits(32+size) tempacc = BitReverse(acc) : Zeros(size); - bits(size+32) tempval = BitReverse(val) : Zeros(32); - - // Poly32Mod2 on a bitstring does a polynomial Modulus over {0,1} operation - X[d] = BitReverse(Poly32Mod2(tempacc EOR tempval, poly)); - -__instruction SUDOT_Z_ZZZi_S - __encoding SUDOT_Z_ZZZi_S - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 101xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveInt8MatMulExt() then UNDEFINED; - integer esize = 32; - integer index = UInt(i2); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer eltspersegment = 128 DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = segmentbase + index; - bits(esize) res = Elem[operand3, e, esize]; - for i = 0 to 3 - integer element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - integer element2 = UInt(Elem[operand2, 4 * s + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = res; - - Z[da] = result; - -__instruction ST4W_Z_P_BR_Contiguous - __encoding ST4W_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 011xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction ZIP2_P_PP__ - __encoding ZIP2_P_PP__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 16 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 xx10xxxx 0100010x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - integer part = 1; - - __encoding ZIP1_P_PP__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 16 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 xx10xxxx 0100000x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - integer part = 0; - - __execute - CheckSVEEnabled(); - integer pairs = VL DIV (esize * 2); - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - integer base = part * pairs; - for p = 0 to pairs-1 - Elem[result, 2*p+0, esize DIV 8] = Elem[operand1, base+p, esize DIV 8]; - Elem[result, 2*p+1, esize DIV 8] = Elem[operand2, base+p, esize DIV 8]; - - P[d] = result; - -__instruction aarch64_vector_crypto_sm3_sm3tt1a - __encoding aarch64_vector_crypto_sm3_sm3tt1a - __instruction_set A64 - __field Rm 16 +: 5 - __field imm2 12 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 010xxxxx 10xx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer i = UInt(imm2); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Vd = V[d]; - bits(32) WjPrime; - bits(128) result; - bits(32) TT1; - bits(32) SS2; - - WjPrime = Elem[Vm,i,32]; - SS2 = Vn[127:96] EOR ROL(Vd[127:96],12); - TT1 = Vd[63:32] EOR (Vd[127:96] EOR Vd[95:64]); - TT1 = (TT1 + Vd[31:0] + SS2 + WjPrime)[31:0]; - result[31:0] = Vd[63:32]; - result[63:32] = ROL(Vd[95:64],9); - result[95:64] = Vd[127:96]; - result[127:96] = TT1; - V[d] = result; - -__instruction ASR_Z_ZW__ - __encoding ASR_Z_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(64) element2 = Elem[operand2, (e * esize) DIV 64, 64]; - integer shift = Min(UInt(element2), esize); - Elem[result, e, esize] = ASR(element1, shift); - - Z[d] = result; - -__instruction FADD_Z_P_ZZ__ - __encoding FADD_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx000000 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPAdd(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction SUB_Z_ZI__ - __encoding SUB_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx100001 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer imm = UInt(imm8); - if sh == '1' then imm = imm << 8; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - Elem[result, e, esize] = element1 - imm; - - Z[dn] = result; - -__instruction LSR_Z_P_ZW__ - __encoding LSR_Z_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx011001 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(64) element2 = Elem[operand2, (e * esize) DIV 64, 64]; - integer shift = Min(UInt(element2), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = LSR(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_diff - __encoding aarch64_vector_arithmetic_binary_uniform_diff - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0111x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean accumulate = (ac == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - bits(esize) absdiff; - - result = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - absdiff = Abs(element1 - element2)[esize-1:0]; - Elem[result, e, esize] = Elem[result, e, esize] + absdiff; - V[d] = result; - -__instruction EOR_Z_ZZ__ - __encoding EOR_Z_ZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 101xxxxx 001100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - - Z[d] = operand1 EOR operand2; - -__instruction aarch64_vector_shift_right_narrow_uniform_sisd - __encoding aarch64_vector_shift_right_narrow_uniform_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 1001x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_shift_right_narrow_uniform_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 1001x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize*2) operand = V[n]; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = (Int(Elem[operand, e, 2*esize], unsigned) + round_const) >> shift; - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction ABS_Z_P_Z__ - __encoding ABS_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx010110 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - integer element = SInt(Elem[operand, e, esize]); - if ElemP[mask, e, esize] == '1' then - element = Abs(element); - Elem[result, e, esize] = element[esize-1:0]; - - Z[d] = result; - -__instruction SQDECH_Z_ZS__ - __encoding SQDECH_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 0110xxxx 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_integer_arithmetic_mul_widening_32_64 - __encoding aarch64_integer_arithmetic_mul_widening_32_64 - __instruction_set A64 - __field U 23 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '10011011 x01xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer a = UInt(Ra); - integer destsize = 64; - integer datasize = 32; - boolean sub_op = (o0 == '1'); - boolean unsigned = (U == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(destsize) operand3 = X[a]; - - integer result; - - if sub_op then - result = Int(operand3, unsigned) - (Int(operand1, unsigned) * Int(operand2, unsigned)); - else - result = Int(operand3, unsigned) + (Int(operand1, unsigned) * Int(operand2, unsigned)); - - X[d] = result[63:0]; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction LDNF1B_Z_P_BI_U8 - __encoding LDNF1B_Z_P_BI_U8 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0001xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LDNF1B_Z_P_BI_U16 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0011xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LDNF1B_Z_P_BI_U32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0101xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LDNF1B_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0111xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_single - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_single - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer maxmin; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - maxmin = if minimum then Min(element1, element2) else Max(element1, element2); - Elem[result, e, esize] = maxmin[esize-1:0]; - - V[d] = result; - -__instruction aarch64_integer_arithmetic_mul_uniform_add_sub - __encoding aarch64_integer_arithmetic_mul_uniform_add_sub - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011011 000xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer a = UInt(Ra); - integer destsize = if sf == '1' then 64 else 32; - integer datasize = destsize; - boolean sub_op = (o0 == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(destsize) operand3 = X[a]; - - integer result; - - if sub_op then - result = UInt(operand3) - (UInt(operand1) * UInt(operand2)); - else - result = UInt(operand3) + (UInt(operand1) * UInt(operand2)); - - X[d] = result[destsize-1:0]; - -__instruction LD4D_Z_P_BR_Contiguous - __encoding LD4D_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 111xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_transfer_vector_permute_transpose - __encoding aarch64_vector_transfer_vector_permute_transpose - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx0xxxxx 0x1010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer part = UInt(op); - integer pairs = elements DIV 2; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - for p = 0 to pairs-1 - Elem[result, 2*p+0, esize] = Elem[operand1, 2*p+part, esize]; - Elem[result, 2*p+1, esize] = Elem[operand2, 2*p+part, esize]; - - V[d] = result; - -__instruction aarch64_branch_unconditional_register - __encoding aarch64_branch_unconditional_register - __instruction_set A64 - __field Z 24 +: 1 - __field op 21 +: 2 - __field A 11 +: 1 - __field M 10 +: 1 - __field Rn 5 +: 5 - __field Rm 0 +: 5 - __opcode '1101011x 0xx11111 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - BranchType branch_type; - integer m = UInt(Rm); - boolean pac = (A == '1'); - boolean use_key_a = (M == '0'); - boolean source_is_sp = ((Z == '1') && (m == 31)); - - if !pac && m != 0 then - UNDEFINED; - elsif pac && !HavePACExt() then - UNDEFINED; - - case op of - when '00' branch_type = BranchType_INDIR; - when '01' branch_type = BranchType_INDCALL; - when '10' branch_type = BranchType_RET; - otherwise UNDEFINED; - - if pac then - if Z == '0' && m != 31 then - UNDEFINED; - - if branch_type == BranchType_RET then - if n != 31 then UNDEFINED; - n = 30; - source_is_sp = TRUE; - - __execute - bits(64) target = X[n]; - boolean auth_then_branch = TRUE; - - if pac then - bits(64) modifier = if source_is_sp then SP[] else X[m]; - - if use_key_a then - target = AuthIA(target, modifier, auth_then_branch); - else - target = AuthIB(target, modifier, auth_then_branch); - - if branch_type == BranchType_INDCALL then X[30] = PC[] + 4; - - // Value in BTypeNext will be used to set PSTATE.BTYPE - case branch_type of - when BranchType_INDIR // BR, BRAA, BRAB, BRAAZ, BRABZ - if InGuardedPage then - if n == 16 || n == 17 then - BTypeNext = '01'; - else - BTypeNext = '11'; - else - BTypeNext = '01'; - when BranchType_INDCALL // BLR, BLRAA, BLRAB, BLRAAZ, BLRABZ - BTypeNext = '10'; - when BranchType_RET // RET, RETAA, RETAB - BTypeNext = '00'; - - BranchTo(target, branch_type); - -__instruction aarch64_vector_arithmetic_unary_cmp_fp16_lessthan_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_lessthan_sisd - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 11111000 111010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - CompareOp comparison = CompareOp_LT; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_lessthan_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 1x100000 111010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison = CompareOp_LT; - - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_lessthan_simd - __instruction_set A64 - __field Q 30 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 11111000 111010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison = CompareOp_LT; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_lessthan_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 1x100000 111010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison = CompareOp_LT; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) zero = FPZero('0'); - bits(esize) element; - boolean test_passed; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - case comparison of - when CompareOp_GT test_passed = FPCompareGT(element, zero, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element, zero, FPCR); - when CompareOp_EQ test_passed = FPCompareEQ(element, zero, FPCR); - when CompareOp_LE test_passed = FPCompareGE(zero, element, FPCR); - when CompareOp_LT test_passed = FPCompareGT(zero, element, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_vector_crypto_sha3op_sha1_hash_choose - __encoding aarch64_vector_crypto_sha3op_sha1_hash_choose - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 000xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if !HaveSHA1Ext() then UNDEFINED; - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) X = V[d]; - bits(32) Y = V[n]; // Note: 32 not 128 bits wide - bits(128) W = V[m]; - bits(32) t; - - for e = 0 to 3 - t = SHAchoose(X[63:32], X[95:64], X[127:96]); - Y = Y + ROL(X[31:0], 5) + t + Elem[W, e, 32]; - X[63:32] = ROL(X[63:32], 30); - [Y, X] = ROL(Y : X, 32); - V[d] = X; - -__instruction LD1ROH_Z_P_BI_U16 - __encoding LD1ROH_Z_P_BI_U16 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1010xxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - if VL < 256 then UNDEFINED; - integer elements = 256 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low bits only - bits(256) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * 32; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = ZeroExtend(Replicate(result, VL DIV 256), VL); - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_integer_pac_pacga_dp_2src - __encoding aarch64_integer_pac_pacga_dp_2src - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '10011010 110xxxxx 001100xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if !HavePACExt() then - UNDEFINED; - - if m == 31 then source_is_sp = TRUE; - - __execute - if source_is_sp then - X[d] = AddPACGA(X[n], SP[]); - else - X[d] = AddPACGA(X[n], X[m]); - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_double_sisd - __encoding aarch64_vector_arithmetic_binary_disparate_mul_double_sisd - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx1xxxxx 110100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '00' || size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - __encoding aarch64_vector_arithmetic_binary_disparate_mul_double_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 110100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '00' || size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - boolean sat; - - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element2 = SInt(Elem[operand2, e, esize]); - (product, sat) = SignedSatQ(2 * element1 * element2, 2*esize); - Elem[result, e, 2*esize] = product; - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction SMIN_Z_P_ZZ__ - __encoding SMIN_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx001010 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer minimum = Min(element1, element2); - Elem[result, e, esize] = minimum[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_long - __encoding aarch64_vector_arithmetic_binary_element_mul_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 xxxxxxxx 1010x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - - element2 = Int(Elem[operand2, index, esize], unsigned); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - Elem[result, e, 2*esize] = product; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_add_saturating_sisd - __encoding aarch64_vector_arithmetic_unary_add_saturating_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 001110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_add_saturating_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 001110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - bits(datasize) operand2 = V[d]; - integer op1; - integer op2; - boolean sat; - - for e = 0 to elements-1 - op1 = Int(Elem[operand, e, esize], !unsigned); - op2 = Int(Elem[operand2, e, esize], unsigned); - (Elem[result, e, esize], sat) = SatQ(op1 + op2, esize, unsigned); - if sat then FPSR.QC = '1'; - V[d] = result; - -__instruction aarch64_memory_vector_multiple_no_wb - __encoding aarch64_memory_vector_multiple_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 0x000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_multiple_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << UInt(size); - integer elements = datasize DIV esize; - - integer rpt; // number of iterations - integer selem; // structure elements - - case opcode of - when '0000' rpt = 1; selem = 4; // LD/ST4 (4 registers) - when '0010' rpt = 4; selem = 1; // LD/ST1 (4 registers) - when '0100' rpt = 1; selem = 3; // LD/ST3 (3 registers) - when '0110' rpt = 3; selem = 1; // LD/ST1 (3 registers) - when '0111' rpt = 1; selem = 1; // LD/ST1 (1 register) - when '1000' rpt = 1; selem = 2; // LD/ST2 (2 registers) - when '1010' rpt = 2; selem = 1; // LD/ST1 (2 registers) - otherwise UNDEFINED; - - // .1D format only permitted with LD1 & ST1 - if size:Q == '110' && selem != 1 then UNDEFINED; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(datasize) rval; - integer tt; - constant integer ebytes = esize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - for r = 0 to rpt-1 - for e = 0 to elements-1 - tt = (t + r) MOD 32; - for s = 0 to selem-1 - rval = V[tt]; - if memop == MemOp_LOAD then - Elem[rval, e, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[tt] = rval; - else // memop == MemOp_STORE - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, e, esize]; - offs = offs + ebytes; - tt = (tt + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_wide - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_wide - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 00x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand1 = V[n]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, 2*esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - Elem[result, e, 2*esize] = sum[2*esize-1:0]; - - V[d] = result; - -__instruction BFMLALT_Z_ZZZ__ - __encoding BFMLALT_Z_ZZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 111xxxxx 100001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 32; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(32) element1 = Elem[operand1, 2 * e + 1, 16] : Zeros(16); - bits(32) element2 = Elem[operand2, 2 * e + 1, 16] : Zeros(16); - bits(32) element3 = Elem[operand3, e, 32]; - Elem[result, e, 32] = FPMulAdd(element3, element1, element2, FPCR); - - Z[da] = result; - -__instruction STNT1B_Z_P_BR_Contiguous - __encoding STNT1B_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 000xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(64) offset = X[m]; - bits(VL) src; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - src = Z[t]; - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_STREAM] = Elem[src, e, esize]; - offset = offset + 1; - -__instruction SUB_Z_P_ZZ__ - __encoding SUB_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx000001 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element1 - element2; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_pair - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_pair - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1010x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - integer element1; - integer element2; - integer maxmin; - - for e = 0 to elements-1 - element1 = Int(Elem[concat, 2*e, esize], unsigned); - element2 = Int(Elem[concat, (2*e)+1, esize], unsigned); - maxmin = if minimum then Min(element1, element2) else Max(element1, element2); - Elem[result, e, esize] = maxmin[esize-1:0]; - - V[d] = result; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_vector_arithmetic_binary_uniform_shift_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - if S == '0' && size != '11' then UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer round_const = 0; - integer shift; - integer element; - boolean sat; - - for e = 0 to elements-1 - shift = SInt(Elem[operand2, e, esize][7:0]); - if rounding then - round_const = 1 << (-shift - 1); // 0 for left shift, 2^(n-1) for right shift - element = (Int(Elem[operand1, e, esize], unsigned) + round_const) << shift; - if saturating then - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - else - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_diff - __encoding aarch64_vector_arithmetic_binary_disparate_diff - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 01x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean accumulate = (op == '0'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) absdiff; - - result = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - absdiff = Abs(element1 - element2)[2*esize-1:0]; - Elem[result, e, 2*esize] = Elem[result, e, 2*esize] + absdiff; - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_double_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_double_sisd - __instruction_set A64 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 xxxxxxxx 1011x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - __encoding aarch64_vector_arithmetic_binary_element_mul_double_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 xxxxxxxx 1011x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - boolean sat; - - element2 = SInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - (product, sat) = SignedSatQ(2 * element1 * element2, 2*esize); - Elem[result, e, 2*esize] = product; - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction FMAXNM_Z_P_ZS__ - __encoding FMAXNM_Z_P_ZS__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - __opcode '01100101 xx011100 100xxx00 00xxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - bits(esize) imm = if i1 == '0' then Zeros() else FPOne('0'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMaxNum(element1, imm, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_integer_ins_ext_extract_immediate - __encoding aarch64_integer_ins_ext_extract_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field N 22 +: 1 - __field Rm 16 +: 5 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0010011 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - integer lsb; - - if N != sf then UNDEFINED; - if sf == '0' && imms[5] == '1' then UNDEFINED; - lsb = UInt(imms); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(2*datasize) concat = operand1:operand2; - - result = concat[lsb+datasize-1:lsb]; - - X[d] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction ST1H_Z_P_BI__ - __encoding ST1H_Z_P_BI__ - __instruction_set A64 - __field size 21 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 1xx0xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8 << UInt(size); - integer msize = 16; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) src = Z[t]; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - addr = addr + mbytes; - -__instruction FMLA_Z_ZZZi_H - __encoding FMLA_Z_ZZZi_H - __instruction_set A64 - __field i3h 22 +: 1 - __field i3l 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 0x1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer index = UInt(i3h:i3l); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = FALSE; - boolean op3_neg = FALSE; - - __encoding FMLA_Z_ZZZi_S - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 101xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer index = UInt(i2); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = FALSE; - boolean op3_neg = FALSE; - - __encoding FMLA_Z_ZZZi_D - __instruction_set A64 - __field i1 20 +: 1 - __field Zm 16 +: 4 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 111xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer index = UInt(i1); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = FALSE; - boolean op3_neg = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer eltspersegment = 128 DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result = Z[da]; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = segmentbase + index; - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, s, esize]; - bits(esize) element3 = Elem[result, e, esize]; - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - - Z[da] = result; - -__instruction aarch64_vector_transfer_vector_table - __encoding aarch64_vector_transfer_vector_table - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field len 13 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 000xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 8; - integer regs = UInt(len) + 1; - boolean is_tbl = (op == '0'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) indices = V[m]; - bits(128*regs) table = Zeros(); - bits(datasize) result; - integer index; - - // Create table from registers - for i = 0 to regs - 1 - table[128*i+127:128*i] = V[n]; - n = (n + 1) MOD 32; - - result = if is_tbl then Zeros() else V[d]; - for i = 0 to elements - 1 - index = UInt(Elem[indices, i, 8]); - if index < 16 * regs then - Elem[result, i, 8] = Elem[table, index, 8]; - - V[d] = result; - -__instruction aarch64_vector_crypto_sha3_rax1 - __encoding aarch64_vector_crypto_sha3_rax1 - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 011xxxxx 100011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSHA3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - V[d] = Vn EOR (ROL(Vm[127:64],1):ROL(Vm[63:0], 1)); - -__instruction INSR_Z_V__ - __encoding INSR_Z_V__ - __instruction_set A64 - __field size 22 +: 2 - __field Vm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000101 xx110100 001110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer m = UInt(Vm); - - __execute - CheckSVEEnabled(); - bits(VL) dest = Z[dn]; - bits(esize) src = V[m]; - Z[dn] = dest[VL-esize-1:0] : src; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_memory_exclusive_pair - __encoding aarch64_memory_exclusive_pair - __instruction_set A64 - __field sz 30 +: 1 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '1x001000 0x1xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = TRUE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 32 << UInt(sz); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_complex - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_complex - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field rot 13 +: 2 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 xxxxxxxx 0xx1x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFCADDExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(M:Rm); - if size == '00' || size == '11' then UNDEFINED; - if size == '01' then index = UInt(H:L); - if size == '10' then index = UInt(H); - integer esize = 8 << UInt(size); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - if size == '10' && (L == '1' || Q == '0') then UNDEFINED; - if size == '01' && H == '1' && Q=='0' then UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - - for e = 0 to (elements DIV 2) -1 - case rot of - when '00' - element1 = Elem[operand2, index*2, esize]; - element2 = Elem[operand1, e*2, esize]; - element3 = Elem[operand2, index*2+1, esize]; - element4 = Elem[operand1, e*2, esize]; - when '01' - element1 = FPNeg(Elem[operand2, index*2+1, esize]); - element2 = Elem[operand1, e*2+1, esize]; - element3 = Elem[operand2, index*2, esize]; - element4 = Elem[operand1, e*2+1, esize]; - when '10' - element1 = FPNeg(Elem[operand2, index*2,esize]); - element2 = Elem[operand1, e*2, esize]; - element3 = FPNeg(Elem[operand2, index*2+1, esize]); - element4 = Elem[operand1, e*2, esize]; - when '11' - element1 = Elem[operand2, index*2+1, esize]; - element2 = Elem[operand1, e*2+1, esize]; - element3 = FPNeg(Elem[operand2, index*2, esize]); - element4 = Elem[operand1, e*2+1, esize]; - - Elem[result, e*2, esize] = FPMulAdd(Elem[operand3, e*2, esize], element2, element1, FPCR); - Elem[result, e*2+1, esize] = FPMulAdd(Elem[operand3, e*2+1, esize], element4, element3, FPCR); - - V[d] = result; - -__instruction FNMSB_Z_P_ZZZ__ - __encoding FNMSB_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Za 16 +: 5 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx1xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - integer a = UInt(Za); - boolean op1_neg = FALSE; - boolean op3_neg = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[a]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - bits(esize) element3 = Elem[operand3, e, esize]; - - if ElemP[mask, e, esize] == '1' then - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction PRFH_I_P_BR_S - __encoding PRFH_I_P_BR_S - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000100 100xxxxx 110xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer esize = 16; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 1; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) offset = X[m]; - bits(64) addr; - - if n == 31 then - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + (UInt(offset) << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - offset = offset + 1; - -__instruction aarch64_vector_arithmetic_binary_uniform_diff - __encoding aarch64_vector_arithmetic_binary_uniform_diff - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0111x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean accumulate = (ac == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - bits(esize) absdiff; - - result = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - absdiff = Abs(element1 - element2)[esize-1:0]; - Elem[result, e, esize] = Elem[result, e, esize] + absdiff; - V[d] = result; - -__instruction ST3D_Z_P_BI_Contiguous - __encoding ST3D_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 1101xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction FMAXNMV_V_P_Z__ - __encoding FMAXNMV_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '01100101 xx000100 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(esize) identity = FPDefaultNaN(); - - V[d] = ReducePredicated(ReduceOp_FMAXNUM, operand, mask, identity); - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction aarch64_vector_arithmetic_unary_extract_sat_sisd - __encoding aarch64_vector_arithmetic_unary_extract_sat_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 010010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer part = 0; - integer elements = 1; - - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_extract_sat_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 010010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand = V[n]; - bits(datasize) result; - bits(2*esize) element; - boolean sat; - - for e = 0 to elements-1 - element = Elem[operand, e, 2*esize]; - (Elem[result, e, esize], sat) = SatQ(Int(element, unsigned), esize, unsigned); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction aarch64_vector_reduce_add_sisd - __encoding aarch64_vector_reduce_add_sisd - __instruction_set A64 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx110001 101110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '11' then UNDEFINED; - - integer esize = 8 << UInt(size); - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = ReduceOp_ADD; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction UDOT_Z_ZZZi_S - __encoding UDOT_Z_ZZZi_S - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 101xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer index = UInt(i2); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __encoding UDOT_Z_ZZZi_D - __instruction_set A64 - __field i1 20 +: 1 - __field Zm 16 +: 4 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 111xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer index = UInt(i1); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer eltspersegment = 128 DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = segmentbase + index; - bits(esize) res = Elem[operand3, e, esize]; - for i = 0 to 3 - integer element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - integer element2 = UInt(Elem[operand2, 4 * s + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = res; - - Z[da] = result; - -__instruction aarch64_vector_crypto_sm4_sm4enckey - __encoding aarch64_vector_crypto_sm4_sm4enckey - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 011xxxxx 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM4Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(32) intval; - bits(8) sboxout; - bits(128) result; - bits(32) const; - bits(128) roundresult; - - roundresult = V[n]; - for index = 0 to 3 - const = Elem[Vm,index,32]; - - intval = roundresult[127:96] EOR roundresult[95:64] EOR roundresult[63:32] EOR const; - - for i = 0 to 3 - Elem[intval,i,8] = Sbox(Elem[intval,i,8]); - - intval = intval EOR ROL(intval,13) EOR ROL(intval,23); - intval = intval EOR roundresult[31:0]; - - roundresult[31:0] = roundresult[63:32]; - roundresult[63:32] = roundresult[95:64]; - roundresult[95:64] = roundresult[127:96]; - roundresult[127:96] = intval; - V[d] = roundresult; - -__instruction aarch64_float_arithmetic_unary - __encoding aarch64_float_arithmetic_unary - __instruction_set A64 - __field ftype 22 +: 2 - __field opc 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10000x x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - FPUnaryOp fpop; - case opc of - when '00' fpop = FPUnaryOp_MOV; - when '01' fpop = FPUnaryOp_ABS; - when '10' fpop = FPUnaryOp_NEG; - when '11' fpop = FPUnaryOp_SQRT; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - case fpop of - when FPUnaryOp_MOV result = operand; - when FPUnaryOp_ABS result = FPAbs(operand); - when FPUnaryOp_NEG result = FPNeg(operand); - when FPUnaryOp_SQRT result = FPSqrt(operand, FPCR); - - V[d] = result; - -__instruction ST3D_Z_P_BR_Contiguous - __encoding ST3D_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 110xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_long - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 xxxxxxxx 0x10x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - - element2 = Int(Elem[operand2, index, esize], unsigned); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - if sub_op then - Elem[result, e, 2*esize] = Elem[operand3, e, 2*esize] - product; - else - Elem[result, e, 2*esize] = Elem[operand3, e, 2*esize] + product; - - V[d] = result; - -__instruction aarch64_memory_pair_general_post_idx - __encoding aarch64_memory_pair_general_post_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101000 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - - __encoding aarch64_memory_pair_general_pre_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101001 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - - __encoding aarch64_memory_pair_general_offset - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101001 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_NORMAL; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if L:opc[0] == '01' || opc == '11' then UNDEFINED; - boolean signed = (opc[0] != '0'); - integer scale = 2 + UInt(opc[1]); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - boolean wb_unknown = FALSE; - - if memop == MemOp_LOAD && wback && (t == n || t2 == n) && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && (t == n || t2 == n) && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is pre-writeback - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown && t == n then - data1 = bits(datasize) UNKNOWN; - else - data1 = X[t]; - if rt_unknown && t2 == n then - data2 = bits(datasize) UNKNOWN; - else - data2 = X[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - if signed then - X[t] = SignExtend(data1, 64); - X[t2] = SignExtend(data2, 64); - else - X[t] = data1; - X[t2] = data2; - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_uniform_shift_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - if S == '0' && size != '11' then UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer round_const = 0; - integer shift; - integer element; - boolean sat; - - for e = 0 to elements-1 - shift = SInt(Elem[operand2, e, esize][7:0]); - if rounding then - round_const = 1 << (-shift - 1); // 0 for left shift, 2^(n-1) for right shift - element = (Int(Elem[operand1, e, esize], unsigned) + round_const) << shift; - if saturating then - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - else - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_memory_pair_general_post_idx - __encoding aarch64_memory_pair_general_post_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101000 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - - __encoding aarch64_memory_pair_general_pre_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101001 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - - __encoding aarch64_memory_pair_general_offset - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101001 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_NORMAL; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if L:opc[0] == '01' || opc == '11' then UNDEFINED; - boolean signed = (opc[0] != '0'); - integer scale = 2 + UInt(opc[1]); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - boolean wb_unknown = FALSE; - - if memop == MemOp_LOAD && wback && (t == n || t2 == n) && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && (t == n || t2 == n) && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is pre-writeback - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown && t == n then - data1 = bits(datasize) UNKNOWN; - else - data1 = X[t]; - if rt_unknown && t2 == n then - data2 = bits(datasize) UNKNOWN; - else - data2 = X[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - if signed then - X[t] = SignExtend(data1, 64); - X[t2] = SignExtend(data2, 64); - else - X[t] = data1; - X[t2] = data2; - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_unary_extract_sqxtun_sisd - __encoding aarch64_vector_arithmetic_unary_extract_sqxtun_sisd - __instruction_set A64 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 xx100001 001010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer part = 0; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_unary_extract_sqxtun_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx100001 001010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand = V[n]; - bits(datasize) result; - bits(2*esize) element; - boolean sat; - - for e = 0 to elements-1 - element = Elem[operand, e, 2*esize]; - (Elem[result, e, esize], sat) = UnsignedSatQ(SInt(element), esize); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction aarch64_system_sysops - __encoding aarch64_system_sysops - __instruction_set A64 - __field L 21 +: 1 - __field op1 16 +: 3 - __field CRn 12 +: 4 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __field Rt 0 +: 5 - __opcode '11010101 00x01xxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - AArch64.CheckSystemAccess('01', op1, CRn, CRm, op2, Rt, L); - - integer t = UInt(Rt); - - integer sys_op0 = 1; - integer sys_op1 = UInt(op1); - integer sys_op2 = UInt(op2); - integer sys_crn = UInt(CRn); - integer sys_crm = UInt(CRm); - boolean has_result = (L == '1'); - - __execute - if has_result then - // No architecturally defined instructions here. - X[t] = AArch64.SysInstrWithResult(sys_op0, sys_op1, sys_crn, sys_crm, sys_op2); - else - AArch64.SysInstr(sys_op0, sys_op1, sys_crn, sys_crm, sys_op2, X[t]); - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction CPY_Z_O_I__ - __encoding CPY_Z_O_I__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 16 +: 4 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - __opcode '00000101 xx01xxxx 00xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer d = UInt(Zd); - boolean merging = FALSE; - integer imm = SInt(imm8); - if sh == '1' then imm = imm << 8; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) dest = Z[d]; - bits(VL) result; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = imm[esize-1:0]; - elsif merging then - Elem[result, e, esize] = Elem[dest, e, esize]; - else - Elem[result, e, esize] = Zeros(); - - Z[d] = result; - -__instruction REV_P_P__ - __encoding REV_P_P__ - __instruction_set A64 - __field size 22 +: 2 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 xx110100 0100000x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Pn); - integer d = UInt(Pd); - - __execute - CheckSVEEnabled(); - bits(PL) operand = P[n]; - bits(PL) result = Reverse(operand, esize DIV 8); - P[d] = result; - -__instruction BIC_Z_ZZ__ - __encoding BIC_Z_ZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 111xxxxx 001100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - - Z[d] = operand1 AND (NOT operand2); - -__instruction aarch64_vector_transfer_integer_insert - __encoding aarch64_vector_transfer_integer_insert - __instruction_set A64 - __field imm5 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01001110 000xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer size = LowestSetBit(imm5); - - if size > 3 then UNDEFINED; - integer index = UInt(imm5[4:size+1]); - - integer esize = 8 << size; - integer datasize = 128; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(esize) element = X[n]; - bits(datasize) result; - - result = V[d]; - Elem[result, index, esize] = element; - V[d] = result; - -__instruction LDFF1SW_Z_P_BR_S64 - __encoding LDFF1SW_Z_P_BR_S64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 100xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + UInt(offset) * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_CNOTFIRST]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_single - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_single - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer maxmin; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - maxmin = if minimum then Min(element1, element2) else Max(element1, element2); - Elem[result, e, esize] = maxmin[esize-1:0]; - - V[d] = result; - -__instruction LD4B_Z_P_BI_Contiguous - __encoding LD4B_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0110xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_integer_logical_shiftedreg - __encoding aarch64_integer_logical_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - boolean invert = (N == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - X[d] = result; - -__instruction aarch64_memory_exclusive_pair - __encoding aarch64_memory_exclusive_pair - __instruction_set A64 - __field sz 30 +: 1 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '1x001000 0x1xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = TRUE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 32 << UInt(sz); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_int - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_int - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 xxxxxxxx 0x00x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - integer element1; - integer element2; - bits(esize) product; - - element2 = UInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = UInt(Elem[operand1, e, esize]); - product = (element1 * element2)[esize-1:0]; - if sub_op then - Elem[result, e, esize] = Elem[operand3, e, esize] - product; - else - Elem[result, e, esize] = Elem[operand3, e, esize] + product; - V[d] = result; - -__instruction aarch64_vector_crypto_sha3_eor3 - __encoding aarch64_vector_crypto_sha3_eor3 - __instruction_set A64 - __field Rm 16 +: 5 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 000xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSHA3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer a = UInt(Ra); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Va = V[a]; - V[d] = Vn EOR Vm EOR Va; - -__instruction aarch64_vector_arithmetic_binary_uniform_div_fp16 - __encoding aarch64_vector_arithmetic_binary_uniform_div_fp16 - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 010xxxxx 001111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __encoding aarch64_vector_arithmetic_binary_uniform_div - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 0x1xxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPDiv(element1, element2, FPCR); - - V[d] = result; - -__instruction SQDECP_R_P_R_SX - __encoding SQDECP_R_P_R_SX - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101010 1000100x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQDECP_R_P_R_X - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101010 1000110x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(ssize) operand1 = X[dn]; - bits(PL) operand2 = P[m]; - bits(ssize) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - integer element = Int(operand1, unsigned); - (result, -) = SatQ(element - count, ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction PTEST__P_P__ - __encoding PTEST__P_P__ - __instruction_set A64 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __opcode '00100101 01010000 11xxxx0x xxx00000' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - - __execute - CheckSVEEnabled(); - bits(PL) mask = P[g]; - bits(PL) result = P[n]; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - -__instruction aarch64_integer_arithmetic_div - __encoding aarch64_integer_arithmetic_div - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field o1 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011010 110xxxxx 00001xxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean unsigned = (o1 == '0'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - integer result; - - if IsZero(operand2) then - result = 0; - else - result = RoundTowardsZero(Real(Int(operand1, unsigned)) / Real(Int(operand2, unsigned))); - - X[d] = result[datasize-1:0]; - -__instruction aarch64_system_exceptions_runtime_svc - __encoding aarch64_system_exceptions_runtime_svc - __instruction_set A64 - __field imm16 5 +: 16 - __opcode '11010100 000xxxxx xxxxxxxx xxx00001' - __guard TRUE - __decode - bits(16) imm = imm16; - - __execute - AArch64.CheckForSVCTrap(imm); - AArch64.CallSupervisor(imm); - -__instruction INCB_R_RS__ - __encoding INCB_R_RS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0011xxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding INCD_R_RS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1111xxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding INCH_R_RS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0111xxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding INCW_R_RS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1011xxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(64) operand1 = X[dn]; - - X[dn] = operand1 + (count * imm); - -__instruction LDFF1SH_Z_P_AI_S - __encoding LDFF1SH_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 101xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __encoding LDFF1SH_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 101xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction STNT1H_Z_P_BI_Contiguous - __encoding STNT1H_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 1001xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - constant integer mbytes = esize DIV 8; - bits(VL) src; - bits(PL) mask = P[g]; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - src = Z[t]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_STREAM] = Elem[src, e, esize]; - addr = addr + mbytes; - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_dmacc_sisd - __encoding aarch64_vector_arithmetic_binary_disparate_mul_dmacc_sisd - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx1xxxxx 10x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '00' || size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - boolean sub_op = (o1 == '1'); - - __encoding aarch64_vector_arithmetic_binary_disparate_mul_dmacc_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 10x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '00' || size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - integer accum; - boolean sat1; - boolean sat2; - - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element2 = SInt(Elem[operand2, e, esize]); - (product, sat1) = SignedSatQ(2 * element1 * element2, 2*esize); - if sub_op then - accum = SInt(Elem[operand3, e, 2*esize]) - SInt(product); - else - accum = SInt(Elem[operand3, e, 2*esize]) + SInt(product); - (Elem[result, e, 2*esize], sat2) = SignedSatQ(accum, 2*esize); - if sat1 || sat2 then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_memory_ordered_rcpc - __encoding aarch64_memory_ordered_rcpc - __instruction_set A64 - __field size 30 +: 2 - __field Rs 16 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 101xxxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = AccType_ORDERED; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_reduce_int_max - __encoding aarch64_vector_reduce_int_max - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 16 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx11000x 101010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '100' then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean min = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - integer maxmin; - integer element; - - maxmin = Int(Elem[operand, 0, esize], unsigned); - for e = 1 to elements-1 - element = Int(Elem[operand, e, esize], unsigned); - maxmin = if min then Min(maxmin, element) else Max(maxmin, element); - - V[d] = maxmin[esize-1:0]; - -__instruction STR_Z_BI__ - __encoding STR_Z_BI__ - __instruction_set A64 - __field imm9h 16 +: 6 - __field imm9l 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 10xxxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer imm = SInt(imm9h:imm9l); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 8; - bits(VL) src; - bits(64) base; - integer offset = imm * elements; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - src = Z[t]; - boolean aligned = AArch64.CheckAlignment(base + offset, 16, AccType_NORMAL, TRUE); - for e = 0 to elements-1 - AArch64.MemSingle[base + offset, 1, AccType_NORMAL, aligned] = Elem[src, e, 8]; - offset = offset + 1; - -__instruction PRFH_I_P_AI_S - __encoding PRFH_I_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000100 100xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 1; - integer offset = UInt(imm5); - - __encoding PRFH_I_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 100xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 1; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) base; - bits(64) addr; - base = Z[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + (offset << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - -__instruction LD4B_Z_P_BR_Contiguous - __encoding LD4B_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 011xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction LD3B_Z_P_BR_Contiguous - __encoding LD3B_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 010xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_shift_conv_float_sisd - __encoding aarch64_vector_shift_conv_float_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '000x' || (immh == '001x' && !HaveFP16Ext()) then UNDEFINED; - integer esize = if immh == '1xxx' then 64 else if immh == '01xx' then 32 else 16; - integer datasize = esize; - integer elements = 1; - - integer fracbits = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - FPRounding rounding = FPRounding_ZERO; - - __encoding aarch64_vector_shift_conv_float_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh == '000x' || (immh == '001x' && !HaveFP16Ext()) then UNDEFINED; - if immh[3]:Q == '10' then UNDEFINED; - integer esize = if immh == '1xxx' then 64 else if immh == '01xx' then 32 else 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer fracbits = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - FPRounding rounding = FPRounding_ZERO; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, fracbits, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction UQDECB_R_RS_UW - __encoding UQDECB_R_RS_UW - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0010xxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQDECB_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0011xxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 - (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction PRFH_I_P_BI_S - __encoding PRFH_I_P_BI_S - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000101 11xxxxxx 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 1; - integer offset = SInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) addr; - - if n == 31 then - base = SP[]; - else - base = X[n]; - - addr = base + ((offset * elements) << scale); - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Hint_Prefetch(addr, pref_hint, level, stream); - addr = addr + (1 << scale); - -__instruction aarch64_integer_tags_mcsettagandzeroarray - __encoding aarch64_integer_tags_mcsettagandzeroarray - __instruction_set A64 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 00100000 000000xx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Xt); - integer n = UInt(Xn); - - __execute - if PSTATE.EL == EL0 then - UNDEFINED; - - bits(64) data = X[t]; - bits(4) tag = data[3:0]; - bits(64) address; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - integer size = 4*(2^(UInt(DCZID_EL0.BS))); - address = Align(address,size); - integer count = size >> LOG2_TAG_GRANULE; - - for i = 0 to count-1 - AArch64.MemTag[address, AccType_NORMAL] = tag; - Mem[address, TAG_GRANULE, AccType_NORMAL] = Zeros(8*TAG_GRANULE); - address = address + TAG_GRANULE; - -__instruction ASRD_Z_P_ZI__ - __encoding ASRD_Z_P_ZI__ - __instruction_set A64 - __field tszh 22 +: 2 - __field Pg 10 +: 3 - __field tszl 8 +: 2 - __field imm3 5 +: 3 - __field Zdn 0 +: 5 - __opcode '00000100 xx000100 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - bits(4) tsize = tszh:tszl; - case tsize of - when '0000' UNDEFINED; - when '0001' esize = 8; - when '001x' esize = 16; - when '01xx' esize = 32; - when '1xxx' esize = 64; - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer shift = (2 * esize) - UInt(tsize:imm3); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = SInt(Elem[operand1, e, esize]); - if ElemP[mask, e, esize] == '1' then - if element1 < 0 then - element1 = element1 + ((1 << shift) - 1); - Elem[result, e, esize] = (element1 >> shift)[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_shift_right_narrow_logical - __encoding aarch64_vector_shift_right_narrow_logical - __instruction_set A64 - __field Q 30 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 0xxxxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize*2) operand = V[n]; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - for e = 0 to elements-1 - element = (UInt(Elem[operand, e, 2*esize]) + round_const) >> shift; - Elem[result, e, esize] = element[esize-1:0]; - - Vpart[d, part] = result; - -__instruction BRKB_P_P_P__ - __encoding BRKB_P_P_P__ - __instruction_set A64 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field M 4 +: 1 - __field Pd 0 +: 4 - __opcode '00100101 10010000 01xxxx0x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer d = UInt(Pd); - boolean merging = (M == '1'); - boolean setflags = FALSE; - - __encoding BRKBS_P_P_P_Z - __instruction_set A64 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 11010000 01xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer d = UInt(Pd); - boolean merging = FALSE; - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand = P[n]; - bits(PL) operand2 = P[d]; - boolean break = FALSE; - bits(PL) result; - - for e = 0 to elements-1 - boolean element = ElemP[operand, e, esize] == '1'; - if ElemP[mask, e, esize] == '1' then - break = break || element; - ElemP[result, e, esize] = if !break then '1' else '0'; - elsif merging then - ElemP[result, e, esize] = ElemP[operand2, e, esize]; - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction UMIN_Z_ZI__ - __encoding UMIN_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx101011 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - boolean unsigned = TRUE; - integer imm = Int(imm8, unsigned); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - Elem[result, e, esize] = Min(element1, imm)[esize-1:0]; - - Z[dn] = result; - -__instruction LD1ROB_Z_P_BR_Contiguous - __encoding LD1ROB_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 001xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - - __execute - CheckSVEEnabled(); - if VL < 256 then UNDEFINED; - integer elements = 256 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low bits only - bits(64) offset; - bits(256) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - offset = X[m]; - - addr = base + UInt(offset) * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = ZeroExtend(Replicate(result, VL DIV 256), VL); - -__instruction aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 11111000 110x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 1x100000 110x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 11111000 110x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 1x100000 110x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) zero = FPZero('0'); - bits(esize) element; - boolean test_passed; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - case comparison of - when CompareOp_GT test_passed = FPCompareGT(element, zero, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element, zero, FPCR); - when CompareOp_EQ test_passed = FPCompareEQ(element, zero, FPCR); - when CompareOp_LE test_passed = FPCompareGE(zero, element, FPCR); - when CompareOp_LT test_passed = FPCompareGT(zero, element, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction CNTB_R_S__ - __encoding CNTB_R_S__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rd 0 +: 5 - __opcode '00000100 0010xxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer d = UInt(Rd); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding CNTD_R_S__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rd 0 +: 5 - __opcode '00000100 1110xxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer d = UInt(Rd); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding CNTH_R_S__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rd 0 +: 5 - __opcode '00000100 0110xxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer d = UInt(Rd); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding CNTW_R_S__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rd 0 +: 5 - __opcode '00000100 1010xxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer d = UInt(Rd); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - - X[d] = (count * imm)[63:0]; - -__instruction aarch64_memory_literal_general - __encoding aarch64_memory_literal_general - __instruction_set A64 - __field opc 30 +: 2 - __field imm19 5 +: 19 - __field Rt 0 +: 5 - __opcode 'xx011000 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - MemOp memop = MemOp_LOAD; - boolean signed = FALSE; - integer size; - bits(64) offset; - - case opc of - when '00' - size = 4; - when '01' - size = 8; - when '10' - size = 4; - signed = TRUE; - when '11' - memop = MemOp_PREFETCH; - - offset = SignExtend(imm19:'00', 64); - boolean tag_checked = FALSE; - - __execute - bits(64) address = PC[] + offset; - bits(size*8) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - case memop of - when MemOp_LOAD - data = Mem[address, size, AccType_NORMAL]; - if signed then - X[t] = SignExtend(data, 64); - else - X[t] = data; - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - -__instruction aarch64_vector_arithmetic_unary_rev - __encoding aarch64_vector_arithmetic_unary_rev - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 000x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - // size=esize: B(0), H(1), S(1), D(S) - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - - // op=REVx: 64(0), 32(1), 16(2) - bits(2) op = o0:U; - - // => op+size: - // 64+B = 0, 64+H = 1, 64+S = 2, 64+D = X - // 32+B = 1, 32+H = 2, 32+S = X, 32+D = X - // 16+B = 2, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - // => 3-(op+size) (index bits in group) - // 64/B = 3, 64+H = 2, 64+S = 1, 64+D = X - // 32+B = 2, 32+H = 1, 32+S = X, 32+D = X - // 16+B = 1, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - - // index bits within group: 1, 2, 3 - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - - integer containers = datasize DIV container_size; - integer elements_per_container = container_size DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element = 0; - integer rev_element; - for c = 0 to containers-1 - rev_element = element + elements_per_container - 1; - for e = 0 to elements_per_container-1 - Elem[result, rev_element, esize] = Elem[operand, element, esize]; - element = element + 1; - rev_element = rev_element - 1; - - V[d] = result; - -__instruction UADDV_R_P_Z__ - __encoding UADDV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx000001 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - integer sum = 0; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer element = UInt(Elem[operand, e, esize]); - sum = sum + element; - - V[d] = sum[63:0]; - -__instruction aarch64_vector_arithmetic_binary_uniform_logical_and_orr - __encoding aarch64_vector_arithmetic_binary_uniform_logical_and_orr - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean invert = (size[0] == '1'); - LogicalOp op = if size[1] == '1' then LogicalOp_ORR else LogicalOp_AND; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND - result = operand1 AND operand2; - when LogicalOp_ORR - result = operand1 OR operand2; - - V[d] = result; - -__instruction FDIV_Z_P_ZZ__ - __encoding FDIV_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx001101 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPDiv(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 11111000 110x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 1x100000 110x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 11111000 110x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 1x100000 110x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) zero = FPZero('0'); - bits(esize) element; - boolean test_passed; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - case comparison of - when CompareOp_GT test_passed = FPCompareGT(element, zero, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element, zero, FPCR); - when CompareOp_EQ test_passed = FPCompareEQ(element, zero, FPCR); - when CompareOp_LE test_passed = FPCompareGE(zero, element, FPCR); - when CompareOp_LT test_passed = FPCompareGT(zero, element, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_vector_reduce_fp16_max_simd - __encoding aarch64_vector_reduce_fp16_max_simd - __instruction_set A64 - __field Q 30 +: 1 - __field o1 23 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 x0110000 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = if o1 == '1' then ReduceOp_FMIN else ReduceOp_FMAX; - - __encoding aarch64_vector_reduce_fp_max_simd - __instruction_set A64 - __field Q 30 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx110000 111110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q != '01' then UNDEFINED; - - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = if o1 == '1' then ReduceOp_FMIN else ReduceOp_FMAX; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction SUNPKHI_Z_Z__ - __encoding SUNPKHI_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx110001 001110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = FALSE; - boolean hi = TRUE; - - __encoding SUNPKLO_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx110000 001110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = FALSE; - boolean hi = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer hsize = esize DIV 2; - bits(VL) operand = Z[n]; - bits(VL) result; - - for e = 0 to elements-1 - bits(hsize) element = if hi then Elem[operand, e + elements, hsize] else Elem[operand, e, hsize]; - Elem[result, e, esize] = Extend(element, esize, unsigned); - - Z[d] = result; - -__instruction aarch64_float_arithmetic_round_frint - __encoding aarch64_float_arithmetic_round_frint - __instruction_set A64 - __field ftype 22 +: 2 - __field rmode 15 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1001xx x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean exact = FALSE; - FPRounding rounding; - case rmode of - when '0xx' rounding = FPDecodeRounding(rmode[1:0]); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundInt(operand, FPCR, rounding, exact); - - V[d] = result; - -__instruction LD1RW_Z_P_BI_U32 - __encoding LD1RW_Z_P_BI_U32 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 01xxxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __encoding LD1RW_Z_P_BI_U64 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 01xxxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - integer last = LastActiveElement(mask, esize); - if last >= 0 then - addr = base + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_literal_general - __encoding aarch64_memory_literal_general - __instruction_set A64 - __field opc 30 +: 2 - __field imm19 5 +: 19 - __field Rt 0 +: 5 - __opcode 'xx011000 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - MemOp memop = MemOp_LOAD; - boolean signed = FALSE; - integer size; - bits(64) offset; - - case opc of - when '00' - size = 4; - when '01' - size = 8; - when '10' - size = 4; - signed = TRUE; - when '11' - memop = MemOp_PREFETCH; - - offset = SignExtend(imm19:'00', 64); - boolean tag_checked = FALSE; - - __execute - bits(64) address = PC[] + offset; - bits(size*8) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - case memop of - when MemOp_LOAD - data = Mem[address, size, AccType_NORMAL]; - if signed then - X[t] = SignExtend(data, 64); - else - X[t] = data; - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_double_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_double_sisd - __instruction_set A64 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 xxxxxxxx 0x11x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - boolean sub_op = (o2 == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_double_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 xxxxxxxx 0x11x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - integer accum; - boolean sat1; - boolean sat2; - - element2 = SInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - (product, sat1) = SignedSatQ(2 * element1 * element2, 2*esize); - if sub_op then - accum = SInt(Elem[operand3, e, 2*esize]) - SInt(product); - else - accum = SInt(Elem[operand3, e, 2*esize]) + SInt(product); - (Elem[result, e, 2*esize], sat2) = SignedSatQ(accum, 2*esize); - if sat1 || sat2 then FPSR.QC = '1'; - - V[d] = result; - -__instruction SDOT_Z_ZZZ__ - __encoding SDOT_Z_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 xx0xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '0x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) res = Elem[operand3, e, esize]; - for i = 0 to 3 - integer element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - integer element2 = SInt(Elem[operand2, 4 * e + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = res; - - Z[da] = result; - -__instruction aarch64_vector_crypto_sha2op_sha1_hash - __encoding aarch64_vector_crypto_sha2op_sha1_hash - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 00101000 000010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - if !HaveSHA1Ext() then UNDEFINED; - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(32) operand = V[n]; // read element [0] only, [1-3] zeroed - V[d] = ROL(operand, 30); - -__instruction SMAX_Z_ZI__ - __encoding SMAX_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx101000 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - boolean unsigned = FALSE; - integer imm = Int(imm8, unsigned); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - Elem[result, e, esize] = Max(element1, imm)[esize-1:0]; - - Z[dn] = result; - -__instruction UDOT_Z_ZZZ__ - __encoding UDOT_Z_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 xx0xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '0x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) res = Elem[operand3, e, esize]; - for i = 0 to 3 - integer element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - integer element2 = UInt(Elem[operand2, 4 * e + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = res; - - Z[da] = result; - -__instruction aarch64_branch_unconditional_register - __encoding aarch64_branch_unconditional_register - __instruction_set A64 - __field Z 24 +: 1 - __field op 21 +: 2 - __field A 11 +: 1 - __field M 10 +: 1 - __field Rn 5 +: 5 - __field Rm 0 +: 5 - __opcode '1101011x 0xx11111 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - BranchType branch_type; - integer m = UInt(Rm); - boolean pac = (A == '1'); - boolean use_key_a = (M == '0'); - boolean source_is_sp = ((Z == '1') && (m == 31)); - - if !pac && m != 0 then - UNDEFINED; - elsif pac && !HavePACExt() then - UNDEFINED; - - case op of - when '00' branch_type = BranchType_INDIR; - when '01' branch_type = BranchType_INDCALL; - when '10' branch_type = BranchType_RET; - otherwise UNDEFINED; - - if pac then - if Z == '0' && m != 31 then - UNDEFINED; - - if branch_type == BranchType_RET then - if n != 31 then UNDEFINED; - n = 30; - source_is_sp = TRUE; - - __execute - bits(64) target = X[n]; - boolean auth_then_branch = TRUE; - - if pac then - bits(64) modifier = if source_is_sp then SP[] else X[m]; - - if use_key_a then - target = AuthIA(target, modifier, auth_then_branch); - else - target = AuthIB(target, modifier, auth_then_branch); - - if branch_type == BranchType_INDCALL then X[30] = PC[] + 4; - - // Value in BTypeNext will be used to set PSTATE.BTYPE - case branch_type of - when BranchType_INDIR // BR, BRAA, BRAB, BRAAZ, BRABZ - if InGuardedPage then - if n == 16 || n == 17 then - BTypeNext = '01'; - else - BTypeNext = '11'; - else - BTypeNext = '01'; - when BranchType_INDCALL // BLR, BLRAA, BLRAB, BLRAAZ, BLRABZ - BTypeNext = '10'; - when BranchType_RET // RET, RETAA, RETAB - BTypeNext = '00'; - - BranchTo(target, branch_type); - -__instruction LD1RQD_Z_P_BR_Contiguous - __encoding LD1RQD_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 100xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - - __execute - CheckSVEEnabled(); - integer elements = 128 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low 16 bits only - bits(64) offset; - bits(128) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = X[m]; - - addr = base + UInt(offset) * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = Replicate(result, VL DIV 128); - -__instruction LSRR_Z_P_ZZ__ - __encoding LSRR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010101 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - integer shift = Min(UInt(element1), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = LSR(element2, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction ZIP2_Z_ZZ__ - __encoding ZIP2_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 011001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 1; - - __encoding ZIP2_Z_ZZ_Q - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 101xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer esize = 128; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 1; - - __encoding ZIP1_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 011000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 0; - - __encoding ZIP1_Z_ZZ_Q - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 101xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer esize = 128; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 0; - - __execute - CheckSVEEnabled(); - if VL < esize * 2 then UNDEFINED; - integer pairs = VL DIV (esize * 2); - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result = Zeros(); - - integer base = part * pairs; - for p = 0 to pairs-1 - Elem[result, 2*p+0, esize] = Elem[operand1, base+p, esize]; - Elem[result, 2*p+1, esize] = Elem[operand2, base+p, esize]; - - Z[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction LASTB_V_P_Z__ - __encoding LASTB_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000101 xx100011 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - boolean isBefore = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - integer last = LastActiveElement(mask, esize); - - if isBefore then - if last < 0 then last = elements - 1; - else - last = last + 1; - if last >= elements then last = 0; - V[d] = Elem[operand, last, esize]; - -__instruction aarch64_integer_bitfield - __encoding aarch64_integer_bitfield - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10011 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - - boolean inzero; - boolean extend; - integer R; - integer S; - bits(datasize) wmask; - bits(datasize) tmask; - - case opc of - when '00' inzero = TRUE; extend = TRUE; // SBFM - when '01' inzero = FALSE; extend = FALSE; // BFM - when '10' inzero = TRUE; extend = FALSE; // UBFM - when '11' UNDEFINED; - - if sf == '1' && N != '1' then UNDEFINED; - if sf == '0' && (N != '0' || immr[5] != '0' || imms[5] != '0') then UNDEFINED; - - R = UInt(immr); - S = UInt(imms); - (wmask, tmask) = DecodeBitMasks(N, imms, immr, FALSE); - - __execute - bits(datasize) dst = if inzero then Zeros() else X[d]; - bits(datasize) src = X[n]; - - // perform bitfield move on low bits - bits(datasize) bot = (dst AND NOT(wmask)) OR (ROR(src, R) AND wmask); - - // determine extension bits (sign, zero or dest register) - bits(datasize) top = if extend then Replicate(src[S]) else dst; - - // combine extension bits and result bits - X[d] = (top AND NOT(tmask)) OR (bot AND tmask); - -__instruction DUPM_Z_I__ - __encoding DUPM_Z_I__ - __instruction_set A64 - __field imm13 5 +: 13 - __field Zd 0 +: 5 - __opcode '00000101 110000xx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer d = UInt(Zd); - bits(esize) imm; - (imm, -) = DecodeBitMasks(imm13[12], imm13[5:0], imm13[11:6], TRUE); - - __execute - CheckSVEEnabled(); - bits(VL) result = Replicate(imm); - Z[d] = result; - -__instruction ST3B_Z_P_BR_Contiguous - __encoding ST3B_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 010xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction SQADD_Z_ZZ__ - __encoding SQADD_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 000100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + element2, esize, unsigned); - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_halving_rounding - __encoding aarch64_vector_arithmetic_binary_uniform_add_halving_rounding - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - Elem[result, e, esize] = (element1 + element2 + 1)[esize:1]; - - V[d] = result; - -__instruction aarch64_vector_reduce_int_max - __encoding aarch64_vector_reduce_int_max - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 16 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx11000x 101010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '100' then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean min = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - integer maxmin; - integer element; - - maxmin = Int(Elem[operand, 0, esize], unsigned); - for e = 1 to elements-1 - element = Int(Elem[operand, e, esize], unsigned); - maxmin = if min then Min(maxmin, element) else Max(maxmin, element); - - V[d] = maxmin[esize-1:0]; - -__instruction LD1RSH_Z_P_BI_S32 - __encoding LD1RSH_Z_P_BI_S32 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 01xxxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = UInt(imm6); - - __encoding LD1RSH_Z_P_BI_S64 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 01xxxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = UInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - integer last = LastActiveElement(mask, esize); - if last >= 0 then - addr = base + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction aarch64_integer_logical_shiftedreg - __encoding aarch64_integer_logical_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - boolean invert = (N == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - X[d] = result; - -__instruction aarch64_integer_shift_variable - __encoding aarch64_integer_shift_variable - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field op2 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011010 110xxxxx 0010xxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - ShiftType shift_type = DecodeShift(op2); - - __execute - bits(datasize) result; - bits(datasize) operand2 = X[m]; - - result = ShiftReg(n, shift_type, UInt(operand2) MOD datasize); - X[d] = result; - -__instruction aarch64_vector_shift_right_sisd - __encoding aarch64_vector_shift_right_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __encoding aarch64_vector_shift_right_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - operand2 = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element = (Int(Elem[operand, e, esize], unsigned) + round_const) >> shift; - Elem[result, e, esize] = Elem[operand2, e, esize] + element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_integer_arithmetic_address_pc_rel - __encoding aarch64_integer_arithmetic_address_pc_rel - __instruction_set A64 - __field op 31 +: 1 - __field immlo 29 +: 2 - __field immhi 5 +: 19 - __field Rd 0 +: 5 - __opcode 'xxx10000 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - boolean page = (op == '1'); - bits(64) imm; - - if page then - imm = SignExtend(immhi:immlo:Zeros(12), 64); - else - imm = SignExtend(immhi:immlo, 64); - - __execute - bits(64) base = PC[]; - - if page then - base[11:0] = Zeros(12); - - X[d] = base + imm; - -__instruction SMMLA_Z_ZZZ__ - __encoding SMMLA_Z_ZZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000101 000xxxxx 100110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveInt8MatMulExt() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_unsigned = FALSE; - boolean op2_unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer segments = VL DIV 128; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result = Zeros(); - bits(128) op1, op2; - bits(128) res, addend; - - for s = 0 to segments-1 - op1 = Elem[operand1, s, 128]; - op2 = Elem[operand2, s, 128]; - addend = Elem[operand3, s, 128]; - res = MatMulAdd(addend, op1, op2, op1_unsigned, op2_unsigned); - Elem[result, s, 128] = res; - - Z[da] = result; - -__instruction aarch64_vector_crypto_aes_mix - __encoding aarch64_vector_crypto_aes_mix - __instruction_set A64 - __field D 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01001110 00101000 011x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - if !HaveAESExt() then UNDEFINED; - boolean decrypt = (D == '1'); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) operand = V[n]; - bits(128) result; - if decrypt then - result = AESInvMixColumns(operand); - else - result = AESMixColumns(operand); - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_high_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_high_sisd - __instruction_set A64 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field S 13 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111111 xxxxxxxx 11x1x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - boolean rounding = TRUE; - boolean sub_op = (S == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_high_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field S 13 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 xxxxxxxx 11x1x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean rounding = TRUE; - boolean sub_op = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - integer rounding_const = if rounding then 1 << (esize - 1) else 0; - integer element1; - integer element2; - integer element3; - integer product; - boolean sat; - - element2 = SInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element3 = SInt(Elem[operand3, e, esize]); - if sub_op then - accum = ((element3 << esize) - 2 * (element1 * element2) + rounding_const); - else - accum = ((element3 << esize) + 2 * (element1 * element2) + rounding_const); - (Elem[result, e, esize], sat) = SignedSatQ(accum >> esize, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction CLASTA_V_P_Z__ - __encoding CLASTA_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Vdn 0 +: 5 - __opcode '00000101 xx101010 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Vdn); - integer m = UInt(Zm); - boolean isBefore = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(esize) operand1 = V[dn]; - bits(VL) operand2 = Z[m]; - bits(esize) result; - integer last = LastActiveElement(mask, esize); - - if last < 0 then - result = ZeroExtend(operand1); - else - if !isBefore then - last = last + 1; - if last >= elements then last = 0; - result = Elem[operand2, last, esize]; - - V[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_product - __encoding aarch64_vector_arithmetic_binary_disparate_mul_product - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - Elem[result, e, 2*esize] = (element1 * element2)[2*esize-1:0]; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_poly - __encoding aarch64_vector_arithmetic_binary_disparate_mul_poly - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 111000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '01' || size == '10' then UNDEFINED; - if size == '11' && !HaveBit128PMULLExt() then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - Elem[result, e, 2*esize] = PolynomialMult(element1, element2); - - V[d] = result; - -__instruction aarch64_float_compare_cond - __encoding aarch64_float_compare_cond - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field op 4 +: 1 - __field nzcv 0 +: 4 - __opcode '00011110 xx1xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean signal_all_nans = (op == '1'); - bits(4) condition = cond; - bits(4) flags = nzcv; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) operand1 = V[n]; - bits(datasize) operand2; - - operand2 = V[m]; - - if ConditionHolds(condition) then - flags = FPCompare(operand1, operand2, signal_all_nans, FPCR); - PSTATE.[N,Z,C,V] = flags; - -__instruction aarch64_vector_crypto_sha3op_sha256_sched1 - __encoding aarch64_vector_crypto_sha3op_sha256_sched1 - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 000xxxxx 011000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if !HaveSHA256Ext() then UNDEFINED; - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) operand1 = V[d]; - bits(128) operand2 = V[n]; - bits(128) operand3 = V[m]; - bits(128) result; - bits(128) T0 = operand3[31:0] : operand2[127:32]; - bits(64) T1; - bits(32) elt; - - T1 = operand3[127:64]; - for e = 0 to 1 - elt = Elem[T1, e, 32]; - elt = ROR(elt, 17) EOR ROR(elt, 19) EOR LSR(elt, 10); - elt = elt + Elem[operand1, e, 32] + Elem[T0, e, 32]; - Elem[result, e, 32] = elt; - - T1 = result[63:0]; - for e = 2 to 3 - elt = Elem[T1, e - 2, 32]; - elt = ROR(elt, 17) EOR ROR(elt, 19) EOR LSR(elt, 10); - elt = elt + Elem[operand1, e, 32] + Elem[T0, e, 32]; - Elem[result, e, 32] = elt; - - V[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_float_arithmetic_round_frint - __encoding aarch64_float_arithmetic_round_frint - __instruction_set A64 - __field ftype 22 +: 2 - __field rmode 15 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1001xx x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean exact = FALSE; - FPRounding rounding; - case rmode of - when '0xx' rounding = FPDecodeRounding(rmode[1:0]); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundInt(operand, FPCR, rounding, exact); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field eq 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 0011x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean cmp_eq = (eq == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field eq 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0011x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean cmp_eq = (eq == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - test_passed = if cmp_eq then element1 >= element2 else element1 > element2; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_vector_shift_right_narrow_uniform_sisd - __encoding aarch64_vector_shift_right_narrow_uniform_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 1001x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_shift_right_narrow_uniform_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 1001x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize*2) operand = V[n]; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = (Int(Elem[operand, e, 2*esize], unsigned) + round_const) >> shift; - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction aarch64_memory_pair_general_no_alloc - __encoding aarch64_memory_pair_general_no_alloc - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101000 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_STREAM; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if opc[0] == '1' then UNDEFINED; - integer scale = 2 + UInt(opc[1]); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown && t == n then - data1 = bits(datasize) UNKNOWN; - else - data1 = X[t]; - if rt_unknown && t2 == n then - data2 = bits(datasize) UNKNOWN; - else - data2 = X[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - X[t] = data1; - X[t2] = data2; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction LD1SH_Z_P_AI_S - __encoding LD1SH_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 101xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __encoding LD1SH_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 101xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_branch_conditional_test - __encoding aarch64_branch_conditional_test - __instruction_set A64 - __field b5 31 +: 1 - __field op 24 +: 1 - __field b40 19 +: 5 - __field imm14 5 +: 14 - __field Rt 0 +: 5 - __opcode 'x011011x xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - - integer datasize = if b5 == '1' then 64 else 32; - integer bit_pos = UInt(b5:b40); - bit bit_val = op; - bits(64) offset = SignExtend(imm14:'00', 64); - - __execute - bits(datasize) operand = X[t]; - - if operand[bit_pos] == bit_val then - BranchTo(PC[] + offset, BranchType_DIR); - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_dotp - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_dotp - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx0xxxxx 100101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveDOTPExt() then UNDEFINED; - if size!= '10' then UNDEFINED; - boolean signed = (U=='0'); - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - result = V[d]; - for e = 0 to elements-1 - integer res = 0; - integer element1, element2; - for i = 0 to 3 - if signed then - element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = SInt(Elem[operand2, 4 * e + i, esize DIV 4]); - else - element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = UInt(Elem[operand2, 4 * e + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = Elem[result, e, esize] + res; - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_add_pairwise - __encoding aarch64_vector_arithmetic_unary_add_pairwise - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 0x1010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV (2*esize); - boolean acc = (op == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - bits(2*esize) sum; - integer op1; - integer op2; - - if acc then result = V[d]; - for e = 0 to elements-1 - op1 = Int(Elem[operand, 2*e+0, esize], unsigned); - op2 = Int(Elem[operand, 2*e+1, esize], unsigned); - sum = (op1 + op2)[2*esize-1:0]; - if acc then - Elem[result, e, 2*esize] = Elem[result, e, 2*esize] + sum; - else - Elem[result, e, 2*esize] = sum; - - V[d] = result; - -__instruction UQDECD_R_RS_UW - __encoding UQDECD_R_RS_UW - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1110xxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQDECD_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1111xxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 - (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_branch_conditional_cond - __encoding aarch64_branch_conditional_cond - __instruction_set A64 - __field imm19 5 +: 19 - __field cond 0 +: 4 - __opcode '01010100 xxxxxxxx xxxxxxxx xxx0xxxx' - __guard TRUE - __decode - bits(64) offset = SignExtend(imm19:'00', 64); - bits(4) condition = cond; - - __execute - if ConditionHolds(condition) then - BranchTo(PC[] + offset, BranchType_DIR); - -__instruction UMINV_R_P_Z__ - __encoding UMINV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx001011 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - integer minimum = if unsigned then (2^esize - 1) else (2^(esize-1) - 1); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer element = Int(Elem[operand, e, esize], unsigned); - minimum = Min(minimum, element); - - V[d] = minimum[esize-1:0]; - -__instruction aarch64_vector_arithmetic_binary_uniform_logical_and_orr - __encoding aarch64_vector_arithmetic_binary_uniform_logical_and_orr - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean invert = (size[0] == '1'); - LogicalOp op = if size[1] == '1' then LogicalOp_ORR else LogicalOp_AND; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND - result = operand1 AND operand2; - when LogicalOp_ORR - result = operand1 OR operand2; - - V[d] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction CMPEQ_P_P_ZZ__ - __encoding CMPEQ_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 101xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_EQ; - boolean unsigned = FALSE; - - __encoding CMPGT_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 100xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - boolean unsigned = FALSE; - - __encoding CMPGE_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 100xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - boolean unsigned = FALSE; - - __encoding CMPHI_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 000xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - boolean unsigned = TRUE; - - __encoding CMPHS_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 000xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - boolean unsigned = TRUE; - - __encoding CMPNE_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 101xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_NE; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(PL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - boolean cond; - case op of - when Cmp_EQ cond = element1 == element2; - when Cmp_NE cond = element1 != element2; - when Cmp_GE cond = element1 >= element2; - when Cmp_LT cond = element1 < element2; - when Cmp_GT cond = element1 > element2; - when Cmp_LE cond = element1 <= element2; - ElemP[result, e, esize] = if cond then '1' else '0'; - else - ElemP[result, e, esize] = '0'; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction ST1W_Z_P_AI_S - __encoding ST1W_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 011xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - integer offset = UInt(imm5); - - __encoding ST1W_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 010xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(VL) src = Z[t]; - bits(PL) mask = P[g]; - bits(64) addr; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - -__instruction aarch64_memory_single_general_immediate_unsigned - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction LDFF1SB_Z_P_BR_S16 - __encoding LDFF1SB_Z_P_BR_S16 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 110xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = FALSE; - - __encoding LDFF1SB_Z_P_BR_S32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 101xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = FALSE; - - __encoding LDFF1SB_Z_P_BR_S64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 100xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + UInt(offset) * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_CNOTFIRST]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - offset = offset + 1; - - Z[t] = result; - -__instruction LDFF1H_Z_P_BZ_S_x32_scaled - __encoding LDFF1H_Z_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 1x1xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding LDFF1H_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 1x1xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding LDFF1H_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 1x0xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1H_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 1x0xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1H_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 111xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 1; - - __encoding LDFF1H_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 110xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction ST4W_Z_P_BI_Contiguous - __encoding ST4W_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 0111xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction aarch64_vector_arithmetic_unary_diff_neg_int_sisd - __encoding aarch64_vector_arithmetic_unary_diff_neg_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 101110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean neg = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_diff_neg_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 101110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean neg = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - if neg then - element = -element; - else - element = Abs(element); - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction BRKPA_P_P_PP__ - __encoding BRKPA_P_P_PP__ - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0000xxxx 11xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding BRKPAS_P_P_PP__ - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0100xxxx 11xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - boolean last = (LastActive(mask, operand1, 8) == '1'); - - for e = 0 to elements-1 - if ElemP[mask, e, 8] == '1' then - ElemP[result, e, 8] = if last then '1' else '0'; - last = last && (ElemP[operand2, e, 8] == '0'); - else - ElemP[result, e, 8] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction LD3W_Z_P_BI_Contiguous - __encoding LD3W_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0100xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction PFIRST_P_P_P__ - __encoding PFIRST_P_P_P__ - __instruction_set A64 - __field Pg 5 +: 4 - __field Pdn 0 +: 4 - __opcode '00100101 01011000 1100000x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer dn = UInt(Pdn); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) result = P[dn]; - integer first = -1; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' && first == -1 then - first = e; - - if first >= 0 then - ElemP[result, first, esize] = '1'; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[dn] = result; - -__instruction LD1SB_Z_P_BI_S16 - __encoding LD1SB_Z_P_BI_S16 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1100xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __encoding LD1SB_Z_P_BI_S32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1010xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __encoding LD1SB_Z_P_BI_S64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1000xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction FRECPE_Z_Z__ - __encoding FRECPE_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx001110 001100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand = Z[n]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRecipEstimate(element, FPCR); - - Z[d] = result; - -__instruction LD1ROD_Z_P_BI_U64 - __encoding LD1ROD_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1010xxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - if VL < 256 then UNDEFINED; - integer elements = 256 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low bits only - bits(256) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * 32; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = ZeroExtend(Replicate(result, VL DIV 256), VL); - -__instruction EOR_Z_ZI__ - __encoding EOR_Z_ZI__ - __instruction_set A64 - __field imm13 5 +: 13 - __field Zdn 0 +: 5 - __opcode '00000101 010000xx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer dn = UInt(Zdn); - bits(64) imm; - (imm, -) = DecodeBitMasks(imm13[12], imm13[5:0], imm13[11:6], TRUE); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 64; - bits(VL) operand = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(64) element1 = Elem[operand, e, 64]; - Elem[result, e, 64] = element1 EOR imm; - - Z[dn] = result; - -__instruction FMINV_V_P_Z__ - __encoding FMINV_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '01100101 xx000111 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(esize) identity = FPInfinity('0'); - - V[d] = ReducePredicated(ReduceOp_FMIN, operand, mask, identity); - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction aarch64_vector_crypto_sha512_sha512su0 - __encoding aarch64_vector_crypto_sha512_sha512su0 - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 11000000 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSHA512Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(64) sig0; - bits(128) Vtmp; - bits(128) X = V[n]; - bits(128) W = V[d]; - sig0 = ROR(W[127:64], 1) EOR ROR(W[127:64], 8) EOR ('0000000':W[127:71]); - Vtmp[63:0] = W[63:0] + sig0; - sig0 = ROR(X[63:0], 1) EOR ROR(X[63:0], 8) EOR ('0000000':X[63:7]); - Vtmp[127:64] = W[127:64] + sig0; - V[d] = Vtmp; - -__instruction aarch64_integer_tags_mcsubtag - __encoding aarch64_integer_tags_mcsubtag - __instruction_set A64 - __field uimm6 16 +: 6 - __field op3 14 +: 2 - __field uimm4 10 +: 4 - __field Xn 5 +: 5 - __field Xd 0 +: 5 - __opcode '11010001 10xxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Xd); - integer n = UInt(Xn); - bits(4) tag_offset = uimm4; - bits(64) offset = LSL(ZeroExtend(uimm6, 64), LOG2_TAG_GRANULE); - boolean ADD = FALSE; - - __execute - bits(64) operand1 = if n == 31 then SP[] else X[n]; - bits(4) start_tag = AArch64.AllocationTagFromAddress(operand1); - bits(16) exclude = GCR_EL1.Exclude; - bits(64) result; - bits(4) rtag; - - if AArch64.AllocationTagAccessIsEnabled() then - rtag = AArch64.ChooseNonExcludedTag(start_tag, tag_offset, exclude); - else - rtag = '0000'; - - if ADD then - (result, -) = AddWithCarry(operand1, offset, '0'); - else - (result, -) = AddWithCarry(operand1, NOT(offset), '1'); - - result = AArch64.AddressWithAllocationTag(result, rtag); - - if d == 31 then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_lower - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_lower - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field S 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 1xxxxxxx 0x00x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt('0':Rm); // Vm can only be in bottom 16 registers. - if sz == '1' then UNDEFINED; - integer index = UInt(H:L:M); - - integer esize = 32; - integer datasize = if Q=='1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (S == '1'); - integer part = 0; - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_upper - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field S 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 1xxxxxxx 1x00x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt('0':Rm); // Vm can only be in bottom 16 registers. - if sz == '1' then UNDEFINED; - integer index = UInt(H:L:M); - - integer esize = 32; - integer datasize = if Q=='1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (S == '1'); - integer part = 1; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize DIV 2) operand1 = Vpart[n,part]; - bits(128) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize DIV 2) element1; - bits(esize DIV 2) element2 = Elem[operand2, index, esize DIV 2]; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize DIV 2]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAddH(Elem[operand3, e, esize], element1, element2, FPCR); - V[d] = result; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction EOR_P_P_PP_Z - __encoding EOR_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0000xxxx 01xxxx1x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding EORS_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0100xxxx 01xxxx1x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for e = 0 to elements-1 - bit element1 = ElemP[operand1, e, esize]; - bit element2 = ElemP[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = element1 EOR element2; - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_vector_reduce_fp16_max_sisd - __encoding aarch64_vector_reduce_fp16_max_sisd - __instruction_set A64 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx110000 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - if sz == '1' then UNDEFINED; - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = if o1 == '1' then ReduceOp_FMIN else ReduceOp_FMAX; - - __encoding aarch64_vector_reduce_fp_max_sisd - __instruction_set A64 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 xx110000 111110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = if o1 == '1' then ReduceOp_FMIN else ReduceOp_FMAX; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction ST1D_Z_P_AI_D - __encoding ST1D_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 110xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(VL) src = Z[t]; - bits(PL) mask = P[g]; - bits(64) addr; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - -__instruction LDNT1D_Z_P_BR_Contiguous - __encoding LDNT1D_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 100xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(64) offset; - bits(PL) mask = P[g]; - bits(VL) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = X[m]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_STREAM]; - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_unary_extract_nosat - __encoding aarch64_vector_arithmetic_unary_extract_nosat - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx100001 001010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand = V[n]; - bits(datasize) result; - bits(2*esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, 2*esize]; - Elem[result, e, esize] = element[esize-1:0]; - Vpart[d, part] = result; - -__instruction ST2D_Z_P_BR_Contiguous - __encoding ST2D_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 101xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction SQINCH_R_RS_SX - __encoding SQINCH_R_RS_SX - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0110xxxx 111100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQINCH_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0111xxxx 111100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 + (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction LDNF1H_Z_P_BI_U16 - __encoding LDNF1H_Z_P_BI_U16 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1011xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LDNF1H_Z_P_BI_U32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1101xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LDNF1H_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1111xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - addr = addr + mbytes; - - Z[t] = result; - -__instruction FSUB_Z_ZZ__ - __encoding FSUB_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx0xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPSub(element1, element2, FPCR); - - Z[d] = result; - -__instruction UMAX_Z_P_ZZ__ - __encoding UMAX_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx001001 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer maximum = Max(element1, element2); - Elem[result, e, esize] = maximum[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 100001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean sub_op = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 100001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if sub_op then - Elem[result, e, esize] = element1 - element2; - else - Elem[result, e, esize] = element1 + element2; - - V[d] = result; - -__instruction aarch64_float_arithmetic_max_min - __encoding aarch64_float_arithmetic_max_min - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field op 12 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx 01xx10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - FPMaxMinOp operation; - case op of - when '00' operation = FPMaxMinOp_MAX; - when '01' operation = FPMaxMinOp_MIN; - when '10' operation = FPMaxMinOp_MAXNUM; - when '11' operation = FPMaxMinOp_MINNUM; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - case operation of - when FPMaxMinOp_MAX result = FPMax(operand1, operand2, FPCR); - when FPMaxMinOp_MIN result = FPMin(operand1, operand2, FPCR); - when FPMaxMinOp_MAXNUM result = FPMaxNum(operand1, operand2, FPCR); - when FPMaxMinOp_MINNUM result = FPMinNum(operand1, operand2, FPCR); - - V[d] = result; - -__instruction aarch64_float_convert_fix - __encoding aarch64_float_convert_fix - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field scale 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - - case ftype of - when '00' fltsize = 32; - when '01' fltsize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - if sf == '0' && scale[5] == '0' then UNDEFINED; - integer fracbits = 64 - UInt(scale); - - case opcode[2:1]:rmode of - when '00 11' // FCVTZ - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, fracbits, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, fracbits, unsigned, FPCR, rounding); - V[d] = fltval; - -__instruction FRECPX_Z_P_Z__ - __encoding FRECPX_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx001100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPRecpX(element, FPCR); - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_rsqrts_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_rsqrts_fp16_sisd - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 110xxxxx 001111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_binary_uniform_rsqrts_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 1x1xxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_binary_uniform_rsqrts_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 110xxxxx 001111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __encoding aarch64_vector_arithmetic_binary_uniform_rsqrts_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 1x1xxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPRSqrtStepFused(element1, element2); - - V[d] = result; - -__instruction LD4D_Z_P_BI_Contiguous - __encoding LD4D_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1110xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_arithmetic_binary_disparate_diff - __encoding aarch64_vector_arithmetic_binary_disparate_diff - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 01x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean accumulate = (op == '0'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) absdiff; - - result = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - absdiff = Abs(element1 - element2)[2*esize-1:0]; - Elem[result, e, 2*esize] = Elem[result, e, 2*esize] + absdiff; - V[d] = result; - -__instruction SABD_Z_P_ZZ__ - __encoding SABD_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx001100 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer absdiff = Abs(element1 - element2); - Elem[result, e, esize] = absdiff[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction FMUL_Z_ZZ__ - __encoding FMUL_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx0xxxxx 000010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPMul(element1, element2, FPCR); - - Z[d] = result; - -__instruction aarch64_integer_tags_mcgettag - __encoding aarch64_integer_tags_mcgettag - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 011xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Xt); - integer n = UInt(Xn); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - - __execute - bits(64) address; - bits(4) tag; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - address = address + offset; - address = Align(address, TAG_GRANULE); - - tag = AArch64.MemTag[address, AccType_NORMAL]; - X[t] = AArch64.AddressWithAllocationTag(X[t], tag); - -__instruction aarch64_vector_arithmetic_unary_float_round_frint_32_64 - __encoding aarch64_vector_arithmetic_unary_float_round_frint_32_64 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x100001 111x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFrintExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer intsize = if op == '0' then 32 else 64; - FPRounding rounding = if U == '0' then FPRounding_ZERO else FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundIntN(element, FPCR, rounding, intsize); - - V[d] = result; - -__instruction aarch64_float_arithmetic_mul_product - __encoding aarch64_float_arithmetic_mul_product - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field op 15 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx x00010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean negated = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - result = FPMul(operand1, operand2, FPCR); - - if negated then result = FPNeg(result); - - V[d] = result; - -__instruction aarch64_vector_crypto_sha3op_sha256_hash - __encoding aarch64_vector_crypto_sha3op_sha256_hash - __instruction_set A64 - __field Rm 16 +: 5 - __field P 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 000xxxxx 010x00xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if !HaveSHA256Ext() then UNDEFINED; - boolean part1 = (P == '0'); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) result; - if part1 then - result = SHA256hash(V[d], V[n], V[m], TRUE); - else - result = SHA256hash(V[n], V[d], V[m], FALSE); - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 100011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean and_test = (U == '0'); - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 100011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean and_test = (U == '0'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if and_test then - test_passed = !IsZero(element1 AND element2); - else - test_passed = (element1 == element2); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_float_arithmetic_unary - __encoding aarch64_float_arithmetic_unary - __instruction_set A64 - __field ftype 22 +: 2 - __field opc 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10000x x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - FPUnaryOp fpop; - case opc of - when '00' fpop = FPUnaryOp_MOV; - when '01' fpop = FPUnaryOp_ABS; - when '10' fpop = FPUnaryOp_NEG; - when '11' fpop = FPUnaryOp_SQRT; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - case fpop of - when FPUnaryOp_MOV result = operand; - when FPUnaryOp_ABS result = FPAbs(operand); - when FPUnaryOp_NEG result = FPNeg(operand); - when FPUnaryOp_SQRT result = FPSqrt(operand, FPCR); - - V[d] = result; - -__instruction LD4H_Z_P_BI_Contiguous - __encoding LD4H_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1110xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_crypto_sha512_sha512h - __encoding aarch64_vector_crypto_sha512_sha512h - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 011xxxxx 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSHA512Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vtmp; - bits(64) MSigma1; - bits(64) tmp; - bits(128) X = V[n]; - bits(128) Y = V[m]; - bits(128) W = V[d]; - - MSigma1 = ROR(Y[127:64], 14) EOR ROR(Y[127:64],18) EOR ROR(Y[127:64],41); - Vtmp[127:64] = (Y[127:64] AND X[63:0]) EOR (NOT(Y[127:64]) AND X[127:64]); - Vtmp[127:64] = (Vtmp[127:64] + MSigma1 + W[127:64]); - tmp = Vtmp[127:64] + Y[63:0]; - MSigma1 = ROR(tmp, 14) EOR ROR(tmp,18) EOR ROR(tmp,41); - Vtmp[63:0] = (tmp AND Y[127:64]) EOR (NOT(tmp) AND X[63:0]); - Vtmp[63:0] = (Vtmp[63:0] + MSigma1 + W[63:0]); - V[d] = Vtmp; - -__instruction aarch64_memory_atomicops_cas_single - __encoding aarch64_memory_atomicops_cas_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x1xxxxx x11111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer n = UInt(Rn); - integer t = UInt(Rt); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if L == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if o0 == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) comparevalue; - bits(datasize) newvalue; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - comparevalue = X[s]; - newvalue = X[t]; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomicCompareAndSwap(address, comparevalue, newvalue, ldacctype, stacctype); - - X[s] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_transfer_vector_cpy_dup_sisd - __encoding aarch64_vector_transfer_vector_cpy_dup_sisd - __instruction_set A64 - __field imm5 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 000xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer size = LowestSetBit(imm5); - if size > 3 then UNDEFINED; - - integer index = UInt(imm5[4:size+1]); - integer idxdsize = if imm5[4] == '1' then 128 else 64; - - integer esize = 8 << size; - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_transfer_vector_cpy_dup_simd - __instruction_set A64 - __field Q 30 +: 1 - __field imm5 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 000xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer size = LowestSetBit(imm5); - if size > 3 then UNDEFINED; - - integer index = UInt(imm5[4:size+1]); - integer idxdsize = if imm5[4] == '1' then 128 else 64; - - if size == 3 && Q == '0' then UNDEFINED; - integer esize = 8 << size; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(idxdsize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - element = Elem[operand, index, esize]; - for e = 0 to elements-1 - Elem[result, e, esize] = element; - V[d] = result; - -__instruction EORV_R_P_Z__ - __encoding EORV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx011001 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(esize) result = Zeros(esize); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - result = result EOR Elem[operand, e, esize]; - - V[d] = result; - -__instruction aarch64_branch_conditional_test - __encoding aarch64_branch_conditional_test - __instruction_set A64 - __field b5 31 +: 1 - __field op 24 +: 1 - __field b40 19 +: 5 - __field imm14 5 +: 14 - __field Rt 0 +: 5 - __opcode 'x011011x xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - - integer datasize = if b5 == '1' then 64 else 32; - integer bit_pos = UInt(b5:b40); - bit bit_val = op; - bits(64) offset = SignExtend(imm14:'00', 64); - - __execute - bits(datasize) operand = X[t]; - - if operand[bit_pos] == bit_val then - BranchTo(PC[] + offset, BranchType_DIR); - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction LSR_Z_P_ZZ__ - __encoding LSR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010001 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - integer shift = Min(UInt(element2), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = LSR(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction LD1SH_Z_P_BR_S32 - __encoding LD1SH_Z_P_BR_S32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 001xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = FALSE; - - __encoding LD1SH_Z_P_BR_S64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 000xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction PRFW_I_P_AI_S - __encoding PRFW_I_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000101 000xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 2; - integer offset = UInt(imm5); - - __encoding PRFW_I_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000101 000xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 2; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) base; - bits(64) addr; - base = Z[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + (offset << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - -__instruction LDFF1B_Z_P_AI_S - __encoding LDFF1B_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 001xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __encoding LDFF1B_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 001xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction CNOT_Z_P_Z__ - __encoding CNOT_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx011011 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = ZeroExtend(IsZeroBit(element), esize); - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_bfdot - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_bfdot - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 010xxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 32; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - - for e = 0 to elements-1 - bits(16) elt1_a = Elem[operand1, 2 * e + 0, 16]; - bits(16) elt1_b = Elem[operand1, 2 * e + 1, 16]; - bits(16) elt2_a = Elem[operand2, 2 * e + 0, 16]; - bits(16) elt2_b = Elem[operand2, 2 * e + 1, 16]; - - bits(32) sum = BFAdd(BFMul(elt1_a, elt2_a), BFMul(elt1_b, elt2_b)); - Elem[result, e, 32] = BFAdd(Elem[operand3, e, 32], sum); - - V[d] = result; - -__instruction aarch64_vector_reduce_add_long - __encoding aarch64_vector_reduce_add_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx110000 001110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '100' then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - integer sum; - - sum = Int(Elem[operand, 0, esize], unsigned); - for e = 1 to elements-1 - sum = sum + Int(Elem[operand, e, esize], unsigned); - - V[d] = sum[2*esize-1:0]; - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction FRSQRTE_Z_Z__ - __encoding FRSQRTE_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx001111 001100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand = Z[n]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRSqrtEstimate(element, FPCR); - - Z[d] = result; - -__instruction aarch64_vector_shift_right_narrow_uniform_sisd - __encoding aarch64_vector_shift_right_narrow_uniform_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 1001x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_shift_right_narrow_uniform_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 1001x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize*2) operand = V[n]; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = (Int(Elem[operand, e, 2*esize], unsigned) + round_const) >> shift; - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction LDFF1W_Z_P_BR_U32 - __encoding LDFF1W_Z_P_BR_U32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 010xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - boolean unsigned = TRUE; - - __encoding LDFF1W_Z_P_BR_U64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 011xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + UInt(offset) * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_CNOTFIRST]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_product - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_product - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 100111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if U == '1' && size != '00' then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean poly = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - bits(esize) product; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if poly then - product = PolynomialMult(element1, element2)[esize-1:0]; - else - product = (UInt(element1) * UInt(element2))[esize-1:0]; - Elem[result, e, esize] = product; - - V[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_uniform_shift_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - if S == '0' && size != '11' then UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer round_const = 0; - integer shift; - integer element; - boolean sat; - - for e = 0 to elements-1 - shift = SInt(Elem[operand2, e, esize][7:0]); - if rounding then - round_const = 1 << (-shift - 1); // 0 for left shift, 2^(n-1) for right shift - element = (Int(Elem[operand1, e, esize], unsigned) + round_const) << shift; - if saturating then - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - else - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_float_arithmetic_max_min - __encoding aarch64_float_arithmetic_max_min - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field op 12 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx 01xx10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - FPMaxMinOp operation; - case op of - when '00' operation = FPMaxMinOp_MAX; - when '01' operation = FPMaxMinOp_MIN; - when '10' operation = FPMaxMinOp_MAXNUM; - when '11' operation = FPMaxMinOp_MINNUM; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - case operation of - when FPMaxMinOp_MAX result = FPMax(operand1, operand2, FPCR); - when FPMaxMinOp_MIN result = FPMin(operand1, operand2, FPCR); - when FPMaxMinOp_MAXNUM result = FPMaxNum(operand1, operand2, FPCR); - when FPMaxMinOp_MINNUM result = FPMinNum(operand1, operand2, FPCR); - - V[d] = result; - -__instruction LDFF1SW_Z_P_AI_D - __encoding LDFF1SW_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 001xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mat_mul_int_dotp - __encoding aarch64_vector_arithmetic_binary_element_mat_mul_int_dotp - __instruction_set A64 - __field Q 30 +: 1 - __field US 23 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 x0xxxxxx 1111x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveInt8MatMulExt() then UNDEFINED; - boolean op1_unsigned = (US == '1'); - boolean op2_unsigned = (US == '0'); - integer n = UInt(Rn); - integer m = UInt(M:Rm); - integer d = UInt(Rd); - integer i = UInt(H:L); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 32; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - - for e = 0 to elements-1 - bits(32) res = Elem[operand3, e, 32]; - for b = 0 to 3 - integer element1 = Int(Elem[operand1, 4 * e + b, 8], op1_unsigned); - integer element2 = Int(Elem[operand2, 4 * i + b, 8], op2_unsigned); - res = res + element1 * element2; - Elem[result, e, 32] = res; - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 100011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean and_test = (U == '0'); - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_bitwise_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 100011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean and_test = (U == '0'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if and_test then - test_passed = !IsZero(element1 AND element2); - else - test_passed = (element1 == element2); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor - __encoding aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor - __instruction_set A64 - __field Q 30 +: 1 - __field opc2 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - VBitOp op; - - case opc2 of - when '00' op = VBitOp_VEOR; - when '01' op = VBitOp_VBSL; - when '10' op = VBitOp_VBIT; - when '11' op = VBitOp_VBIF; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1; - bits(datasize) operand2; - bits(datasize) operand3; - bits(datasize) operand4 = V[n]; - - case op of - when VBitOp_VEOR - operand1 = V[m]; - operand2 = Zeros(); - operand3 = Ones(); - when VBitOp_VBSL - operand1 = V[m]; - operand2 = operand1; - operand3 = V[d]; - when VBitOp_VBIT - operand1 = V[d]; - operand2 = operand1; - operand3 = V[m]; - when VBitOp_VBIF - operand1 = V[d]; - operand2 = operand1; - operand3 = NOT(V[m]); - - V[d] = operand1 EOR ((operand2 EOR operand4) AND operand3); - -__instruction aarch64_integer_arithmetic_pointer_mcsubtracttaggedaddresssetflags - __encoding aarch64_integer_arithmetic_pointer_mcsubtracttaggedaddresssetflags - __instruction_set A64 - __field Xm 16 +: 5 - __field Xn 5 +: 5 - __field Xd 0 +: 5 - __opcode '10111010 110xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Xd); - integer n = UInt(Xn); - integer m = UInt(Xm); - boolean setflags = TRUE; - - __execute - bits(64) operand1 = if n == 31 then SP[] else X[n]; - bits(64) operand2 = if m == 31 then SP[] else X[m]; - operand1 = SignExtend(operand1[55:0], 64); - operand2 = SignExtend(operand2[55:0], 64); - - bits(64) result; - bits(4) nzcv; - - operand2 = NOT(operand2); - (result, nzcv) = AddWithCarry(operand1, operand2, '1'); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - X[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_single - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_single - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer maxmin; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - maxmin = if minimum then Min(element1, element2) else Max(element1, element2); - Elem[result, e, esize] = maxmin[esize-1:0]; - - V[d] = result; - -__instruction FMMLA_Z_ZZZ_S - __encoding FMMLA_Z_ZZZ_S - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 101xxxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP32MatMulExt() then UNDEFINED; - integer esize = 32; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __encoding FMMLA_Z_ZZZ_D - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 111xxxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer esize = 64; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - if VL < esize * 4 then UNDEFINED; - integer segments = VL DIV (4 * esize); - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result = Zeros(); - bits(4*esize) op1, op2; - bits(4*esize) res, addend; - - for s = 0 to segments-1 - op1 = Elem[operand1, s, 4*esize]; - op2 = Elem[operand2, s, 4*esize]; - addend = Elem[operand3, s, 4*esize]; - res = FPMatMulAdd(addend, op1, op2, esize, FPCR); - Elem[result, s, 4*esize] = res; - - Z[da] = result; - -__instruction aarch64_integer_arithmetic_div - __encoding aarch64_integer_arithmetic_div - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field o1 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011010 110xxxxx 00001xxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean unsigned = (o1 == '0'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - integer result; - - if IsZero(operand2) then - result = 0; - else - result = RoundTowardsZero(Real(Int(operand1, unsigned)) / Real(Int(operand2, unsigned))); - - X[d] = result[datasize-1:0]; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_accum - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_accum - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 100101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - bits(esize) product; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - product = (UInt(element1) * UInt(element2))[esize-1:0]; - if sub_op then - Elem[result, e, esize] = Elem[operand3, e, esize] - product; - else - Elem[result, e, esize] = Elem[operand3, e, esize] + product; - - V[d] = result; - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_system_exceptions_runtime_smc - __encoding aarch64_system_exceptions_runtime_smc - __instruction_set A64 - __field imm16 5 +: 16 - __opcode '11010100 000xxxxx xxxxxxxx xxx00011' - __guard TRUE - __decode - bits(16) imm = imm16; - - __execute - AArch64.CheckForSMCUndefOrTrap(imm); - - if SCR_EL3.SMD == '1' then - // SMC disabled - UNDEFINED; - else - AArch64.CallSecureMonitor(imm); - -__instruction PNEXT_P_P_P__ - __encoding PNEXT_P_P_P__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 5 +: 4 - __field Pdn 0 +: 4 - __opcode '00100101 xx011001 1100010x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Pdn); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand = P[dn]; - bits(PL) result; - - integer next = LastActiveElement(operand, esize) + 1; - - while next < elements && (ElemP[mask, next, esize] == '0') do - next = next + 1; - - result = Zeros(); - if next < elements then - ElemP[result, next, esize] = '1'; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[dn] = result; - -__instruction LDNF1D_Z_P_BI_U64 - __encoding LDNF1D_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1111xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_integer_bitfield - __encoding aarch64_integer_bitfield - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10011 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - - boolean inzero; - boolean extend; - integer R; - integer S; - bits(datasize) wmask; - bits(datasize) tmask; - - case opc of - when '00' inzero = TRUE; extend = TRUE; // SBFM - when '01' inzero = FALSE; extend = FALSE; // BFM - when '10' inzero = TRUE; extend = FALSE; // UBFM - when '11' UNDEFINED; - - if sf == '1' && N != '1' then UNDEFINED; - if sf == '0' && (N != '0' || immr[5] != '0' || imms[5] != '0') then UNDEFINED; - - R = UInt(immr); - S = UInt(imms); - (wmask, tmask) = DecodeBitMasks(N, imms, immr, FALSE); - - __execute - bits(datasize) dst = if inzero then Zeros() else X[d]; - bits(datasize) src = X[n]; - - // perform bitfield move on low bits - bits(datasize) bot = (dst AND NOT(wmask)) OR (ROR(src, R) AND wmask); - - // determine extension bits (sign, zero or dest register) - bits(datasize) top = if extend then Replicate(src[S]) else dst; - - // combine extension bits and result bits - X[d] = (top AND NOT(tmask)) OR (bot AND tmask); - -__instruction aarch64_vector_logical - __encoding aarch64_vector_logical - __instruction_set A64 - __field Q 30 +: 1 - __field op 29 +: 1 - __field a 18 +: 1 - __field b 17 +: 1 - __field c 16 +: 1 - __field cmode 12 +: 4 - __field d 9 +: 1 - __field e 8 +: 1 - __field f 7 +: 1 - __field g 6 +: 1 - __field h 5 +: 1 - __field Rd 0 +: 5 - __opcode '0xx01111 00000xxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer rd = UInt(Rd); - - integer datasize = if Q == '1' then 128 else 64; - bits(datasize) imm; - bits(64) imm64; - - ImmediateOp operation; - case cmode:op of - when '0xx00' operation = ImmediateOp_MOVI; - when '0xx01' operation = ImmediateOp_MVNI; - when '0xx10' operation = ImmediateOp_ORR; - when '0xx11' operation = ImmediateOp_BIC; - when '10x00' operation = ImmediateOp_MOVI; - when '10x01' operation = ImmediateOp_MVNI; - when '10x10' operation = ImmediateOp_ORR; - when '10x11' operation = ImmediateOp_BIC; - when '110x0' operation = ImmediateOp_MOVI; - when '110x1' operation = ImmediateOp_MVNI; - when '1110x' operation = ImmediateOp_MOVI; - when '11110' operation = ImmediateOp_MOVI; - when '11111' - // FMOV Dn,#imm is in main FP instruction set - if Q == '0' then UNDEFINED; - operation = ImmediateOp_MOVI; - - imm64 = AdvSIMDExpandImm(op, cmode, a:b:c:d:e:f:g:h); - imm = Replicate(imm64, datasize DIV 64); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand; - bits(datasize) result; - - case operation of - when ImmediateOp_MOVI - result = imm; - when ImmediateOp_MVNI - result = NOT(imm); - when ImmediateOp_ORR - operand = V[rd]; - result = operand OR imm; - when ImmediateOp_BIC - operand = V[rd]; - result = operand AND NOT(imm); - - V[rd] = result; - -__instruction PRFW_I_P_BI_S - __encoding PRFW_I_P_BI_S - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000101 11xxxxxx 010xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 2; - integer offset = SInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) addr; - - if n == 31 then - base = SP[]; - else - base = X[n]; - - addr = base + ((offset * elements) << scale); - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Hint_Prefetch(addr, pref_hint, level, stream); - addr = addr + (1 << scale); - -__instruction aarch64_vector_arithmetic_unary_float_narrow - __encoding aarch64_vector_arithmetic_unary_float_narrow - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 0x100001 011010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16 << UInt(sz); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand = V[n]; - bits(datasize) result; - - for e = 0 to elements-1 - Elem[result, e, esize] = FPConvert(Elem[operand, e, 2*esize], FPCR); - - Vpart[d, part] = result; - -__instruction aarch64_vector_shift_right_sisd - __encoding aarch64_vector_shift_right_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __encoding aarch64_vector_shift_right_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - operand2 = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element = (Int(Elem[operand, e, esize], unsigned) + round_const) >> shift; - Elem[result, e, esize] = Elem[operand2, e, esize] + element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_integer_tags_mcsettagarray - __encoding aarch64_integer_tags_mcsettagarray - __instruction_set A64 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 10100000 000000xx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Xt); - integer n = UInt(Xn); - - __execute - if PSTATE.EL == EL0 then - UNDEFINED; - - bits(64) data = X[t]; - bits(64) address; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - integer size = 4*(2^(UInt(GMID_EL1.BS))); - address = Align(address,size); - integer count = size >> LOG2_TAG_GRANULE; - integer index = UInt(address[LOG2_TAG_GRANULE+3:LOG2_TAG_GRANULE]); - - for i = 0 to count-1 - bits(4) tag = data[(index*4)+3:index*4]; - AArch64.MemTag[address, AccType_NORMAL] = tag; - address = address + TAG_GRANULE; - index = index + 1; - -__instruction aarch64_vector_crypto_sha3op_sha256_hash - __encoding aarch64_vector_crypto_sha3op_sha256_hash - __instruction_set A64 - __field Rm 16 +: 5 - __field P 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 000xxxxx 010x00xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if !HaveSHA256Ext() then UNDEFINED; - boolean part1 = (P == '0'); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) result; - if part1 then - result = SHA256hash(V[d], V[n], V[m], TRUE); - else - result = SHA256hash(V[n], V[d], V[m], FALSE); - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_int - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_int - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 xxxxxxxx 0x00x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - integer element1; - integer element2; - bits(esize) product; - - element2 = UInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = UInt(Elem[operand1, e, esize]); - product = (element1 * element2)[esize-1:0]; - if sub_op then - Elem[result, e, esize] = Elem[operand3, e, esize] - product; - else - Elem[result, e, esize] = Elem[operand3, e, esize] + product; - V[d] = result; - -__instruction BIC_Z_P_ZZ__ - __encoding BIC_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx011011 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element1 AND (NOT element2); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction STNT1H_Z_P_BR_Contiguous - __encoding STNT1H_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 100xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(64) offset = X[m]; - bits(VL) src; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - src = Z[t]; - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_STREAM] = Elem[src, e, esize]; - offset = offset + 1; - -__instruction ST3H_Z_P_BI_Contiguous - __encoding ST3H_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 1101xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction FTSMUL_Z_ZZ__ - __encoding FTSMUL_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx0xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPTrigSMul(element1, element2, FPCR); - - Z[d] = result; - -__instruction aarch64_integer_logical_immediate - __encoding aarch64_integer_logical_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10010 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - bits(datasize) imm; - if sf == '0' && N != '0' then UNDEFINED; - (imm, -) = DecodeBitMasks(N, imms, immr, TRUE); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = imm; - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction FMSB_Z_P_ZZZ__ - __encoding FMSB_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Za 16 +: 5 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx1xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - integer a = UInt(Za); - boolean op1_neg = TRUE; - boolean op3_neg = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[a]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - bits(esize) element3 = Elem[operand3, e, esize]; - - if ElemP[mask, e, esize] == '1' then - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction LD1H_Z_P_AI_S - __encoding LD1H_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 101xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __encoding LD1H_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 101xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_system_barriers_sb - __encoding aarch64_system_barriers_sb - __instruction_set A64 - __field CRm 8 +: 4 - __field opc 5 +: 2 - __opcode '11010101 00000011 0011xxxx 1xx11111' - __guard TRUE - __decode - if !HaveSBExt() then UNDEFINED; - - __execute - SpeculationBarrier(); - -__instruction aarch64_system_barriers_dmb - __encoding aarch64_system_barriers_dmb - __instruction_set A64 - __field CRm 8 +: 4 - __field opc 5 +: 2 - __opcode '11010101 00000011 0011xxxx 1xx11111' - __guard TRUE - __decode - case CRm[3:2] of - when '00' domain = MBReqDomain_OuterShareable; - when '01' domain = MBReqDomain_Nonshareable; - when '10' domain = MBReqDomain_InnerShareable; - when '11' domain = MBReqDomain_FullSystem; - case CRm[1:0] of - when '00' types = MBReqTypes_All; domain = MBReqDomain_FullSystem; - when '01' types = MBReqTypes_Reads; - when '10' types = MBReqTypes_Writes; - when '11' types = MBReqTypes_All; - - __execute - DataMemoryBarrier(domain, types); - -__instruction aarch64_system_exceptions_debug_exception - __encoding aarch64_system_exceptions_debug_exception - __instruction_set A64 - __field imm16 5 +: 16 - __field LL 0 +: 2 - __opcode '11010100 101xxxxx xxxxxxxx xxx000xx' - __guard TRUE - __decode - bits(2) target_level = LL; - if LL == '00' then UNDEFINED; - if !Halted() then UNDEFINED; - - __execute - DCPSInstruction(target_level); - -__instruction aarch64_vector_arithmetic_unary_float_round_frint_32_64 - __encoding aarch64_vector_arithmetic_unary_float_round_frint_32_64 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x100001 111x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFrintExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer intsize = if op == '0' then 32 else 64; - FPRounding rounding = if U == '0' then FPRounding_ZERO else FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundIntN(element, FPCR, rounding, intsize); - - V[d] = result; - -__instruction LD3B_Z_P_BI_Contiguous - __encoding LD3B_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0100xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction FCPY_Z_P_I__ - __encoding FCPY_Z_P_I__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 16 +: 4 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - __opcode '00000101 xx01xxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer d = UInt(Zd); - bits(esize) imm = VFPExpandImm(imm8); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = imm; - - Z[d] = result; - -__instruction NOR_P_P_PP_Z - __encoding NOR_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 1000xxxx 01xxxx1x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding NORS_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 1100xxxx 01xxxx1x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for e = 0 to elements-1 - bit element1 = ElemP[operand1, e, esize]; - bit element2 = ElemP[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = NOT(element1 OR element2); - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_memory_vector_multiple_no_wb - __encoding aarch64_memory_vector_multiple_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 0x000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_multiple_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << UInt(size); - integer elements = datasize DIV esize; - - integer rpt; // number of iterations - integer selem; // structure elements - - case opcode of - when '0000' rpt = 1; selem = 4; // LD/ST4 (4 registers) - when '0010' rpt = 4; selem = 1; // LD/ST1 (4 registers) - when '0100' rpt = 1; selem = 3; // LD/ST3 (3 registers) - when '0110' rpt = 3; selem = 1; // LD/ST1 (3 registers) - when '0111' rpt = 1; selem = 1; // LD/ST1 (1 register) - when '1000' rpt = 1; selem = 2; // LD/ST2 (2 registers) - when '1010' rpt = 2; selem = 1; // LD/ST1 (2 registers) - otherwise UNDEFINED; - - // .1D format only permitted with LD1 & ST1 - if size:Q == '110' && selem != 1 then UNDEFINED; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(datasize) rval; - integer tt; - constant integer ebytes = esize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - for r = 0 to rpt-1 - for e = 0 to elements-1 - tt = (t + r) MOD 32; - for s = 0 to selem-1 - rval = V[tt]; - if memop == MemOp_LOAD then - Elem[rval, e, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[tt] = rval; - else // memop == MemOp_STORE - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, e, esize]; - offs = offs + ebytes; - tt = (tt + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction LD4W_Z_P_BI_Contiguous - __encoding LD4W_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0110xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_integer_bitfield - __encoding aarch64_integer_bitfield - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10011 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - - boolean inzero; - boolean extend; - integer R; - integer S; - bits(datasize) wmask; - bits(datasize) tmask; - - case opc of - when '00' inzero = TRUE; extend = TRUE; // SBFM - when '01' inzero = FALSE; extend = FALSE; // BFM - when '10' inzero = TRUE; extend = FALSE; // UBFM - when '11' UNDEFINED; - - if sf == '1' && N != '1' then UNDEFINED; - if sf == '0' && (N != '0' || immr[5] != '0' || imms[5] != '0') then UNDEFINED; - - R = UInt(immr); - S = UInt(imms); - (wmask, tmask) = DecodeBitMasks(N, imms, immr, FALSE); - - __execute - bits(datasize) dst = if inzero then Zeros() else X[d]; - bits(datasize) src = X[n]; - - // perform bitfield move on low bits - bits(datasize) bot = (dst AND NOT(wmask)) OR (ROR(src, R) AND wmask); - - // determine extension bits (sign, zero or dest register) - bits(datasize) top = if extend then Replicate(src[S]) else dst; - - // combine extension bits and result bits - X[d] = (top AND NOT(tmask)) OR (bot AND tmask); - -__instruction aarch64_memory_single_simdfp_immediate_signed_post_idx - __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111100 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111100 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_simdfp_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111101 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_VEC; - MemOp memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - bits(64) address; - bits(datasize) data; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data = V[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - V[t] = data; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction SDIV_Z_P_ZZ__ - __encoding SDIV_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010100 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '0x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer quotient; - if element2 == 0 then - quotient = 0; - else - quotient = RoundTowardsZero(Real(element1) / Real(element2)); - Elem[result, e, esize] = quotient[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction STNT1D_Z_P_BR_Contiguous - __encoding STNT1D_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 100xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(64) offset = X[m]; - bits(VL) src; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - src = Z[t]; - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_STREAM] = Elem[src, e, esize]; - offset = offset + 1; - -__instruction aarch64_memory_pair_general_post_idx - __encoding aarch64_memory_pair_general_post_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101000 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - - __encoding aarch64_memory_pair_general_pre_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101001 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - - __encoding aarch64_memory_pair_general_offset - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101001 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_NORMAL; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if L:opc[0] == '01' || opc == '11' then UNDEFINED; - boolean signed = (opc[0] != '0'); - integer scale = 2 + UInt(opc[1]); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - boolean wb_unknown = FALSE; - - if memop == MemOp_LOAD && wback && (t == n || t2 == n) && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && (t == n || t2 == n) && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is pre-writeback - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown && t == n then - data1 = bits(datasize) UNKNOWN; - else - data1 = X[t]; - if rt_unknown && t2 == n then - data2 = bits(datasize) UNKNOWN; - else - data2 = X[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - if signed then - X[t] = SignExtend(data1, 64); - X[t2] = SignExtend(data2, 64); - else - X[t] = data1; - X[t2] = data2; - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction LASTA_V_P_Z__ - __encoding LASTA_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000101 xx100010 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - boolean isBefore = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - integer last = LastActiveElement(mask, esize); - - if isBefore then - if last < 0 then last = elements - 1; - else - last = last + 1; - if last >= elements then last = 0; - V[d] = Elem[operand, last, esize]; - -__instruction aarch64_vector_arithmetic_binary_uniform_sub_saturating_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_sub_saturating_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 001011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_sub_saturating_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 001011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer diff; - boolean sat; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - diff = element1 - element2; - (Elem[result, e, esize], sat) = SatQ(diff, esize, unsigned); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_memory_vector_multiple_no_wb - __encoding aarch64_memory_vector_multiple_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 0x000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_multiple_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << UInt(size); - integer elements = datasize DIV esize; - - integer rpt; // number of iterations - integer selem; // structure elements - - case opcode of - when '0000' rpt = 1; selem = 4; // LD/ST4 (4 registers) - when '0010' rpt = 4; selem = 1; // LD/ST1 (4 registers) - when '0100' rpt = 1; selem = 3; // LD/ST3 (3 registers) - when '0110' rpt = 3; selem = 1; // LD/ST1 (3 registers) - when '0111' rpt = 1; selem = 1; // LD/ST1 (1 register) - when '1000' rpt = 1; selem = 2; // LD/ST2 (2 registers) - when '1010' rpt = 2; selem = 1; // LD/ST1 (2 registers) - otherwise UNDEFINED; - - // .1D format only permitted with LD1 & ST1 - if size:Q == '110' && selem != 1 then UNDEFINED; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(datasize) rval; - integer tt; - constant integer ebytes = esize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - for r = 0 to rpt-1 - for e = 0 to elements-1 - tt = (t + r) MOD 32; - for s = 0 to selem-1 - rval = V[tt]; - if memop == MemOp_LOAD then - Elem[rval, e, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[tt] = rval; - else // memop == MemOp_STORE - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, e, esize]; - offs = offs + ebytes; - tt = (tt + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction FDIVR_Z_P_ZZ__ - __encoding FDIVR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx001100 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPDiv(element2, element1, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_integer_ins_ext_insert_movewide - __encoding aarch64_integer_ins_ext_insert_movewide - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field hw 21 +: 2 - __field imm16 5 +: 16 - __field Rd 0 +: 5 - __opcode 'xxx10010 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer datasize = if sf == '1' then 64 else 32; - bits(16) imm = imm16; - integer pos; - MoveWideOp opcode; - - case opc of - when '00' opcode = MoveWideOp_N; - when '10' opcode = MoveWideOp_Z; - when '11' opcode = MoveWideOp_K; - otherwise UNDEFINED; - - if sf == '0' && hw[1] == '1' then UNDEFINED; - pos = UInt(hw:'0000'); - - __execute - bits(datasize) result; - - if opcode == MoveWideOp_K then - result = X[d]; - else - result = Zeros(); - - result[pos+15:pos] = imm; - if opcode == MoveWideOp_N then - result = NOT(result); - X[d] = result; - -__instruction EOR_Z_P_ZZ__ - __encoding EOR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx011001 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element1 EOR element2; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction FSUBR_Z_P_ZZ__ - __encoding FSUBR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx000011 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPSub(element2, element1, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction PRFD_I_P_AI_S - __encoding PRFD_I_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000101 100xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 3; - integer offset = UInt(imm5); - - __encoding PRFD_I_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000101 100xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 3; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) base; - bits(64) addr; - base = Z[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + (offset << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - -__instruction aarch64_branch_unconditional_dret - __encoding aarch64_branch_unconditional_dret - __instruction_set A64 - __opcode '11010110 10111111 00000011 11100000' - __guard TRUE - __decode - if !Halted() || PSTATE.EL == EL0 then UNDEFINED; - - __execute - DRPSInstruction(); - -__instruction aarch64_vector_arithmetic_unary_extract_sat_sisd - __encoding aarch64_vector_arithmetic_unary_extract_sat_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 010010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer part = 0; - integer elements = 1; - - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_extract_sat_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 010010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand = V[n]; - bits(datasize) result; - bits(2*esize) element; - boolean sat; - - for e = 0 to elements-1 - element = Elem[operand, e, 2*esize]; - (Elem[result, e, esize], sat) = SatQ(Int(element, unsigned), esize, unsigned); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction ST3B_Z_P_BI_Contiguous - __encoding ST3B_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 0101xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction LD1RH_Z_P_BI_U16 - __encoding LD1RH_Z_P_BI_U16 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 11xxxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __encoding LD1RH_Z_P_BI_U32 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 11xxxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __encoding LD1RH_Z_P_BI_U64 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 11xxxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - integer last = LastActiveElement(mask, esize); - if last >= 0 then - addr = base + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction UQADD_Z_ZZ__ - __encoding UQADD_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + element2, esize, unsigned); - - Z[d] = result; - -__instruction LDNF1SH_Z_P_BI_S32 - __encoding LDNF1SH_Z_P_BI_S32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0011xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __encoding LDNF1SH_Z_P_BI_S64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0001xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_integer_flags_xaflag - __encoding aarch64_integer_flags_xaflag - __instruction_set A64 - __field CRm 8 +: 4 - __opcode '11010101 00000000 0100xxxx 00111111' - __guard TRUE - __decode - if !HaveFlagFormatExt() then UNDEFINED; - - __execute - bit N = NOT(PSTATE.C) AND NOT(PSTATE.Z); - bit Z = PSTATE.Z AND PSTATE.C; - bit C = PSTATE.C OR PSTATE.Z; - bit V = NOT(PSTATE.C) AND PSTATE.Z; - - PSTATE.N = N; - PSTATE.Z = Z; - PSTATE.C = C; - PSTATE.V = V; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction ST1W_Z_P_BZ_S_x32_scaled - __encoding ST1W_Z_P_BZ_S_x32_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 011xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 2; - - __encoding ST1W_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 001xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 2; - - __encoding ST1W_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 000xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding ST1W_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 010xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding ST1W_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 001xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 2; - - __encoding ST1W_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 000xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(VL) offset = Z[m]; - bits(VL) src = Z[t]; - bits(PL) mask = P[g]; - bits(64) addr; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - -__instruction SMAXV_R_P_Z__ - __encoding SMAXV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx001000 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - integer maximum = if unsigned then 0 else -(2^(esize-1)); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer element = Int(Elem[operand, e, esize], unsigned); - maximum = Max(maximum, element); - - V[d] = maximum[esize-1:0]; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if abs then - element1 = FPAbs(element1); - element2 = FPAbs(element2); - case cmp of - when CompareOp_EQ test_passed = FPCompareEQ(element1, element2, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element1, element2, FPCR); - when CompareOp_GT test_passed = FPCompareGT(element1, element2, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction ST1D_Z_P_BZ_D_x32_scaled - __encoding ST1D_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 101xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 3; - - __encoding ST1D_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 100xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding ST1D_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 101xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 3; - - __encoding ST1D_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 100xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(VL) offset = Z[m]; - bits(VL) src = Z[t]; - bits(PL) mask = P[g]; - bits(64) addr; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - -__instruction UQINCH_R_RS_UW - __encoding UQINCH_R_RS_UW - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0110xxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQINCH_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0111xxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 + (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction LDNF1SB_Z_P_BI_S16 - __encoding LDNF1SB_Z_P_BI_S16 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1101xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __encoding LDNF1SB_Z_P_BI_S32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1011xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __encoding LDNF1SB_Z_P_BI_S64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1001xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - addr = addr + mbytes; - - Z[t] = result; - -__instruction CNTP_R_P_P__ - __encoding CNTP_R_P_P__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Rd 0 +: 5 - __opcode '00100101 xx100000 10xxxx0x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Pn); - integer d = UInt(Rd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand = P[n]; - bits(64) sum = Zeros(); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' && ElemP[operand, e, esize] == '1' then - sum = sum + 1; - X[d] = sum; - -__instruction aarch64_vector_reduce_fp16_maxnm_simd - __encoding aarch64_vector_reduce_fp16_maxnm_simd - __instruction_set A64 - __field Q 30 +: 1 - __field o1 23 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 x0110000 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = if o1 == '1' then ReduceOp_FMINNUM else ReduceOp_FMAXNUM; - - __encoding aarch64_vector_reduce_fp_maxnm_simd - __instruction_set A64 - __field Q 30 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx110000 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q != '01' then UNDEFINED; // .4S only - - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = if o1 == '1' then ReduceOp_FMINNUM else ReduceOp_FMAXNUM; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction PFALSE_P__ - __encoding PFALSE_P__ - __instruction_set A64 - __field Pd 0 +: 4 - __opcode '00100101 00011000 11100100 0000xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer d = UInt(Pd); - - __execute - CheckSVEEnabled(); - P[d] = Zeros(PL); - -__instruction aarch64_vector_shift_conv_int_sisd - __encoding aarch64_vector_shift_conv_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '000x' || (immh == '001x' && !HaveFP16Ext()) then UNDEFINED; - integer esize = if immh == '1xxx' then 64 else if immh == '01xx' then 32 else 16; - integer datasize = esize; - integer elements = 1; - - integer fracbits = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_shift_conv_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh == '000x' || (immh == '001x' && !HaveFP16Ext()) then UNDEFINED; - if immh[3]:Q == '10' then UNDEFINED; - integer esize = if immh == '1xxx' then 64 else if immh == '01xx' then 32 else 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer fracbits = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - FPRounding rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FixedToFP(element, fracbits, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction aarch64_vector_shift_left_long - __encoding aarch64_vector_shift_left_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 101001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = UInt(immh:immb) - esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = Vpart[n, part]; - bits(datasize*2) result; - integer element; - - for e = 0 to elements-1 - element = Int(Elem[operand, e, esize], unsigned) << shift; - Elem[result, e, 2*esize] = element[2*esize-1:0]; - - V[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction FSUB_Z_P_ZS__ - __encoding FSUB_Z_P_ZS__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - __opcode '01100101 xx011001 100xxx00 00xxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - bits(esize) imm = if i1 == '0' then FPPointFive('0') else FPOne('0'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPSub(element1, imm, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction LDR_Z_BI__ - __encoding LDR_Z_BI__ - __instruction_set A64 - __field imm9h 16 +: 6 - __field imm9l 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 10xxxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer imm = SInt(imm9h:imm9l); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 8; - bits(64) base; - integer offset = imm * elements; - bits(VL) result; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - boolean aligned = AArch64.CheckAlignment(base + offset, 16, AccType_NORMAL, FALSE); - for e = 0 to elements-1 - Elem[result, e, 8] = AArch64.MemSingle[base + offset, 1, AccType_NORMAL, aligned]; - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_vector_transfer_vector_permute_unzip - __encoding aarch64_vector_transfer_vector_permute_unzip - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx0xxxxx 0x0110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer part = UInt(op); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operandl = V[n]; - bits(datasize) operandh = V[m]; - bits(datasize) result; - - bits(datasize*2) zipped = operandh:operandl; - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[zipped, 2*e+part, esize]; - - V[d] = result; - -__instruction aarch64_float_arithmetic_mul_product - __encoding aarch64_float_arithmetic_mul_product - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field op 15 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx x00010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean negated = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - result = FPMul(operand1, operand2, FPCR); - - if negated then result = FPNeg(result); - - V[d] = result; - -__instruction AND_Z_ZZ__ - __encoding AND_Z_ZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 001xxxxx 001100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - - Z[d] = operand1 AND operand2; - -__instruction FABD_Z_P_ZZ__ - __encoding FABD_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx001000 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPAbs(FPSub(element1, element2, FPCR)); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction CPY_Z_P_V__ - __encoding CPY_Z_P_V__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Vn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx100000 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Vn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(esize) operand1 = V[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = operand1; - - Z[d] = result; - -__instruction ST4D_Z_P_BI_Contiguous - __encoding ST4D_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 1111xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_accum - __encoding aarch64_vector_arithmetic_binary_disparate_mul_accum - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 10x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - bits(2*esize) accum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - if sub_op then - accum = Elem[operand3, e, 2*esize] - product; - else - accum = Elem[operand3, e, 2*esize] + product; - Elem[result, e, 2*esize] = accum; - - V[d] = result; - -__instruction ST1W_Z_P_BR__ - __encoding ST1W_Z_P_BR__ - __instruction_set A64 - __field size 21 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 0xxxxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '1x' then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8 << UInt(size); - integer msize = 32; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - bits(VL) src = Z[t]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - offset = offset + 1; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_vector_arithmetic_unary_diff_neg_sat_sisd - __encoding aarch64_vector_arithmetic_unary_diff_neg_sat_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 011110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean neg = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_diff_neg_sat_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 011110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean neg = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - if neg then - element = -element; - else - element = Abs(element); - (Elem[result, e, esize], sat) = SignedSatQ(element, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_float_arithmetic_max_min - __encoding aarch64_float_arithmetic_max_min - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field op 12 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx 01xx10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - FPMaxMinOp operation; - case op of - when '00' operation = FPMaxMinOp_MAX; - when '01' operation = FPMaxMinOp_MIN; - when '10' operation = FPMaxMinOp_MAXNUM; - when '11' operation = FPMaxMinOp_MINNUM; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - case operation of - when FPMaxMinOp_MAX result = FPMax(operand1, operand2, FPCR); - when FPMaxMinOp_MIN result = FPMin(operand1, operand2, FPCR); - when FPMaxMinOp_MAXNUM result = FPMaxNum(operand1, operand2, FPCR); - when FPMaxMinOp_MINNUM result = FPMinNum(operand1, operand2, FPCR); - - V[d] = result; - -__instruction ST1W_Z_P_BI__ - __encoding ST1W_Z_P_BI__ - __instruction_set A64 - __field size 21 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 0xx0xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '1x' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8 << UInt(size); - integer msize = 32; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) src = Z[t]; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - addr = addr + mbytes; - -__instruction ST4B_Z_P_BR_Contiguous - __encoding ST4B_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 011xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction aarch64_integer_conditional_compare_register - __encoding aarch64_integer_conditional_compare_register - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field nzcv 0 +: 4 - __opcode 'xx111010 010xxxxx xxxx00xx xxx0xxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - bits(4) condition = cond; - bits(4) flags = nzcv; - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bit carry_in = '0'; - - if ConditionHolds(condition) then - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - (-, flags) = AddWithCarry(operand1, operand2, carry_in); - PSTATE.[N,Z,C,V] = flags; - -__instruction LD1RD_Z_P_BI_U64 - __encoding LD1RD_Z_P_BI_U64 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 11xxxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - integer last = LastActiveElement(mask, esize); - if last >= 0 then - addr = base + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction ADD_Z_ZZ__ - __encoding ADD_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = element1 + element2; - - Z[d] = result; - -__instruction aarch64_memory_ordered_rcpc - __encoding aarch64_memory_ordered_rcpc - __instruction_set A64 - __field size 30 +: 2 - __field Rs 16 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 101xxxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = AccType_ORDERED; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_float_arithmetic_max_min - __encoding aarch64_float_arithmetic_max_min - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field op 12 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx 01xx10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - FPMaxMinOp operation; - case op of - when '00' operation = FPMaxMinOp_MAX; - when '01' operation = FPMaxMinOp_MIN; - when '10' operation = FPMaxMinOp_MAXNUM; - when '11' operation = FPMaxMinOp_MINNUM; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - case operation of - when FPMaxMinOp_MAX result = FPMax(operand1, operand2, FPCR); - when FPMaxMinOp_MIN result = FPMin(operand1, operand2, FPCR); - when FPMaxMinOp_MAXNUM result = FPMaxNum(operand1, operand2, FPCR); - when FPMaxMinOp_MINNUM result = FPMinNum(operand1, operand2, FPCR); - - V[d] = result; - -__instruction UUNPKHI_Z_Z__ - __encoding UUNPKHI_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx110011 001110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = TRUE; - boolean hi = TRUE; - - __encoding UUNPKLO_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx110010 001110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = TRUE; - boolean hi = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer hsize = esize DIV 2; - bits(VL) operand = Z[n]; - bits(VL) result; - - for e = 0 to elements-1 - bits(hsize) element = if hi then Elem[operand, e + elements, hsize] else Elem[operand, e, hsize]; - Elem[result, e, esize] = Extend(element, esize, unsigned); - - Z[d] = result; - -__instruction DECB_R_RS__ - __encoding DECB_R_RS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0011xxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding DECD_R_RS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1111xxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding DECH_R_RS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0111xxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding DECW_R_RS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1011xxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(64) operand1 = X[dn]; - - X[dn] = operand1 - (count * imm); - -__instruction aarch64_vector_shift_left_insert_sisd - __encoding aarch64_vector_shift_left_insert_sisd - __instruction_set A64 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111111 0xxxxxxx 010101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = UInt(immh:immb) - esize; - - __encoding aarch64_vector_shift_left_insert_simd - __instruction_set A64 - __field Q 30 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 0xxxxxxx 010101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = UInt(immh:immb) - esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2 = V[d]; - bits(datasize) result; - bits(esize) mask = LSL(Ones(esize), shift); - bits(esize) shifted; - - for e = 0 to elements-1 - shifted = LSL(Elem[operand, e, esize], shift); - Elem[result, e, esize] = (Elem[operand2, e, esize] AND NOT(mask)) OR shifted; - V[d] = result; - -__instruction INCP_R_P_R__ - __encoding INCP_R_P_R__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101100 1000100x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) operand1 = X[dn]; - bits(PL) operand2 = P[m]; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - X[dn] = operand1 + count; - -__instruction aarch64_integer_arithmetic_mul_uniform_add_sub - __encoding aarch64_integer_arithmetic_mul_uniform_add_sub - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011011 000xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer a = UInt(Ra); - integer destsize = if sf == '1' then 64 else 32; - integer datasize = destsize; - boolean sub_op = (o0 == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(destsize) operand3 = X[a]; - - integer result; - - if sub_op then - result = UInt(operand3) - (UInt(operand1) * UInt(operand2)); - else - result = UInt(operand3) + (UInt(operand1) * UInt(operand2)); - - X[d] = result[destsize-1:0]; - -__instruction aarch64_vector_arithmetic_unary_special_sqrt_est_fp16_sisd - __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_fp16_sisd - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 11111001 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_float_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 1x100001 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 11111001 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __encoding aarch64_vector_arithmetic_unary_special_sqrt_est_float_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 1x100001 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRSqrtEstimate(element, FPCR); - - V[d] = result; - -__instruction aarch64_memory_vector_multiple_no_wb - __encoding aarch64_memory_vector_multiple_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 0x000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_multiple_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << UInt(size); - integer elements = datasize DIV esize; - - integer rpt; // number of iterations - integer selem; // structure elements - - case opcode of - when '0000' rpt = 1; selem = 4; // LD/ST4 (4 registers) - when '0010' rpt = 4; selem = 1; // LD/ST1 (4 registers) - when '0100' rpt = 1; selem = 3; // LD/ST3 (3 registers) - when '0110' rpt = 3; selem = 1; // LD/ST1 (3 registers) - when '0111' rpt = 1; selem = 1; // LD/ST1 (1 register) - when '1000' rpt = 1; selem = 2; // LD/ST2 (2 registers) - when '1010' rpt = 2; selem = 1; // LD/ST1 (2 registers) - otherwise UNDEFINED; - - // .1D format only permitted with LD1 & ST1 - if size:Q == '110' && selem != 1 then UNDEFINED; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(datasize) rval; - integer tt; - constant integer ebytes = esize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - for r = 0 to rpt-1 - for e = 0 to elements-1 - tt = (t + r) MOD 32; - for s = 0 to selem-1 - rval = V[tt]; - if memop == MemOp_LOAD then - Elem[rval, e, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[tt] = rval; - else // memop == MemOp_STORE - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, e, esize]; - offs = offs + ebytes; - tt = (tt + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction RDVL_R_I__ - __encoding RDVL_R_I__ - __instruction_set A64 - __field imm6 5 +: 6 - __field Rd 0 +: 5 - __opcode '00000100 10111111 01010xxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer d = UInt(Rd); - integer imm = SInt(imm6); - - __execute - CheckSVEEnabled(); - integer len = imm * (VL DIV 8); - X[d] = len[63:0]; - -__instruction LDFF1D_Z_P_BR_U64 - __encoding LDFF1D_Z_P_BR_U64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 111xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + UInt(offset) * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_CNOTFIRST]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - offset = offset + 1; - - Z[t] = result; - -__instruction LD1ROW_Z_P_BI_U32 - __encoding LD1ROW_Z_P_BI_U32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0010xxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - if VL < 256 then UNDEFINED; - integer elements = 256 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low bits only - bits(256) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * 32; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = ZeroExtend(Replicate(result, VL DIV 256), VL); - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 001101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_1985 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - - if minimum then - Elem[result, e, esize] = FPMin(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMax(element1, element2, FPCR); - - V[d] = result; - -__instruction FNMLS_Z_P_ZZZ__ - __encoding FNMLS_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100101 xx1xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = FALSE; - boolean op3_neg = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - bits(esize) element3 = Elem[operand3, e, esize]; - - if ElemP[mask, e, esize] == '1' then - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - else - Elem[result, e, esize] = element3; - - Z[da] = result; - -__instruction ST1B_Z_P_AI_S - __encoding ST1B_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 011xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - integer offset = UInt(imm5); - - __encoding ST1B_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 010xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(VL) src = Z[t]; - bits(PL) mask = P[g]; - bits(64) addr; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction LDFF1H_Z_P_AI_S - __encoding LDFF1H_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 101xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __encoding LDFF1H_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 101xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_narrow - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_narrow - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 01x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean round = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand1 = V[n]; - bits(2*datasize) operand2 = V[m]; - bits(datasize) result; - integer round_const = if round then 1 << (esize - 1) else 0; - bits(2*esize) element1; - bits(2*esize) element2; - bits(2*esize) sum; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, 2*esize]; - element2 = Elem[operand2, e, 2*esize]; - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - sum = sum + round_const; - Elem[result, e, esize] = sum[2*esize-1:esize]; - - Vpart[d, part] = result; - -__instruction FMAX_Z_P_ZZ__ - __encoding FMAX_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx000110 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMax(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_sisd - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 xx0xxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' || size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean rounding = TRUE; - boolean sub_op = (S == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx0xxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' || size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean rounding = TRUE; - boolean sub_op = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - integer rounding_const = if rounding then 1 << (esize - 1) else 0; - integer element1; - integer element2; - integer element3; - integer product; - boolean sat; - - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element2 = SInt(Elem[operand2, e, esize]); - element3 = SInt(Elem[operand3, e, esize]); - if sub_op then - accum = ((element3 << esize) - 2 * (element1 * element2) + rounding_const); - else - accum = ((element3 << esize) + 2 * (element1 * element2) + rounding_const); - (Elem[result, e, esize], sat) = SignedSatQ(accum >> esize, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction LSR_Z_ZI__ - __encoding LSR_Z_ZI__ - __instruction_set A64 - __field tszh 22 +: 2 - __field tszl 19 +: 2 - __field imm3 16 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 100101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - bits(4) tsize = tszh:tszl; - case tsize of - when '0000' UNDEFINED; - when '0001' esize = 8; - when '001x' esize = 16; - when '01xx' esize = 32; - when '1xxx' esize = 64; - integer n = UInt(Zn); - integer d = UInt(Zd); - integer shift = (2 * esize) - UInt(tsize:imm3); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - Elem[result, e, esize] = LSR(element1, shift); - - Z[d] = result; - -__instruction LD1RSW_Z_P_BI_S64 - __encoding LD1RSW_Z_P_BI_S64 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 11xxxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = FALSE; - integer offset = UInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - integer last = LastActiveElement(mask, esize); - if last >= 0 then - addr = base + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_branch_unconditional_register - __encoding aarch64_branch_unconditional_register - __instruction_set A64 - __field Z 24 +: 1 - __field op 21 +: 2 - __field A 11 +: 1 - __field M 10 +: 1 - __field Rn 5 +: 5 - __field Rm 0 +: 5 - __opcode '1101011x 0xx11111 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - BranchType branch_type; - integer m = UInt(Rm); - boolean pac = (A == '1'); - boolean use_key_a = (M == '0'); - boolean source_is_sp = ((Z == '1') && (m == 31)); - - if !pac && m != 0 then - UNDEFINED; - elsif pac && !HavePACExt() then - UNDEFINED; - - case op of - when '00' branch_type = BranchType_INDIR; - when '01' branch_type = BranchType_INDCALL; - when '10' branch_type = BranchType_RET; - otherwise UNDEFINED; - - if pac then - if Z == '0' && m != 31 then - UNDEFINED; - - if branch_type == BranchType_RET then - if n != 31 then UNDEFINED; - n = 30; - source_is_sp = TRUE; - - __execute - bits(64) target = X[n]; - boolean auth_then_branch = TRUE; - - if pac then - bits(64) modifier = if source_is_sp then SP[] else X[m]; - - if use_key_a then - target = AuthIA(target, modifier, auth_then_branch); - else - target = AuthIB(target, modifier, auth_then_branch); - - if branch_type == BranchType_INDCALL then X[30] = PC[] + 4; - - // Value in BTypeNext will be used to set PSTATE.BTYPE - case branch_type of - when BranchType_INDIR // BR, BRAA, BRAB, BRAAZ, BRABZ - if InGuardedPage then - if n == 16 || n == 17 then - BTypeNext = '01'; - else - BTypeNext = '11'; - else - BTypeNext = '01'; - when BranchType_INDCALL // BLR, BLRAA, BLRAB, BLRAAZ, BLRABZ - BTypeNext = '10'; - when BranchType_RET // RET, RETAA, RETAB - BTypeNext = '00'; - - BranchTo(target, branch_type); - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp16_sisd - __instruction_set A64 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 00xxxxxx 0x01x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - boolean sub_op = (o2 == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 1xxxxxxx 0x01x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi = M; - case sz:L of - when '0x' index = UInt(H:L); - when '10' index = UInt(H); - when '11' UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - boolean sub_op = (o2 == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 00xxxxxx 0x01x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (o2 == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 1xxxxxxx 0x01x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi = M; - case sz:L of - when '0x' index = UInt(H:L); - when '10' index = UInt(H); - when '11' UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2 = Elem[operand2, index, esize]; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAdd(Elem[operand3, e, esize], element1, element2, FPCR); - V[d] = result; - -__instruction ORV_R_P_Z__ - __encoding ORV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx011000 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(esize) result = Zeros(esize); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - result = result OR Elem[operand, e, esize]; - - V[d] = result; - -__instruction aarch64_integer_flags_rmif - __encoding aarch64_integer_flags_rmif - __instruction_set A64 - __field sf 31 +: 1 - __field imm6 15 +: 6 - __field Rn 5 +: 5 - __field mask 0 +: 4 - __opcode 'x0111010 000xxxxx x00001xx xxx0xxxx' - __guard TRUE - __decode - if !HaveFlagManipulateExt() || sf != '1' then UNDEFINED; - integer lsb = UInt(imm6); - integer n = UInt(Rn); - - __execute - bits(4) tmp; - bits(64) tmpreg = X[n]; - tmp = (tmpreg:tmpreg)[lsb+3:lsb]; - if mask[3] == '1' then PSTATE.N = tmp[3]; - if mask[2] == '1' then PSTATE.Z = tmp[2]; - if mask[1] == '1' then PSTATE.C = tmp[1]; - if mask[0] == '1' then PSTATE.V = tmp[0]; - -__instruction FMLS_Z_ZZZi_H - __encoding FMLS_Z_ZZZi_H - __instruction_set A64 - __field i3h 22 +: 1 - __field i3l 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 0x1xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer index = UInt(i3h:i3l); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = TRUE; - boolean op3_neg = FALSE; - - __encoding FMLS_Z_ZZZi_S - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 101xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer index = UInt(i2); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = TRUE; - boolean op3_neg = FALSE; - - __encoding FMLS_Z_ZZZi_D - __instruction_set A64 - __field i1 20 +: 1 - __field Zm 16 +: 4 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 111xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer index = UInt(i1); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = TRUE; - boolean op3_neg = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer eltspersegment = 128 DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result = Z[da]; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = segmentbase + index; - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, s, esize]; - bits(esize) element3 = Elem[result, e, esize]; - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - - Z[da] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_long - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 xxxxxxxx 0x10x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - - element2 = Int(Elem[operand2, index, esize], unsigned); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - if sub_op then - Elem[result, e, 2*esize] = Elem[operand3, e, 2*esize] - product; - else - Elem[result, e, 2*esize] = Elem[operand3, e, 2*esize] + product; - - V[d] = result; - -__instruction UQINCD_Z_ZS__ - __encoding UQINCD_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1110xxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_pair - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_pair - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1010x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - integer element1; - integer element2; - integer maxmin; - - for e = 0 to elements-1 - element1 = Int(Elem[concat, 2*e, esize], unsigned); - element2 = Int(Elem[concat, (2*e)+1, esize], unsigned); - maxmin = if minimum then Min(element1, element2) else Max(element1, element2); - Elem[result, e, esize] = maxmin[esize-1:0]; - - V[d] = result; - -__instruction ADDPL_R_RI__ - __encoding ADDPL_R_RI__ - __instruction_set A64 - __field Rn 16 +: 5 - __field imm6 5 +: 6 - __field Rd 0 +: 5 - __opcode '00000100 011xxxxx 01010xxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer n = UInt(Rn); - integer d = UInt(Rd); - integer imm = SInt(imm6); - - __execute - CheckSVEEnabled(); - bits(64) operand1 = if n == 31 then SP[] else X[n]; - bits(64) result = operand1 + (imm * (PL DIV 8)); - - if d == 31 then - SP[] = result; - else - X[d] = result; - -__instruction BRKPB_P_P_PP__ - __encoding BRKPB_P_P_PP__ - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0000xxxx 11xxxx0x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding BRKPBS_P_P_PP__ - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0100xxxx 11xxxx0x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - boolean last = (LastActive(mask, operand1, 8) == '1'); - - for e = 0 to elements-1 - if ElemP[mask, e, 8] == '1' then - last = last && (ElemP[operand2, e, 8] == '0'); - ElemP[result, e, 8] = if last then '1' else '0'; - else - ElemP[result, e, 8] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction USDOT_Z_ZZZi_S - __encoding USDOT_Z_ZZZi_S - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 101xxxxx 000110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveInt8MatMulExt() then UNDEFINED; - integer esize = 32; - integer index = UInt(i2); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer eltspersegment = 128 DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = segmentbase + index; - bits(esize) res = Elem[operand3, e, esize]; - for i = 0 to 3 - integer element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - integer element2 = SInt(Elem[operand2, 4 * s + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = res; - - Z[da] = result; - -__instruction CLASTA_Z_P_ZZ__ - __encoding CLASTA_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000101 xx101000 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean isBefore = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - integer last = LastActiveElement(mask, esize); - - if last < 0 then - result = operand1; - else - if !isBefore then - last = last + 1; - if last >= elements then last = 0; - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[operand2, last, esize]; - - Z[dn] = result; - -__instruction FMAXV_V_P_Z__ - __encoding FMAXV_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '01100101 xx000110 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(esize) identity = FPInfinity('1'); - - V[d] = ReducePredicated(ReduceOp_FMAX, operand, mask, identity); - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 001101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_1985 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - - if minimum then - Elem[result, e, esize] = FPMin(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMax(element1, element2, FPCR); - - V[d] = result; - -__instruction FMUL_Z_P_ZS__ - __encoding FMUL_Z_P_ZS__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - __opcode '01100101 xx011010 100xxx00 00xxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - bits(esize) imm = if i1 == '0' then FPPointFive('0') else FPTwo('0'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMul(element1, imm, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction FSQRT_Z_P_Z__ - __encoding FSQRT_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx001101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPSqrt(element, FPCR); - - Z[d] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction PRFB_I_P_BR_S - __encoding PRFB_I_P_BR_S - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000100 000xxxxx 110xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) offset = X[m]; - bits(64) addr; - - if n == 31 then - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + (UInt(offset) << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - offset = offset + 1; - -__instruction LDFF1D_Z_P_AI_D - __encoding LDFF1D_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 101xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction COMPACT_Z_P_Z__ - __encoding COMPACT_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx100001 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '0x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) result; - integer x = 0; - - for e = 0 to elements-1 - Elem[result, e, esize] = Zeros(); - if ElemP[mask, e, esize] == '1' then - bits(esize) element = Elem[operand1, e, esize]; - Elem[result, x, esize] = element; - x = x + 1; - - Z[d] = result; - -__instruction BRKA_P_P_P__ - __encoding BRKA_P_P_P__ - __instruction_set A64 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field M 4 +: 1 - __field Pd 0 +: 4 - __opcode '00100101 00010000 01xxxx0x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer d = UInt(Pd); - boolean merging = (M == '1'); - boolean setflags = FALSE; - - __encoding BRKAS_P_P_P_Z - __instruction_set A64 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 01010000 01xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer d = UInt(Pd); - boolean merging = FALSE; - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand = P[n]; - bits(PL) operand2 = P[d]; - boolean break = FALSE; - bits(PL) result; - - for e = 0 to elements-1 - boolean element = ElemP[operand, e, esize] == '1'; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = if !break then '1' else '0'; - break = break || element; - elsif merging then - ElemP[result, e, esize] = ElemP[operand2, e, esize]; - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_halving_truncating - __encoding aarch64_vector_arithmetic_binary_uniform_add_halving_truncating - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - sum = element1 + element2; - Elem[result, e, esize] = sum[esize:1]; - - V[d] = result; - -__instruction aarch64_integer_arithmetic_add_sub_extendedreg - __encoding aarch64_integer_arithmetic_add_sub_extendedreg - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field imm3 10 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01011 001xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - ExtendType extend_type = DecodeRegExtend(option); - integer shift = UInt(imm3); - if shift > 4 then UNDEFINED; - - __execute - bits(datasize) result; - bits(datasize) operand1 = if n == 31 then SP[] else X[n]; - bits(datasize) operand2 = ExtendReg(m, extend_type, shift); - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction UQDECW_Z_ZS__ - __encoding UQDECW_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1010xxxx 110011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 100001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean sub_op = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_single_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 100001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if sub_op then - Elem[result, e, esize] = element1 - element2; - else - Elem[result, e, esize] = element1 + element2; - - V[d] = result; - -__instruction aarch64_system_exceptions_debug_exception - __encoding aarch64_system_exceptions_debug_exception - __instruction_set A64 - __field imm16 5 +: 16 - __field LL 0 +: 2 - __opcode '11010100 101xxxxx xxxxxxxx xxx000xx' - __guard TRUE - __decode - bits(2) target_level = LL; - if LL == '00' then UNDEFINED; - if !Halted() then UNDEFINED; - - __execute - DCPSInstruction(target_level); - -__instruction LD1SW_Z_P_AI_D - __encoding LD1SW_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 001xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction SQSUB_Z_ZI__ - __encoding SQSUB_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx100110 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer imm = UInt(imm8); - if sh == '1' then imm = imm << 8; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - imm, esize, unsigned); - - Z[dn] = result; - -__instruction ST1H_Z_P_AI_S - __encoding ST1H_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 111xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offset = UInt(imm5); - - __encoding ST1H_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 110xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(VL) src = Z[t]; - bits(PL) mask = P[g]; - bits(64) addr; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - -__instruction LD1ROW_Z_P_BR_Contiguous - __encoding LD1ROW_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 001xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - - __execute - CheckSVEEnabled(); - if VL < 256 then UNDEFINED; - integer elements = 256 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low bits only - bits(64) offset; - bits(256) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - offset = X[m]; - - addr = base + UInt(offset) * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = ZeroExtend(Replicate(result, VL DIV 256), VL); - -__instruction ADD_Z_ZI__ - __encoding ADD_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx100000 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer imm = UInt(imm8); - if sh == '1' then imm = imm << 8; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - Elem[result, e, esize] = element1 + imm; - - Z[dn] = result; - -__instruction aarch64_float_arithmetic_round_frint - __encoding aarch64_float_arithmetic_round_frint - __instruction_set A64 - __field ftype 22 +: 2 - __field rmode 15 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1001xx x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean exact = FALSE; - FPRounding rounding; - case rmode of - when '0xx' rounding = FPDecodeRounding(rmode[1:0]); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundInt(operand, FPCR, rounding, exact); - - V[d] = result; - -__instruction LDFF1D_Z_P_BZ_D_x32_scaled - __encoding LDFF1D_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 1x1xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 3; - - __encoding LDFF1D_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 1x0xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1D_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 111xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 3; - - __encoding LDFF1D_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 110xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction PUNPKHI_P_P__ - __encoding PUNPKHI_P_P__ - __instruction_set A64 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 00110001 0100000x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer n = UInt(Pn); - integer d = UInt(Pd); - boolean hi = TRUE; - - __encoding PUNPKLO_P_P__ - __instruction_set A64 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 00110000 0100000x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer n = UInt(Pn); - integer d = UInt(Pd); - boolean hi = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) operand = P[n]; - bits(PL) result; - - for e = 0 to elements-1 - ElemP[result, e, esize] = ElemP[operand, if hi then e + elements else e, esize DIV 2]; - - P[d] = result; - -__instruction DUP_Z_I__ - __encoding DUP_Z_I__ - __instruction_set A64 - __field size 22 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - __opcode '00100101 xx111000 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer d = UInt(Zd); - integer imm = SInt(imm8); - if sh == '1' then imm = imm << 8; - - __execute - CheckSVEEnabled(); - bits(VL) result = Replicate(imm[esize-1:0]); - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field a 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (a == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_2008 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - - if minimum then - Elem[result, e, esize] = FPMinNum(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMaxNum(element1, element2, FPCR); - - V[d] = result; - -__instruction LDFF1B_Z_P_BR_U8 - __encoding LDFF1B_Z_P_BR_U8 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 000xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - integer msize = 8; - boolean unsigned = TRUE; - - __encoding LDFF1B_Z_P_BR_U16 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 001xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = TRUE; - - __encoding LDFF1B_Z_P_BR_U32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 010xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = TRUE; - - __encoding LDFF1B_Z_P_BR_U64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 011xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + UInt(offset) * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_CNOTFIRST]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - offset = offset + 1; - - Z[t] = result; - -__instruction LD2D_Z_P_BR_Contiguous - __encoding LD2D_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 101xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_transfer_vector_permute_transpose - __encoding aarch64_vector_transfer_vector_permute_transpose - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx0xxxxx 0x1010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer part = UInt(op); - integer pairs = elements DIV 2; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - for p = 0 to pairs-1 - Elem[result, 2*p+0, esize] = Elem[operand1, 2*p+part, esize]; - Elem[result, 2*p+1, esize] = Elem[operand2, 2*p+part, esize]; - - V[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_integer_arithmetic_add_sub_immediate - __encoding aarch64_integer_arithmetic_add_sub_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field sh 22 +: 1 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10001 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - bits(datasize) imm; - - case sh of - when '0' imm = ZeroExtend(imm12, datasize); - when '1' imm = ZeroExtend(imm12 : Zeros(12), datasize); - - __execute - bits(datasize) result; - bits(datasize) operand1 = if n == 31 then SP[] else X[n]; - bits(datasize) operand2 = imm; - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction LSR_Z_ZW__ - __encoding LSR_Z_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 100001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(64) element2 = Elem[operand2, (e * esize) DIV 64, 64]; - integer shift = Min(UInt(element2), esize); - Elem[result, e, esize] = LSR(element1, shift); - - Z[d] = result; - -__instruction aarch64_memory_vector_multiple_no_wb - __encoding aarch64_memory_vector_multiple_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 0x000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_multiple_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << UInt(size); - integer elements = datasize DIV esize; - - integer rpt; // number of iterations - integer selem; // structure elements - - case opcode of - when '0000' rpt = 1; selem = 4; // LD/ST4 (4 registers) - when '0010' rpt = 4; selem = 1; // LD/ST1 (4 registers) - when '0100' rpt = 1; selem = 3; // LD/ST3 (3 registers) - when '0110' rpt = 3; selem = 1; // LD/ST1 (3 registers) - when '0111' rpt = 1; selem = 1; // LD/ST1 (1 register) - when '1000' rpt = 1; selem = 2; // LD/ST2 (2 registers) - when '1010' rpt = 2; selem = 1; // LD/ST1 (2 registers) - otherwise UNDEFINED; - - // .1D format only permitted with LD1 & ST1 - if size:Q == '110' && selem != 1 then UNDEFINED; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(datasize) rval; - integer tt; - constant integer ebytes = esize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - for r = 0 to rpt-1 - for e = 0 to elements-1 - tt = (t + r) MOD 32; - for s = 0 to selem-1 - rval = V[tt]; - if memop == MemOp_LOAD then - Elem[rval, e, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[tt] = rval; - else // memop == MemOp_STORE - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, e, esize]; - offs = offs + ebytes; - tt = (tt + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction ST2B_Z_P_BI_Contiguous - __encoding ST2B_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 0011xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction aarch64_integer_tags_mcsettaganddatapairpost - __encoding aarch64_integer_tags_mcsettaganddatapairpost - __instruction_set A64 - __field simm7 15 +: 7 - __field Xt2 10 +: 5 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '01101000 10xxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - integer t2 = UInt(Xt2); - bits(64) offset = LSL(SignExtend(simm7, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = TRUE; - - __encoding aarch64_integer_tags_mcsettaganddatapairpre - __instruction_set A64 - __field simm7 15 +: 7 - __field Xt2 10 +: 5 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '01101001 10xxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - integer t2 = UInt(Xt2); - bits(64) offset = LSL(SignExtend(simm7, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = FALSE; - - __encoding aarch64_integer_tags_mcsettaganddatapair - __instruction_set A64 - __field simm7 15 +: 7 - __field Xt2 10 +: 5 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '01101001 00xxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - integer t2 = UInt(Xt2); - bits(64) offset = LSL(SignExtend(simm7, 64), LOG2_TAG_GRANULE); - boolean writeback = FALSE; - boolean postindex = FALSE; - - __execute - bits(64) address; - bits(64) data1; - bits(64) data2; - - SetTagCheckedInstruction(FALSE); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data1 = X[t]; - data2 = X[t2]; - - if !postindex then - address = address + offset; - - Mem[address, 8, AccType_NORMAL] = data1; - Mem[address+8, 8, AccType_NORMAL] = data2; - - AArch64.MemTag[address, AccType_NORMAL] = AArch64.AllocationTagFromAddress(address); - - if writeback then - if postindex then - address = address + offset; - - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_halving_rounding - __encoding aarch64_vector_arithmetic_binary_uniform_add_halving_rounding - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - Elem[result, e, esize] = (element1 + element2 + 1)[esize:1]; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_float_round_frint_32_64 - __encoding aarch64_vector_arithmetic_unary_float_round_frint_32_64 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x100001 111x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFrintExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer intsize = if op == '0' then 32 else 64; - FPRounding rounding = if U == '0' then FPRounding_ZERO else FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundIntN(element, FPCR, rounding, intsize); - - V[d] = result; - -__instruction aarch64_branch_unconditional_register - __encoding aarch64_branch_unconditional_register - __instruction_set A64 - __field Z 24 +: 1 - __field op 21 +: 2 - __field A 11 +: 1 - __field M 10 +: 1 - __field Rn 5 +: 5 - __field Rm 0 +: 5 - __opcode '1101011x 0xx11111 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - BranchType branch_type; - integer m = UInt(Rm); - boolean pac = (A == '1'); - boolean use_key_a = (M == '0'); - boolean source_is_sp = ((Z == '1') && (m == 31)); - - if !pac && m != 0 then - UNDEFINED; - elsif pac && !HavePACExt() then - UNDEFINED; - - case op of - when '00' branch_type = BranchType_INDIR; - when '01' branch_type = BranchType_INDCALL; - when '10' branch_type = BranchType_RET; - otherwise UNDEFINED; - - if pac then - if Z == '0' && m != 31 then - UNDEFINED; - - if branch_type == BranchType_RET then - if n != 31 then UNDEFINED; - n = 30; - source_is_sp = TRUE; - - __execute - bits(64) target = X[n]; - boolean auth_then_branch = TRUE; - - if pac then - bits(64) modifier = if source_is_sp then SP[] else X[m]; - - if use_key_a then - target = AuthIA(target, modifier, auth_then_branch); - else - target = AuthIB(target, modifier, auth_then_branch); - - if branch_type == BranchType_INDCALL then X[30] = PC[] + 4; - - // Value in BTypeNext will be used to set PSTATE.BTYPE - case branch_type of - when BranchType_INDIR // BR, BRAA, BRAB, BRAAZ, BRABZ - if InGuardedPage then - if n == 16 || n == 17 then - BTypeNext = '01'; - else - BTypeNext = '11'; - else - BTypeNext = '01'; - when BranchType_INDCALL // BLR, BLRAA, BLRAB, BLRAAZ, BLRABZ - BTypeNext = '10'; - when BranchType_RET // RET, RETAA, RETAB - BTypeNext = '00'; - - BranchTo(target, branch_type); - -__instruction SQDECD_R_RS_SX - __encoding SQDECD_R_RS_SX - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1110xxxx 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQDECD_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1111xxxx 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 - (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_memory_pair_general_no_alloc - __encoding aarch64_memory_pair_general_no_alloc - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101000 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_STREAM; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if opc[0] == '1' then UNDEFINED; - integer scale = 2 + UInt(opc[1]); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown && t == n then - data1 = bits(datasize) UNKNOWN; - else - data1 = X[t]; - if rt_unknown && t2 == n then - data2 = bits(datasize) UNKNOWN; - else - data2 = X[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - X[t] = data1; - X[t2] = data2; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction ADD_Z_P_ZZ__ - __encoding ADD_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx000000 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element1 + element2; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction UQSUB_Z_ZI__ - __encoding UQSUB_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx100111 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer imm = UInt(imm8); - if sh == '1' then imm = imm << 8; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - imm, esize, unsigned); - - Z[dn] = result; - -__instruction TRN1_Z_ZZ__ - __encoding TRN1_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 011100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 0; - - __encoding TRN1_Z_ZZ_Q - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 101xxxxx 000110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer esize = 128; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 0; - - __encoding TRN2_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 011101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 1; - - __encoding TRN2_Z_ZZ_Q - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 101xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer esize = 128; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer part = 1; - - __execute - CheckSVEEnabled(); - if VL < esize * 2 then UNDEFINED; - integer pairs = VL DIV (esize * 2); - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result = Zeros(); - - for p = 0 to pairs-1 - Elem[result, 2*p+0, esize] = Elem[operand1, 2*p+part, esize]; - Elem[result, 2*p+1, esize] = Elem[operand2, 2*p+part, esize]; - - Z[d] = result; - -__instruction LD1B_Z_P_BI_U8 - __encoding LD1B_Z_P_BI_U8 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0000xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LD1B_Z_P_BI_U16 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0010xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LD1B_Z_P_BI_U32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0100xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LD1B_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0110xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction SQDECH_R_RS_SX - __encoding SQDECH_R_RS_SX - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0110xxxx 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQDECH_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0111xxxx 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 - (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_integer_arithmetic_add_sub_extendedreg - __encoding aarch64_integer_arithmetic_add_sub_extendedreg - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field imm3 10 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01011 001xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - ExtendType extend_type = DecodeRegExtend(option); - integer shift = UInt(imm3); - if shift > 4 then UNDEFINED; - - __execute - bits(datasize) result; - bits(datasize) operand1 = if n == 31 then SP[] else X[n]; - bits(datasize) operand2 = ExtendReg(m, extend_type, shift); - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction FCVT_Z_P_Z_H2S - __encoding FCVT_Z_P_Z_H2S - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 10001001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 32; - - __encoding FCVT_Z_P_Z_H2D - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11001001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 64; - - __encoding FCVT_Z_P_Z_S2H - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 10001000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 16; - - __encoding FCVT_Z_P_Z_S2D - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11001011 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 64; - - __encoding FCVT_Z_P_Z_D2H - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11001000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 16; - - __encoding FCVT_Z_P_Z_D2S - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11001010 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 32; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - bits(d_esize) res = FPConvertSVE(element[s_esize-1:0], FPCR); - Elem[result, e, esize] = ZeroExtend(res); - - Z[d] = result; - -__instruction aarch64_vector_cvt_bf16_vector - __encoding aarch64_vector_cvt_bf16_vector - __instruction_set A64 - __field Q 30 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 10100001 011010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Rn); - integer d = UInt(Rd); - integer part = UInt(Q); - integer elements = 64 DIV 16; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(128) operand = V[n]; - bits(64) result; - - for e = 0 to elements-1 - Elem[result, e, 16] = FPConvertBF(Elem[operand, e, 32], FPCR); - - Vpart[d, part] = result; - -__instruction SXTB_Z_P_Z__ - __encoding SXTB_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx010000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer s_esize = 8; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = FALSE; - - __encoding SXTH_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx010010 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '1x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer s_esize = 16; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = FALSE; - - __encoding SXTW_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx010100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer s_esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(element[s_esize-1:0], esize, unsigned); - - Z[d] = result; - -__instruction aarch64_integer_flags_cfinv - __encoding aarch64_integer_flags_cfinv - __instruction_set A64 - __field CRm 8 +: 4 - __opcode '11010101 00000000 0100xxxx 00011111' - __guard TRUE - __decode - if !HaveFlagManipulateExt() then UNDEFINED; - - __execute - PSTATE.C = NOT(PSTATE.C); - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_fp_complex - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_complex - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field rot 11 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx0xxxxx 110xx1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFCADDExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '00' then UNDEFINED; - if Q == '0' && size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - bits(esize) element3; - bits(esize) element4; - - for e = 0 to (elements DIV 2) -1 - case rot of - when '00' - element1 = Elem[operand2, e*2, esize]; - element2 = Elem[operand1, e*2, esize]; - element3 = Elem[operand2, e*2+1, esize]; - element4 = Elem[operand1, e*2, esize]; - when '01' - element1 = FPNeg(Elem[operand2, e*2+1, esize]); - element2 = Elem[operand1, e*2+1, esize]; - element3 = Elem[operand2, e*2, esize]; - element4 = Elem[operand1, e*2+1, esize]; - when '10' - element1 = FPNeg(Elem[operand2, e*2, esize]); - element2 = Elem[operand1, e*2, esize]; - element3 = FPNeg(Elem[operand2, e*2+1, esize]); - element4 = Elem[operand1, e*2, esize]; - when '11' - element1 = Elem[operand2, e*2+1, esize]; - element2 = Elem[operand1, e*2+1, esize]; - element3 = FPNeg(Elem[operand2, e*2, esize]); - element4 = Elem[operand1, e*2+1, esize]; - - Elem[result, e*2, esize] = FPMulAdd(Elem[operand3, e*2, esize], element2, element1, FPCR); - Elem[result, e*2+1, esize] = FPMulAdd(Elem[operand3, e*2+1, esize], element4, element3, FPCR); - - V[d] = result; - -__instruction ASR_Z_ZI__ - __encoding ASR_Z_ZI__ - __instruction_set A64 - __field tszh 22 +: 2 - __field tszl 19 +: 2 - __field imm3 16 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 100100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - bits(4) tsize = tszh:tszl; - case tsize of - when '0000' UNDEFINED; - when '0001' esize = 8; - when '001x' esize = 16; - when '01xx' esize = 32; - when '1xxx' esize = 64; - integer n = UInt(Zn); - integer d = UInt(Zd); - integer shift = (2 * esize) - UInt(tsize:imm3); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - Elem[result, e, esize] = ASR(element1, shift); - - Z[d] = result; - -__instruction UDIVR_Z_P_ZZ__ - __encoding UDIVR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010111 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '0x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer quotient; - if element1 == 0 then - quotient = 0; - else - quotient = RoundTowardsZero(Real(element2) / Real(element1)); - Elem[result, e, esize] = quotient[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction ORR_Z_P_ZZ__ - __encoding ORR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx011000 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element1 OR element2; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_integer_pac_pacda_dp_1src - __encoding aarch64_integer_pac_pacda_dp_1src - __instruction_set A64 - __field Z 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 00x010xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if Z == '0' then // PACDA - if n == 31 then source_is_sp = TRUE; - else // PACDZA - if n != 31 then UNDEFINED; - - __execute - if source_is_sp then - X[d] = AddPACDA(X[d], SP[]); - else - X[d] = AddPACDA(X[d], X[n]); - -__instruction aarch64_vector_arithmetic_binary_uniform_diff - __encoding aarch64_vector_arithmetic_binary_uniform_diff - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0111x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean accumulate = (ac == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - bits(esize) absdiff; - - result = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - absdiff = Abs(element1 - element2)[esize-1:0]; - Elem[result, e, esize] = Elem[result, e, esize] + absdiff; - V[d] = result; - -__instruction ADDVL_R_RI__ - __encoding ADDVL_R_RI__ - __instruction_set A64 - __field Rn 16 +: 5 - __field imm6 5 +: 6 - __field Rd 0 +: 5 - __opcode '00000100 001xxxxx 01010xxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer n = UInt(Rn); - integer d = UInt(Rd); - integer imm = SInt(imm6); - - __execute - CheckSVEEnabled(); - bits(64) operand1 = if n == 31 then SP[] else X[n]; - bits(64) result = operand1 + (imm * (VL DIV 8)); - - if d == 31 then - SP[] = result; - else - X[d] = result; - -__instruction LD1ROD_Z_P_BR_Contiguous - __encoding LD1ROD_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 101xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - - __execute - CheckSVEEnabled(); - if VL < 256 then UNDEFINED; - integer elements = 256 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low bits only - bits(64) offset; - bits(256) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - offset = X[m]; - - addr = base + UInt(offset) * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = ZeroExtend(Replicate(result, VL DIV 256), VL); - -__instruction CLASTB_V_P_Z__ - __encoding CLASTB_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Vdn 0 +: 5 - __opcode '00000101 xx101011 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Vdn); - integer m = UInt(Zm); - boolean isBefore = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(esize) operand1 = V[dn]; - bits(VL) operand2 = Z[m]; - bits(esize) result; - integer last = LastActiveElement(mask, esize); - - if last < 0 then - result = ZeroExtend(operand1); - else - if !isBefore then - last = last + 1; - if last >= elements then last = 0; - result = Elem[operand2, last, esize]; - - V[dn] = result; - -__instruction aarch64_float_move_fp_select - __encoding aarch64_float_move_fp_select - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - bits(4) condition = cond; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - - result = if ConditionHolds(condition) then V[n] else V[m]; - - V[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction SDIVR_Z_P_ZZ__ - __encoding SDIVR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010110 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '0x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer quotient; - if element1 == 0 then - quotient = 0; - else - quotient = RoundTowardsZero(Real(element2) / Real(element1)); - Elem[result, e, esize] = quotient[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_float_move_fp_imm - __encoding aarch64_float_move_fp_imm - __instruction_set A64 - __field ftype 22 +: 2 - __field imm8 13 +: 8 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx xxx10000 000xxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - bits(datasize) imm = VFPExpandImm(imm8); - - __execute - CheckFPAdvSIMDEnabled64(); - - V[d] = imm; - -__instruction EXT_Z_ZI_Des - __encoding EXT_Z_ZI_Des - __instruction_set A64 - __field imm8h 16 +: 5 - __field imm8l 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000101 001xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Zdn); - integer m = UInt(Zm); - integer position = UInt(imm8h:imm8l); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - if position >= elements then - position = 0; - - position = position << 3; - bits(VL*2) concat = operand2 : operand1; - result = concat[position+VL-1:position]; - - Z[dn] = result; - -__instruction aarch64_vector_transfer_vector_extract - __encoding aarch64_vector_transfer_vector_extract - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field imm4 11 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 000xxxxx 0xxxx0xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if Q == '0' && imm4[3] == '1' then UNDEFINED; - - integer datasize = if Q == '1' then 128 else 64; - integer position = UInt(imm4) << 3; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) hi = V[m]; - bits(datasize) lo = V[n]; - bits(datasize*2) concat = hi : lo; - - V[d] = concat[position+datasize-1:position]; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_crypto_sm3_sm3ss1 - __encoding aarch64_vector_crypto_sm3_sm3ss1 - __instruction_set A64 - __field Rm 16 +: 5 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 010xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer a = UInt(Ra); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Vd = V[d]; - bits(128) Va = V[a]; - Vd[127:96] = ROL((ROL(Vn[127:96],12) + Vm[127:96] + Va[127:96]) , 7); - Vd[95:0] = Zeros(); - V[d] = Vd; - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_dmacc_sisd - __encoding aarch64_vector_arithmetic_binary_disparate_mul_dmacc_sisd - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx1xxxxx 10x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '00' || size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - boolean sub_op = (o1 == '1'); - - __encoding aarch64_vector_arithmetic_binary_disparate_mul_dmacc_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 10x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '00' || size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - integer accum; - boolean sat1; - boolean sat2; - - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element2 = SInt(Elem[operand2, e, esize]); - (product, sat1) = SignedSatQ(2 * element1 * element2, 2*esize); - if sub_op then - accum = SInt(Elem[operand3, e, 2*esize]) - SInt(product); - else - accum = SInt(Elem[operand3, e, 2*esize]) + SInt(product); - (Elem[result, e, 2*esize], sat2) = SignedSatQ(accum, 2*esize); - if sat1 || sat2 then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if abs then - element1 = FPAbs(element1); - element2 = FPAbs(element2); - case cmp of - when CompareOp_EQ test_passed = FPCompareEQ(element1, element2, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element1, element2, FPCR); - when CompareOp_GT test_passed = FPCompareGT(element1, element2, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction CMPEQ_P_P_ZI__ - __encoding CMPEQ_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx0xxxxx 100xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_EQ; - integer imm = SInt(imm5); - boolean unsigned = FALSE; - - __encoding CMPGT_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx0xxxxx 000xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - integer imm = SInt(imm5); - boolean unsigned = FALSE; - - __encoding CMPGE_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx0xxxxx 000xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - integer imm = SInt(imm5); - boolean unsigned = FALSE; - - __encoding CMPHI_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm7 14 +: 7 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx1xxxxx xx0xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - integer imm = UInt(imm7); - boolean unsigned = TRUE; - - __encoding CMPHS_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm7 14 +: 7 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx1xxxxx xx0xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - integer imm = UInt(imm7); - boolean unsigned = TRUE; - - __encoding CMPLT_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx0xxxxx 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_LT; - integer imm = SInt(imm5); - boolean unsigned = FALSE; - - __encoding CMPLE_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx0xxxxx 001xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_LE; - integer imm = SInt(imm5); - boolean unsigned = FALSE; - - __encoding CMPLO_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm7 14 +: 7 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx1xxxxx xx1xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_LT; - integer imm = UInt(imm7); - boolean unsigned = TRUE; - - __encoding CMPLS_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm7 14 +: 7 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx1xxxxx xx1xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_LE; - integer imm = UInt(imm7); - boolean unsigned = TRUE; - - __encoding CMPNE_P_P_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx0xxxxx 100xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_NE; - integer imm = SInt(imm5); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(PL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - boolean cond; - case op of - when Cmp_EQ cond = element1 == imm; - when Cmp_NE cond = element1 != imm; - when Cmp_GE cond = element1 >= imm; - when Cmp_LT cond = element1 < imm; - when Cmp_GT cond = element1 > imm; - when Cmp_LE cond = element1 <= imm; - ElemP[result, e, esize] = if cond then '1' else '0'; - else - ElemP[result, e, esize] = '0'; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_integer_logical_shiftedreg - __encoding aarch64_integer_logical_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - boolean invert = (N == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - X[d] = result; - -__instruction aarch64_vector_arithmetic_unary_rev - __encoding aarch64_vector_arithmetic_unary_rev - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 000x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - // size=esize: B(0), H(1), S(1), D(S) - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - - // op=REVx: 64(0), 32(1), 16(2) - bits(2) op = o0:U; - - // => op+size: - // 64+B = 0, 64+H = 1, 64+S = 2, 64+D = X - // 32+B = 1, 32+H = 2, 32+S = X, 32+D = X - // 16+B = 2, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - // => 3-(op+size) (index bits in group) - // 64/B = 3, 64+H = 2, 64+S = 1, 64+D = X - // 32+B = 2, 32+H = 1, 32+S = X, 32+D = X - // 16+B = 1, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - - // index bits within group: 1, 2, 3 - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - - integer containers = datasize DIV container_size; - integer elements_per_container = container_size DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element = 0; - integer rev_element; - for c = 0 to containers-1 - rev_element = element + elements_per_container - 1; - for e = 0 to elements_per_container-1 - Elem[result, rev_element, esize] = Elem[operand, element, esize]; - element = element + 1; - rev_element = rev_element - 1; - - V[d] = result; - -__instruction aarch64_vector_crypto_aes_round - __encoding aarch64_vector_crypto_aes_round - __instruction_set A64 - __field D 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01001110 00101000 010x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - if !HaveAESExt() then UNDEFINED; - boolean decrypt = (D == '1'); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) operand1 = V[d]; - bits(128) operand2 = V[n]; - bits(128) result; - result = operand1 EOR operand2; - if decrypt then - result = AESInvSubBytes(AESInvShiftRows(result)); - else - result = AESSubBytes(AESShiftRows(result)); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_sub_int - __encoding aarch64_vector_arithmetic_binary_uniform_sub_int - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 001001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer diff; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - diff = element1 - element2; - Elem[result, e, esize] = diff[esize:1]; - - V[d] = result; - -__instruction PRFW_I_P_BR_S - __encoding PRFW_I_P_BR_S - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000101 000xxxxx 110xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) offset = X[m]; - bits(64) addr; - - if n == 31 then - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + (UInt(offset) << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - offset = offset + 1; - -__instruction aarch64_float_arithmetic_round_frint_32_64 - __encoding aarch64_float_arithmetic_round_frint_32_64 - __instruction_set A64 - __field ftype 22 +: 2 - __field op 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10100x x10000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFrintExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '1x' UNDEFINED; - - integer intsize = if op[1] == '0' then 32 else 64; - - FPRounding rounding = if op[0] == '0' then FPRounding_ZERO else FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundIntN(operand, FPCR, rounding, intsize); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field eq 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 0011x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean cmp_eq = (eq == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field eq 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0011x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean cmp_eq = (eq == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - test_passed = if cmp_eq then element1 >= element2 else element1 > element2; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_high_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_high_sisd - __instruction_set A64 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field S 13 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111111 xxxxxxxx 11x1x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - boolean rounding = TRUE; - boolean sub_op = (S == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_high_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field S 13 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 xxxxxxxx 11x1x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean rounding = TRUE; - boolean sub_op = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - integer rounding_const = if rounding then 1 << (esize - 1) else 0; - integer element1; - integer element2; - integer element3; - integer product; - boolean sat; - - element2 = SInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element3 = SInt(Elem[operand3, e, esize]); - if sub_op then - accum = ((element3 << esize) - 2 * (element1 * element2) + rounding_const); - else - accum = ((element3 << esize) + 2 * (element1 * element2) + rounding_const); - (Elem[result, e, esize], sat) = SignedSatQ(accum >> esize, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction BFDOT_Z_ZZZi__ - __encoding BFDOT_Z_ZZZi__ - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 011xxxxx 010000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - integer index = UInt(i2); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 32; - integer eltspersegment = 128 DIV 32; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = segmentbase + index; - bits(16) elt1_a = Elem[operand1, 2 * e + 0, 16]; - bits(16) elt1_b = Elem[operand1, 2 * e + 1, 16]; - bits(16) elt2_a = Elem[operand2, 2 * s + 0, 16]; - bits(16) elt2_b = Elem[operand2, 2 * s + 1, 16]; - - bits(32) sum = BFAdd(BFMul(elt1_a, elt2_a), BFMul(elt1_b, elt2_b)); - Elem[result, e, 32] = BFAdd(Elem[operand3, e, 32], sum); - - Z[da] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_sub_fp16_simd - __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 110xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean abs = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 1x1xxxxx 110101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean abs = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - bits(esize) diff; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - diff = FPSub(element1, element2, FPCR); - Elem[result, e, esize] = if abs then FPAbs(diff) else diff; - - V[d] = result; - -__instruction PRFB_I_P_BI_S - __encoding PRFB_I_P_BI_S - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000101 11xxxxxx 000xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 0; - integer offset = SInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) addr; - - if n == 31 then - base = SP[]; - else - base = X[n]; - - addr = base + ((offset * elements) << scale); - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Hint_Prefetch(addr, pref_hint, level, stream); - addr = addr + (1 << scale); - -__instruction aarch64_integer_arithmetic_add_sub_shiftedreg - __encoding aarch64_integer_arithmetic_add_sub_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field shift 22 +: 2 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01011 xx0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - - if shift == '11' then UNDEFINED; - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - X[d] = result; - -__instruction UXTB_Z_P_Z__ - __encoding UXTB_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx010001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer s_esize = 8; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = TRUE; - - __encoding UXTH_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx010011 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '1x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer s_esize = 16; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = TRUE; - - __encoding UXTW_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx010101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer s_esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(element[s_esize-1:0], esize, unsigned); - - Z[d] = result; - -__instruction INDEX_Z_IR__ - __encoding INDEX_Z_IR__ - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field imm5 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 010010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Rm); - integer d = UInt(Zd); - integer imm = SInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(esize) operand2 = X[m]; - integer element2 = SInt(operand2); - bits(VL) result; - - for e = 0 to elements-1 - integer index = imm + e * element2; - Elem[result, e, esize] = index[esize-1:0]; - - Z[d] = result; - -__instruction aarch64_integer_arithmetic_mul_widening_64_128hi - __encoding aarch64_integer_arithmetic_mul_widening_64_128hi - __instruction_set A64 - __field U 23 +: 1 - __field Rm 16 +: 5 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '10011011 x10xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer a = UInt(Ra); // ignored by UMULH/SMULH - integer destsize = 64; - integer datasize = destsize; - boolean unsigned = (U == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - - integer result; - - result = Int(operand1, unsigned) * Int(operand2, unsigned); - - X[d] = result[127:64]; - -__instruction FEXPA_Z_Z__ - __encoding FEXPA_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx100000 101110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand = Z[n]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPExpA(element); - - Z[d] = result; - -__instruction ANDV_R_P_Z__ - __encoding ANDV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx011010 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(esize) result = Ones(esize); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - result = result AND Elem[operand, e, esize]; - - V[d] = result; - -__instruction LD1RQH_Z_P_BI_U16 - __encoding LD1RQH_Z_P_BI_U16 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1000xxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = 128 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low 16 bits only - bits(128) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * 16; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = Replicate(result, VL DIV 128); - -__instruction ST1D_Z_P_BI__ - __encoding ST1D_Z_P_BI__ - __instruction_set A64 - __field size 21 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 1xx0xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '11' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8 << UInt(size); - integer msize = 64; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) src = Z[t]; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - addr = addr + mbytes; - -__instruction BRKN_P_P_PP__ - __encoding BRKN_P_P_PP__ - __instruction_set A64 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pdm 0 +: 4 - __opcode '00100101 00011000 01xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer dm = UInt(Pdm); - boolean setflags = FALSE; - - __encoding BRKNS_P_P_PP__ - __instruction_set A64 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pdm 0 +: 4 - __opcode '00100101 01011000 01xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer dm = UInt(Pdm); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[dm]; - bits(PL) result; - - if LastActive(mask, operand1, 8) == '1' then - result = operand2; - else - result = Zeros(); - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(Ones(PL), result, 8); - P[dm] = result; - -__instruction LD1SB_Z_P_BR_S16 - __encoding LD1SB_Z_P_BR_S16 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 110xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = FALSE; - - __encoding LD1SB_Z_P_BR_S32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 101xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = FALSE; - - __encoding LD1SB_Z_P_BR_S64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 100xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction PRFH_I_P_BZ_S_x32_scaled - __encoding PRFH_I_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000100 0x1xxxxx 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 32; - boolean offs_unsigned = (xs == '0'); - integer scale = 1; - - __encoding PRFH_I_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 0x1xxxxx 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 32; - boolean offs_unsigned = (xs == '0'); - integer scale = 1; - - __encoding PRFH_I_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 011xxxxx 101xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 1; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) addr; - bits(VL) offset; - - if n == 31 then - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_wide - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_wide - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 00x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand1 = V[n]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, 2*esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - Elem[result, e, 2*esize] = sum[2*esize-1:0]; - - V[d] = result; - -__instruction aarch64_integer_tags_mcsettagpost - __encoding aarch64_integer_tags_mcsettagpost - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 001xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = TRUE; - boolean zero_data = FALSE; - - __encoding aarch64_integer_tags_mcsettagpre - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 001xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = FALSE; - boolean zero_data = FALSE; - - __encoding aarch64_integer_tags_mcsettag - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 001xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = FALSE; - boolean postindex = FALSE; - boolean zero_data = FALSE; - - __execute - bits(64) address; - - SetTagCheckedInstruction(FALSE); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if !postindex then - address = address + offset; - - if zero_data then - Mem[address, TAG_GRANULE, AccType_NORMAL] = Zeros(TAG_GRANULE * 8); - - bits(64) data = if t == 31 then SP[] else X[t]; - bits(4) tag = AArch64.AllocationTagFromAddress(data); - AArch64.MemTag[address, AccType_NORMAL] = tag; - - if writeback then - if postindex then - address = address + offset; - - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field eq 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 0011x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean cmp_eq = (eq == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field eq 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0011x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean cmp_eq = (eq == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - test_passed = if cmp_eq then element1 >= element2 else element1 > element2; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction LD1D_Z_P_BR_U64 - __encoding LD1D_Z_P_BR_U64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 111xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction LSL_Z_P_ZZ__ - __encoding LSL_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010011 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - integer shift = Min(UInt(element2), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = LSL(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_crypto_sha2op_sha1_sched1 - __encoding aarch64_vector_crypto_sha2op_sha1_sched1 - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 00101000 000110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - if !HaveSHA1Ext() then UNDEFINED; - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) operand1 = V[d]; - bits(128) operand2 = V[n]; - bits(128) result; - bits(128) T = operand1 EOR LSR(operand2, 32); - result[31:0] = ROL(T[31:0], 1); - result[63:32] = ROL(T[63:32], 1); - result[95:64] = ROL(T[95:64], 1); - result[127:96] = ROL(T[127:96], 1) EOR ROL(T[31:0], 2); - V[d] = result; - -__instruction LDFF1SB_Z_P_BZ_D_x32_unscaled - __encoding LDFF1SB_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 0x0xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1SB_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 0x0xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1SB_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 010xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction ST2W_Z_P_BR_Contiguous - __encoding ST2W_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 001xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_crypto_sm3_sm3partw1 - __encoding aarch64_vector_crypto_sm3_sm3partw1 - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 011xxxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Vd = V[d]; - bits(128) result; - - result[95:0] = (Vd EOR Vn)[95:0] EOR (ROL(Vm[127:96],15):ROL(Vm[95:64],15):ROL(Vm[63:32],15)); - - for i = 0 to 3 - if i == 3 then - result[127:96] = (Vd EOR Vn)[127:96] EOR (ROL(result[31:0],15)); - result[(32*i)+31:(32*i)] = result[(32*i)+31:(32*i)] EOR ROL(result[(32*i)+31:(32*i)],15) EOR ROL(result[(32*i)+31:(32*i)],23); - V[d] = result; - -__instruction INDEX_Z_II__ - __encoding INDEX_Z_II__ - __instruction_set A64 - __field size 22 +: 2 - __field imm5b 16 +: 5 - __field imm5 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 010000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer d = UInt(Zd); - integer imm1 = SInt(imm5); - integer imm2 = SInt(imm5b); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) result; - - for e = 0 to elements-1 - integer index = imm1 + e * imm2; - Elem[result, e, esize] = index[esize-1:0]; - - Z[d] = result; - -__instruction aarch64_system_exceptions_debug_exception - __encoding aarch64_system_exceptions_debug_exception - __instruction_set A64 - __field imm16 5 +: 16 - __field LL 0 +: 2 - __opcode '11010100 101xxxxx xxxxxxxx xxx000xx' - __guard TRUE - __decode - bits(2) target_level = LL; - if LL == '00' then UNDEFINED; - if !Halted() then UNDEFINED; - - __execute - DCPSInstruction(target_level); - -__instruction aarch64_branch_unconditional_immediate - __encoding aarch64_branch_unconditional_immediate - __instruction_set A64 - __field op 31 +: 1 - __field imm26 0 +: 26 - __opcode 'x00101xx xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - BranchType branch_type = if op == '1' then BranchType_DIRCALL else BranchType_DIR; - bits(64) offset = SignExtend(imm26:'00', 64); - - __execute - if branch_type == BranchType_DIRCALL then X[30] = PC[] + 4; - - BranchTo(PC[] + offset, branch_type); - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction UQDECP_Z_P_Z__ - __encoding UQDECP_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Zdn 0 +: 5 - __opcode '00100101 xx101011 1000000x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Zdn); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) operand2 = P[m]; - bits(VL) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - for e = 0 to elements-1 - integer element = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element - count, esize, unsigned); - - Z[dn] = result; - -__instruction UZP1_P_PP__ - __encoding UZP1_P_PP__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 16 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 xx10xxxx 0100100x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - integer part = 0; - - __encoding UZP2_P_PP__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 16 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 xx10xxxx 0100110x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - integer part = 1; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - bits(PL*2) zipped = operand2:operand1; - for e = 0 to elements-1 - Elem[result, e, esize DIV 8] = Elem[zipped, 2*e+part, esize DIV 8]; - - P[d] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_long - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 00x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - Elem[result, e, 2*esize] = sum[2*esize-1:0]; - - V[d] = result; - -__instruction ST1H_Z_P_BZ_S_x32_scaled - __encoding ST1H_Z_P_BZ_S_x32_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 111xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding ST1H_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 101xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding ST1H_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 100xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding ST1H_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 110xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding ST1H_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 101xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 1; - - __encoding ST1H_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 100xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(VL) offset = Z[m]; - bits(VL) src = Z[t]; - bits(PL) mask = P[g]; - bits(64) addr; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - -__instruction aarch64_vector_transfer_integer_move_unsigned - __encoding aarch64_vector_transfer_integer_move_unsigned - __instruction_set A64 - __field Q 30 +: 1 - __field imm5 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 000xxxxx 001111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer size; - case Q:imm5 of - when '0xxxx1' size = 0; // UMOV Wd, Vn.B - when '0xxx10' size = 1; // UMOV Wd, Vn.H - when '0xx100' size = 2; // UMOV Wd, Vn.S - when '1x1000' size = 3; // UMOV Xd, Vn.D - otherwise UNDEFINED; - - integer idxdsize = if imm5[4] == '1' then 128 else 64; - integer index = UInt(imm5[4:size+1]); - integer esize = 8 << size; - integer datasize = if Q == '1' then 64 else 32; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(idxdsize) operand = V[n]; - - X[d] = ZeroExtend(Elem[operand, index, esize], datasize); - -__instruction LSL_Z_ZI__ - __encoding LSL_Z_ZI__ - __instruction_set A64 - __field tszh 22 +: 2 - __field tszl 19 +: 2 - __field imm3 16 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 100111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - bits(4) tsize = tszh:tszl; - case tsize of - when '0000' UNDEFINED; - when '0001' esize = 8; - when '001x' esize = 16; - when '01xx' esize = 32; - when '1xxx' esize = 64; - integer n = UInt(Zn); - integer d = UInt(Zd); - integer shift = UInt(tsize:imm3) - esize; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - Elem[result, e, esize] = LSL(element1, shift); - - Z[d] = result; - -__instruction aarch64_system_register_system - __encoding aarch64_system_register_system - __instruction_set A64 - __field L 21 +: 1 - __field o0 19 +: 1 - __field op1 16 +: 3 - __field CRn 12 +: 4 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __field Rt 0 +: 5 - __opcode '11010101 00x1xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - AArch64.CheckSystemAccess('1':o0, op1, CRn, CRm, op2, Rt, L); - - integer t = UInt(Rt); - - integer sys_op0 = 2 + UInt(o0); - integer sys_op1 = UInt(op1); - integer sys_op2 = UInt(op2); - integer sys_crn = UInt(CRn); - integer sys_crm = UInt(CRm); - boolean read = (L == '1'); - - __execute - if read then - X[t] = AArch64.SysRegRead(sys_op0, sys_op1, sys_crn, sys_crm, sys_op2); - else - AArch64.SysRegWrite(sys_op0, sys_op1, sys_crn, sys_crm, sys_op2, X[t]); - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction UQDECW_R_RS_UW - __encoding UQDECW_R_RS_UW - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1010xxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQDECW_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1011xxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 - (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction CLS_Z_P_Z__ - __encoding CLS_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx011000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = CountLeadingSignBits(element)[esize-1:0]; - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_product - __encoding aarch64_vector_arithmetic_binary_disparate_mul_product - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - Elem[result, e, 2*esize] = (element1 * element2)[2*esize-1:0]; - - V[d] = result; - -__instruction LDNT1D_Z_P_BI_Contiguous - __encoding LDNT1D_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1000xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_STREAM]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_integer_arithmetic_add_sub_shiftedreg - __encoding aarch64_integer_arithmetic_add_sub_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field shift 22 +: 2 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01011 xx0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - - if shift == '11' then UNDEFINED; - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - X[d] = result; - -__instruction aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 11111000 110x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 1x100000 110x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 11111000 110x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 1x100000 110x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) zero = FPZero('0'); - bits(esize) element; - boolean test_passed; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - case comparison of - when CompareOp_GT test_passed = FPCompareGT(element, zero, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element, zero, FPCR); - when CompareOp_EQ test_passed = FPCompareEQ(element, zero, FPCR); - when CompareOp_LE test_passed = FPCompareGE(zero, element, FPCR); - when CompareOp_LT test_passed = FPCompareGT(zero, element, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_integer_arithmetic_add_sub_immediate - __encoding aarch64_integer_arithmetic_add_sub_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field sh 22 +: 1 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10001 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - bits(datasize) imm; - - case sh of - when '0' imm = ZeroExtend(imm12, datasize); - when '1' imm = ZeroExtend(imm12 : Zeros(12), datasize); - - __execute - bits(datasize) result; - bits(datasize) operand1 = if n == 31 then SP[] else X[n]; - bits(datasize) operand2 = imm; - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction aarch64_vector_arithmetic_unary_clsz - __encoding aarch64_vector_arithmetic_unary_clsz - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 010010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CountOp countop = if U == '1' then CountOp_CLZ else CountOp_CLS; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - integer count; - for e = 0 to elements-1 - if countop == CountOp_CLS then - count = CountLeadingSignBits(Elem[operand, e, esize]); - else - count = CountLeadingZeroBits(Elem[operand, e, esize]); - Elem[result, e, esize] = count[esize-1:0]; - V[d] = result; - -__instruction SQINCD_Z_ZS__ - __encoding SQINCD_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1110xxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_memory_atomicops_swp - __encoding aarch64_memory_atomicops_swp - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - bits(datasize) store_value; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - store_value = X[s]; - data = MemAtomic(address, MemAtomicOp_SWP, store_value, ldacctype, stacctype); - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_system_exceptions_debug_halt - __encoding aarch64_system_exceptions_debug_halt - __instruction_set A64 - __field imm16 5 +: 16 - __opcode '11010100 010xxxxx xxxxxxxx xxx00000' - __guard TRUE - __decode - if EDSCR.HDE == '0' || !HaltingAllowed() then UNDEFINED; - if HaveBTIExt() then - SetBTypeCompatible(TRUE); - - __execute - Halt(DebugHalt_HaltInstruction); - -__instruction ST1D_Z_P_BR__ - __encoding ST1D_Z_P_BR__ - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 111xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - bits(VL) src = Z[t]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - offset = offset + 1; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction SMULH_Z_P_ZZ__ - __encoding SMULH_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010010 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer product = (element1 * element2) >> esize; - Elem[result, e, esize] = product[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_float_arithmetic_mul_add_sub - __encoding aarch64_float_arithmetic_mul_add_sub - __instruction_set A64 - __field ftype 22 +: 2 - __field o1 21 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011111 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer a = UInt(Ra); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean opa_neg = (o1 == '1'); - boolean op1_neg = (o0 != o1); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operanda = V[a]; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - if opa_neg then operanda = FPNeg(operanda); - if op1_neg then operand1 = FPNeg(operand1); - result = FPMulAdd(operanda, operand1, operand2, FPCR); - - V[d] = result; - -__instruction aarch64_float_arithmetic_add_sub - __encoding aarch64_float_arithmetic_add_sub - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx 001x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean sub_op = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - if sub_op then - result = FPSub(operand1, operand2, FPCR); - else - result = FPAdd(operand1, operand2, FPCR); - - V[d] = result; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_float_convert_fix - __encoding aarch64_float_convert_fix - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field scale 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - - case ftype of - when '00' fltsize = 32; - when '01' fltsize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - if sf == '0' && scale[5] == '0' then UNDEFINED; - integer fracbits = 64 - UInt(scale); - - case opcode[2:1]:rmode of - when '00 11' // FCVTZ - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, fracbits, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, fracbits, unsigned, FPCR, rounding); - V[d] = fltval; - -__instruction FMIN_Z_P_ZS__ - __encoding FMIN_Z_P_ZS__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - __opcode '01100101 xx011111 100xxx00 00xxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - bits(esize) imm = if i1 == '0' then Zeros() else FPOne('0'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMin(element1, imm, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction LDNT1B_Z_P_BI_Contiguous - __encoding LDNT1B_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0000xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_STREAM]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_vector_crypto_sha3op_sha1_hash_majority - __encoding aarch64_vector_crypto_sha3op_sha1_hash_majority - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 000xxxxx 001000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if !HaveSHA1Ext() then UNDEFINED; - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) X = V[d]; - bits(32) Y = V[n]; // Note: 32 not 128 bits wide - bits(128) W = V[m]; - bits(32) t; - - for e = 0 to 3 - t = SHAmajority(X[63:32], X[95:64], X[127:96]); - Y = Y + ROL(X[31:0], 5) + t + Elem[W, e, 32]; - X[63:32] = ROL(X[63:32], 30); - [Y, X] = ROL(Y : X, 32); - V[d] = X; - -__instruction LD1SH_Z_P_BI_S32 - __encoding LD1SH_Z_P_BI_S32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0010xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __encoding LD1SH_Z_P_BI_S64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0000xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_int_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 01111001 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 0x100001 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 01111001 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x100001 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - FPRounding rounding = FPRoundingMode(FPCR); - bits(esize) element; - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FixedToFP(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction SPLICE_Z_P_ZZ_Des - __encoding SPLICE_Z_P_ZZ_Des - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000101 xx101100 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - integer x = 0; - boolean active = FALSE; - integer lastnum = LastActiveElement(mask, esize); - - if lastnum >= 0 then - for e = 0 to lastnum - active = active || ElemP[mask, e, esize] == '1'; - if active then - Elem[result, x, esize] = Elem[operand1, e, esize]; - x = x + 1; - - elements = elements - x - 1; - for e = 0 to elements - Elem[result, x, esize] = Elem[operand2, e, esize]; - x = x + 1; - - Z[dn] = result; - -__instruction aarch64_branch_conditional_compare - __encoding aarch64_branch_conditional_compare - __instruction_set A64 - __field sf 31 +: 1 - __field op 24 +: 1 - __field imm19 5 +: 19 - __field Rt 0 +: 5 - __opcode 'x011010x xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer datasize = if sf == '1' then 64 else 32; - boolean iszero = (op == '0'); - bits(64) offset = SignExtend(imm19:'00', 64); - - __execute - bits(datasize) operand1 = X[t]; - - if IsZero(operand1) == iszero then - BranchTo(PC[] + offset, BranchType_DIR); - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction LDFF1SB_Z_P_AI_S - __encoding LDFF1SB_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 001xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __encoding LDFF1SB_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 001xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction aarch64_system_barriers_ssbb - __encoding aarch64_system_barriers_ssbb - __instruction_set A64 - __field CRm 8 +: 4 - __field opc 5 +: 2 - __opcode '11010101 00000011 0011xxxx 1xx11111' - __guard TRUE - __decode - // No additional decoding required - - __execute - SpeculativeStoreBypassBarrierToVA(); - -__instruction aarch64_vector_arithmetic_unary_diff_neg_sat_sisd - __encoding aarch64_vector_arithmetic_unary_diff_neg_sat_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 011110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean neg = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_diff_neg_sat_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 011110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean neg = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - if neg then - element = -element; - else - element = Abs(element); - (Elem[result, e, esize], sat) = SignedSatQ(element, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_halving_truncating - __encoding aarch64_vector_arithmetic_binary_uniform_add_halving_truncating - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - sum = element1 + element2; - Elem[result, e, esize] = sum[esize:1]; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_round - __encoding aarch64_vector_arithmetic_unary_fp16_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 100x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_arithmetic_unary_float_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundInt(element, FPCR, rounding, exact); - - V[d] = result; - -__instruction MLA_Z_P_ZZZ__ - __encoding MLA_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '00000100 xx0xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean sub_op = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = UInt(Elem[operand1, e, esize]); - integer element2 = UInt(Elem[operand2, e, esize]); - if ElemP[mask, e, esize] == '1' then - integer product = element1 * element2; - if sub_op then - Elem[result, e, esize] = Elem[operand3, e, esize] - product; - else - Elem[result, e, esize] = Elem[operand3, e, esize] + product; - else - Elem[result, e, esize] = Elem[operand3, e, esize]; - - Z[da] = result; - -__instruction aarch64_vector_crypto_sha512_sha512su1 - __encoding aarch64_vector_crypto_sha512_sha512su1 - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 011xxxxx 100010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSHA512Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(64) sig1; - bits(128) Vtmp; - bits(128) X = V[n]; - bits(128) Y = V[m]; - bits(128) W = V[d]; - - sig1 = ROR(X[127:64], 19) EOR ROR(X[127:64],61) EOR ('000000':X[127:70]); - Vtmp[127:64] = W[127:64] + sig1 + Y[127:64]; - sig1 = ROR(X[63:0], 19) EOR ROR(X[63:0],61) EOR ('000000':X[63:6]); - Vtmp[63:0] = W[63:0] + sig1 + Y[63:0]; - V[d] = Vtmp; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_sisd - __instruction_set A64 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 01111001 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPRounding_TIEAWAY; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_tieaway_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 0x100001 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPRounding_TIEAWAY; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 01111001 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPRounding_TIEAWAY; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_tieaway_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x100001 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPRounding_TIEAWAY; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_special_frecpx_fp16 - __encoding aarch64_vector_arithmetic_unary_special_frecpx_fp16 - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 11111001 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_unary_special_frecpx - __instruction_set A64 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 1x100001 111110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRecpX(element, FPCR); - - V[d] = result; - -__instruction aarch64_branch_conditional_compare - __encoding aarch64_branch_conditional_compare - __instruction_set A64 - __field sf 31 +: 1 - __field op 24 +: 1 - __field imm19 5 +: 19 - __field Rt 0 +: 5 - __opcode 'x011010x xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer datasize = if sf == '1' then 64 else 32; - boolean iszero = (op == '0'); - bits(64) offset = SignExtend(imm19:'00', 64); - - __execute - bits(datasize) operand1 = X[t]; - - if IsZero(operand1) == iszero then - BranchTo(PC[] + offset, BranchType_DIR); - -__instruction aarch64_integer_conditional_compare_immediate - __encoding aarch64_integer_conditional_compare_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field imm5 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field nzcv 0 +: 4 - __opcode 'xx111010 010xxxxx xxxx10xx xxx0xxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - bits(4) condition = cond; - bits(4) flags = nzcv; - bits(datasize) imm = ZeroExtend(imm5, datasize); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = imm; - bit carry_in = '0'; - - if ConditionHolds(condition) then - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - (-, flags) = AddWithCarry(operand1, operand2, carry_in); - PSTATE.[N,Z,C,V] = flags; - -__instruction AND_P_P_PP_Z - __encoding AND_P_P_PP_Z - __instruction_set A64 - __field S 22 +: 1 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0000xxxx 01xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding ANDS_P_P_PP_Z - __instruction_set A64 - __field S 22 +: 1 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0100xxxx 01xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for e = 0 to elements-1 - bit element1 = ElemP[operand1, e, esize]; - bit element2 = ElemP[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = element1 AND element2; - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_integer_arithmetic_rev - __encoding aarch64_integer_arithmetic_rev - __instruction_set A64 - __field sf 31 +: 1 - __field opc 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x1011010 11000000 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize = if sf == '1' then 64 else 32; - - integer container_size; - case opc of - when '00' - Unreachable(); - when '01' - container_size = 16; - when '10' - container_size = 32; - when '11' - if sf == '0' then UNDEFINED; - container_size = 64; - - __execute - bits(datasize) operand = X[n]; - bits(datasize) result; - - integer containers = datasize DIV container_size; - integer elements_per_container = container_size DIV 8; - integer index = 0; - integer rev_index; - for c = 0 to containers-1 - rev_index = index + ((elements_per_container - 1) * 8); - for e = 0 to elements_per_container-1 - result[rev_index + 7:rev_index] = operand[index + 7:index]; - index = index + 8; - rev_index = rev_index - 8; - - X[d] = result; - -__instruction aarch64_memory_vector_multiple_no_wb - __encoding aarch64_memory_vector_multiple_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 0x000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_multiple_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << UInt(size); - integer elements = datasize DIV esize; - - integer rpt; // number of iterations - integer selem; // structure elements - - case opcode of - when '0000' rpt = 1; selem = 4; // LD/ST4 (4 registers) - when '0010' rpt = 4; selem = 1; // LD/ST1 (4 registers) - when '0100' rpt = 1; selem = 3; // LD/ST3 (3 registers) - when '0110' rpt = 3; selem = 1; // LD/ST1 (3 registers) - when '0111' rpt = 1; selem = 1; // LD/ST1 (1 register) - when '1000' rpt = 1; selem = 2; // LD/ST2 (2 registers) - when '1010' rpt = 2; selem = 1; // LD/ST1 (2 registers) - otherwise UNDEFINED; - - // .1D format only permitted with LD1 & ST1 - if size:Q == '110' && selem != 1 then UNDEFINED; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(datasize) rval; - integer tt; - constant integer ebytes = esize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - for r = 0 to rpt-1 - for e = 0 to elements-1 - tt = (t + r) MOD 32; - for s = 0 to selem-1 - rval = V[tt]; - if memop == MemOp_LOAD then - Elem[rval, e, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[tt] = rval; - else // memop == MemOp_STORE - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, e, esize]; - offs = offs + ebytes; - tt = (tt + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_memory_exclusive_pair - __encoding aarch64_memory_exclusive_pair - __instruction_set A64 - __field sz 30 +: 1 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '1x001000 0x1xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = TRUE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 32 << UInt(sz); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_element_bfdot - __encoding aarch64_vector_arithmetic_binary_element_bfdot - __instruction_set A64 - __field Q 30 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 01xxxxxx 1111x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Rn); - integer m = UInt(M:Rm); - integer d = UInt(Rd); - integer i = UInt(H:L); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 32; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - - for e = 0 to elements-1 - bits(16) elt1_a = Elem[operand1, 2 * e + 0, 16]; - bits(16) elt1_b = Elem[operand1, 2 * e + 1, 16]; - bits(16) elt2_a = Elem[operand2, 2 * i + 0, 16]; - bits(16) elt2_b = Elem[operand2, 2 * i + 1, 16]; - - bits(32) sum = BFAdd(BFMul(elt1_a, elt2_a), BFMul(elt1_b, elt2_b)); - Elem[result, e, 32] = BFAdd(Elem[operand3, e, 32], sum); - - V[d] = result; - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction ST3H_Z_P_BR_Contiguous - __encoding ST3H_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 110xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction WRFFR_F_P__ - __encoding WRFFR_F_P__ - __instruction_set A64 - __field Pn 5 +: 4 - __opcode '00100101 00101000 1001000x xxx00000' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer n = UInt(Pn); - - __execute - CheckSVEEnabled(); - bits(PL) operand = P[n]; - - hsb = HighestSetBit(operand); - if hsb < 0 || IsOnes(operand[hsb:0]) then - FFR[] = operand; - else // not a monotonic predicate - FFR[] = bits(PL) UNKNOWN; - -__instruction aarch64_integer_logical_shiftedreg - __encoding aarch64_integer_logical_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - boolean invert = (N == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - X[d] = result; - -__instruction UMMLA_Z_ZZZ__ - __encoding UMMLA_Z_ZZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000101 110xxxxx 100110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveInt8MatMulExt() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_unsigned = TRUE; - boolean op2_unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer segments = VL DIV 128; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result = Zeros(); - bits(128) op1, op2; - bits(128) res, addend; - - for s = 0 to segments-1 - op1 = Elem[operand1, s, 128]; - op2 = Elem[operand2, s, 128]; - addend = Elem[operand3, s, 128]; - res = MatMulAdd(addend, op1, op2, op1_unsigned, op2_unsigned); - Elem[result, s, 128] = res; - - Z[da] = result; - -__instruction LD1W_Z_P_BI_U32 - __encoding LD1W_Z_P_BI_U32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0100xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LD1W_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0110xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_vector_shift_left_long - __encoding aarch64_vector_shift_left_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 101001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = UInt(immh:immb) - esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = Vpart[n, part]; - bits(datasize*2) result; - integer element; - - for e = 0 to elements-1 - element = Int(Elem[operand, e, esize], unsigned) << shift; - Elem[result, e, 2*esize] = element[2*esize-1:0]; - - V[d] = result; - -__instruction WHILELE_P_P_RR__ - __encoding WHILELE_P_P_RR__ - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field sf 12 +: 1 - __field Rn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx1xxxxx 000x01xx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer rsize = 32 << UInt(sf); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Pd); - boolean unsigned = FALSE; - SVECmp op = Cmp_LE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = Ones(PL); - bits(rsize) operand1 = X[n]; - bits(rsize) operand2 = X[m]; - bits(PL) result; - boolean last = TRUE; - - for e = 0 to elements-1 - boolean cond; - case op of - when Cmp_LT cond = (Int(operand1, unsigned) < Int(operand2, unsigned)); - when Cmp_LE cond = (Int(operand1, unsigned) <= Int(operand2, unsigned)); - - last = last && cond; - ElemP[result, e, esize] = if last then '1' else '0'; - operand1 = operand1 + 1; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_vector_reduce_int_max - __encoding aarch64_vector_reduce_int_max - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 16 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx11000x 101010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '100' then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean min = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - integer maxmin; - integer element; - - maxmin = Int(Elem[operand, 0, esize], unsigned); - for e = 1 to elements-1 - element = Int(Elem[operand, e, esize], unsigned); - maxmin = if min then Min(maxmin, element) else Max(maxmin, element); - - V[d] = maxmin[esize-1:0]; - -__instruction LD1SW_Z_P_BZ_D_x32_scaled - __encoding LD1SW_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 0x1xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 2; - - __encoding LD1SW_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 0x0xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1SW_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 011xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 2; - - __encoding LD1SW_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 010xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset = Z[m]; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor - __encoding aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor - __instruction_set A64 - __field Q 30 +: 1 - __field opc2 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - VBitOp op; - - case opc2 of - when '00' op = VBitOp_VEOR; - when '01' op = VBitOp_VBSL; - when '10' op = VBitOp_VBIT; - when '11' op = VBitOp_VBIF; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1; - bits(datasize) operand2; - bits(datasize) operand3; - bits(datasize) operand4 = V[n]; - - case op of - when VBitOp_VEOR - operand1 = V[m]; - operand2 = Zeros(); - operand3 = Ones(); - when VBitOp_VBSL - operand1 = V[m]; - operand2 = operand1; - operand3 = V[d]; - when VBitOp_VBIT - operand1 = V[d]; - operand2 = operand1; - operand3 = V[m]; - when VBitOp_VBIF - operand1 = V[d]; - operand2 = operand1; - operand3 = NOT(V[m]); - - V[d] = operand1 EOR ((operand2 EOR operand4) AND operand3); - -__instruction STNT1D_Z_P_BI_Contiguous - __encoding STNT1D_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 1001xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - constant integer mbytes = esize DIV 8; - bits(VL) src; - bits(PL) mask = P[g]; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - src = Z[t]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_STREAM] = Elem[src, e, esize]; - addr = addr + mbytes; - -__instruction aarch64_vector_crypto_sha2op_sha256_sched0 - __encoding aarch64_vector_crypto_sha2op_sha256_sched0 - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 00101000 001010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - if !HaveSHA256Ext() then UNDEFINED; - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) operand1 = V[d]; - bits(128) operand2 = V[n]; - bits(128) result; - bits(128) T = operand2[31:0] : operand1[127:32]; - bits(32) elt; - - for e = 0 to 3 - elt = Elem[T, e, 32]; - elt = ROR(elt, 7) EOR ROR(elt, 18) EOR LSR(elt, 3); - Elem[result, e, 32] = elt + Elem[operand1, e, 32]; - V[d] = result; - -__instruction aarch64_vector_shift_right_sisd - __encoding aarch64_vector_shift_right_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __encoding aarch64_vector_shift_right_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - operand2 = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element = (Int(Elem[operand, e, esize], unsigned) + round_const) >> shift; - Elem[result, e, esize] = Elem[operand2, e, esize] + element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_memory_vector_multiple_no_wb - __encoding aarch64_memory_vector_multiple_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 0x000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_multiple_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << UInt(size); - integer elements = datasize DIV esize; - - integer rpt; // number of iterations - integer selem; // structure elements - - case opcode of - when '0000' rpt = 1; selem = 4; // LD/ST4 (4 registers) - when '0010' rpt = 4; selem = 1; // LD/ST1 (4 registers) - when '0100' rpt = 1; selem = 3; // LD/ST3 (3 registers) - when '0110' rpt = 3; selem = 1; // LD/ST1 (3 registers) - when '0111' rpt = 1; selem = 1; // LD/ST1 (1 register) - when '1000' rpt = 1; selem = 2; // LD/ST2 (2 registers) - when '1010' rpt = 2; selem = 1; // LD/ST1 (2 registers) - otherwise UNDEFINED; - - // .1D format only permitted with LD1 & ST1 - if size:Q == '110' && selem != 1 then UNDEFINED; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(datasize) rval; - integer tt; - constant integer ebytes = esize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - for r = 0 to rpt-1 - for e = 0 to elements-1 - tt = (t + r) MOD 32; - for s = 0 to selem-1 - rval = V[tt]; - if memop == MemOp_LOAD then - Elem[rval, e, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[tt] = rval; - else // memop == MemOp_STORE - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, e, esize]; - offs = offs + ebytes; - tt = (tt + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_integer_arithmetic_mul_widening_32_64 - __encoding aarch64_integer_arithmetic_mul_widening_32_64 - __instruction_set A64 - __field U 23 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '10011011 x01xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer a = UInt(Ra); - integer destsize = 64; - integer datasize = 32; - boolean sub_op = (o0 == '1'); - boolean unsigned = (U == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(destsize) operand3 = X[a]; - - integer result; - - if sub_op then - result = Int(operand3, unsigned) - (Int(operand1, unsigned) * Int(operand2, unsigned)); - else - result = Int(operand3, unsigned) + (Int(operand1, unsigned) * Int(operand2, unsigned)); - - X[d] = result[63:0]; - -__instruction aarch64_integer_arithmetic_add_sub_immediate - __encoding aarch64_integer_arithmetic_add_sub_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field sh 22 +: 1 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10001 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - bits(datasize) imm; - - case sh of - when '0' imm = ZeroExtend(imm12, datasize); - when '1' imm = ZeroExtend(imm12 : Zeros(12), datasize); - - __execute - bits(datasize) result; - bits(datasize) operand1 = if n == 31 then SP[] else X[n]; - bits(datasize) operand2 = imm; - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_shift_right_narrow_nonuniform_sisd - __encoding aarch64_vector_shift_right_narrow_nonuniform_sisd - __instruction_set A64 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111111 0xxxxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - - __encoding aarch64_vector_shift_right_narrow_nonuniform_simd - __instruction_set A64 - __field Q 30 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 0xxxxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize*2) operand = V[n]; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = (SInt(Elem[operand, e, 2*esize]) + round_const) >> shift; - (Elem[result, e, esize], sat) = UnsignedSatQ(element, esize); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction LDNT1W_Z_P_BI_Contiguous - __encoding LDNT1W_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0000xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_STREAM]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction FCMLA_Z_ZZZi_H - __encoding FCMLA_Z_ZZZi_H - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field rot 10 +: 2 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 101xxxxx 0001xxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer index = UInt(i2); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - integer sel_a = UInt(rot[0]); - integer sel_b = UInt(NOT(rot[0])); - boolean neg_i = (rot[1] == '1'); - boolean neg_r = (rot[0] != rot[1]); - - __encoding FCMLA_Z_ZZZi_S - __instruction_set A64 - __field i1 20 +: 1 - __field Zm 16 +: 4 - __field rot 10 +: 2 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 111xxxxx 0001xxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer index = UInt(i1); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - integer sel_a = UInt(rot[0]); - integer sel_b = UInt(NOT(rot[0])); - boolean neg_i = (rot[1] == '1'); - boolean neg_r = (rot[0] != rot[1]); - - __execute - CheckSVEEnabled(); - integer pairs = VL DIV (2 * esize); - integer pairspersegment = 128 DIV (2 * esize); - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for p = 0 to pairs-1 - segmentbase = p - (p MOD pairspersegment); - s = segmentbase + index; - addend_r = Elem[operand3, 2 * p + 0, esize]; - addend_i = Elem[operand3, 2 * p + 1, esize]; - elt1_a = Elem[operand1, 2 * p + sel_a, esize]; - elt2_a = Elem[operand2, 2 * s + sel_a, esize]; - elt2_b = Elem[operand2, 2 * s + sel_b, esize]; - if neg_r then elt2_a = FPNeg(elt2_a); - if neg_i then elt2_b = FPNeg(elt2_b); - addend_r = FPMulAdd(addend_r, elt1_a, elt2_a, FPCR); - addend_i = FPMulAdd(addend_i, elt1_a, elt2_b, FPCR); - Elem[result, 2 * p + 0, esize] = addend_r; - Elem[result, 2 * p + 1, esize] = addend_i; - - Z[da] = result; - -__instruction LDNF1SW_Z_P_BI_S64 - __encoding LDNF1SW_Z_P_BI_S64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1001xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - addr = addr + mbytes; - - Z[t] = result; - -__instruction FNMAD_Z_P_ZZZ__ - __encoding FNMAD_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Za 16 +: 5 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx1xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - integer a = UInt(Za); - boolean op1_neg = TRUE; - boolean op3_neg = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[a]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - bits(esize) element3 = Elem[operand3, e, esize]; - - if ElemP[mask, e, esize] == '1' then - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction ORR_Z_ZZ__ - __encoding ORR_Z_ZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 011xxxxx 001100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - - Z[d] = operand1 OR operand2; - -__instruction FMINNM_Z_P_ZS__ - __encoding FMINNM_Z_P_ZS__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - __opcode '01100101 xx011101 100xxx00 00xxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - bits(esize) imm = if i1 == '0' then Zeros() else FPOne('0'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMinNum(element1, imm, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction CPY_Z_P_I__ - __encoding CPY_Z_P_I__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 16 +: 4 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - __opcode '00000101 xx01xxxx 01xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer d = UInt(Zd); - boolean merging = TRUE; - integer imm = SInt(imm8); - if sh == '1' then imm = imm << 8; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) dest = Z[d]; - bits(VL) result; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = imm[esize-1:0]; - elsif merging then - Elem[result, e, esize] = Elem[dest, e, esize]; - else - Elem[result, e, esize] = Zeros(); - - Z[d] = result; - -__instruction LDNT1W_Z_P_BR_Contiguous - __encoding LDNT1W_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 000xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(64) offset; - bits(PL) mask = P[g]; - bits(VL) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = X[m]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_STREAM]; - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction LSLR_Z_P_ZZ__ - __encoding LSLR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010111 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - integer shift = Min(UInt(element1), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = LSL(element2, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction CTERMEQ_RR__ - __encoding CTERMEQ_RR__ - __instruction_set A64 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __opcode '00100101 1x1xxxxx 001000xx xxx00000' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32 << UInt(sz); - integer n = UInt(Rn); - integer m = UInt(Rm); - SVECmp op = Cmp_EQ; - - __encoding CTERMNE_RR__ - __instruction_set A64 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __opcode '00100101 1x1xxxxx 001000xx xxx10000' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32 << UInt(sz); - integer n = UInt(Rn); - integer m = UInt(Rm); - SVECmp op = Cmp_NE; - - __execute - CheckSVEEnabled(); - bits(esize) operand1 = X[n]; - bits(esize) operand2 = X[m]; - integer element1 = UInt(operand1); - integer element2 = UInt(operand2); - boolean term; - - case op of - when Cmp_EQ term = element1 == element2; - when Cmp_NE term = element1 != element2; - if term then - PSTATE.N = '1'; - PSTATE.V = '0'; - else - PSTATE.N = '0'; - PSTATE.V = (NOT PSTATE.C); - -__instruction UQADD_Z_ZI__ - __encoding UQADD_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx100101 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer imm = UInt(imm8); - if sh == '1' then imm = imm << 8; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + imm, esize, unsigned); - - Z[dn] = result; - -__instruction LD1W_Z_P_BR_U32 - __encoding LD1W_Z_P_BR_U32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 010xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - boolean unsigned = TRUE; - - __encoding LD1W_Z_P_BR_U64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 011xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction CPY_Z_P_R__ - __encoding CPY_Z_P_R__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx101000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Rn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) operand1; - if n == 31 then - operand1 = SP[]; - else - operand1 = X[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = operand1[esize-1:0]; - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_fp16_product - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_product - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 010xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_product - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 0x1xxxxx 110111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPMul(element1, element2, FPCR); - - V[d] = result; - -__instruction WHILELS_P_P_RR__ - __encoding WHILELS_P_P_RR__ - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field sf 12 +: 1 - __field Rn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx1xxxxx 000x11xx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer rsize = 32 << UInt(sf); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Pd); - boolean unsigned = TRUE; - SVECmp op = Cmp_LE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = Ones(PL); - bits(rsize) operand1 = X[n]; - bits(rsize) operand2 = X[m]; - bits(PL) result; - boolean last = TRUE; - - for e = 0 to elements-1 - boolean cond; - case op of - when Cmp_LT cond = (Int(operand1, unsigned) < Int(operand2, unsigned)); - when Cmp_LE cond = (Int(operand1, unsigned) <= Int(operand2, unsigned)); - - last = last && cond; - ElemP[result, e, esize] = if last then '1' else '0'; - operand1 = operand1 + 1; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field eq 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 0011x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean cmp_eq = (eq == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field eq 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0011x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean cmp_eq = (eq == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - test_passed = if cmp_eq then element1 >= element2 else element1 > element2; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_vector_reduce_fp16_add_sisd - __encoding aarch64_vector_reduce_fp16_add_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 0x110000 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer esize = 16; - if sz == '1' then UNDEFINED; - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = ReduceOp_FADD; - - __encoding aarch64_vector_reduce_fp_add_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 0x110000 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = ReduceOp_FADD; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction aarch64_vector_arithmetic_unary_clsz - __encoding aarch64_vector_arithmetic_unary_clsz - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 010010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CountOp countop = if U == '1' then CountOp_CLZ else CountOp_CLS; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - integer count; - for e = 0 to elements-1 - if countop == CountOp_CLS then - count = CountLeadingSignBits(Elem[operand, e, esize]); - else - count = CountLeadingZeroBits(Elem[operand, e, esize]); - Elem[result, e, esize] = count[esize-1:0]; - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 11111000 110x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 1x100000 110x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_fp16_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 11111000 110x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 1x100000 110x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) zero = FPZero('0'); - bits(esize) element; - boolean test_passed; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - case comparison of - when CompareOp_GT test_passed = FPCompareGT(element, zero, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element, zero, FPCR); - when CompareOp_EQ test_passed = FPCompareEQ(element, zero, FPCR); - when CompareOp_LE test_passed = FPCompareGE(zero, element, FPCR); - when CompareOp_LT test_passed = FPCompareGT(zero, element, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_integer_logical_immediate - __encoding aarch64_integer_logical_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10010 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - bits(datasize) imm; - if sf == '0' && N != '0' then UNDEFINED; - (imm, -) = DecodeBitMasks(N, imms, immr, TRUE); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = imm; - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_round - __encoding aarch64_vector_arithmetic_unary_fp16_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 100x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_arithmetic_unary_float_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundInt(element, FPCR, rounding, exact); - - V[d] = result; - -__instruction aarch64_vector_reduce_add_simd - __encoding aarch64_vector_reduce_add_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx110001 101110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '100' then UNDEFINED; - if size == '11' then UNDEFINED; - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = ReduceOp_ADD; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction LDFF1B_Z_P_BZ_D_x32_unscaled - __encoding LDFF1B_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 0x0xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1B_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 0x0xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1B_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 010xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction LD1RB_Z_P_BI_U8 - __encoding LD1RB_Z_P_BI_U8 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 01xxxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __encoding LD1RB_Z_P_BI_U16 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 01xxxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __encoding LD1RB_Z_P_BI_U32 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 01xxxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __encoding LD1RB_Z_P_BI_U64 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 01xxxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = UInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - integer last = LastActiveElement(mask, esize); - if last >= 0 then - addr = base + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction LD1H_Z_P_BR_U16 - __encoding LD1H_Z_P_BR_U16 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 101xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 16; - boolean unsigned = TRUE; - - __encoding LD1H_Z_P_BR_U32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 110xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = TRUE; - - __encoding LD1H_Z_P_BR_U64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 111xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_float_convert_fp - __encoding aarch64_float_convert_fp - __instruction_set A64 - __field ftype 22 +: 2 - __field opc 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10001x x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer srcsize; - integer dstsize; - - if ftype == opc then UNDEFINED; - - case ftype of - when '00' srcsize = 32; - when '01' srcsize = 64; - when '10' UNDEFINED; - when '11' srcsize = 16; - case opc of - when '00' dstsize = 32; - when '01' dstsize = 64; - when '10' UNDEFINED; - when '11' dstsize = 16; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(dstsize) result; - bits(srcsize) operand = V[n]; - - result = FPConvert(operand, FPCR); - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction LD3D_Z_P_BR_Contiguous - __encoding LD3D_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 110xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_fp16 - __encoding aarch64_vector_arithmetic_binary_uniform_add_fp16 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 010xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_add_fp - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x1xxxxx 110101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPAdd(element1, element2, FPCR); - - V[d] = result; - -__instruction UMAXV_R_P_Z__ - __encoding UMAXV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx001001 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - integer maximum = if unsigned then 0 else -(2^(esize-1)); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer element = Int(Elem[operand, e, esize], unsigned); - maximum = Max(maximum, element); - - V[d] = maximum[esize-1:0]; - -__instruction LD4W_Z_P_BR_Contiguous - __encoding LD4W_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 011xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_crypto_sm3_sm3tt2b - __encoding aarch64_vector_crypto_sm3_sm3tt2b - __instruction_set A64 - __field Rm 16 +: 5 - __field imm2 12 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 010xxxxx 10xx11xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer i = UInt(imm2); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Vd = V[d]; - bits(32) Wj; - bits(128) result; - bits(32) TT2; - - Wj = Elem[Vm,i,32]; - TT2 = (Vd[127:96] AND Vd[95:64]) OR (NOT(Vd[127:96]) AND Vd[63:32]); - TT2 = (TT2 + Vd[31:0] + Vn[127:96] + Wj)[31:0]; - - result[31:0] = Vd[63:32]; - result[63:32] = ROL(Vd[95:64],19); - result[95:64] = Vd[127:96]; - result[127:96] = TT2 EOR ROL(TT2,9) EOR ROL(TT2,17); - V[d] = result; - -__instruction CMPEQ_P_P_ZW__ - __encoding CMPEQ_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_EQ; - boolean unsigned = FALSE; - - __encoding CMPGT_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 010xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - boolean unsigned = FALSE; - - __encoding CMPGE_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 010xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - boolean unsigned = FALSE; - - __encoding CMPHI_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 110xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - boolean unsigned = TRUE; - - __encoding CMPHS_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 110xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - boolean unsigned = TRUE; - - __encoding CMPLT_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 011xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_LT; - boolean unsigned = FALSE; - - __encoding CMPLE_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 011xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_LE; - boolean unsigned = FALSE; - - __encoding CMPLO_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_LT; - boolean unsigned = TRUE; - - __encoding CMPLS_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 111xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_LE; - boolean unsigned = TRUE; - - __encoding CMPNE_P_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100100 xx0xxxxx 001xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_NE; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(PL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, (e * esize) DIV 64, 64], unsigned); - if ElemP[mask, e, esize] == '1' then - boolean cond; - case op of - when Cmp_EQ cond = element1 == element2; - when Cmp_NE cond = element1 != element2; - when Cmp_GE cond = element1 >= element2; - when Cmp_LT cond = element1 < element2; - when Cmp_GT cond = element1 > element2; - when Cmp_LE cond = element1 <= element2; - ElemP[result, e, esize] = if cond then '1' else '0'; - else - ElemP[result, e, esize] = '0'; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_float_arithmetic_round_frint - __encoding aarch64_float_arithmetic_round_frint - __instruction_set A64 - __field ftype 22 +: 2 - __field rmode 15 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1001xx x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean exact = FALSE; - FPRounding rounding; - case rmode of - when '0xx' rounding = FPDecodeRounding(rmode[1:0]); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundInt(operand, FPCR, rounding, exact); - - V[d] = result; - -__instruction UMAX_Z_ZI__ - __encoding UMAX_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx101001 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - boolean unsigned = TRUE; - integer imm = Int(imm8, unsigned); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - Elem[result, e, esize] = Max(element1, imm)[esize-1:0]; - - Z[dn] = result; - -__instruction aarch64_vector_shift_conv_float_sisd - __encoding aarch64_vector_shift_conv_float_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '000x' || (immh == '001x' && !HaveFP16Ext()) then UNDEFINED; - integer esize = if immh == '1xxx' then 64 else if immh == '01xx' then 32 else 16; - integer datasize = esize; - integer elements = 1; - - integer fracbits = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - FPRounding rounding = FPRounding_ZERO; - - __encoding aarch64_vector_shift_conv_float_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh == '000x' || (immh == '001x' && !HaveFP16Ext()) then UNDEFINED; - if immh[3]:Q == '10' then UNDEFINED; - integer esize = if immh == '1xxx' then 64 else if immh == '01xx' then 32 else 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer fracbits = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - FPRounding rounding = FPRounding_ZERO; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, fracbits, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction TBL_Z_ZZ_1 - __encoding TBL_Z_ZZ_1 - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 001100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer idx = UInt(Elem[operand2, e, esize]); - Elem[result, e, esize] = if idx < elements then Elem[operand1, idx, esize] else Zeros(); - - Z[d] = result; - -__instruction FMINNMV_V_P_Z__ - __encoding FMINNMV_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '01100101 xx000101 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(esize) identity = FPDefaultNaN(); - - V[d] = ReducePredicated(ReduceOp_FMINNUM, operand, mask, identity); - -__instruction UQINCH_Z_ZS__ - __encoding UQINCH_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 0110xxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_unary_diff_neg_fp16 - __encoding aarch64_vector_arithmetic_unary_diff_neg_fp16 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 11111000 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean neg = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_diff_neg_float - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 1x100000 111110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean neg = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - if neg then - element = FPNeg(element); - else - element = FPAbs(element); - Elem[result, e, esize] = element; - - V[d] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction SQINCH_Z_ZS__ - __encoding SQINCH_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 0110xxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction FMLA_Z_P_ZZZ__ - __encoding FMLA_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100101 xx1xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = FALSE; - boolean op3_neg = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - bits(esize) element3 = Elem[operand3, e, esize]; - - if ElemP[mask, e, esize] == '1' then - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - else - Elem[result, e, esize] = element3; - - Z[da] = result; - -__instruction ST2W_Z_P_BI_Contiguous - __encoding ST2W_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 0011xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction aarch64_integer_arithmetic_rev - __encoding aarch64_integer_arithmetic_rev - __instruction_set A64 - __field sf 31 +: 1 - __field opc 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x1011010 11000000 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize = if sf == '1' then 64 else 32; - - integer container_size; - case opc of - when '00' - Unreachable(); - when '01' - container_size = 16; - when '10' - container_size = 32; - when '11' - if sf == '0' then UNDEFINED; - container_size = 64; - - __execute - bits(datasize) operand = X[n]; - bits(datasize) result; - - integer containers = datasize DIV container_size; - integer elements_per_container = container_size DIV 8; - integer index = 0; - integer rev_index; - for c = 0 to containers-1 - rev_index = index + ((elements_per_container - 1) * 8); - for e = 0 to elements_per_container-1 - result[rev_index + 7:rev_index] = operand[index + 7:index]; - index = index + 8; - rev_index = rev_index - 8; - - X[d] = result; - -__instruction SQADD_Z_ZI__ - __encoding SQADD_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field sh 13 +: 1 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx100100 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size:sh == '001' then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer imm = UInt(imm8); - if sh == '1' then imm = imm << 8; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + imm, esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor - __encoding aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor - __instruction_set A64 - __field Q 30 +: 1 - __field opc2 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - VBitOp op; - - case opc2 of - when '00' op = VBitOp_VEOR; - when '01' op = VBitOp_VBSL; - when '10' op = VBitOp_VBIT; - when '11' op = VBitOp_VBIF; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1; - bits(datasize) operand2; - bits(datasize) operand3; - bits(datasize) operand4 = V[n]; - - case op of - when VBitOp_VEOR - operand1 = V[m]; - operand2 = Zeros(); - operand3 = Ones(); - when VBitOp_VBSL - operand1 = V[m]; - operand2 = operand1; - operand3 = V[d]; - when VBitOp_VBIT - operand1 = V[d]; - operand2 = operand1; - operand3 = V[m]; - when VBitOp_VBIF - operand1 = V[d]; - operand2 = operand1; - operand3 = NOT(V[m]); - - V[d] = operand1 EOR ((operand2 EOR operand4) AND operand3); - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_int_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 01111001 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 0x100001 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 01111001 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x100001 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - FPRounding rounding = FPRoundingMode(FPCR); - bits(esize) element; - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FixedToFP(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction aarch64_vector_logical - __encoding aarch64_vector_logical - __instruction_set A64 - __field Q 30 +: 1 - __field op 29 +: 1 - __field a 18 +: 1 - __field b 17 +: 1 - __field c 16 +: 1 - __field cmode 12 +: 4 - __field d 9 +: 1 - __field e 8 +: 1 - __field f 7 +: 1 - __field g 6 +: 1 - __field h 5 +: 1 - __field Rd 0 +: 5 - __opcode '0xx01111 00000xxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer rd = UInt(Rd); - - integer datasize = if Q == '1' then 128 else 64; - bits(datasize) imm; - bits(64) imm64; - - ImmediateOp operation; - case cmode:op of - when '0xx00' operation = ImmediateOp_MOVI; - when '0xx01' operation = ImmediateOp_MVNI; - when '0xx10' operation = ImmediateOp_ORR; - when '0xx11' operation = ImmediateOp_BIC; - when '10x00' operation = ImmediateOp_MOVI; - when '10x01' operation = ImmediateOp_MVNI; - when '10x10' operation = ImmediateOp_ORR; - when '10x11' operation = ImmediateOp_BIC; - when '110x0' operation = ImmediateOp_MOVI; - when '110x1' operation = ImmediateOp_MVNI; - when '1110x' operation = ImmediateOp_MOVI; - when '11110' operation = ImmediateOp_MOVI; - when '11111' - // FMOV Dn,#imm is in main FP instruction set - if Q == '0' then UNDEFINED; - operation = ImmediateOp_MOVI; - - imm64 = AdvSIMDExpandImm(op, cmode, a:b:c:d:e:f:g:h); - imm = Replicate(imm64, datasize DIV 64); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand; - bits(datasize) result; - - case operation of - when ImmediateOp_MOVI - result = imm; - when ImmediateOp_MVNI - result = NOT(imm); - when ImmediateOp_ORR - operand = V[rd]; - result = operand OR imm; - when ImmediateOp_BIC - operand = V[rd]; - result = operand AND NOT(imm); - - V[rd] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_diff - __encoding aarch64_vector_arithmetic_binary_uniform_diff - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 0111x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean accumulate = (ac == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - bits(esize) absdiff; - - result = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - absdiff = Abs(element1 - element2)[esize-1:0]; - Elem[result, e, esize] = Elem[result, e, esize] + absdiff; - V[d] = result; - -__instruction PRFD_I_P_BR_S - __encoding PRFD_I_P_BR_S - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000101 100xxxxx 110xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) offset = X[m]; - bits(64) addr; - - if n == 31 then - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + (UInt(offset) << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - offset = offset + 1; - -__instruction ADR_Z_AZ_SD_same_scaled - __encoding ADR_Z_AZ_SD_same_scaled - __instruction_set A64 - __field sz 22 +: 1 - __field Zm 16 +: 5 - __field msz 10 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 1x1xxxxx 1010xxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32 << UInt(sz); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer osize = esize; - boolean unsigned = TRUE; - integer mbytes = 1 << UInt(msz); - - __encoding ADR_Z_AZ_D_s32_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field msz 10 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 001xxxxx 1010xxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer osize = 32; - boolean unsigned = FALSE; - integer mbytes = 1 << UInt(msz); - - __encoding ADR_Z_AZ_D_u32_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field msz 10 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 011xxxxx 1010xxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - integer osize = 32; - boolean unsigned = TRUE; - integer mbytes = 1 << UInt(msz); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(VL) offs = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) addr = Elem[base, e, esize]; - integer offset = Int(Elem[offs, e, esize][osize-1:0], unsigned); - Elem[result, e, esize] = addr + (offset * mbytes); - - Z[d] = result; - -__instruction FADDA_V_P_Z__ - __encoding FADDA_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Vdn 0 +: 5 - __opcode '01100101 xx011000 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Vdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(esize) operand1 = V[dn]; - bits(VL) operand2 = Z[m]; - bits(esize) result = operand1; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - bits(esize) element = Elem[operand2, e, esize]; - result = FPAdd(result, element, FPCR); - - V[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_long - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 xxxxxxxx 0x10x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - - element2 = Int(Elem[operand2, index, esize], unsigned); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - if sub_op then - Elem[result, e, 2*esize] = Elem[operand3, e, 2*esize] - product; - else - Elem[result, e, 2*esize] = Elem[operand3, e, 2*esize] + product; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_narrow - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_narrow - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 01x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean round = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand1 = V[n]; - bits(2*datasize) operand2 = V[m]; - bits(datasize) result; - integer round_const = if round then 1 << (esize - 1) else 0; - bits(2*esize) element1; - bits(2*esize) element2; - bits(2*esize) sum; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, 2*esize]; - element2 = Elem[operand2, e, 2*esize]; - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - sum = sum + round_const; - Elem[result, e, esize] = sum[2*esize-1:esize]; - - Vpart[d, part] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_fp16_sisd - __instruction_set A64 - __field U 29 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 00xxxxxx 1001x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - boolean mulx_op = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_fp_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 1xxxxxxx 1001x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi = M; - case sz:L of - when '0x' index = UInt(H:L); - when '10' index = UInt(H); - when '11' UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - boolean mulx_op = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 00xxxxxx 1001x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean mulx_op = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 1xxxxxxx 1001x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi = M; - case sz:L of - when '0x' index = UInt(H:L); - when '10' index = UInt(H); - when '11' UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean mulx_op = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2 = Elem[operand2, index, esize]; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - if mulx_op then - Elem[result, e, esize] = FPMulX(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMul(element1, element2, FPCR); - - V[d] = result; - -__instruction SQDECW_R_RS_SX - __encoding SQDECW_R_RS_SX - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1010xxxx 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQDECW_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1011xxxx 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 - (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_uniform_recps_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_recps_fp16_sisd - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 010xxxxx 001111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_binary_uniform_recps_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 0x1xxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_binary_uniform_recps_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 010xxxxx 001111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __encoding aarch64_vector_arithmetic_binary_uniform_recps_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 0x1xxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPRecipStepFused(element1, element2); - - V[d] = result; - -__instruction aarch64_vector_logical - __encoding aarch64_vector_logical - __instruction_set A64 - __field Q 30 +: 1 - __field op 29 +: 1 - __field a 18 +: 1 - __field b 17 +: 1 - __field c 16 +: 1 - __field cmode 12 +: 4 - __field d 9 +: 1 - __field e 8 +: 1 - __field f 7 +: 1 - __field g 6 +: 1 - __field h 5 +: 1 - __field Rd 0 +: 5 - __opcode '0xx01111 00000xxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer rd = UInt(Rd); - - integer datasize = if Q == '1' then 128 else 64; - bits(datasize) imm; - bits(64) imm64; - - ImmediateOp operation; - case cmode:op of - when '0xx00' operation = ImmediateOp_MOVI; - when '0xx01' operation = ImmediateOp_MVNI; - when '0xx10' operation = ImmediateOp_ORR; - when '0xx11' operation = ImmediateOp_BIC; - when '10x00' operation = ImmediateOp_MOVI; - when '10x01' operation = ImmediateOp_MVNI; - when '10x10' operation = ImmediateOp_ORR; - when '10x11' operation = ImmediateOp_BIC; - when '110x0' operation = ImmediateOp_MOVI; - when '110x1' operation = ImmediateOp_MVNI; - when '1110x' operation = ImmediateOp_MOVI; - when '11110' operation = ImmediateOp_MOVI; - when '11111' - // FMOV Dn,#imm is in main FP instruction set - if Q == '0' then UNDEFINED; - operation = ImmediateOp_MOVI; - - imm64 = AdvSIMDExpandImm(op, cmode, a:b:c:d:e:f:g:h); - imm = Replicate(imm64, datasize DIV 64); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand; - bits(datasize) result; - - case operation of - when ImmediateOp_MOVI - result = imm; - when ImmediateOp_MVNI - result = NOT(imm); - when ImmediateOp_ORR - operand = V[rd]; - result = operand OR imm; - when ImmediateOp_BIC - operand = V[rd]; - result = operand AND NOT(imm); - - V[rd] = result; - -__instruction FABS_Z_P_Z__ - __encoding FABS_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx011100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPAbs(element); - - Z[d] = result; - -__instruction FTSSEL_Z_ZZ__ - __encoding FTSSEL_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 101100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPTrigSSel(element1, element2); - - Z[d] = result; - -__instruction SQSUB_Z_ZZ__ - __encoding SQSUB_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 000110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - element2, esize, unsigned); - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_sub_saturating_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_sub_saturating_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 001011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_sub_saturating_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 001011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer diff; - boolean sat; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - diff = element1 - element2; - (Elem[result, e, esize], sat) = SatQ(diff, esize, unsigned); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction aarch64_memory_single_general_immediate_signed_pac - __encoding aarch64_memory_single_general_immediate_signed_pac - __instruction_set A64 - __field size 30 +: 2 - __field M 23 +: 1 - __field S 22 +: 1 - __field imm9 12 +: 9 - __field W 11 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxxx1xx xxxxxxxx' - __guard TRUE - __decode - if !HavePACExt() || size != '11' then UNDEFINED; - integer t = UInt(Rt); - integer n = UInt(Rn); - boolean wback = (W == '1'); - boolean use_key_a = (M == '0'); - bits(10) S10 = S:imm9; - integer scale = 3; - bits(64) offset = LSL(SignExtend(S10, 64), scale); - boolean tag_checked = wback || n != 31; - - __execute - bits(64) address; - bits(64) data; - boolean wb_unknown = FALSE; - boolean auth_then_branch = TRUE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - address = SP[]; - else - address = X[n]; - - if use_key_a then - address = AuthDA(address, X[31], auth_then_branch); - else - address = AuthDB(address, X[31], auth_then_branch); - - if n == 31 then - CheckSPAlignment(); - - address = address + offset; - data = Mem[address, 8, AccType_NORMAL]; - X[t] = data; - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction STNT1W_Z_P_BI_Contiguous - __encoding STNT1W_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 0001xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - constant integer mbytes = esize DIV 8; - bits(VL) src; - bits(PL) mask = P[g]; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - src = Z[t]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_STREAM] = Elem[src, e, esize]; - addr = addr + mbytes; - -__instruction FADD_Z_P_ZS__ - __encoding FADD_Z_P_ZS__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - __opcode '01100101 xx011000 100xxx00 00xxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - bits(esize) imm = if i1 == '0' then FPPointFive('0') else FPOne('0'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPAdd(element1, imm, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction SETFFR_F__ - __encoding SETFFR_F__ - __instruction_set A64 - __opcode '00100101 00101100 10010000 00000000' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - - __execute - CheckSVEEnabled(); - FFR[] = Ones(PL); - -__instruction MUL_Z_ZI__ - __encoding MUL_Z_ZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm8 5 +: 8 - __field Zdn 0 +: 5 - __opcode '00100101 xx110000 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer imm = SInt(imm8); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = SInt(Elem[operand1, e, esize]); - Elem[result, e, esize] = (element1 * imm)[esize-1:0]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field a 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (a == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_2008 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - - if minimum then - Elem[result, e, esize] = FPMinNum(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMaxNum(element1, element2, FPCR); - - V[d] = result; - -__instruction aarch64_integer_pac_pacdb_dp_1src - __encoding aarch64_integer_pac_pacdb_dp_1src - __instruction_set A64 - __field Z 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 00x011xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if Z == '0' then // PACDB - if n == 31 then source_is_sp = TRUE; - else // PACDZB - if n != 31 then UNDEFINED; - - __execute - if source_is_sp then - X[d] = AddPACDB(X[d], SP[]); - else - X[d] = AddPACDB(X[d], X[n]); - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_float_arithmetic_mul_add_sub - __encoding aarch64_float_arithmetic_mul_add_sub - __instruction_set A64 - __field ftype 22 +: 2 - __field o1 21 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011111 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer a = UInt(Ra); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean opa_neg = (o1 == '1'); - boolean op1_neg = (o0 != o1); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operanda = V[a]; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - if opa_neg then operanda = FPNeg(operanda); - if op1_neg then operand1 = FPNeg(operand1); - result = FPMulAdd(operanda, operand1, operand2, FPCR); - - V[d] = result; - -__instruction USMMLA_Z_ZZZ__ - __encoding USMMLA_Z_ZZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000101 100xxxxx 100110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveInt8MatMulExt() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_unsigned = TRUE; - boolean op2_unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer segments = VL DIV 128; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result = Zeros(); - bits(128) op1, op2; - bits(128) res, addend; - - for s = 0 to segments-1 - op1 = Elem[operand1, s, 128]; - op2 = Elem[operand2, s, 128]; - addend = Elem[operand3, s, 128]; - res = MatMulAdd(addend, op1, op2, op1_unsigned, op2_unsigned); - Elem[result, s, 128] = res; - - Z[da] = result; - -__instruction SEL_Z_P_ZZ__ - __encoding SEL_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 4 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx1xxxxx 11xxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element1; - else - Elem[result, e, esize] = element2; - - Z[d] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_branch_unconditional_register - __encoding aarch64_branch_unconditional_register - __instruction_set A64 - __field Z 24 +: 1 - __field op 21 +: 2 - __field A 11 +: 1 - __field M 10 +: 1 - __field Rn 5 +: 5 - __field Rm 0 +: 5 - __opcode '1101011x 0xx11111 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - BranchType branch_type; - integer m = UInt(Rm); - boolean pac = (A == '1'); - boolean use_key_a = (M == '0'); - boolean source_is_sp = ((Z == '1') && (m == 31)); - - if !pac && m != 0 then - UNDEFINED; - elsif pac && !HavePACExt() then - UNDEFINED; - - case op of - when '00' branch_type = BranchType_INDIR; - when '01' branch_type = BranchType_INDCALL; - when '10' branch_type = BranchType_RET; - otherwise UNDEFINED; - - if pac then - if Z == '0' && m != 31 then - UNDEFINED; - - if branch_type == BranchType_RET then - if n != 31 then UNDEFINED; - n = 30; - source_is_sp = TRUE; - - __execute - bits(64) target = X[n]; - boolean auth_then_branch = TRUE; - - if pac then - bits(64) modifier = if source_is_sp then SP[] else X[m]; - - if use_key_a then - target = AuthIA(target, modifier, auth_then_branch); - else - target = AuthIB(target, modifier, auth_then_branch); - - if branch_type == BranchType_INDCALL then X[30] = PC[] + 4; - - // Value in BTypeNext will be used to set PSTATE.BTYPE - case branch_type of - when BranchType_INDIR // BR, BRAA, BRAB, BRAAZ, BRABZ - if InGuardedPage then - if n == 16 || n == 17 then - BTypeNext = '01'; - else - BTypeNext = '11'; - else - BTypeNext = '01'; - when BranchType_INDCALL // BLR, BLRAA, BLRAB, BLRAAZ, BLRABZ - BTypeNext = '10'; - when BranchType_RET // RET, RETAA, RETAB - BTypeNext = '00'; - - BranchTo(target, branch_type); - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_product - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_product - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 100111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if U == '1' && size != '00' then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean poly = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - bits(esize) product; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if poly then - product = PolynomialMult(element1, element2)[esize-1:0]; - else - product = (UInt(element1) * UInt(element2))[esize-1:0]; - Elem[result, e, esize] = product; - - V[d] = result; - -__instruction aarch64_integer_shift_variable - __encoding aarch64_integer_shift_variable - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field op2 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011010 110xxxxx 0010xxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - ShiftType shift_type = DecodeShift(op2); - - __execute - bits(datasize) result; - bits(datasize) operand2 = X[m]; - - result = ShiftReg(n, shift_type, UInt(operand2) MOD datasize); - X[d] = result; - -__instruction ST2B_Z_P_BR_Contiguous - __encoding ST2B_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 001xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction LD1H_Z_P_BZ_S_x32_scaled - __encoding LD1H_Z_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 1x1xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding LD1H_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 1x1xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding LD1H_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 1x0xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1H_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 1x0xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1H_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 111xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 1; - - __encoding LD1H_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 110xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset = Z[m]; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction STNT1B_Z_P_BI_Contiguous - __encoding STNT1B_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 0001xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - constant integer mbytes = esize DIV 8; - bits(VL) src; - bits(PL) mask = P[g]; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - src = Z[t]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_STREAM] = Elem[src, e, esize]; - addr = addr + mbytes; - -__instruction aarch64_vector_arithmetic_binary_uniform_shift_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - if S == '0' && size != '11' then UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer round_const = 0; - integer shift; - integer element; - boolean sat; - - for e = 0 to elements-1 - shift = SInt(Elem[operand2, e, esize][7:0]); - if rounding then - round_const = 1 << (-shift - 1); // 0 for left shift, 2^(n-1) for right shift - element = (Int(Elem[operand1, e, esize], unsigned) + round_const) << shift; - if saturating then - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - else - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_vector_crypto_sha512_sha512h2 - __encoding aarch64_vector_crypto_sha512_sha512h2 - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 011xxxxx 100001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSHA512Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vtmp; - bits(64) NSigma0; - bits(64) tmp; - bits(128) X = V[n]; - bits(128) Y = V[m]; - bits(128) W = V[d]; - - NSigma0 = ROR(Y[63:0], 28) EOR ROR(Y[63:0],34) EOR ROR(Y[63:0],39); - Vtmp[127:64] = (X[63:0] AND Y[127:64]) EOR (X[63:0] AND Y[63:0]) EOR (Y[127:64] AND Y[63:0]); - Vtmp[127:64] = (Vtmp[127:64] + NSigma0 + W[127:64]); - NSigma0 = ROR(Vtmp[127:64], 28) EOR ROR(Vtmp[127:64],34) EOR ROR(Vtmp[127:64],39); - Vtmp[63:0] = (Vtmp[127:64] AND Y[63:0]) EOR (Vtmp[127:64] AND Y[127:64]) EOR (Y[127:64] AND Y[63:0]); - Vtmp[63:0] = (Vtmp[63:0] + NSigma0 + W[63:0]); - - V[d] = Vtmp; - -__instruction LD4H_Z_P_BR_Contiguous - __encoding LD4H_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 111xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_dotp - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_dotp - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx0xxxxx 100101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveDOTPExt() then UNDEFINED; - if size!= '10' then UNDEFINED; - boolean signed = (U=='0'); - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - result = V[d]; - for e = 0 to elements-1 - integer res = 0; - integer element1, element2; - for i = 0 to 3 - if signed then - element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = SInt(Elem[operand2, 4 * e + i, esize DIV 4]); - else - element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = UInt(Elem[operand2, 4 * e + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = Elem[result, e, esize] + res; - V[d] = result; - -__instruction aarch64_memory_pair_simdfp_no_alloc - __encoding aarch64_memory_pair_simdfp_no_alloc - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101100 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_VECSTREAM; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if opc == '11' then UNDEFINED; - integer scale = 2 + UInt(opc); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data1 = V[t]; - data2 = V[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - V[t] = data1; - V[t2] = data2; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_unary_add_pairwise - __encoding aarch64_vector_arithmetic_unary_add_pairwise - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 0x1010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV (2*esize); - boolean acc = (op == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - bits(2*esize) sum; - integer op1; - integer op2; - - if acc then result = V[d]; - for e = 0 to elements-1 - op1 = Int(Elem[operand, 2*e+0, esize], unsigned); - op2 = Int(Elem[operand, 2*e+1, esize], unsigned); - sum = (op1 + op2)[2*esize-1:0]; - if acc then - Elem[result, e, 2*esize] = Elem[result, e, 2*esize] + sum; - else - Elem[result, e, 2*esize] = sum; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_lower - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_lower - __instruction_set A64 - __field Q 30 +: 1 - __field S 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 111011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz == '1' then UNDEFINED; - integer esize = 32; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (S == '1'); - integer part = 0; - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_upper - __instruction_set A64 - __field Q 30 +: 1 - __field S 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx1xxxxx 110011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz == '1' then UNDEFINED; - integer esize = 32; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (S == '1'); - integer part = 1; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize DIV 2) operand1 = Vpart[n,part]; - bits(datasize DIV 2) operand2 = Vpart[m,part]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize DIV 2) element1; - bits(esize DIV 2) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize DIV 2]; - element2 = Elem[operand2, e, esize DIV 2]; - if sub_op then element1 = FPNeg(element1); - Elem[result,e,esize] = FPMulAddH(Elem[operand3, e, esize], element1, element2, FPCR); - V[d] = result; - -__instruction aarch64_vector_shift_conv_int_sisd - __encoding aarch64_vector_shift_conv_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '000x' || (immh == '001x' && !HaveFP16Ext()) then UNDEFINED; - integer esize = if immh == '1xxx' then 64 else if immh == '01xx' then 32 else 16; - integer datasize = esize; - integer elements = 1; - - integer fracbits = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_shift_conv_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 111001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh == '000x' || (immh == '001x' && !HaveFP16Ext()) then UNDEFINED; - if immh[3]:Q == '10' then UNDEFINED; - integer esize = if immh == '1xxx' then 64 else if immh == '01xx' then 32 else 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer fracbits = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - FPRounding rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FixedToFP(element, fracbits, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_transfer_integer_dup - __encoding aarch64_vector_transfer_integer_dup - __instruction_set A64 - __field Q 30 +: 1 - __field imm5 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 000xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer size = LowestSetBit(imm5); - if size > 3 then UNDEFINED; - - // imm5[4:size+1] is IGNORED - - if size == 3 && Q == '0' then UNDEFINED; - integer esize = 8 << size; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(esize) element = X[n]; - bits(datasize) result; - - for e = 0 to elements-1 - Elem[result, e, esize] = element; - V[d] = result; - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_cvt_bf16_scalar - __encoding aarch64_vector_cvt_bf16_scalar - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 01100011 010000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Rn); - integer d = UInt(Rd); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(32) operand = V[n]; - bits(16) result; - - result = FPConvertBF(operand, FPCR); - V[d] = result; - -__instruction LDFF1H_Z_P_BR_U16 - __encoding LDFF1H_Z_P_BR_U16 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 101xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 16; - boolean unsigned = TRUE; - - __encoding LDFF1H_Z_P_BR_U32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 110xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = TRUE; - - __encoding LDFF1H_Z_P_BR_U64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 111xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + UInt(offset) * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_CNOTFIRST]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - offset = offset + 1; - - Z[t] = result; - -__instruction LD1RSB_Z_P_BI_S16 - __encoding LD1RSB_Z_P_BI_S16 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 11xxxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = UInt(imm6); - - __encoding LD1RSB_Z_P_BI_S32 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 11xxxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = UInt(imm6); - - __encoding LD1RSB_Z_P_BI_S64 - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 11xxxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = UInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - integer last = LastActiveElement(mask, esize); - if last >= 0 then - addr = base + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction RDFFR_P_F__ - __encoding RDFFR_P_F__ - __instruction_set A64 - __field Pd 0 +: 4 - __opcode '00100101 00011001 11110000 0000xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer d = UInt(Pd); - - __execute - CheckSVEEnabled(); - bits(PL) ffr = FFR[]; - P[d] = ffr; - -__instruction LDNT1H_Z_P_BR_Contiguous - __encoding LDNT1H_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 100xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(64) offset; - bits(PL) mask = P[g]; - bits(VL) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = X[m]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_STREAM]; - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_unary_fp16_round - __encoding aarch64_vector_arithmetic_unary_fp16_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 100x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_arithmetic_unary_float_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundInt(element, FPCR, rounding, exact); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean test_passed; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - case comparison of - when CompareOp_GT test_passed = element > 0; - when CompareOp_GE test_passed = element >= 0; - when CompareOp_EQ test_passed = element == 0; - when CompareOp_LE test_passed = element <= 0; - when CompareOp_LT test_passed = element < 0; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction SQINCB_R_RS_SX - __encoding SQINCB_R_RS_SX - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0010xxxx 111100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQINCB_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0011xxxx 111100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 + (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla - __encoding aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla - __instruction_set A64 - __field U 29 +: 1 - __field Rm 16 +: 5 - __field B 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x01110 100xxxxx 1010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveInt8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(128) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(128) addend = V[d]; - - V[d] = MatMulAdd(addend, operand1, operand2, op1_unsigned, op2_unsigned); - -__instruction SDOT_Z_ZZZi_S - __encoding SDOT_Z_ZZZi_S - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 101xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer index = UInt(i2); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __encoding SDOT_Z_ZZZi_D - __instruction_set A64 - __field i1 20 +: 1 - __field Zm 16 +: 4 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 111xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer index = UInt(i1); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer eltspersegment = 128 DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = segmentbase + index; - bits(esize) res = Elem[operand3, e, esize]; - for i = 0 to 3 - integer element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - integer element2 = SInt(Elem[operand2, 4 * s + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = res; - - Z[da] = result; - -__instruction aarch64_vector_transfer_integer_move_signed - __encoding aarch64_vector_transfer_integer_move_signed - __instruction_set A64 - __field Q 30 +: 1 - __field imm5 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 000xxxxx 001011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer size; - case Q:imm5 of - when 'xxxxx1' size = 0; // SMOV [WX]d, Vn.B - when 'xxxx10' size = 1; // SMOV [WX]d, Vn.H - when '1xx100' size = 2; // SMOV Xd, Vn.S - otherwise UNDEFINED; - - integer idxdsize = if imm5[4] == '1' then 128 else 64; - integer index = UInt(imm5[4:size+1]); - integer esize = 8 << size; - integer datasize = if Q == '1' then 64 else 32; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(idxdsize) operand = V[n]; - - X[d] = SignExtend(Elem[operand, index, esize], datasize); - -__instruction aarch64_memory_exclusive_pair - __encoding aarch64_memory_exclusive_pair - __instruction_set A64 - __field sz 30 +: 1 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '1x001000 0x1xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = TRUE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 32 << UInt(sz); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_reduce_fp16_maxnm_sisd - __encoding aarch64_vector_reduce_fp16_maxnm_sisd - __instruction_set A64 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx110000 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - if sz == '1' then UNDEFINED; - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = if o1 == '1' then ReduceOp_FMINNUM else ReduceOp_FMAXNUM; - - __encoding aarch64_vector_reduce_fp_maxnm_sisd - __instruction_set A64 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 xx110000 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = if o1 == '1' then ReduceOp_FMINNUM else ReduceOp_FMAXNUM; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_accum - __encoding aarch64_vector_arithmetic_binary_disparate_mul_accum - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 10x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - bits(2*esize) accum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - if sub_op then - accum = Elem[operand3, e, 2*esize] - product; - else - accum = Elem[operand3, e, 2*esize] + product; - Elem[result, e, 2*esize] = accum; - - V[d] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction UQDECP_R_P_R_UW - __encoding UQDECP_R_P_R_UW - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101011 1000100x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQDECP_R_P_R_X - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101011 1000110x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(ssize) operand1 = X[dn]; - bits(PL) operand2 = P[m]; - bits(ssize) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - integer element = Int(operand1, unsigned); - (result, -) = SatQ(element - count, ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction LD1H_Z_P_BI_U16 - __encoding LD1H_Z_P_BI_U16 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1010xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LD1H_Z_P_BI_U32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1100xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LD1H_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1110xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_vector_shift_left_sat_sisd - __encoding aarch64_vector_shift_left_sat_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 011x01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - - integer shift = UInt(immh:immb) - esize; - - boolean src_unsigned; - boolean dst_unsigned; - case op:U of - when '00' UNDEFINED; - when '01' src_unsigned = FALSE; dst_unsigned = TRUE; - when '10' src_unsigned = FALSE; dst_unsigned = FALSE; - when '11' src_unsigned = TRUE; dst_unsigned = TRUE; - - __encoding aarch64_vector_shift_left_sat_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 011x01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = UInt(immh:immb) - esize; - - boolean src_unsigned; - boolean dst_unsigned; - case op:U of - when '00' UNDEFINED; - when '01' src_unsigned = FALSE; dst_unsigned = TRUE; - when '10' src_unsigned = FALSE; dst_unsigned = FALSE; - when '11' src_unsigned = TRUE; dst_unsigned = TRUE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = Int(Elem[operand, e, esize], src_unsigned) << shift; - (Elem[result, e, esize], sat) = SatQ(element, esize, dst_unsigned); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction ST2H_Z_P_BR_Contiguous - __encoding ST2H_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 101xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction aarch64_integer_pac_pacia_dp_1src - __encoding aarch64_integer_pac_pacia_dp_1src - __instruction_set A64 - __field Z 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 00x000xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if Z == '0' then // PACIA - if n == 31 then source_is_sp = TRUE; - else // PACIZA - if n != 31 then UNDEFINED; - - __encoding aarch64_integer_pac_pacia_hint - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - integer d; - integer n; - boolean source_is_sp = FALSE; - - case CRm:op2 of - when '0011 000' // PACIAZ - d = 30; - n = 31; - when '0011 001' // PACIASP - d = 30; - source_is_sp = TRUE; - if HaveBTIExt() then - // Check for branch target compatibility between PSTATE.BTYPE - // and implicit branch target of PACIASP instruction. - SetBTypeCompatible(BTypeCompatible_PACIXSP()); - - when '0001 000' // PACIA1716 - d = 17; - n = 16; - when '0001 010' SEE "PACIB"; - when '0001 100' SEE "AUTIA"; - when '0001 110' SEE "AUTIB"; - when '0011 01x' SEE "PACIB"; - when '0011 10x' SEE "AUTIA"; - when '0011 11x' SEE "AUTIB"; - when '0000 111' SEE "XPACLRI"; - otherwise SEE "HINT"; - - __execute - if HavePACExt() then - if source_is_sp then - X[d] = AddPACIA(X[d], SP[]); - else - X[d] = AddPACIA(X[d], X[n]); - -__instruction LD3D_Z_P_BI_Contiguous - __encoding LD3D_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1100xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction SADDV_R_P_Z__ - __encoding SADDV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx000000 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - integer sum = 0; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer element = SInt(Elem[operand, e, esize]); - sum = sum + element; - - V[d] = sum[63:0]; - -__instruction aarch64_float_compare_cond - __encoding aarch64_float_compare_cond - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field op 4 +: 1 - __field nzcv 0 +: 4 - __opcode '00011110 xx1xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean signal_all_nans = (op == '1'); - bits(4) condition = cond; - bits(4) flags = nzcv; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) operand1 = V[n]; - bits(datasize) operand2; - - operand2 = V[m]; - - if ConditionHolds(condition) then - flags = FPCompare(operand1, operand2, signal_all_nans, FPCR); - PSTATE.[N,Z,C,V] = flags; - -__instruction LD1RQW_Z_P_BR_Contiguous - __encoding LD1RQW_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 000xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - - __execute - CheckSVEEnabled(); - integer elements = 128 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low 16 bits only - bits(64) offset; - bits(128) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = X[m]; - - addr = base + UInt(offset) * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = Replicate(result, VL DIV 128); - -__instruction FMULX_Z_P_ZZ__ - __encoding FMULX_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx001010 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMulX(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction LD2W_Z_P_BR_Contiguous - __encoding LD2W_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 001xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_arithmetic_binary_uniform_logical_and_orr - __encoding aarch64_vector_arithmetic_binary_uniform_logical_and_orr - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean invert = (size[0] == '1'); - LogicalOp op = if size[1] == '1' then LogicalOp_ORR else LogicalOp_AND; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND - result = operand1 AND operand2; - when LogicalOp_ORR - result = operand1 OR operand2; - - V[d] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_memory_pair_simdfp_post_idx - __encoding aarch64_memory_pair_simdfp_post_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101100 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - - __encoding aarch64_memory_pair_simdfp_pre_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - - __encoding aarch64_memory_pair_simdfp_offset - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101101 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_VEC; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if opc == '11' then UNDEFINED; - integer scale = 2 + UInt(opc); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data1 = V[t]; - data2 = V[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - V[t] = data1; - V[t2] = data2; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction NOT_Z_P_Z__ - __encoding NOT_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx011110 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = NOT element; - - Z[d] = result; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction ORR_Z_ZI__ - __encoding ORR_Z_ZI__ - __instruction_set A64 - __field imm13 5 +: 13 - __field Zdn 0 +: 5 - __opcode '00000101 000000xx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer dn = UInt(Zdn); - bits(64) imm; - (imm, -) = DecodeBitMasks(imm13[12], imm13[5:0], imm13[11:6], TRUE); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 64; - bits(VL) operand = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(64) element1 = Elem[operand, e, 64]; - Elem[result, e, 64] = element1 OR imm; - - Z[dn] = result; - -__instruction aarch64_integer_arithmetic_add_sub_carry - __encoding aarch64_integer_arithmetic_add_sub_carry - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx11010 000xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(4) nzcv; - - if sub_op then - operand2 = NOT(operand2); - - (result, nzcv) = AddWithCarry(operand1, operand2, PSTATE.C); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - X[d] = result; - -__instruction FACGT_P_P_ZZ__ - __encoding FACGT_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx0xxxxx 111xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - - __encoding FACGE_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx0xxxxx 110xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(PL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - case op of - when Cmp_GE res = FPCompareGE(FPAbs(element1), FPAbs(element2), FPCR); - when Cmp_GT res = FPCompareGT(FPAbs(element1), FPAbs(element2), FPCR); - ElemP[result, e, esize] = if res then '1' else '0'; - else - ElemP[result, e, esize] = '0'; - - P[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_fp16_sisd - __instruction_set A64 - __field U 29 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 00xxxxxx 1001x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - boolean mulx_op = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_fp_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 1xxxxxxx 1001x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi = M; - case sz:L of - when '0x' index = UInt(H:L); - when '10' index = UInt(H); - when '11' UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - boolean mulx_op = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 00xxxxxx 1001x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer idxdsize = if H == '1' then 128 else 64; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean mulx_op = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 1xxxxxxx 1001x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi = M; - case sz:L of - when '0x' index = UInt(H:L); - when '10' index = UInt(H); - when '11' UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean mulx_op = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2 = Elem[operand2, index, esize]; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - if mulx_op then - Elem[result, e, esize] = FPMulX(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMul(element1, element2, FPCR); - - V[d] = result; - -__instruction MLS_Z_P_ZZZ__ - __encoding MLS_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '00000100 xx0xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean sub_op = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = UInt(Elem[operand1, e, esize]); - integer element2 = UInt(Elem[operand2, e, esize]); - if ElemP[mask, e, esize] == '1' then - integer product = element1 * element2; - if sub_op then - Elem[result, e, esize] = Elem[operand3, e, esize] - product; - else - Elem[result, e, esize] = Elem[operand3, e, esize] + product; - else - Elem[result, e, esize] = Elem[operand3, e, esize]; - - Z[da] = result; - -__instruction LD1W_Z_P_BZ_S_x32_scaled - __encoding LD1W_Z_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 0x1xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 2; - - __encoding LD1W_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 0x1xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 2; - - __encoding LD1W_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 0x0xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1W_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 0x0xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1W_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 011xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 2; - - __encoding LD1W_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 010xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset = Z[m]; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_bf16_long - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_bf16_long - __instruction_set A64 - __field Q 30 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 11xxxxxx 1111x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Rn); - integer m = UInt('0':Rm); - integer d = UInt(Rd); - integer index = UInt(H:L:M); - - integer elements = 128 DIV 32; - integer sel = UInt(Q); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(128) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(128) operand3 = V[d]; - bits(128) result; - - bits(32) element2 = Elem[operand2, index, 16] : Zeros(16); - - for e = 0 to elements-1 - bits(32) element1 = Elem[operand1, 2 * e + sel, 16] : Zeros(16); - bits(32) addend = Elem[operand3, e, 32]; - Elem[result, e, 32] = FPMulAdd(addend, element1, element2, FPCR); - - V[d] = result; - -__instruction aarch64_integer_arithmetic_add_sub_carry - __encoding aarch64_integer_arithmetic_add_sub_carry - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx11010 000xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(4) nzcv; - - if sub_op then - operand2 = NOT(operand2); - - (result, nzcv) = AddWithCarry(operand1, operand2, PSTATE.C); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - X[d] = result; - -__instruction LD1W_Z_P_AI_S - __encoding LD1W_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 001xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __encoding LD1W_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 001xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction FSCALE_Z_P_ZZ__ - __encoding FSCALE_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx001001 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - integer element2 = SInt(Elem[operand2, e, esize]); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPScale(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction FRECPS_Z_ZZ__ - __encoding FRECPS_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx0xxxxx 000110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPRecipStepFused(element1, element2); - - Z[d] = result; - -__instruction aarch64_integer_tags_mcinsertrandomtag - __encoding aarch64_integer_tags_mcinsertrandomtag - __instruction_set A64 - __field Xm 16 +: 5 - __field Xn 5 +: 5 - __field Xd 0 +: 5 - __opcode '10011010 110xxxxx 000100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Xd); - integer n = UInt(Xn); - integer m = UInt(Xm); - - __execute - bits(64) operand = if n == 31 then SP[] else X[n]; - bits(64) exclude_reg = X[m]; - bits(16) exclude = exclude_reg[15:0] OR GCR_EL1.Exclude; - - if AArch64.AllocationTagAccessIsEnabled() then - if GCR_EL1.RRND == '1' then - RGSR_EL1 = bits(32) UNKNOWN; - rtag = _ChooseRandomNonExcludedTag(exclude); - else - bits(4) start = RGSR_EL1.TAG; - bits(4) offset = AArch64.RandomTag(); - - rtag = AArch64.ChooseNonExcludedTag(start, offset, exclude); - - RGSR_EL1.TAG = rtag; - else - rtag = '0000'; - - bits(64) result = AArch64.AddressWithAllocationTag(operand, rtag); - - if d == 31 then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_long - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 xxxxxxxx 0x10x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - - element2 = Int(Elem[operand2, index, esize], unsigned); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - if sub_op then - Elem[result, e, 2*esize] = Elem[operand3, e, 2*esize] - product; - else - Elem[result, e, 2*esize] = Elem[operand3, e, 2*esize] + product; - - V[d] = result; - -__instruction LD2H_Z_P_BR_Contiguous - __encoding LD2H_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 101xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction LD1B_Z_P_AI_S - __encoding LD1B_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 001xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __encoding LD1B_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 001xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction SQDECB_R_RS_SX - __encoding SQDECB_R_RS_SX - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0010xxxx 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQDECB_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0011xxxx 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 - (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction PRFB_I_P_BZ_S_x32_scaled - __encoding PRFB_I_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000100 0x1xxxxx 000xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 32; - boolean offs_unsigned = (xs == '0'); - integer scale = 0; - - __encoding PRFB_I_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 0x1xxxxx 000xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 32; - boolean offs_unsigned = (xs == '0'); - integer scale = 0; - - __encoding PRFB_I_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 011xxxxx 100xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) addr; - bits(VL) offset; - - if n == 31 then - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - -__instruction LD1SW_Z_P_BR_S64 - __encoding LD1SW_Z_P_BR_S64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 100xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_round - __encoding aarch64_vector_arithmetic_unary_fp16_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 100x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_arithmetic_unary_float_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundInt(element, FPCR, rounding, exact); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_shift_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - if S == '0' && size != '11' then UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer round_const = 0; - integer shift; - integer element; - boolean sat; - - for e = 0 to elements-1 - shift = SInt(Elem[operand2, e, esize][7:0]); - if rounding then - round_const = 1 << (-shift - 1); // 0 for left shift, 2^(n-1) for right shift - element = (Int(Elem[operand1, e, esize], unsigned) + round_const) << shift; - if saturating then - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - else - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_branch_unconditional_register - __encoding aarch64_branch_unconditional_register - __instruction_set A64 - __field Z 24 +: 1 - __field op 21 +: 2 - __field A 11 +: 1 - __field M 10 +: 1 - __field Rn 5 +: 5 - __field Rm 0 +: 5 - __opcode '1101011x 0xx11111 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - BranchType branch_type; - integer m = UInt(Rm); - boolean pac = (A == '1'); - boolean use_key_a = (M == '0'); - boolean source_is_sp = ((Z == '1') && (m == 31)); - - if !pac && m != 0 then - UNDEFINED; - elsif pac && !HavePACExt() then - UNDEFINED; - - case op of - when '00' branch_type = BranchType_INDIR; - when '01' branch_type = BranchType_INDCALL; - when '10' branch_type = BranchType_RET; - otherwise UNDEFINED; - - if pac then - if Z == '0' && m != 31 then - UNDEFINED; - - if branch_type == BranchType_RET then - if n != 31 then UNDEFINED; - n = 30; - source_is_sp = TRUE; - - __execute - bits(64) target = X[n]; - boolean auth_then_branch = TRUE; - - if pac then - bits(64) modifier = if source_is_sp then SP[] else X[m]; - - if use_key_a then - target = AuthIA(target, modifier, auth_then_branch); - else - target = AuthIB(target, modifier, auth_then_branch); - - if branch_type == BranchType_INDCALL then X[30] = PC[] + 4; - - // Value in BTypeNext will be used to set PSTATE.BTYPE - case branch_type of - when BranchType_INDIR // BR, BRAA, BRAB, BRAAZ, BRABZ - if InGuardedPage then - if n == 16 || n == 17 then - BTypeNext = '01'; - else - BTypeNext = '11'; - else - BTypeNext = '01'; - when BranchType_INDCALL // BLR, BLRAA, BLRAB, BLRAAZ, BLRABZ - BTypeNext = '10'; - when BranchType_RET // RET, RETAA, RETAB - BTypeNext = '00'; - - BranchTo(target, branch_type); - -__instruction aarch64_vector_shift_right_sisd - __encoding aarch64_vector_shift_right_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __encoding aarch64_vector_shift_right_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - operand2 = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element = (Int(Elem[operand, e, esize], unsigned) + round_const) >> shift; - Elem[result, e, esize] = Elem[operand2, e, esize] + element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_1985 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 001101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_1985 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - - if minimum then - Elem[result, e, esize] = FPMin(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMax(element1, element2, FPCR); - - V[d] = result; - -__instruction aarch64_integer_tags_mcaddtag - __encoding aarch64_integer_tags_mcaddtag - __instruction_set A64 - __field uimm6 16 +: 6 - __field op3 14 +: 2 - __field uimm4 10 +: 4 - __field Xn 5 +: 5 - __field Xd 0 +: 5 - __opcode '10010001 10xxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Xd); - integer n = UInt(Xn); - bits(4) tag_offset = uimm4; - bits(64) offset = LSL(ZeroExtend(uimm6, 64), LOG2_TAG_GRANULE); - boolean ADD = TRUE; - - __execute - bits(64) operand1 = if n == 31 then SP[] else X[n]; - bits(4) start_tag = AArch64.AllocationTagFromAddress(operand1); - bits(16) exclude = GCR_EL1.Exclude; - bits(64) result; - bits(4) rtag; - - if AArch64.AllocationTagAccessIsEnabled() then - rtag = AArch64.ChooseNonExcludedTag(start_tag, tag_offset, exclude); - else - rtag = '0000'; - - if ADD then - (result, -) = AddWithCarry(operand1, offset, '0'); - else - (result, -) = AddWithCarry(operand1, NOT(offset), '1'); - - result = AArch64.AddressWithAllocationTag(result, rtag); - - if d == 31 then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_integer_arithmetic_pointer_mcsubtracttaggedaddress - __encoding aarch64_integer_arithmetic_pointer_mcsubtracttaggedaddress - __instruction_set A64 - __field Xm 16 +: 5 - __field Xn 5 +: 5 - __field Xd 0 +: 5 - __opcode '10011010 110xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Xd); - integer n = UInt(Xn); - integer m = UInt(Xm); - boolean setflags = FALSE; - - __execute - bits(64) operand1 = if n == 31 then SP[] else X[n]; - bits(64) operand2 = if m == 31 then SP[] else X[m]; - operand1 = SignExtend(operand1[55:0], 64); - operand2 = SignExtend(operand2[55:0], 64); - - bits(64) result; - bits(4) nzcv; - - operand2 = NOT(operand2); - (result, nzcv) = AddWithCarry(operand1, operand2, '1'); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - X[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field a 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (a == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_2008 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - - if minimum then - Elem[result, e, esize] = FPMinNum(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMaxNum(element1, element2, FPCR); - - V[d] = result; - -__instruction PRFD_I_P_BZ_S_x32_scaled - __encoding PRFD_I_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000100 0x1xxxxx 011xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 32; - boolean offs_unsigned = (xs == '0'); - integer scale = 3; - - __encoding PRFD_I_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 0x1xxxxx 011xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 32; - boolean offs_unsigned = (xs == '0'); - integer scale = 3; - - __encoding PRFD_I_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 011xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) addr; - bits(VL) offset; - - if n == 31 then - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction LD1RQD_Z_P_BI_U64 - __encoding LD1RQD_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1000xxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = 128 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low 16 bits only - bits(128) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * 16; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = Replicate(result, VL DIV 128); - -__instruction FSUB_Z_P_ZZ__ - __encoding FSUB_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx000001 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPSub(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction LD1ROB_Z_P_BI_U8 - __encoding LD1ROB_Z_P_BI_U8 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0010xxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVEFP64MatMulExt() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - if VL < 256 then UNDEFINED; - integer elements = 256 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low bits only - bits(256) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * 32; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = ZeroExtend(Replicate(result, VL DIV 256), VL); - -__instruction aarch64_vector_arithmetic_unary_special_recip_fp16_sisd - __encoding aarch64_vector_arithmetic_unary_special_recip_fp16_sisd - __instruction_set A64 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 11111001 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_unary_special_recip_float_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 1x100001 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_unary_special_recip_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 11111001 110110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __encoding aarch64_vector_arithmetic_unary_special_recip_float_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 1x100001 110110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRecipEstimate(element, FPCR); - - V[d] = result; - -__instruction FADD_Z_ZZ__ - __encoding FADD_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx0xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPAdd(element1, element2, FPCR); - - Z[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_single_simdfp_register - __encoding aarch64_memory_single_simdfp_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111100 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_VEC; - MemOp memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - bits(64) address; - bits(datasize) data; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data = V[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - V[t] = data; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_integer_arithmetic_add_sub_shiftedreg - __encoding aarch64_integer_arithmetic_add_sub_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field shift 22 +: 2 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01011 xx0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - - if shift == '11' then UNDEFINED; - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - X[d] = result; - -__instruction aarch64_vector_reduce_fp16_max_simd - __encoding aarch64_vector_reduce_fp16_max_simd - __instruction_set A64 - __field Q 30 +: 1 - __field o1 23 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 x0110000 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = if o1 == '1' then ReduceOp_FMIN else ReduceOp_FMAX; - - __encoding aarch64_vector_reduce_fp_max_simd - __instruction_set A64 - __field Q 30 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx110000 111110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q != '01' then UNDEFINED; - - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = if o1 == '1' then ReduceOp_FMIN else ReduceOp_FMAX; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction aarch64_integer_pac_autda_dp_1src - __encoding aarch64_integer_pac_autda_dp_1src - __instruction_set A64 - __field Z 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 00x110xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if Z == '0' then // AUTDA - if n == 31 then source_is_sp = TRUE; - else // AUTDZA - if n != 31 then UNDEFINED; - - __execute - auth_then_branch = FALSE; - - if HavePACExt() then - if source_is_sp then - X[d] = AuthDA(X[d], SP[], auth_then_branch); - else - X[d] = AuthDA(X[d], X[n], auth_then_branch); - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_wrapping_pair - __encoding aarch64_vector_arithmetic_binary_uniform_add_wrapping_pair - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 101111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - Elem[result, e, esize] = element1 + element2; - - V[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_shift_right_sisd - __encoding aarch64_vector_shift_right_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __encoding aarch64_vector_shift_right_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - operand2 = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element = (Int(Elem[operand, e, esize], unsigned) + round_const) >> shift; - Elem[result, e, esize] = Elem[operand2, e, esize] + element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_integer_arithmetic_add_sub_carry - __encoding aarch64_integer_arithmetic_add_sub_carry - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx11010 000xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(4) nzcv; - - if sub_op then - operand2 = NOT(operand2); - - (result, nzcv) = AddWithCarry(operand1, operand2, PSTATE.C); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - X[d] = result; - -__instruction aarch64_vector_arithmetic_unary_add_pairwise - __encoding aarch64_vector_arithmetic_unary_add_pairwise - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 0x1010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV (2*esize); - boolean acc = (op == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - bits(2*esize) sum; - integer op1; - integer op2; - - if acc then result = V[d]; - for e = 0 to elements-1 - op1 = Int(Elem[operand, 2*e+0, esize], unsigned); - op2 = Int(Elem[operand, 2*e+1, esize], unsigned); - sum = (op1 + op2)[2*esize-1:0]; - if acc then - Elem[result, e, 2*esize] = Elem[result, e, 2*esize] + sum; - else - Elem[result, e, 2*esize] = sum; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_accum - __encoding aarch64_vector_arithmetic_binary_disparate_mul_accum - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 10x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - bits(2*esize) accum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - if sub_op then - accum = Elem[operand3, e, 2*esize] - product; - else - accum = Elem[operand3, e, 2*esize] + product; - Elem[result, e, 2*esize] = accum; - - V[d] = result; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction ST3W_Z_P_BR_Contiguous - __encoding ST3W_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 010xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_narrow - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_narrow - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 01x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean round = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand1 = V[n]; - bits(2*datasize) operand2 = V[m]; - bits(datasize) result; - integer round_const = if round then 1 << (esize - 1) else 0; - bits(2*esize) element1; - bits(2*esize) element2; - bits(2*esize) sum; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, 2*esize]; - element2 = Elem[operand2, e, 2*esize]; - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - sum = sum + round_const; - Elem[result, e, esize] = sum[2*esize-1:esize]; - - Vpart[d, part] = result; - -__instruction aarch64_vector_arithmetic_unary_cnt - __encoding aarch64_vector_arithmetic_unary_cnt - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx100000 010110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '00' then UNDEFINED; - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 8; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - integer count; - for e = 0 to elements-1 - count = BitCount(Elem[operand, e, esize]); - Elem[result, e, esize] = count[esize-1:0]; - V[d] = result; - -__instruction LDFF1W_Z_P_BZ_S_x32_scaled - __encoding LDFF1W_Z_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 0x1xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 2; - - __encoding LDFF1W_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 0x1xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 2; - - __encoding LDFF1W_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 0x0xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1W_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 0x0xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1W_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 011xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 2; - - __encoding LDFF1W_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 010xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction aarch64_float_arithmetic_mul_add_sub - __encoding aarch64_float_arithmetic_mul_add_sub - __instruction_set A64 - __field ftype 22 +: 2 - __field o1 21 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011111 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer a = UInt(Ra); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean opa_neg = (o1 == '1'); - boolean op1_neg = (o0 != o1); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operanda = V[a]; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - if opa_neg then operanda = FPNeg(operanda); - if op1_neg then operand1 = FPNeg(operand1); - result = FPMulAdd(operanda, operand1, operand2, FPCR); - - V[d] = result; - -__instruction UABD_Z_P_ZZ__ - __encoding UABD_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx001101 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer absdiff = Abs(element1 - element2); - Elem[result, e, esize] = absdiff[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction ST1B_Z_P_BR__ - __encoding ST1B_Z_P_BR__ - __instruction_set A64 - __field size 21 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 0xxxxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8 << UInt(size); - integer msize = 8; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - bits(VL) src = Z[t]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - offset = offset + 1; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_long - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 00x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - Elem[result, e, 2*esize] = sum[2*esize-1:0]; - - V[d] = result; - -__instruction aarch64_vector_crypto_sm3_sm3tt1b - __encoding aarch64_vector_crypto_sm3_sm3tt1b - __instruction_set A64 - __field Rm 16 +: 5 - __field imm2 12 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 010xxxxx 10xx01xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer i = UInt(imm2); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Vd = V[d]; - bits(32) WjPrime; - bits(128) result; - bits(32) TT1; - bits(32) SS2; - - WjPrime = Elem[Vm,i,32]; - SS2 = Vn[127:96] EOR ROL(Vd[127:96],12); - TT1 = (Vd[127:96] AND Vd[63:32]) OR (Vd[127:96] AND Vd[95:64]) OR (Vd[63:32] AND Vd[95:64]); - TT1 = (TT1 + Vd[31:0] + SS2 + WjPrime)[31:0]; - result[31:0] = Vd[63:32]; - result[63:32] = ROL(Vd[95:64],9); - result[95:64] = Vd[127:96]; - result[127:96] = TT1; - V[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_float_arithmetic_round_frint_32_64 - __encoding aarch64_float_arithmetic_round_frint_32_64 - __instruction_set A64 - __field ftype 22 +: 2 - __field op 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10100x x10000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFrintExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '1x' UNDEFINED; - - integer intsize = if op[1] == '0' then 32 else 64; - - FPRounding rounding = if op[0] == '0' then FPRounding_ZERO else FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundIntN(operand, FPCR, rounding, intsize); - - V[d] = result; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_vector_arithmetic_binary_disparate_diff - __encoding aarch64_vector_arithmetic_binary_disparate_diff - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 01x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean accumulate = (op == '0'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) absdiff; - - result = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - absdiff = Abs(element1 - element2)[2*esize-1:0]; - Elem[result, e, 2*esize] = Elem[result, e, 2*esize] + absdiff; - V[d] = result; - -__instruction LD2H_Z_P_BI_Contiguous - __encoding LD2H_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1010xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_shift_right_narrow_uniform_sisd - __encoding aarch64_vector_shift_right_narrow_uniform_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 1001x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_shift_right_narrow_uniform_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 1001x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize*2) operand = V[n]; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = (Int(Elem[operand, e, 2*esize], unsigned) + round_const) >> shift; - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction aarch64_integer_flags_setf - __encoding aarch64_integer_flags_setf - __instruction_set A64 - __field sf 31 +: 1 - __field sz 14 +: 1 - __field Rn 5 +: 5 - __opcode 'x0111010 00000000 0x0010xx xxx01101' - __guard TRUE - __decode - if !HaveFlagManipulateExt() || sf != '0' then UNDEFINED; - integer msb = if sz=='1' then 15 else 7; - integer n = UInt(Rn); - - __execute - bits(32) tmpreg = X[n]; - PSTATE.N = tmpreg[msb]; - PSTATE.Z = if (tmpreg[msb:0] == Zeros(msb+1)) then '1' else '0'; - PSTATE.V = tmpreg[msb+1] EOR tmpreg[msb]; - //PSTATE.C unchanged; - -__instruction LD1SB_Z_P_AI_S - __encoding LD1SB_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 001xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __encoding LD1SB_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 001xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = FALSE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_integer_pac_autdb_dp_1src - __encoding aarch64_integer_pac_autdb_dp_1src - __instruction_set A64 - __field Z 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 00x111xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if Z == '0' then // AUTDB - if n == 31 then source_is_sp = TRUE; - else // AUTDZB - if n != 31 then UNDEFINED; - - __execute - auth_then_branch = FALSE; - - if HavePACExt() then - if source_is_sp then - X[d] = AuthDB(X[d], SP[], auth_then_branch); - else - X[d] = AuthDB(X[d], X[n], auth_then_branch); - -__instruction aarch64_vector_shift_right_narrow_nonuniform_sisd - __encoding aarch64_vector_shift_right_narrow_nonuniform_sisd - __instruction_set A64 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111111 0xxxxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then UNDEFINED; - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - - __encoding aarch64_vector_shift_right_narrow_nonuniform_simd - __instruction_set A64 - __field Q 30 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 0xxxxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize*2) operand = V[n]; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - boolean sat; - - for e = 0 to elements-1 - element = (SInt(Elem[operand, e, 2*esize]) + round_const) >> shift; - (Elem[result, e, esize], sat) = UnsignedSatQ(element, esize); - if sat then FPSR.QC = '1'; - - Vpart[d, part] = result; - -__instruction UCVTF_Z_P_Z_H2FP16 - __encoding UCVTF_Z_P_Z_H2FP16 - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01010011 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 16; - boolean unsigned = TRUE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding UCVTF_Z_P_Z_W2FP16 - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01010101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 16; - boolean unsigned = TRUE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding UCVTF_Z_P_Z_W2S - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 10010101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 32; - boolean unsigned = TRUE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding UCVTF_Z_P_Z_W2D - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11010001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 64; - boolean unsigned = TRUE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding UCVTF_Z_P_Z_X2FP16 - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01010111 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 16; - boolean unsigned = TRUE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding UCVTF_Z_P_Z_X2S - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11010101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 32; - boolean unsigned = TRUE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding UCVTF_Z_P_Z_X2D - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11010111 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 64; - boolean unsigned = TRUE; - FPRounding rounding = FPRoundingMode(FPCR); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - bits(d_esize) fpval = FixedToFP(element[s_esize-1:0], 0, unsigned, FPCR, rounding); - Elem[result, e, esize] = ZeroExtend(fpval); - - Z[d] = result; - -__instruction ASR_Z_P_ZZ__ - __encoding ASR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010000 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - integer shift = Min(UInt(element2), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = ASR(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_acc_bf16_long - __encoding aarch64_vector_arithmetic_binary_uniform_mul_acc_bf16_long - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 110xxxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveBF16Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer elements = 128 DIV 32; - integer sel = UInt(Q); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(128) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(128) operand3 = V[d]; - bits(128) result; - - for e = 0 to elements-1 - bits(32) element1 = Elem[operand1, 2 * e + sel, 16] : Zeros(16); - bits(32) element2 = Elem[operand2, 2 * e + sel, 16] : Zeros(16); - bits(32) addend = Elem[operand3, e, 32]; - Elem[result, e, 32] = FPMulAdd(addend, element1, element2, FPCR); - - V[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_unpriv - __encoding aarch64_memory_single_general_immediate_signed_offset_unpriv - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - - unpriv_at_el1 = PSTATE.EL == EL1 && !(EL2Enabled() && HaveNVExt() && HCR_EL2.[NV,NV1] == '11'); - unpriv_at_el2 = PSTATE.EL == EL2 && HaveVirtHostExt() && HCR_EL2.[E2H,TGE] == '11'; - - user_access_override = HaveUAOExt() && PSTATE.UAO == '1'; - if !user_access_override && (unpriv_at_el1 || unpriv_at_el2) then - acctype = AccType_UNPRIV; - else - acctype = AccType_NORMAL; - - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction LSL_Z_P_ZI__ - __encoding LSL_Z_P_ZI__ - __instruction_set A64 - __field tszh 22 +: 2 - __field Pg 10 +: 3 - __field tszl 8 +: 2 - __field imm3 5 +: 3 - __field Zdn 0 +: 5 - __opcode '00000100 xx000011 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - bits(4) tsize = tszh:tszl; - case tsize of - when '0000' UNDEFINED; - when '0001' esize = 8; - when '001x' esize = 16; - when '01xx' esize = 32; - when '1xxx' esize = 64; - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer shift = UInt(tsize:imm3) - esize; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) mask = P[g]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = LSL(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_float_arithmetic_mul_add_sub - __encoding aarch64_float_arithmetic_mul_add_sub - __instruction_set A64 - __field ftype 22 +: 2 - __field o1 21 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011111 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer a = UInt(Ra); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean opa_neg = (o1 == '1'); - boolean op1_neg = (o0 != o1); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operanda = V[a]; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - if opa_neg then operanda = FPNeg(operanda); - if op1_neg then operand1 = FPNeg(operand1); - result = FPMulAdd(operanda, operand1, operand2, FPCR); - - V[d] = result; - -__instruction ORR_P_P_PP_Z - __encoding ORR_P_P_PP_Z - __instruction_set A64 - __field S 22 +: 1 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 1000xxxx 01xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding ORRS_P_P_PP_Z - __instruction_set A64 - __field S 22 +: 1 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 1100xxxx 01xxxx0x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for e = 0 to elements-1 - bit element1 = ElemP[operand1, e, esize]; - bit element2 = ElemP[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = element1 OR element2; - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_pair - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_pair - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1010x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - integer element1; - integer element2; - integer maxmin; - - for e = 0 to elements-1 - element1 = Int(Elem[concat, 2*e, esize], unsigned); - element2 = Int(Elem[concat, (2*e)+1, esize], unsigned); - maxmin = if minimum then Min(element1, element2) else Max(element1, element2); - Elem[result, e, esize] = maxmin[esize-1:0]; - - V[d] = result; - -__instruction aarch64_vector_crypto_sm3_sm3tt2a - __encoding aarch64_vector_crypto_sm3_sm3tt2a - __instruction_set A64 - __field Rm 16 +: 5 - __field imm2 12 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 010xxxxx 10xx10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer i = UInt(imm2); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Vd = V[d]; - bits(32) Wj; - bits(128) result; - bits(32) TT2; - - Wj = Elem[Vm,i,32]; - TT2 = Vd[63:32] EOR (Vd[127:96] EOR Vd[95:64]); - TT2 = (TT2 + Vd[31:0] + Vn[127:96] + Wj)[31:0]; - - result[31:0] = Vd[63:32]; - result[63:32] = ROL(Vd[95:64],19); - result[95:64] = Vd[127:96]; - result[127:96] = TT2 EOR ROL(TT2,9) EOR ROL(TT2,17); - V[d] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction CLASTA_R_P_Z__ - __encoding CLASTA_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000101 xx110000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Rdn); - integer m = UInt(Zm); - integer csize = if esize < 64 then 32 else 64; - boolean isBefore = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(esize) operand1 = X[dn]; - bits(VL) operand2 = Z[m]; - bits(csize) result; - integer last = LastActiveElement(mask, esize); - - if last < 0 then - result = ZeroExtend(operand1); - else - if !isBefore then - last = last + 1; - if last >= elements then last = 0; - result = ZeroExtend(Elem[operand2, last, esize]); - - X[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_element_dotp - __encoding aarch64_vector_arithmetic_binary_element_dotp - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 xxxxxxxx 1110x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveDOTPExt() then UNDEFINED; - if size != '10' then UNDEFINED; - boolean signed = (U=='0'); - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(M:Rm); - integer index = UInt(H:L); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(datasize) result = V[d]; - for e = 0 to elements-1 - integer res = 0; - integer element1, element2; - for i = 0 to 3 - if signed then - element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = SInt(Elem[operand2, 4 * index + i, esize DIV 4]); - else - element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = UInt(Elem[operand2, 4 * index + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = Elem[result, e, esize] + res; - V[d] = result; - -__instruction aarch64_integer_tags_mcsettagpairandzerodatapost - __encoding aarch64_integer_tags_mcsettagpairandzerodatapost - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 111xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = TRUE; - boolean zero_data = TRUE; - - __encoding aarch64_integer_tags_mcsettagpairandzerodatapre - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 111xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = FALSE; - boolean zero_data = TRUE; - - __encoding aarch64_integer_tags_mcsettagpairandzerodata - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 111xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = FALSE; - boolean postindex = FALSE; - boolean zero_data = TRUE; - - __execute - bits(64) address; - bits(64) data = if t == 31 then SP[] else X[t]; - bits(4) tag = AArch64.AllocationTagFromAddress(data); - - SetTagCheckedInstruction(FALSE); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if !postindex then - address = address + offset; - - if zero_data then - Mem[address, TAG_GRANULE, AccType_NORMAL] = Zeros(8*TAG_GRANULE); - Mem[address+TAG_GRANULE, TAG_GRANULE, AccType_NORMAL] = Zeros(8*TAG_GRANULE); - - AArch64.MemTag[address, AccType_NORMAL] = tag; - AArch64.MemTag[address+TAG_GRANULE, AccType_NORMAL] = tag; - - if writeback then - if postindex then - address = address + offset; - - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction ASRR_Z_P_ZZ__ - __encoding ASRR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010100 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - integer shift = Min(UInt(element1), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = ASR(element2, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_round - __encoding aarch64_vector_arithmetic_unary_fp16_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 100x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_arithmetic_unary_float_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundInt(element, FPCR, rounding, exact); - - V[d] = result; - -__instruction aarch64_memory_single_simdfp_immediate_signed_offset_normal - __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111100 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_VEC; - MemOp memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - bits(64) address; - bits(datasize) data; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data = V[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - V[t] = data; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor - __encoding aarch64_vector_arithmetic_binary_uniform_logical_bsl_eor - __instruction_set A64 - __field Q 30 +: 1 - __field opc2 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - VBitOp op; - - case opc2 of - when '00' op = VBitOp_VEOR; - when '01' op = VBitOp_VBSL; - when '10' op = VBitOp_VBIT; - when '11' op = VBitOp_VBIF; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1; - bits(datasize) operand2; - bits(datasize) operand3; - bits(datasize) operand4 = V[n]; - - case op of - when VBitOp_VEOR - operand1 = V[m]; - operand2 = Zeros(); - operand3 = Ones(); - when VBitOp_VBSL - operand1 = V[m]; - operand2 = operand1; - operand3 = V[d]; - when VBitOp_VBIT - operand1 = V[d]; - operand2 = operand1; - operand3 = V[m]; - when VBitOp_VBIF - operand1 = V[d]; - operand2 = operand1; - operand3 = NOT(V[m]); - - V[d] = operand1 EOR ((operand2 EOR operand4) AND operand3); - -__instruction aarch64_vector_crypto_aes_mix - __encoding aarch64_vector_crypto_aes_mix - __instruction_set A64 - __field D 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01001110 00101000 011x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - if !HaveAESExt() then UNDEFINED; - boolean decrypt = (D == '1'); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) operand = V[n]; - bits(128) result; - if decrypt then - result = AESInvMixColumns(operand); - else - result = AESMixColumns(operand); - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_rev - __encoding aarch64_vector_arithmetic_unary_rev - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 000x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - // size=esize: B(0), H(1), S(1), D(S) - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - - // op=REVx: 64(0), 32(1), 16(2) - bits(2) op = o0:U; - - // => op+size: - // 64+B = 0, 64+H = 1, 64+S = 2, 64+D = X - // 32+B = 1, 32+H = 2, 32+S = X, 32+D = X - // 16+B = 2, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - // => 3-(op+size) (index bits in group) - // 64/B = 3, 64+H = 2, 64+S = 1, 64+D = X - // 32+B = 2, 32+H = 1, 32+S = X, 32+D = X - // 16+B = 1, 16+H = X, 16+S = X, 16+D = X - // 8+B = X, 8+H = X, 8+S = X, 8+D = X - - // index bits within group: 1, 2, 3 - if UInt(op)+UInt(size) >= 3 then UNDEFINED; - - integer container_size; - case op of - when '10' container_size = 16; - when '01' container_size = 32; - when '00' container_size = 64; - - integer containers = datasize DIV container_size; - integer elements_per_container = container_size DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element = 0; - integer rev_element; - for c = 0 to containers-1 - rev_element = element + elements_per_container - 1; - for e = 0 to elements_per_container-1 - Elem[result, rev_element, esize] = Elem[operand, element, esize]; - element = element + 1; - rev_element = rev_element - 1; - - V[d] = result; - -__instruction aarch64_system_barriers_dsb - __encoding aarch64_system_barriers_dsb - __instruction_set A64 - __field CRm 8 +: 4 - __field opc 5 +: 2 - __opcode '11010101 00000011 0011xxxx 1xx11111' - __guard TRUE - __decode - case CRm[3:2] of - when '00' domain = MBReqDomain_OuterShareable; - when '01' domain = MBReqDomain_Nonshareable; - when '10' domain = MBReqDomain_InnerShareable; - when '11' domain = MBReqDomain_FullSystem; - case CRm[1:0] of - when '00' types = MBReqTypes_All; domain = MBReqDomain_FullSystem; - when '01' types = MBReqTypes_Reads; - when '10' types = MBReqTypes_Writes; - when '11' types = MBReqTypes_All; - - __execute - DataSynchronizationBarrier(domain, types); - -__instruction aarch64_integer_logical_immediate - __encoding aarch64_integer_logical_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10010 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - bits(datasize) imm; - if sf == '0' && N != '0' then UNDEFINED; - (imm, -) = DecodeBitMasks(N, imms, immr, TRUE); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = imm; - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_vector_transfer_vector_permute_unzip - __encoding aarch64_vector_transfer_vector_permute_unzip - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx0xxxxx 0x0110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer part = UInt(op); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operandl = V[n]; - bits(datasize) operandh = V[m]; - bits(datasize) result; - - bits(datasize*2) zipped = operandh:operandl; - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[zipped, 2*e+part, esize]; - - V[d] = result; - -__instruction aarch64_integer_arithmetic_rev - __encoding aarch64_integer_arithmetic_rev - __instruction_set A64 - __field sf 31 +: 1 - __field opc 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x1011010 11000000 0000xxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize = if sf == '1' then 64 else 32; - - integer container_size; - case opc of - when '00' - Unreachable(); - when '01' - container_size = 16; - when '10' - container_size = 32; - when '11' - if sf == '0' then UNDEFINED; - container_size = 64; - - __execute - bits(datasize) operand = X[n]; - bits(datasize) result; - - integer containers = datasize DIV container_size; - integer elements_per_container = container_size DIV 8; - integer index = 0; - integer rev_index; - for c = 0 to containers-1 - rev_index = index + ((elements_per_container - 1) * 8); - for e = 0 to elements_per_container-1 - result[rev_index + 7:rev_index] = operand[index + 7:index]; - index = index + 8; - rev_index = rev_index - 8; - - X[d] = result; - -__instruction ST1H_Z_P_BR__ - __encoding ST1H_Z_P_BR__ - __instruction_set A64 - __field size 21 +: 2 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 1xxxxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8 << UInt(size); - integer msize = 16; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - bits(VL) src = Z[t]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - offset = offset + 1; - -__instruction FCVTZU_Z_P_Z_FP162H - __encoding FCVTZU_Z_P_Z_FP162H - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01011011 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 16; - boolean unsigned = TRUE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZU_Z_P_Z_FP162W - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01011101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 32; - boolean unsigned = TRUE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZU_Z_P_Z_FP162X - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01011111 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 64; - boolean unsigned = TRUE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZU_Z_P_Z_S2W - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 10011101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 32; - boolean unsigned = TRUE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZU_Z_P_Z_S2X - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11011101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 64; - boolean unsigned = TRUE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZU_Z_P_Z_D2W - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11011001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 32; - boolean unsigned = TRUE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZU_Z_P_Z_D2X - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11011111 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 64; - boolean unsigned = TRUE; - FPRounding rounding = FPRounding_ZERO; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - bits(d_esize) res = FPToFixed(element[s_esize-1:0], 0, unsigned, FPCR, rounding); - Elem[result, e, esize] = Extend(res, unsigned); - - Z[d] = result; - -__instruction SQDECW_Z_ZS__ - __encoding SQDECW_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1010xxxx 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction RDFFR_P_P_F__ - __encoding RDFFR_P_P_F__ - __instruction_set A64 - __field Pg 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 00011000 1111000x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer g = UInt(Pg); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding RDFFRS_P_P_F__ - __instruction_set A64 - __field Pg 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 01011000 1111000x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer g = UInt(Pg); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - bits(PL) mask = P[g]; - bits(PL) ffr = FFR[]; - bits(PL) result = ffr AND mask; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, 8); - P[d] = result; - -__instruction UQINCP_Z_P_Z__ - __encoding UQINCP_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Zdn 0 +: 5 - __opcode '00100101 xx101001 1000000x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Zdn); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) operand2 = P[m]; - bits(VL) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - for e = 0 to elements-1 - integer element = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element + count, esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction NEG_Z_P_Z__ - __encoding NEG_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx010111 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - integer element = SInt(Elem[operand, e, esize]); - if ElemP[mask, e, esize] == '1' then - element = -element; - Elem[result, e, esize] = element[esize-1:0]; - - Z[d] = result; - -__instruction LSL_Z_P_ZW__ - __encoding LSL_Z_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx011011 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(64) element2 = Elem[operand2, (e * esize) DIV 64, 64]; - integer shift = Min(UInt(element2), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = LSL(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_narrow - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_narrow - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 01x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean round = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand1 = V[n]; - bits(2*datasize) operand2 = V[m]; - bits(datasize) result; - integer round_const = if round then 1 << (esize - 1) else 0; - bits(2*esize) element1; - bits(2*esize) element2; - bits(2*esize) sum; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, 2*esize]; - element2 = Elem[operand2, e, 2*esize]; - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - sum = sum + round_const; - Elem[result, e, esize] = sum[2*esize-1:esize]; - - Vpart[d, part] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction LDR_P_BI__ - __encoding LDR_P_BI__ - __instruction_set A64 - __field imm9h 16 +: 6 - __field imm9l 10 +: 3 - __field Rn 5 +: 5 - __field Pt 0 +: 4 - __opcode '10000101 10xxxxxx 000xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Pt); - integer n = UInt(Rn); - integer imm = SInt(imm9h:imm9l); - - __execute - CheckSVEEnabled(); - integer elements = PL DIV 8; - bits(64) base; - integer offset = imm * elements; - bits(PL) result; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - boolean aligned = AArch64.CheckAlignment(base + offset, 2, AccType_NORMAL, FALSE); - for e = 0 to elements-1 - Elem[result, e, 8] = AArch64.MemSingle[base + offset, 1, AccType_NORMAL, aligned]; - offset = offset + 1; - - P[t] = result; - -__instruction UMIN_Z_P_ZZ__ - __encoding UMIN_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx001011 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer minimum = Min(element1, element2); - Elem[result, e, esize] = minimum[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction NAND_P_P_PP_Z - __encoding NAND_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 1000xxxx 01xxxx1x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding NANDS_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 1100xxxx 01xxxx1x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for e = 0 to elements-1 - bit element1 = ElemP[operand1, e, esize]; - bit element2 = ElemP[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = NOT(element1 AND element2); - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction aarch64_integer_pac_autia_dp_1src - __encoding aarch64_integer_pac_autia_dp_1src - __instruction_set A64 - __field Z 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 00x100xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if Z == '0' then // AUTIA - if n == 31 then source_is_sp = TRUE; - else // AUTIZA - if n != 31 then UNDEFINED; - - __encoding aarch64_integer_pac_autia_hint - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - integer d; - integer n; - boolean source_is_sp = FALSE; - - case CRm:op2 of - when '0011 100' // AUTIAZ - d = 30; - n = 31; - when '0011 101' // AUTIASP - d = 30; - source_is_sp = TRUE; - when '0001 100' // AUTIA1716 - d = 17; - n = 16; - when '0001 000' SEE "PACIA"; - when '0001 010' SEE "PACIB"; - when '0001 110' SEE "AUTIB"; - when '0011 00x' SEE "PACIA"; - when '0011 01x' SEE "PACIB"; - when '0011 11x' SEE "AUTIB"; - when '0000 111' SEE "XPACLRI"; - otherwise SEE "HINT"; - - __execute - auth_then_branch = FALSE; - - if HavePACExt() then - if source_is_sp then - X[d] = AuthIA(X[d], SP[], auth_then_branch); - else - X[d] = AuthIA(X[d], X[n], auth_then_branch); - -__instruction LDFF1SH_Z_P_BZ_S_x32_scaled - __encoding LDFF1SH_Z_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 1x1xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding LDFF1SH_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 1x1xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding LDFF1SH_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 1x0xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1SH_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 1x0xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1SH_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 111xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 1; - - __encoding LDFF1SH_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 110xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction LD1RQB_Z_P_BR_Contiguous - __encoding LD1RQB_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 000xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - - __execute - CheckSVEEnabled(); - integer elements = 128 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low 16 bits only - bits(64) offset; - bits(128) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = X[m]; - - addr = base + UInt(offset) * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = Replicate(result, VL DIV 128); - -__instruction PTRUE_P_S__ - __encoding PTRUE_P_S__ - __instruction_set A64 - __field size 22 +: 2 - __field pattern 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx011000 111000xx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer d = UInt(Pd); - boolean setflags = FALSE; - bits(5) pat = pattern; - - __encoding PTRUES_P_S__ - __instruction_set A64 - __field size 22 +: 2 - __field pattern 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx011001 111000xx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer d = UInt(Pd); - boolean setflags = TRUE; - bits(5) pat = pattern; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(PL) result; - - for e = 0 to elements-1 - ElemP[result, e, esize] = if e < count then '1' else '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(result, result, esize); - P[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction ST4H_Z_P_BR_Contiguous - __encoding ST4H_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 111xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction ST1B_Z_P_BZ_D_x32_unscaled - __encoding ST1B_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 000xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding ST1B_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field xs 14 +: 1 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 010xxxxx 1x0xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - integer offs_size = 32; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding ST1B_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 000xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 64; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(VL) offset = Z[m]; - bits(VL) src = Z[t]; - bits(PL) mask = P[g]; - bits(64) addr; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - -__instruction aarch64_vector_reduce_add_long - __encoding aarch64_vector_reduce_add_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx110000 001110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '100' then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - integer sum; - - sum = Int(Elem[operand, 0, esize], unsigned); - for e = 1 to elements-1 - sum = sum + Int(Elem[operand, e, esize], unsigned); - - V[d] = sum[2*esize-1:0]; - -__instruction aarch64_vector_arithmetic_unary_float_xtn_sisd - __encoding aarch64_vector_arithmetic_unary_float_xtn_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 0x100001 011010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz == '0' then UNDEFINED; - integer esize = 32; - integer datasize = esize; - integer elements = 1; - integer part = 0; - - __encoding aarch64_vector_arithmetic_unary_float_xtn_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 0x100001 011010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz == '0' then UNDEFINED; - integer esize = 32; - integer datasize = 64; - integer elements = 2; - integer part = UInt(Q); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand = V[n]; - bits(datasize) result; - - for e = 0 to elements-1 - Elem[result, e, esize] = FPConvert(Elem[operand, e, 2*esize], FPCR, FPRounding_ODD); - - Vpart[d, part] = result; - -__instruction UQINCW_Z_ZS__ - __encoding UQINCW_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1010xxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction aarch64_integer_logical_immediate - __encoding aarch64_integer_logical_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field N 22 +: 1 - __field immr 16 +: 6 - __field imms 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10010 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - bits(datasize) imm; - if sf == '0' && N != '0' then UNDEFINED; - (imm, -) = DecodeBitMasks(N, imms, immr, TRUE); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = imm; - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_lower - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_lower - __instruction_set A64 - __field Q 30 +: 1 - __field S 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 111011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz == '1' then UNDEFINED; - integer esize = 32; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (S == '1'); - integer part = 0; - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_mul_norounding_upper - __instruction_set A64 - __field Q 30 +: 1 - __field S 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx1xxxxx 110011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz == '1' then UNDEFINED; - integer esize = 32; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean sub_op = (S == '1'); - integer part = 1; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize DIV 2) operand1 = Vpart[n,part]; - bits(datasize DIV 2) operand2 = Vpart[m,part]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize DIV 2) element1; - bits(esize DIV 2) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize DIV 2]; - element2 = Elem[operand2, e, esize DIV 2]; - if sub_op then element1 = FPNeg(element1); - Elem[result,e,esize] = FPMulAddH(Elem[operand3, e, esize], element1, element2, FPCR); - V[d] = result; - -__instruction SMINV_R_P_Z__ - __encoding SMINV_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '00000100 xx001010 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - integer minimum = if unsigned then (2^esize - 1) else (2^(esize-1) - 1); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer element = Int(Elem[operand, e, esize], unsigned); - minimum = Min(minimum, element); - - V[d] = minimum[esize-1:0]; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_integer_pac_autib_dp_1src - __encoding aarch64_integer_pac_autib_dp_1src - __instruction_set A64 - __field Z 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 00x101xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if Z == '0' then // AUTIB - if n == 31 then source_is_sp = TRUE; - else // AUTIZB - if n != 31 then UNDEFINED; - - __encoding aarch64_integer_pac_autib_hint - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - integer d; - integer n; - boolean source_is_sp = FALSE; - - case CRm:op2 of - when '0011 110' // AUTIBZ - d = 30; - n = 31; - when '0011 111' // AUTIBSP - d = 30; - source_is_sp = TRUE; - when '0001 110' // AUTIB1716 - d = 17; - n = 16; - when '0001 000' SEE "PACIA"; - when '0001 010' SEE "PACIB"; - when '0001 100' SEE "AUTIA"; - when '0011 00x' SEE "PACIA"; - when '0011 01x' SEE "PACIB"; - when '0011 10x' SEE "AUTIA"; - when '0000 111' SEE "XPACLRI"; - otherwise SEE "HINT"; - - __execute - auth_then_branch = FALSE; - - if HavePACExt() then - if source_is_sp then - X[d] = AuthIB(X[d], SP[], auth_then_branch); - else - X[d] = AuthIB(X[d], X[n], auth_then_branch); - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_lower - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_lower - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field S 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 1xxxxxxx 0x00x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt('0':Rm); // Vm can only be in bottom 16 registers. - if sz == '1' then UNDEFINED; - integer index = UInt(H:L:M); - - integer esize = 32; - integer datasize = if Q=='1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (S == '1'); - integer part = 0; - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_mul_norounding_i_upper - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field S 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 1xxxxxxx 1x00x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16MulNoRoundingToFP32Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt('0':Rm); // Vm can only be in bottom 16 registers. - if sz == '1' then UNDEFINED; - integer index = UInt(H:L:M); - - integer esize = 32; - integer datasize = if Q=='1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (S == '1'); - integer part = 1; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize DIV 2) operand1 = Vpart[n,part]; - bits(128) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize DIV 2) element1; - bits(esize DIV 2) element2 = Elem[operand2, index, esize DIV 2]; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize DIV 2]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAddH(Elem[operand3, e, esize], element1, element2, FPCR); - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_high_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_high_sisd - __instruction_set A64 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field op 12 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 xxxxxxxx 110xx0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - boolean round = (op == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_high_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field op 12 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 xxxxxxxx 110xx0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean round = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) result; - integer round_const = if round then 1 << (esize - 1) else 0; - integer element1; - integer element2; - integer product; - boolean sat; - - element2 = SInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - product = (2 * element1 * element2) + round_const; - // The following only saturates if element1 and element2 equal -(2^(esize-1)) - (Elem[result, e, esize], sat) = SignedSatQ(product >> esize, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_shift - __encoding aarch64_vector_arithmetic_unary_shift - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx100001 001110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = esize; - boolean unsigned = FALSE; // Or TRUE without change of functionality - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = Vpart[n, part]; - bits(2*datasize) result; - integer element; - - for e = 0 to elements-1 - element = Int(Elem[operand, e, esize], unsigned) << shift; - Elem[result, e, 2*esize] = element[2*esize-1:0]; - - V[d] = result; - -__instruction LASTB_R_P_Z__ - __encoding LASTB_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00000101 xx100001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer rsize = if esize < 64 then 32 else 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Rd); - boolean isBefore = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(rsize) result; - integer last = LastActiveElement(mask, esize); - - if isBefore then - if last < 0 then last = elements - 1; - else - last = last + 1; - if last >= elements then last = 0; - result = ZeroExtend(Elem[operand, last, esize]); - - X[d] = result; - -__instruction aarch64_integer_arithmetic_add_sub_shiftedreg - __encoding aarch64_integer_arithmetic_add_sub_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field shift 22 +: 2 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01011 xx0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - - if shift == '11' then UNDEFINED; - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - X[d] = result; - -__instruction aarch64_integer_tags_mcsettagandzerodatapost - __encoding aarch64_integer_tags_mcsettagandzerodatapost - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 011xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = TRUE; - boolean zero_data = TRUE; - - __encoding aarch64_integer_tags_mcsettagandzerodatapre - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 011xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = FALSE; - boolean zero_data = TRUE; - - __encoding aarch64_integer_tags_mcsettagandzerodata - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 011xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = FALSE; - boolean postindex = FALSE; - boolean zero_data = TRUE; - - __execute - bits(64) address; - - SetTagCheckedInstruction(FALSE); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if !postindex then - address = address + offset; - - if zero_data then - Mem[address, TAG_GRANULE, AccType_NORMAL] = Zeros(TAG_GRANULE * 8); - - bits(64) data = if t == 31 then SP[] else X[t]; - bits(4) tag = AArch64.AllocationTagFromAddress(data); - AArch64.MemTag[address, AccType_NORMAL] = tag; - - if writeback then - if postindex then - address = address + offset; - - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 101101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' || size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean rounding = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 101101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' || size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean rounding = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer round_const = if rounding then 1 << (esize - 1) else 0; - integer element1; - integer element2; - integer product; - boolean sat; - - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element2 = SInt(Elem[operand2, e, esize]); - product = (2 * element1 * element2) + round_const; - (Elem[result, e, esize], sat) = SignedSatQ(product >> esize, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction LDFF1SH_Z_P_BR_S32 - __encoding LDFF1SH_Z_P_BR_S32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 001xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - boolean unsigned = FALSE; - - __encoding LDFF1SH_Z_P_BR_S64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 000xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = base + UInt(offset) * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_CNOTFIRST]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - offset = offset + 1; - - Z[t] = result; - -__instruction FSUBR_Z_P_ZS__ - __encoding FSUBR_Z_P_ZS__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field i1 5 +: 1 - __field Zdn 0 +: 5 - __opcode '01100101 xx011011 100xxx00 00xxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - bits(esize) imm = if i1 == '0' then FPPointFive('0') else FPOne('0'); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPSub(imm, element1, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction LDNT1H_Z_P_BI_Contiguous - __encoding LDNT1H_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1000xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_STREAM]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction UQINCP_R_P_R_UW - __encoding UQINCP_R_P_R_UW - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101001 1000100x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQINCP_R_P_R_X - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101001 1000110x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(ssize) operand1 = X[dn]; - bits(PL) operand2 = P[m]; - bits(ssize) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - integer element = Int(operand1, unsigned); - (result, -) = SatQ(element + count, ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_vector_arithmetic_binary_element_mul_acc_double_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_double_sisd - __instruction_set A64 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 xxxxxxxx 0x11x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - integer part = 0; - - boolean sub_op = (o2 == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_acc_double_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field o2 14 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 xxxxxxxx 0x11x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o2 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - integer accum; - boolean sat1; - boolean sat2; - - element2 = SInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - (product, sat1) = SignedSatQ(2 * element1 * element2, 2*esize); - if sub_op then - accum = SInt(Elem[operand3, e, 2*esize]) - SInt(product); - else - accum = SInt(Elem[operand3, e, 2*esize]) + SInt(product); - (Elem[result, e, 2*esize], sat2) = SignedSatQ(accum, 2*esize); - if sat1 || sat2 then FPSR.QC = '1'; - - V[d] = result; - -__instruction DUP_Z_R__ - __encoding DUP_Z_R__ - __instruction_set A64 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx100000 001110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Rn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) operand; - if n == 31 then - operand = SP[]; - else - operand = X[n]; - bits(VL) result; - - for e = 0 to elements-1 - Elem[result, e, esize] = operand[esize-1:0]; - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_unary_add_saturating_sisd - __encoding aarch64_vector_arithmetic_unary_add_saturating_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 001110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_add_saturating_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 001110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - - bits(datasize) operand2 = V[d]; - integer op1; - integer op2; - boolean sat; - - for e = 0 to elements-1 - op1 = Int(Elem[operand, e, esize], !unsigned); - op2 = Int(Elem[operand2, e, esize], unsigned); - (Elem[result, e, esize], sat) = SatQ(op1 + op2, esize, unsigned); - if sat then FPSR.QC = '1'; - V[d] = result; - -__instruction aarch64_memory_atomicops_swp - __encoding aarch64_memory_atomicops_swp - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - bits(datasize) store_value; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - store_value = X[s]; - data = MemAtomic(address, MemAtomicOp_SWP, store_value, ldacctype, stacctype); - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_integer_conditional_select - __encoding aarch64_integer_conditional_select - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field o2 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xx011010 100xxxxx xxxx0xxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - bits(4) condition = cond; - boolean else_inv = (op == '1'); - boolean else_inc = (o2 == '1'); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - - if ConditionHolds(condition) then - result = operand1; - else - result = operand2; - if else_inv then result = NOT(result); - if else_inc then result = result + 1; - - X[d] = result; - -__instruction ST1B_Z_P_BI__ - __encoding ST1B_Z_P_BI__ - __instruction_set A64 - __field size 21 +: 2 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 0xx0xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8 << UInt(size); - integer msize = 8; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) src = Z[t]; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[src, e, esize][msize-1:0]; - addr = addr + mbytes; - -__instruction LDNF1W_Z_P_BI_U32 - __encoding LDNF1W_Z_P_BI_U32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0101xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __encoding LDNF1W_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0111xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_integer_flags_axflag - __encoding aarch64_integer_flags_axflag - __instruction_set A64 - __field CRm 8 +: 4 - __opcode '11010101 00000000 0100xxxx 01011111' - __guard TRUE - __decode - if !HaveFlagFormatExt() then UNDEFINED; - - __execute - bit N = '0'; - bit Z = PSTATE.Z OR PSTATE.V; - bit C = PSTATE.C AND NOT(PSTATE.V); - bit V = '0'; - - PSTATE.N = N; - PSTATE.Z = Z; - PSTATE.C = C; - PSTATE.V = V; - -__instruction FNEG_Z_P_Z__ - __encoding FNEG_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx011101 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPNeg(element); - - Z[d] = result; - -__instruction FCMEQ_P_P_ZZ__ - __encoding FCMEQ_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx0xxxxx 011xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_EQ; - - __encoding FCMGT_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx0xxxxx 010xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - - __encoding FCMGE_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx0xxxxx 010xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - - __encoding FCMNE_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx0xxxxx 011xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_NE; - - __encoding FCMUO_P_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx0xxxxx 110xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Pd); - SVECmp op = Cmp_UN; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(PL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - case op of - when Cmp_EQ res = FPCompareEQ(element1, element2, FPCR); - when Cmp_GE res = FPCompareGE(element1, element2, FPCR); - when Cmp_GT res = FPCompareGT(element1, element2, FPCR); - when Cmp_UN res = FPCompareUN(element1, element2, FPCR); - when Cmp_NE res = FPCompareNE(element1, element2, FPCR); - when Cmp_LT res = FPCompareGT(element2, element1, FPCR); - when Cmp_LE res = FPCompareGE(element2, element1, FPCR); - ElemP[result, e, esize] = if res then '1' else '0'; - else - ElemP[result, e, esize] = '0'; - - P[d] = result; - -__instruction CLASTB_R_P_Z__ - __encoding CLASTB_R_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000101 xx110001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Rdn); - integer m = UInt(Zm); - integer csize = if esize < 64 then 32 else 64; - boolean isBefore = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(esize) operand1 = X[dn]; - bits(VL) operand2 = Z[m]; - bits(csize) result; - integer last = LastActiveElement(mask, esize); - - if last < 0 then - result = ZeroExtend(operand1); - else - if !isBefore then - last = last + 1; - if last >= elements then last = 0; - result = ZeroExtend(Elem[operand2, last, esize]); - - X[dn] = result; - -__instruction aarch64_integer_conditional_select - __encoding aarch64_integer_conditional_select - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field o2 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xx011010 100xxxxx xxxx0xxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - bits(4) condition = cond; - boolean else_inv = (op == '1'); - boolean else_inc = (o2 == '1'); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - - if ConditionHolds(condition) then - result = operand1; - else - result = operand2; - if else_inv then result = NOT(result); - if else_inc then result = result + 1; - - X[d] = result; - -__instruction SQDECP_Z_P_Z__ - __encoding SQDECP_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Zdn 0 +: 5 - __opcode '00100101 xx101010 1000000x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Zdn); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) operand2 = P[m]; - bits(VL) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - for e = 0 to elements-1 - integer element = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element - count, esize, unsigned); - - Z[dn] = result; - -__instruction UQSUB_Z_ZZ__ - __encoding UQSUB_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - element2, esize, unsigned); - - Z[d] = result; - -__instruction STNT1W_Z_P_BR_Contiguous - __encoding STNT1W_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 000xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(64) offset = X[m]; - bits(VL) src; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - src = Z[t]; - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_STREAM] = Elem[src, e, esize]; - offset = offset + 1; - -__instruction aarch64_integer_arithmetic_cnt - __encoding aarch64_integer_arithmetic_cnt - __instruction_set A64 - __field sf 31 +: 1 - __field op 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x1011010 11000000 00010xxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - CountOp opcode = if op == '0' then CountOp_CLZ else CountOp_CLS; - - __execute - integer result; - bits(datasize) operand1 = X[n]; - - if opcode == CountOp_CLZ then - result = CountLeadingZeroBits(operand1); - else - result = CountLeadingSignBits(operand1); - - X[d] = result[datasize-1:0]; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_float_arithmetic_round_frint_32_64 - __encoding aarch64_float_arithmetic_round_frint_32_64 - __instruction_set A64 - __field ftype 22 +: 2 - __field op 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10100x x10000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFrintExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '1x' UNDEFINED; - - integer intsize = if op[1] == '0' then 32 else 64; - - FPRounding rounding = if op[0] == '0' then FPRounding_ZERO else FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundIntN(operand, FPCR, rounding, intsize); - - V[d] = result; - -__instruction SQINCW_Z_ZS__ - __encoding SQINCW_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1010xxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 + (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_float_compare_uncond - __encoding aarch64_float_compare_uncond - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field opc 3 +: 2 - __opcode '00011110 xx1xxxxx 001000xx xxxxx000' - __guard TRUE - __decode - integer n = UInt(Rn); - integer m = UInt(Rm); // ignored when opc[0] == '1' - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean signal_all_nans = (opc[1] == '1'); - boolean cmp_with_zero = (opc[0] == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) operand1 = V[n]; - bits(datasize) operand2; - - operand2 = if cmp_with_zero then FPZero('0') else V[m]; - - PSTATE.[N,Z,C,V] = FPCompare(operand1, operand2, signal_all_nans, FPCR); - -__instruction FMAXNM_Z_P_ZZ__ - __encoding FMAXNM_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx000100 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMaxNum(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if abs then - element1 = FPAbs(element1); - element2 = FPAbs(element2); - case cmp of - when CompareOp_EQ test_passed = FPCompareEQ(element1, element2, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element1, element2, FPCR); - when CompareOp_GT test_passed = FPCompareGT(element1, element2, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_system_exceptions_debug_breakpoint - __encoding aarch64_system_exceptions_debug_breakpoint - __instruction_set A64 - __field imm16 5 +: 16 - __opcode '11010100 001xxxxx xxxxxxxx xxx00000' - __guard TRUE - __decode - bits(16) comment = imm16; - if HaveBTIExt() then - SetBTypeCompatible(TRUE); - - __execute - AArch64.SoftwareBreakpoint(comment); - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_sisd - __instruction_set A64 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 01111001 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPRounding_TIEAWAY; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_tieaway_sisd - __instruction_set A64 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 0x100001 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPRounding_TIEAWAY; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_tieaway_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 01111001 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPRounding_TIEAWAY; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_tieaway_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x100001 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPRounding_TIEAWAY; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction USDOT_Z_ZZZ_S - __encoding USDOT_Z_ZZZ_S - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01000100 100xxxxx 011110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveInt8MatMulExt() then UNDEFINED; - integer esize = 32; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) res = Elem[operand3, e, esize]; - for i = 0 to 3 - integer element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - integer element2 = SInt(Elem[operand2, 4 * e + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = res; - - Z[da] = result; - -__instruction aarch64_vector_shift_right_insert_sisd - __encoding aarch64_vector_shift_right_insert_sisd - __instruction_set A64 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111111 0xxxxxxx 010001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - - __encoding aarch64_vector_shift_right_insert_simd - __instruction_set A64 - __field Q 30 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101111 0xxxxxxx 010001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2 = V[d]; - bits(datasize) result; - bits(esize) mask = LSR(Ones(esize), shift); - bits(esize) shifted; - - for e = 0 to elements-1 - shifted = LSR(Elem[operand, e, esize], shift); - Elem[result, e, esize] = (Elem[operand2, e, esize] AND NOT(mask)) OR shifted; - V[d] = result; - -__instruction aarch64_integer_conditional_select - __encoding aarch64_integer_conditional_select - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field o2 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xx011010 100xxxxx xxxx0xxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - bits(4) condition = cond; - boolean else_inv = (op == '1'); - boolean else_inc = (o2 == '1'); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - - if ConditionHolds(condition) then - result = operand1; - else - result = operand2; - if else_inv then result = NOT(result); - if else_inc then result = result + 1; - - X[d] = result; - -__instruction aarch64_system_barriers_pssbb - __encoding aarch64_system_barriers_pssbb - __instruction_set A64 - __field CRm 8 +: 4 - __field opc 5 +: 2 - __opcode '11010101 00000011 0011xxxx 1xx11111' - __guard TRUE - __decode - // No additional decoding required - - __execute - SpeculativeStoreBypassBarrierToPA(); - -__instruction aarch64_vector_arithmetic_unary_cmp_int_lessthan_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_int_lessthan_sisd - __instruction_set A64 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx100000 101010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison = CompareOp_LT; - - __encoding aarch64_vector_arithmetic_unary_cmp_int_lessthan_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx100000 101010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison = CompareOp_LT; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean test_passed; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - case comparison of - when CompareOp_GT test_passed = element > 0; - when CompareOp_GE test_passed = element >= 0; - when CompareOp_EQ test_passed = element == 0; - when CompareOp_LE test_passed = element <= 0; - when CompareOp_LT test_passed = element < 0; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction ST2D_Z_P_BI_Contiguous - __encoding ST2D_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 1011xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction LD3W_Z_P_BR_Contiguous - __encoding LD3W_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 010xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction BFMLALB_Z_ZZZi__ - __encoding BFMLALB_Z_ZZZi__ - __instruction_set A64 - __field i3h 19 +: 2 - __field Zm 16 +: 3 - __field i3l 11 +: 1 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 111xxxxx 0100x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - integer index = UInt(i3h:i3l); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 32; - integer eltspersegment = 128 DIV 32; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = 2 * segmentbase + index; - bits(32) element1 = Elem[operand1, 2 * e + 0, 16] : Zeros(16); - bits(32) element2 = Elem[operand2, s, 16] : Zeros(16); - bits(32) element3 = Elem[operand3, e, 32]; - Elem[result, e, 32] = FPMulAdd(element3, element1, element2, FPCR); - - Z[da] = result; - -__instruction ST4D_Z_P_BR_Contiguous - __encoding ST4D_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 111xxxxx 011xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - offset = offset + nreg; - -__instruction UDIV_Z_P_ZZ__ - __encoding UDIV_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010101 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '0x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer quotient; - if element2 == 0 then - quotient = 0; - else - quotient = RoundTowardsZero(Real(element1) / Real(element2)); - Elem[result, e, esize] = quotient[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction SMAX_Z_P_ZZ__ - __encoding SMAX_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx001000 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer maximum = Max(element1, element2); - Elem[result, e, esize] = maximum[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction MSB_Z_P_ZZZ__ - __encoding MSB_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Za 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx0xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - integer a = UInt(Za); - boolean sub_op = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[a]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = UInt(Elem[operand1, e, esize]); - integer element2 = UInt(Elem[operand2, e, esize]); - if ElemP[mask, e, esize] == '1' then - integer product = element1 * element2; - if sub_op then - Elem[result, e, esize] = Elem[operand3, e, esize] - product; - else - Elem[result, e, esize] = Elem[operand3, e, esize] + product; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_long - __encoding aarch64_vector_arithmetic_binary_element_mul_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 xxxxxxxx 1010x0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(idxdsize) operand2 = V[m]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - - element2 = Int(Elem[operand2, index, esize], unsigned); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - Elem[result, e, 2*esize] = product; - - V[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction ASR_Z_P_ZI__ - __encoding ASR_Z_P_ZI__ - __instruction_set A64 - __field tszh 22 +: 2 - __field Pg 10 +: 3 - __field tszl 8 +: 2 - __field imm3 5 +: 3 - __field Zdn 0 +: 5 - __opcode '00000100 xx000000 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - bits(4) tsize = tszh:tszl; - case tsize of - when '0000' UNDEFINED; - when '0001' esize = 8; - when '001x' esize = 16; - when '01xx' esize = 32; - when '1xxx' esize = 64; - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer shift = (2 * esize) - UInt(tsize:imm3); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) mask = P[g]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = ASR(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction LD1B_Z_P_BR_U8 - __encoding LD1B_Z_P_BR_U8 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 000xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - integer msize = 8; - boolean unsigned = TRUE; - - __encoding LD1B_Z_P_BR_U16 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 001xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - integer msize = 8; - boolean unsigned = TRUE; - - __encoding LD1B_Z_P_BR_U32 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 010xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - boolean unsigned = TRUE; - - __encoding LD1B_Z_P_BR_U64 - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 011xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - bits(64) offset = X[m]; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - offset = offset + 1; - - Z[t] = result; - -__instruction aarch64_vector_fp16_movi - __encoding aarch64_vector_fp16_movi - __instruction_set A64 - __field Q 30 +: 1 - __field a 18 +: 1 - __field b 17 +: 1 - __field c 16 +: 1 - __field d 9 +: 1 - __field e 8 +: 1 - __field f 7 +: 1 - __field g 6 +: 1 - __field h 5 +: 1 - __field Rd 0 +: 5 - __opcode '0x001111 00000xxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer rd = UInt(Rd); - - integer datasize = if Q == '1' then 128 else 64; - bits(datasize) imm; - - imm8 = a:b:c:d:e:f:g:h; - imm16 = imm8[7]:NOT(imm8[6]):Replicate(imm8[6],2):imm8[5:0]:Zeros(6); - - imm = Replicate(imm16, datasize DIV 16); - - __encoding aarch64_vector_logical - __instruction_set A64 - __field Q 30 +: 1 - __field op 29 +: 1 - __field a 18 +: 1 - __field b 17 +: 1 - __field c 16 +: 1 - __field cmode 12 +: 4 - __field d 9 +: 1 - __field e 8 +: 1 - __field f 7 +: 1 - __field g 6 +: 1 - __field h 5 +: 1 - __field Rd 0 +: 5 - __opcode '0xx01111 00000xxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer rd = UInt(Rd); - - integer datasize = if Q == '1' then 128 else 64; - bits(datasize) imm; - bits(64) imm64; - - ImmediateOp operation; - case cmode:op of - when '0xx00' operation = ImmediateOp_MOVI; - when '0xx01' operation = ImmediateOp_MVNI; - when '0xx10' operation = ImmediateOp_ORR; - when '0xx11' operation = ImmediateOp_BIC; - when '10x00' operation = ImmediateOp_MOVI; - when '10x01' operation = ImmediateOp_MVNI; - when '10x10' operation = ImmediateOp_ORR; - when '10x11' operation = ImmediateOp_BIC; - when '110x0' operation = ImmediateOp_MOVI; - when '110x1' operation = ImmediateOp_MVNI; - when '1110x' operation = ImmediateOp_MOVI; - when '11110' operation = ImmediateOp_MOVI; - when '11111' - // FMOV Dn,#imm is in main FP instruction set - if Q == '0' then UNDEFINED; - operation = ImmediateOp_MOVI; - - imm64 = AdvSIMDExpandImm(op, cmode, a:b:c:d:e:f:g:h); - imm = Replicate(imm64, datasize DIV 64); - - __execute - CheckFPAdvSIMDEnabled64(); - - V[rd] = imm; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_sisd - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 xx0xxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' || size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean rounding = TRUE; - boolean sub_op = (S == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_doubling_accum_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx0xxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveQRDMLAHExt() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' || size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean rounding = TRUE; - boolean sub_op = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - integer rounding_const = if rounding then 1 << (esize - 1) else 0; - integer element1; - integer element2; - integer element3; - integer product; - boolean sat; - - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - element2 = SInt(Elem[operand2, e, esize]); - element3 = SInt(Elem[operand3, e, esize]); - if sub_op then - accum = ((element3 << esize) - 2 * (element1 * element2) + rounding_const); - else - accum = ((element3 << esize) + 2 * (element1 * element2) + rounding_const); - (Elem[result, e, esize], sat) = SignedSatQ(accum >> esize, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_vector_crypto_sha3_bcax - __encoding aarch64_vector_crypto_sha3_bcax - __instruction_set A64 - __field Rm 16 +: 5 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 001xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSHA3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer a = UInt(Ra); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Va = V[a]; - V[d] = Vn EOR (Vm AND NOT(Va)); - -__instruction aarch64_integer_arithmetic_add_sub_extendedreg - __encoding aarch64_integer_arithmetic_add_sub_extendedreg - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field imm3 10 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01011 001xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - ExtendType extend_type = DecodeRegExtend(option); - integer shift = UInt(imm3); - if shift > 4 then UNDEFINED; - - __execute - bits(datasize) result; - bits(datasize) operand1 = if n == 31 then SP[] else X[n]; - bits(datasize) operand2 = ExtendReg(m, extend_type, shift); - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_memory_pair_simdfp_post_idx - __encoding aarch64_memory_pair_simdfp_post_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101100 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - - __encoding aarch64_memory_pair_simdfp_pre_idx - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - - __encoding aarch64_memory_pair_simdfp_offset - __instruction_set A64 - __field opc 30 +: 2 - __field L 22 +: 1 - __field imm7 15 +: 7 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx101101 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); - AccType acctype = AccType_VEC; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - if opc == '11' then UNDEFINED; - integer scale = 2 + UInt(opc); - integer datasize = 8 << scale; - bits(64) offset = LSL(SignExtend(imm7, 64), scale); - boolean tag_checked = wback || n != 31; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(datasize) data1; - bits(datasize) data2; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data1 = V[t]; - data2 = V[t2]; - Mem[address + 0 , dbytes, acctype] = data1; - Mem[address + dbytes, dbytes, acctype] = data2; - - when MemOp_LOAD - data1 = Mem[address + 0 , dbytes, acctype]; - data2 = Mem[address + dbytes, dbytes, acctype]; - if rt_unknown then - data1 = bits(datasize) UNKNOWN; - data2 = bits(datasize) UNKNOWN; - V[t] = data1; - V[t2] = data2; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp16_2008 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field a 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (a == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_max_min_fp_2008 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - boolean minimum = (o1 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - - if minimum then - Elem[result, e, esize] = FPMinNum(element1, element2, FPCR); - else - Elem[result, e, esize] = FPMaxNum(element1, element2, FPCR); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_fp16_fused - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_fused - __instruction_set A64 - __field Q 30 +: 1 - __field a 23 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 x10xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (a == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_fused - __instruction_set A64 - __field Q 30 +: 1 - __field op 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 110011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if sub_op then element1 = FPNeg(element1); - Elem[result, e, esize] = FPMulAdd(Elem[operand3, e, esize], element1, element2, FPCR); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_shift_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - if S == '0' && size != '11' then UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer round_const = 0; - integer shift; - integer element; - boolean sat; - - for e = 0 to elements-1 - shift = SInt(Elem[operand2, e, esize][7:0]); - if rounding then - round_const = 1 << (-shift - 1); // 0 for left shift, 2^(n-1) for right shift - element = (Int(Elem[operand1, e, esize], unsigned) + round_const) << shift; - if saturating then - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - else - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction AND_Z_P_ZZ__ - __encoding AND_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx011010 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element1 AND element2; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_system_exceptions_runtime_hvc - __encoding aarch64_system_exceptions_runtime_hvc - __instruction_set A64 - __field imm16 5 +: 16 - __opcode '11010100 000xxxxx xxxxxxxx xxx00010' - __guard TRUE - __decode - bits(16) imm = imm16; - - __execute - if !HaveEL(EL2) || PSTATE.EL == EL0 || (PSTATE.EL == EL1 && (!IsSecureEL2Enabled() && IsSecure())) then - UNDEFINED; - - hvc_enable = if HaveEL(EL3) then SCR_EL3.HCE else NOT(HCR_EL2.HCD); - - if hvc_enable == '0' then - UNDEFINED; - else - AArch64.CallHypervisor(imm); - -__instruction aarch64_vector_shift_right_narrow_logical - __encoding aarch64_vector_shift_right_narrow_logical - __instruction_set A64 - __field Q 30 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field op 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 0xxxxxxx 1000x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3] == '1' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - integer shift = (2 * esize) - UInt(immh:immb); - boolean round = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize*2) operand = V[n]; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - for e = 0 to elements-1 - element = (UInt(Elem[operand, e, 2*esize]) + round_const) >> shift; - Elem[result, e, esize] = element[esize-1:0]; - - Vpart[d, part] = result; - -__instruction aarch64_integer_logical_shiftedreg - __encoding aarch64_integer_logical_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - boolean invert = (N == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - X[d] = result; - -__instruction ST3W_Z_P_BI_Contiguous - __encoding ST3W_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100101 0101xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - integer nreg = 3; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..2] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction SUB_Z_ZZ__ - __encoding SUB_Z_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 000001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = element1 - element2; - - Z[d] = result; - -__instruction aarch64_system_barriers_isb - __encoding aarch64_system_barriers_isb - __instruction_set A64 - __field CRm 8 +: 4 - __field opc 5 +: 2 - __opcode '11010101 00000011 0011xxxx 1xx11111' - __guard TRUE - __decode - // No additional decoding required - - __execute - InstructionSynchronizationBarrier(); - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_long - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 00x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - Elem[result, e, 2*esize] = sum[2*esize-1:0]; - - V[d] = result; - -__instruction REV_Z_Z__ - __encoding REV_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx111000 001110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - bits(VL) operand = Z[n]; - bits(VL) result = Reverse(operand, esize); - Z[d] = result; - -__instruction FMIN_Z_P_ZZ__ - __encoding FMIN_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx000111 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMin(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction LD1B_Z_P_BZ_D_x32_unscaled - __encoding LD1B_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 0x0xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1B_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 0x0xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1B_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 010xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset = Z[m]; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_system_register_system - __encoding aarch64_system_register_system - __instruction_set A64 - __field L 21 +: 1 - __field o0 19 +: 1 - __field op1 16 +: 3 - __field CRn 12 +: 4 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __field Rt 0 +: 5 - __opcode '11010101 00x1xxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - AArch64.CheckSystemAccess('1':o0, op1, CRn, CRm, op2, Rt, L); - - integer t = UInt(Rt); - - integer sys_op0 = 2 + UInt(o0); - integer sys_op1 = UInt(op1); - integer sys_op2 = UInt(op2); - integer sys_crn = UInt(CRn); - integer sys_crm = UInt(CRm); - boolean read = (L == '1'); - - __execute - if read then - X[t] = AArch64.SysRegRead(sys_op0, sys_op1, sys_crn, sys_crm, sys_op2); - else - AArch64.SysRegWrite(sys_op0, sys_op1, sys_crn, sys_crm, sys_op2, X[t]); - -__instruction FMUL_Z_ZZi_H - __encoding FMUL_Z_ZZi_H - __instruction_set A64 - __field i3h 22 +: 1 - __field i3l 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100100 0x1xxxxx 001000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer index = UInt(i3h:i3l); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __encoding FMUL_Z_ZZi_S - __instruction_set A64 - __field i2 19 +: 2 - __field Zm 16 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100100 101xxxxx 001000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer index = UInt(i2); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __encoding FMUL_Z_ZZi_D - __instruction_set A64 - __field i1 20 +: 1 - __field Zm 16 +: 4 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100100 111xxxxx 001000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer index = UInt(i1); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer eltspersegment = 128 DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer segmentbase = e - (e MOD eltspersegment); - integer s = segmentbase + index; - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, s, esize]; - Elem[result, e, esize] = FPMul(element1, element2, FPCR); - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_mul_accum - __encoding aarch64_vector_arithmetic_binary_disparate_mul_accum - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 10x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) operand3 = V[d]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) product; - bits(2*esize) accum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - product = (element1 * element2)[2*esize-1:0]; - if sub_op then - accum = Elem[operand3, e, 2*esize] - product; - else - accum = Elem[operand3, e, 2*esize] + product; - Elem[result, e, 2*esize] = accum; - - V[d] = result; - -__instruction DECP_Z_P_Z__ - __encoding DECP_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Zdn 0 +: 5 - __opcode '00100101 xx101101 1000000x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Zdn); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) operand2 = P[m]; - bits(VL) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[operand1, e, esize] - count; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_element_dotp - __encoding aarch64_vector_arithmetic_binary_element_dotp - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 xxxxxxxx 1110x0xx xxxxxxxx' - __guard TRUE - __decode - if !HaveDOTPExt() then UNDEFINED; - if size != '10' then UNDEFINED; - boolean signed = (U=='0'); - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(M:Rm); - integer index = UInt(H:L); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(datasize) result = V[d]; - for e = 0 to elements-1 - integer res = 0; - integer element1, element2; - for i = 0 to 3 - if signed then - element1 = SInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = SInt(Elem[operand2, 4 * index + i, esize DIV 4]); - else - element1 = UInt(Elem[operand1, 4 * e + i, esize DIV 4]); - element2 = UInt(Elem[operand2, 4 * index + i, esize DIV 4]); - res = res + element1 * element2; - Elem[result, e, esize] = Elem[result, e, esize] + res; - V[d] = result; - -__instruction aarch64_system_sysops - __encoding aarch64_system_sysops - __instruction_set A64 - __field L 21 +: 1 - __field op1 16 +: 3 - __field CRn 12 +: 4 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __field Rt 0 +: 5 - __opcode '11010101 00x01xxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - AArch64.CheckSystemAccess('01', op1, CRn, CRm, op2, Rt, L); - - integer t = UInt(Rt); - - integer sys_op0 = 1; - integer sys_op1 = UInt(op1); - integer sys_op2 = UInt(op2); - integer sys_crn = UInt(CRn); - integer sys_crm = UInt(CRm); - boolean has_result = (L == '1'); - - __execute - if has_result then - // No architecturally defined instructions here. - X[t] = AArch64.SysInstrWithResult(sys_op0, sys_op1, sys_crn, sys_crm, sys_op2); - else - AArch64.SysInstr(sys_op0, sys_op1, sys_crn, sys_crm, sys_op2, X[t]); - -__instruction LD1SW_Z_P_BI_S64 - __encoding LD1SW_Z_P_BI_S64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 1000xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = FALSE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction FMUL_Z_P_ZZ__ - __encoding FMUL_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx000010 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMul(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction LD1RQH_Z_P_BR_Contiguous - __encoding LD1RQH_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 100xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 16; - - __execute - CheckSVEEnabled(); - integer elements = 128 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low 16 bits only - bits(64) offset; - bits(128) result; - constant integer mbytes = esize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = X[m]; - - addr = base + UInt(offset) * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = Replicate(result, VL DIV 128); - -__instruction LD1RQB_Z_P_BI_U8 - __encoding LD1RQB_Z_P_BI_U8 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0000xxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = 128 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low 16 bits only - bits(128) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * 16; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = Replicate(result, VL DIV 128); - -__instruction aarch64_vector_arithmetic_binary_uniform_logical_and_orr - __encoding aarch64_vector_arithmetic_binary_uniform_logical_and_orr - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx1xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean invert = (size[0] == '1'); - LogicalOp op = if size[1] == '1' then LogicalOp_ORR else LogicalOp_AND; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND - result = operand1 AND operand2; - when LogicalOp_ORR - result = operand1 OR operand2; - - V[d] = result; - -__instruction BFDOT_Z_ZZZ__ - __encoding BFDOT_Z_ZZZ__ - __instruction_set A64 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100100 011xxxxx 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 32; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(16) elt1_a = Elem[operand1, 2 * e + 0, 16]; - bits(16) elt1_b = Elem[operand1, 2 * e + 1, 16]; - bits(16) elt2_a = Elem[operand2, 2 * e + 0, 16]; - bits(16) elt2_b = Elem[operand2, 2 * e + 1, 16]; - - bits(32) sum = BFAdd(BFMul(elt1_a, elt2_a), BFMul(elt1_b, elt2_b)); - Elem[result, e, 32] = BFAdd(Elem[operand3, e, 32], sum); - - Z[da] = result; - -__instruction aarch64_integer_tags_mcinserttagmask - __encoding aarch64_integer_tags_mcinserttagmask - __instruction_set A64 - __field Xm 16 +: 5 - __field Xn 5 +: 5 - __field Xd 0 +: 5 - __opcode '10011010 110xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Xd); - integer n = UInt(Xn); - integer m = UInt(Xm); - - __execute - bits(64) address = if n == 31 then SP[] else X[n]; - bits(64) mask = X[m]; - bits(4) tag = AArch64.AllocationTagFromAddress(address); - - mask[UInt(tag)] = '1'; - X[d] = mask; - -__instruction LD1SB_Z_P_BZ_D_x32_unscaled - __encoding LD1SB_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 0x0xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1SB_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 0x0xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 8; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1SB_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 010xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 8; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset = Z[m]; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_diff - __encoding aarch64_vector_arithmetic_binary_disparate_diff - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 01x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean accumulate = (op == '0'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - bits(2*esize) absdiff; - - result = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - absdiff = Abs(element1 - element2)[2*esize-1:0]; - Elem[result, e, 2*esize] = Elem[result, e, 2*esize] + absdiff; - V[d] = result; - -__instruction CLZ_Z_P_Z__ - __encoding CLZ_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx011001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = CountLeadingZeroBits(element)[esize-1:0]; - - Z[d] = result; - -__instruction BIC_P_P_PP_Z - __encoding BIC_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0000xxxx 01xxxx0x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding BICS_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0100xxxx 01xxxx0x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for e = 0 to elements-1 - bit element1 = ElemP[operand1, e, esize]; - bit element2 = ElemP[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = element1 AND (NOT element2); - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction LD1RQW_Z_P_BI_U32 - __encoding LD1RQW_Z_P_BI_U32 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 0000xxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 32; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = 128 DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; // low 16 bits only - bits(128) result; - constant integer mbytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * 16; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = Replicate(result, VL DIV 128); - -__instruction ST2H_Z_P_BI_Contiguous - __encoding ST2H_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 1011xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 16; - integer offset = SInt(imm4); - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction aarch64_vector_arithmetic_binary_uniform_sub_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp16_sisd - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 110xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - boolean abs = TRUE; - - __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 1x1xxxxx 110101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - boolean abs = TRUE; - - __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 110xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean abs = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_sub_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 1x1xxxxx 110101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean abs = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - bits(esize) diff; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - diff = FPSub(element1, element2, FPCR); - Elem[result, e, esize] = if abs then FPAbs(diff) else diff; - - V[d] = result; - -__instruction aarch64_memory_ordered_rcpc - __encoding aarch64_memory_ordered_rcpc - __instruction_set A64 - __field size 30 +: 2 - __field Rs 16 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 101xxxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = AccType_ORDERED; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction UQDECD_Z_ZS__ - __encoding UQDECD_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1110xxxx 110011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_unary_special_sqrt_fp16 - __encoding aarch64_vector_arithmetic_unary_special_sqrt_fp16 - __instruction_set A64 - __field Q 30 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 11111001 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __encoding aarch64_vector_arithmetic_unary_special_sqrt - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 1x100001 111110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPSqrt(element, FPCR); - - V[d] = result; - -__instruction aarch64_float_arithmetic_unary - __encoding aarch64_float_arithmetic_unary - __instruction_set A64 - __field ftype 22 +: 2 - __field opc 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10000x x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - FPUnaryOp fpop; - case opc of - when '00' fpop = FPUnaryOp_MOV; - when '01' fpop = FPUnaryOp_ABS; - when '10' fpop = FPUnaryOp_NEG; - when '11' fpop = FPUnaryOp_SQRT; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - case fpop of - when FPUnaryOp_MOV result = operand; - when FPUnaryOp_ABS result = FPAbs(operand); - when FPUnaryOp_NEG result = FPNeg(operand); - when FPUnaryOp_SQRT result = FPSqrt(operand, FPCR); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_rbit - __encoding aarch64_vector_arithmetic_unary_rbit - __instruction_set A64 - __field Q 30 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 01100000 010110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 8; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - bits(esize) rev; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - for i = 0 to esize-1 - rev[esize-1-i] = element[i]; - Elem[result, e, esize] = rev; - - V[d] = result; - -__instruction FADDV_V_P_Z__ - __encoding FADDV_V_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Vd 0 +: 5 - __opcode '01100101 xx000000 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Vd); - - __execute - CheckSVEEnabled(); - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(esize) identity = FPZero('0'); - - V[d] = ReducePredicated(ReduceOp_FADD, operand, mask, identity); - -__instruction SUBR_Z_P_ZZ__ - __encoding SUBR_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx000011 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = element2 - element1; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_float_arithmetic_div - __encoding aarch64_float_arithmetic_div - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx 000110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - result = FPDiv(operand1, operand2, FPCR); - - V[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if abs then - element1 = FPAbs(element1); - element2 = FPAbs(element2); - case cmp of - when CompareOp_EQ test_passed = FPCompareEQ(element1, element2, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element1, element2, FPCR); - when CompareOp_GT test_passed = FPCompareGT(element1, element2, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_float_convert_fix - __encoding aarch64_float_convert_fix - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field scale 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - - case ftype of - when '00' fltsize = 32; - when '01' fltsize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - if sf == '0' && scale[5] == '0' then UNDEFINED; - integer fracbits = 64 - UInt(scale); - - case opcode[2:1]:rmode of - when '00 11' // FCVTZ - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, fracbits, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, fracbits, unsigned, FPCR, rounding); - V[d] = fltval; - -__instruction aarch64_memory_atomicops_swp - __encoding aarch64_memory_atomicops_swp - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - bits(datasize) store_value; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - store_value = X[s]; - data = MemAtomic(address, MemAtomicOp_SWP, store_value, ldacctype, stacctype); - X[t] = ZeroExtend(data, regsize); - -__instruction SQINCP_R_P_R_SX - __encoding SQINCP_R_P_R_SX - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101000 1000100x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQINCP_R_P_R_X - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101000 1000110x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(ssize) operand1 = X[dn]; - bits(PL) operand2 = P[m]; - bits(ssize) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - integer element = Int(operand1, unsigned); - (result, -) = SatQ(element + count, ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction FRINTI_Z_P_Z__ - __encoding FRINTI_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx000111 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean exact = FALSE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding FRINTX_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx000110 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean exact = TRUE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding FRINTA_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx000100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean exact = FALSE; - FPRounding rounding = FPRounding_TIEAWAY; - - __encoding FRINTN_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx000000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean exact = FALSE; - FPRounding rounding = FPRounding_TIEEVEN; - - __encoding FRINTZ_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx000011 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean exact = FALSE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FRINTM_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx000010 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean exact = FALSE; - FPRounding rounding = FPRounding_NEGINF; - - __encoding FRINTP_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 xx000001 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - boolean exact = FALSE; - FPRounding rounding = FPRounding_POSINF; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPRoundInt(element, FPCR, rounding, exact); - - Z[d] = result; - -__instruction LDFF1W_Z_P_AI_S - __encoding LDFF1W_Z_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000101 001xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __encoding LDFF1W_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 001xxxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_memory_single_simdfp_register - __encoding aarch64_memory_single_simdfp_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111100 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_VEC; - MemOp memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - bits(64) address; - bits(datasize) data; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data = V[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - V[t] = data; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_integer_tags_mcsettagpairpost - __encoding aarch64_integer_tags_mcsettagpairpost - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 101xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = TRUE; - boolean zero_data = FALSE; - - __encoding aarch64_integer_tags_mcsettagpairpre - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 101xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = TRUE; - boolean postindex = FALSE; - boolean zero_data = FALSE; - - __encoding aarch64_integer_tags_mcsettagpair - __instruction_set A64 - __field imm9 12 +: 9 - __field Xn 5 +: 5 - __field Xt 0 +: 5 - __opcode '11011001 101xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Xn); - integer t = UInt(Xt); - bits(64) offset = LSL(SignExtend(imm9, 64), LOG2_TAG_GRANULE); - boolean writeback = FALSE; - boolean postindex = FALSE; - boolean zero_data = FALSE; - - __execute - bits(64) address; - bits(64) data = if t == 31 then SP[] else X[t]; - bits(4) tag = AArch64.AllocationTagFromAddress(data); - - SetTagCheckedInstruction(FALSE); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if !postindex then - address = address + offset; - - if zero_data then - Mem[address, TAG_GRANULE, AccType_NORMAL] = Zeros(8*TAG_GRANULE); - Mem[address+TAG_GRANULE, TAG_GRANULE, AccType_NORMAL] = Zeros(8*TAG_GRANULE); - - AArch64.MemTag[address, AccType_NORMAL] = tag; - AArch64.MemTag[address+TAG_GRANULE, AccType_NORMAL] = tag; - - if writeback then - if postindex then - address = address + offset; - - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction LD2D_Z_P_BI_Contiguous - __encoding LD2D_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1010xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer offset = SInt(imm4); - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_saturating_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_add_saturating_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_add_saturating_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 000011xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer sum; - boolean sat; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - sum = element1 + element2; - (Elem[result, e, esize], sat) = SatQ(sum, esize, unsigned); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction aarch64_system_register_cpsr - __encoding aarch64_system_register_cpsr - __instruction_set A64 - __field op1 16 +: 3 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000xxx 0100xxxx xxx11111' - __guard TRUE - __decode - if op1 == '000' && op2 == '000' then SEE "CFINV"; - if op1 == '000' && op2 == '001' then SEE "XAFLAG"; - if op1 == '000' && op2 == '010' then SEE "AXFLAG"; - - AArch64.CheckSystemAccess('00', op1, '0100', CRm, op2, '11111', '0'); - bits(2) min_EL; - boolean need_secure; - (min_EL, need_secure) = AArch64.GetMinELSecurityState(op1); - if UInt(PSTATE.EL) < UInt(min_EL) || (need_secure && !IsSecure()) then - UNDEFINED; - - bits(4) operand = CRm; - PSTATEField field; - case op1:op2 of - when '000 011' - if !HaveUAOExt() then - UNDEFINED; - field = PSTATEField_UAO; - when '000 100' - if !HavePANExt() then - UNDEFINED; - field = PSTATEField_PAN; - when '000 101' field = PSTATEField_SP; - when '011 010' - if !HaveDITExt() then - UNDEFINED; - field = PSTATEField_DIT; - when '011 100' - if !HaveMTEExt() then - UNDEFINED; - field = PSTATEField_TCO; - when '011 110' field = PSTATEField_DAIFSet; - when '011 111' field = PSTATEField_DAIFClr; - when '011 001' - if !HaveSSBSExt() then - UNDEFINED; - field = PSTATEField_SSBS; - otherwise UNDEFINED; - - // Check that an AArch64 MSR/MRS access to the DAIF flags is permitted - if PSTATE.EL == EL0 && field IN {PSTATEField_DAIFSet, PSTATEField_DAIFClr} then - if !ELUsingAArch32(EL1) && ((EL2Enabled() && HCR_EL2.[E2H,TGE] == '11') || SCTLR_EL1.UMA == '0') then - if EL2Enabled() && !ELUsingAArch32(EL2) && HCR_EL2.TGE == '1' then - AArch64.SystemAccessTrap(EL2, 0x18); - else - AArch64.SystemAccessTrap(EL1, 0x18); - - __execute - case field of - when PSTATEField_SSBS - PSTATE.SSBS = operand[0]; - when PSTATEField_SP - PSTATE.SP = operand[0]; - when PSTATEField_DAIFSet - PSTATE.D = PSTATE.D OR operand[3]; - PSTATE.A = PSTATE.A OR operand[2]; - PSTATE.I = PSTATE.I OR operand[1]; - PSTATE.F = PSTATE.F OR operand[0]; - when PSTATEField_DAIFClr - PSTATE.D = PSTATE.D AND NOT(operand[3]); - PSTATE.A = PSTATE.A AND NOT(operand[2]); - PSTATE.I = PSTATE.I AND NOT(operand[1]); - PSTATE.F = PSTATE.F AND NOT(operand[0]); - when PSTATEField_PAN - PSTATE.PAN = operand[0]; - when PSTATEField_UAO - PSTATE.UAO = operand[0]; - when PSTATEField_DIT - PSTATE.DIT = operand[0]; - when PSTATEField_TCO - PSTATE.TCO = operand[0]; - -__instruction aarch64_float_compare_uncond - __encoding aarch64_float_compare_uncond - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field opc 3 +: 2 - __opcode '00011110 xx1xxxxx 001000xx xxxxx000' - __guard TRUE - __decode - integer n = UInt(Rn); - integer m = UInt(Rm); // ignored when opc[0] == '1' - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean signal_all_nans = (opc[1] == '1'); - boolean cmp_with_zero = (opc[0] == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) operand1 = V[n]; - bits(datasize) operand2; - - operand2 = if cmp_with_zero then FPZero('0') else V[m]; - - PSTATE.[N,Z,C,V] = FPCompare(operand1, operand2, signal_all_nans, FPCR); - -__instruction aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean test_passed; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - case comparison of - when CompareOp_GT test_passed = element > 0; - when CompareOp_GE test_passed = element >= 0; - when CompareOp_EQ test_passed = element == 0; - when CompareOp_LE test_passed = element <= 0; - when CompareOp_LT test_passed = element < 0; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction UQDECH_R_RS_UW - __encoding UQDECH_R_RS_UW - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0110xxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQDECH_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0111xxxx 111111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 - (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_vector_shift_right_sisd - __encoding aarch64_vector_shift_right_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __encoding aarch64_vector_shift_right_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - operand2 = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element = (Int(Elem[operand, e, esize], unsigned) + round_const) >> shift; - Elem[result, e, esize] = Elem[operand2, e, esize] + element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_memory_vector_multiple_no_wb - __encoding aarch64_memory_vector_multiple_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 0x000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_multiple_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field Rm 16 +: 5 - __field opcode 12 +: 4 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001100 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << UInt(size); - integer elements = datasize DIV esize; - - integer rpt; // number of iterations - integer selem; // structure elements - - case opcode of - when '0000' rpt = 1; selem = 4; // LD/ST4 (4 registers) - when '0010' rpt = 4; selem = 1; // LD/ST1 (4 registers) - when '0100' rpt = 1; selem = 3; // LD/ST3 (3 registers) - when '0110' rpt = 3; selem = 1; // LD/ST1 (3 registers) - when '0111' rpt = 1; selem = 1; // LD/ST1 (1 register) - when '1000' rpt = 1; selem = 2; // LD/ST2 (2 registers) - when '1010' rpt = 2; selem = 1; // LD/ST1 (2 registers) - otherwise UNDEFINED; - - // .1D format only permitted with LD1 & ST1 - if size:Q == '110' && selem != 1 then UNDEFINED; - __execute - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(datasize) rval; - integer tt; - constant integer ebytes = esize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - for r = 0 to rpt-1 - for e = 0 to elements-1 - tt = (t + r) MOD 32; - for s = 0 to selem-1 - rval = V[tt]; - if memop == MemOp_LOAD then - Elem[rval, e, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[tt] = rval; - else // memop == MemOp_STORE - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, e, esize]; - offs = offs + ebytes; - tt = (tt + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_float_arithmetic_add_sub - __encoding aarch64_float_arithmetic_add_sub - __instruction_set A64 - __field ftype 22 +: 2 - __field Rm 16 +: 5 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1xxxxx 001x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean sub_op = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) result; - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - - if sub_op then - result = FPSub(operand1, operand2, FPCR); - else - result = FPAdd(operand1, operand2, FPCR); - - V[d] = result; - -__instruction aarch64_integer_logical_shiftedreg - __encoding aarch64_integer_logical_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - boolean invert = (N == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - X[d] = result; - -__instruction aarch64_integer_conditional_compare_immediate - __encoding aarch64_integer_conditional_compare_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field imm5 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field nzcv 0 +: 4 - __opcode 'xx111010 010xxxxx xxxx10xx xxx0xxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - bits(4) condition = cond; - bits(4) flags = nzcv; - bits(datasize) imm = ZeroExtend(imm5, datasize); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = imm; - bit carry_in = '0'; - - if ConditionHolds(condition) then - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - (-, flags) = AddWithCarry(operand1, operand2, carry_in); - PSTATE.[N,Z,C,V] = flags; - -__instruction aarch64_udf - __encoding aarch64_udf - __instruction_set A64 - __field imm16 0 +: 16 - __opcode '00000000 00000000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - // The imm16 field is ignored by hardware. - UNDEFINED; - - __execute - // No operation. - -__instruction PRFD_I_P_BI_S - __encoding PRFD_I_P_BI_S - __instruction_set A64 - __field imm6 16 +: 6 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000101 11xxxxxx 011xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Rn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 3; - integer offset = SInt(imm6); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(64) base; - bits(64) addr; - - if n == 31 then - base = SP[]; - else - base = X[n]; - - addr = base + ((offset * elements) << scale); - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - Hint_Prefetch(addr, pref_hint, level, stream); - addr = addr + (1 << scale); - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_fp16_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 101x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_float_conv_float_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 101x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - FPRounding rounding = FPDecodeRounding(o1:o2); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPToFixed(element, 0, unsigned, FPCR, rounding); - - V[d] = result; - -__instruction SQINCP_Z_P_Z__ - __encoding SQINCP_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Zdn 0 +: 5 - __opcode '00100101 xx101000 1000000x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Zdn); - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) operand2 = P[m]; - bits(VL) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - for e = 0 to elements-1 - integer element = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element + count, esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_int_accum - __encoding aarch64_vector_arithmetic_binary_uniform_mul_int_accum - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 100101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean sub_op = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - bits(esize) product; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - product = (UInt(element1) * UInt(element2))[esize-1:0]; - if sub_op then - Elem[result, e, esize] = Elem[operand3, e, esize] - product; - else - Elem[result, e, esize] = Elem[operand3, e, esize] + product; - - V[d] = result; - -__instruction SQDECD_Z_ZS__ - __encoding SQDECD_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1110xxxx 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_memory_single_general_immediate_signed_offset_normal - __encoding aarch64_memory_single_general_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction ASR_Z_P_ZW__ - __encoding ASR_Z_P_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx011000 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(64) element2 = Elem[operand2, (e * esize) DIV 64, 64]; - integer shift = Min(UInt(element2), esize); - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = ASR(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction FDUP_Z_I__ - __encoding FDUP_Z_I__ - __instruction_set A64 - __field size 22 +: 2 - __field imm8 5 +: 8 - __field Zd 0 +: 5 - __opcode '00100101 xx111001 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer d = UInt(Zd); - bits(esize) imm = VFPExpandImm(imm8); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) result; - - for e = 0 to elements-1 - Elem[result, e, esize] = imm; - - Z[d] = result; - -__instruction aarch64_integer_arithmetic_mul_widening_64_128hi - __encoding aarch64_integer_arithmetic_mul_widening_64_128hi - __instruction_set A64 - __field U 23 +: 1 - __field Rm 16 +: 5 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '10011011 x10xxxxx 0xxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer a = UInt(Ra); // ignored by UMULH/SMULH - integer destsize = 64; - integer datasize = destsize; - boolean unsigned = (U == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - - integer result; - - result = Int(operand1, unsigned) * Int(operand2, unsigned); - - X[d] = result[127:64]; - -__instruction UQINCB_R_RS_UW - __encoding UQINCB_R_RS_UW - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0010xxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQINCB_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 0011xxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 + (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_vector_arithmetic_binary_uniform_mul_fp16_extended_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_extended_sisd - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 010xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_extended_sisd - __instruction_set A64 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 0x1xxxxx 110111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp16_extended_simd - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 010xxxxx 000111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __encoding aarch64_vector_arithmetic_binary_uniform_mul_fp_extended_simd - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 0x1xxxxx 110111xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPMulX(element1, element2, FPCR); - V[d] = result; - -__instruction aarch64_system_hints - __encoding aarch64_system_hints - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - SystemHintOp op; - - case CRm:op2 of - when '0000 000' op = SystemHintOp_NOP; - when '0000 001' op = SystemHintOp_YIELD; - when '0000 010' op = SystemHintOp_WFE; - when '0000 011' op = SystemHintOp_WFI; - when '0000 100' op = SystemHintOp_SEV; - when '0000 101' op = SystemHintOp_SEVL; - when '0000 110' - if !HaveDGHExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_DGH; - when '0000 111' SEE "XPACLRI"; - when '0001 xxx' - case op2 of - when '000' SEE "PACIA1716"; - when '010' SEE "PACIB1716"; - when '100' SEE "AUTIA1716"; - when '110' SEE "AUTIB1716"; - otherwise EndOfInstruction(); // Instruction executes as NOP - when '0010 000' - if !HaveRASExt() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_ESB; - when '0010 001' - if !HaveStatisticalProfiling() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_PSB; - when '0010 010' - if !HaveSelfHostedTrace() then EndOfInstruction(); // Instruction executes as NOP - op = SystemHintOp_TSB; - when '0010 100' - op = SystemHintOp_CSDB; - when '0011 xxx' - case op2 of - when '000' SEE "PACIAZ"; - when '001' SEE "PACIASP"; - when '010' SEE "PACIBZ"; - when '011' SEE "PACIBSP"; - when '100' SEE "AUTIAZ"; - when '101' SEE "AUTHASP"; - when '110' SEE "AUTIBZ"; - when '111' SEE "AUTIBSP"; - when '0100 xx0' - op = SystemHintOp_BTI; - // Check branch target compatibility between BTI instruction and PSTATE.BTYPE - SetBTypeCompatible(BTypeCompatible_BTI(op2[2:1])); - otherwise EndOfInstruction(); // Instruction executes as NOP - - __execute - case op of - when SystemHintOp_YIELD - Hint_Yield(); - - when SystemHintOp_DGH - Hint_DGH(); - - when SystemHintOp_WFE - if IsEventRegisterSet() then - ClearEventRegister(); - else - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, TRUE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, TRUE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, TRUE); - WaitForEvent(); - - when SystemHintOp_WFI - if !InterruptPending() then - if PSTATE.EL == EL0 then - // Check for traps described by the OS which may be EL1 or EL2. - AArch64.CheckForWFxTrap(EL1, FALSE); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() && !IsInHost() then - // Check for traps described by the Hypervisor. - AArch64.CheckForWFxTrap(EL2, FALSE); - if HaveEL(EL3) && PSTATE.EL != EL3 then - // Check for traps described by the Secure Monitor. - AArch64.CheckForWFxTrap(EL3, FALSE); - WaitForInterrupt(); - - when SystemHintOp_SEV - SendEvent(); - - when SystemHintOp_SEVL - SendEventLocal(); - - when SystemHintOp_ESB - SynchronizeErrors(); - AArch64.ESBOperation(); - if PSTATE.EL IN {EL0, EL1} && EL2Enabled() then AArch64.vESBOperation(); - TakeUnmaskedSErrorInterrupts(); - - when SystemHintOp_PSB - ProfilingSynchronizationBarrier(); - - when SystemHintOp_TSB - TraceSynchronizationBarrier(); - - when SystemHintOp_CSDB - ConsumptionOfSpeculativeDataBarrier(); - - when SystemHintOp_BTI - SetBTypeNext('00'); - - otherwise // do nothing - -__instruction SCVTF_Z_P_Z_H2FP16 - __encoding SCVTF_Z_P_Z_H2FP16 - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01010010 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 16; - boolean unsigned = FALSE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding SCVTF_Z_P_Z_W2FP16 - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01010100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 16; - boolean unsigned = FALSE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding SCVTF_Z_P_Z_W2S - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 10010100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 32; - boolean unsigned = FALSE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding SCVTF_Z_P_Z_W2D - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11010000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 64; - boolean unsigned = FALSE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding SCVTF_Z_P_Z_X2FP16 - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01010110 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 16; - boolean unsigned = FALSE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding SCVTF_Z_P_Z_X2S - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11010100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 32; - boolean unsigned = FALSE; - FPRounding rounding = FPRoundingMode(FPCR); - - __encoding SCVTF_Z_P_Z_X2D - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11010110 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 64; - boolean unsigned = FALSE; - FPRounding rounding = FPRoundingMode(FPCR); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - bits(d_esize) fpval = FixedToFP(element[s_esize-1:0], 0, unsigned, FPCR, rounding); - Elem[result, e, esize] = ZeroExtend(fpval); - - Z[d] = result; - -__instruction LSR_Z_P_ZI__ - __encoding LSR_Z_P_ZI__ - __instruction_set A64 - __field tszh 22 +: 2 - __field Pg 10 +: 3 - __field tszl 8 +: 2 - __field imm3 5 +: 3 - __field Zdn 0 +: 5 - __opcode '00000100 xx000001 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - bits(4) tsize = tszh:tszl; - case tsize of - when '0000' UNDEFINED; - when '0001' esize = 8; - when '001x' esize = 16; - when '01xx' esize = 32; - when '1xxx' esize = 64; - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer shift = (2 * esize) - UInt(tsize:imm3); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) mask = P[g]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = LSR(element1, shift); - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_float_arithmetic_unary - __encoding aarch64_float_arithmetic_unary - __instruction_set A64 - __field ftype 22 +: 2 - __field opc 15 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx10000x x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - FPUnaryOp fpop; - case opc of - when '00' fpop = FPUnaryOp_MOV; - when '01' fpop = FPUnaryOp_ABS; - when '10' fpop = FPUnaryOp_NEG; - when '11' fpop = FPUnaryOp_SQRT; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - case fpop of - when FPUnaryOp_MOV result = operand; - when FPUnaryOp_ABS result = FPAbs(operand); - when FPUnaryOp_NEG result = FPNeg(operand); - when FPUnaryOp_SQRT result = FPSqrt(operand, FPCR); - - V[d] = result; - -__instruction aarch64_float_arithmetic_round_frint - __encoding aarch64_float_arithmetic_round_frint - __instruction_set A64 - __field ftype 22 +: 2 - __field rmode 15 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1001xx x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean exact = FALSE; - FPRounding rounding; - case rmode of - when '0xx' rounding = FPDecodeRounding(rmode[1:0]); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundInt(operand, FPCR, rounding, exact); - - V[d] = result; - -__instruction FCMEQ_P_P_Z0__ - __encoding FCMEQ_P_P_Z0__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx010010 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_EQ; - - __encoding FCMGT_P_P_Z0__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx010000 001xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_GT; - - __encoding FCMGE_P_P_Z0__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx010000 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_GE; - - __encoding FCMLT_P_P_Z0__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx010001 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_LT; - - __encoding FCMLE_P_P_Z0__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx010001 001xxxxx xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_LE; - - __encoding FCMNE_P_P_Z0__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Pd 0 +: 4 - __opcode '01100101 xx010011 001xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Pd); - SVECmp op = Cmp_NE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(PL) result; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - case op of - when Cmp_EQ res = FPCompareEQ(element, 0[esize-1:0], FPCR); - when Cmp_GE res = FPCompareGE(element, 0[esize-1:0], FPCR); - when Cmp_GT res = FPCompareGT(element, 0[esize-1:0], FPCR); - when Cmp_NE res = FPCompareNE(element, 0[esize-1:0], FPCR); - when Cmp_LT res = FPCompareGT(0[esize-1:0], element, FPCR); - when Cmp_LE res = FPCompareGE(0[esize-1:0], element, FPCR); - ElemP[result, e, esize] = if res then '1' else '0'; - else - ElemP[result, e, esize] = '0'; - - P[d] = result; - -__instruction TRN1_P_PP__ - __encoding TRN1_P_PP__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 16 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 xx10xxxx 0101000x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - integer part = 0; - - __encoding TRN2_P_PP__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 16 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00000101 xx10xxxx 0101010x xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - integer part = 1; - - __execute - CheckSVEEnabled(); - integer pairs = VL DIV (esize * 2); - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for p = 0 to pairs-1 - Elem[result, 2*p+0, esize DIV 8] = Elem[operand1, 2*p+part, esize DIV 8]; - Elem[result, 2*p+1, esize DIV 8] = Elem[operand2, 2*p+part, esize DIV 8]; - - P[d] = result; - -__instruction aarch64_vector_arithmetic_unary_diff_neg_fp16 - __encoding aarch64_vector_arithmetic_unary_diff_neg_fp16 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 11111000 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean neg = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_diff_neg_float - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 1x100000 111110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean neg = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - if neg then - element = FPNeg(element); - else - element = FPAbs(element); - Elem[result, e, esize] = element; - - V[d] = result; - -__instruction AND_Z_ZI__ - __encoding AND_Z_ZI__ - __instruction_set A64 - __field imm13 5 +: 13 - __field Zdn 0 +: 5 - __opcode '00000101 100000xx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer dn = UInt(Zdn); - bits(64) imm; - (imm, -) = DecodeBitMasks(imm13[12], imm13[5:0], imm13[11:6], TRUE); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 64; - bits(VL) operand = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - bits(64) element1 = Elem[operand, e, 64]; - Elem[result, e, 64] = element1 AND imm; - - Z[dn] = result; - -__instruction aarch64_integer_arithmetic_add_sub_extendedreg - __encoding aarch64_integer_arithmetic_add_sub_extendedreg - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field imm3 10 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01011 001xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - ExtendType extend_type = DecodeRegExtend(option); - integer shift = UInt(imm3); - if shift > 4 then UNDEFINED; - - __execute - bits(datasize) result; - bits(datasize) operand1 = if n == 31 then SP[] else X[n]; - bits(datasize) operand2 = ExtendReg(m, extend_type, shift); - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction MUL_Z_P_ZZ__ - __encoding MUL_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010000 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = UInt(Elem[operand1, e, esize]); - integer element2 = UInt(Elem[operand2, e, esize]); - if ElemP[mask, e, esize] == '1' then - integer product = element1 * element2; - Elem[result, e, esize] = product[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction SEL_P_P_PP__ - __encoding SEL_P_P_PP__ - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 0000xxxx 01xxxx1x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for e = 0 to elements-1 - bit element1 = ElemP[operand1, e, esize]; - bit element2 = ElemP[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = element1; - else - ElemP[result, e, esize] = element2; - - P[d] = result; - -__instruction aarch64_memory_atomicops_cas_single - __encoding aarch64_memory_atomicops_cas_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x1xxxxx x11111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer n = UInt(Rn); - integer t = UInt(Rt); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if L == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if o0 == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) comparevalue; - bits(datasize) newvalue; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - comparevalue = X[s]; - newvalue = X[t]; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomicCompareAndSwap(address, comparevalue, newvalue, ldacctype, stacctype); - - X[s] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_unary_fp16_round - __encoding aarch64_vector_arithmetic_unary_fp16_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x1111001 100x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __encoding aarch64_vector_arithmetic_unary_float_round - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field o2 23 +: 1 - __field sz 22 +: 1 - __field o1 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100001 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean exact = FALSE; - FPRounding rounding; - case U:o1:o2 of - when '0xx' rounding = FPDecodeRounding(o1:o2); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundInt(element, FPCR, rounding, exact); - - V[d] = result; - -__instruction UQDECH_Z_ZS__ - __encoding UQDECH_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 0110xxxx 110011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - (Elem[result, e, esize], -) = SatQ(element1 - (count * imm), esize, unsigned); - - Z[dn] = result; - -__instruction aarch64_float_convert_fix - __encoding aarch64_float_convert_fix - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field scale 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - - case ftype of - when '00' fltsize = 32; - when '01' fltsize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - if sf == '0' && scale[5] == '0' then UNDEFINED; - integer fracbits = 64 - UInt(scale); - - case opcode[2:1]:rmode of - when '00 11' // FCVTZ - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, fracbits, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, fracbits, unsigned, FPCR, rounding); - V[d] = fltval; - -__instruction MOVPRFX_Z_Z__ - __encoding MOVPRFX_Z_Z__ - __instruction_set A64 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 00100000 101111xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - bits(VL) result = Z[n]; - Z[d] = result; - -__instruction aarch64_integer_pac_strip_dp_1src - __encoding aarch64_integer_pac_strip_dp_1src - __instruction_set A64 - __field D 10 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 01000xxx xxxxxxxx' - __guard TRUE - __decode - boolean data = (D == '1'); - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if n != 31 then UNDEFINED; - - __encoding aarch64_integer_pac_strip_hint - __instruction_set A64 - __opcode '11010101 00000011 00100000 11111111' - __guard TRUE - __decode - integer d = 30; - boolean data = FALSE; - - __execute - if HavePACExt() then - X[d] = Strip(X[d], data); - -__instruction aarch64_vector_shift_right_sisd - __encoding aarch64_vector_shift_right_sisd - __instruction_set A64 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh[3] != '1' then UNDEFINED; - integer esize = 8 << 3; - integer datasize = esize; - integer elements = 1; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __encoding aarch64_vector_shift_right_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field immh 19 +: 4 - __field immb 16 +: 3 - __field o1 13 +: 1 - __field o0 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01111 0xxxxxxx 00xx01xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if immh == '0000' then SEE(asimdimm); - if immh[3]:Q == '10' then UNDEFINED; - integer esize = 8 << HighestSetBit(immh); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - integer shift = (esize * 2) - UInt(immh:immb); - boolean unsigned = (U == '1'); - boolean round = (o1 == '1'); - boolean accumulate = (o0 == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) operand2; - bits(datasize) result; - integer round_const = if round then (1 << (shift - 1)) else 0; - integer element; - - operand2 = if accumulate then V[d] else Zeros(); - for e = 0 to elements-1 - element = (Int(Elem[operand, e, esize], unsigned) + round_const) >> shift; - Elem[result, e, esize] = Elem[operand2, e, esize] + element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_memory_single_simdfp_immediate_signed_offset_normal - __encoding aarch64_memory_single_simdfp_immediate_signed_offset_normal - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111100 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_VEC; - MemOp memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - bits(64) address; - bits(datasize) data; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data = V[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - V[t] = data; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_uniform_sub_int - __encoding aarch64_vector_arithmetic_binary_uniform_sub_int - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 001001xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - integer element1; - integer element2; - integer diff; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - diff = element1 - element2; - Elem[result, e, esize] = diff[esize:1]; - - V[d] = result; - -__instruction aarch64_memory_single_simdfp_immediate_signed_post_idx - __encoding aarch64_memory_single_simdfp_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111100 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_simdfp_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111100 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_simdfp_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111101 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(opc[1]:size); - if scale > 4 then UNDEFINED; - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_VEC; - MemOp memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - bits(64) address; - bits(datasize) data; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - data = V[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - V[t] = data; - - if wback then - if postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction FTMAD_Z_ZZI__ - __encoding FTMAD_Z_ZZI__ - __instruction_set A64 - __field size 22 +: 2 - __field imm3 16 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx010xxx 100000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - integer imm = UInt(imm3); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPTrigMAdd(imm, element1, element2, FPCR); - - Z[dn] = result; - -__instruction aarch64_vector_reduce_fp16_maxnm_simd - __encoding aarch64_vector_reduce_fp16_maxnm_simd - __instruction_set A64 - __field Q 30 +: 1 - __field o1 23 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 x0110000 110010xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = if o1 == '1' then ReduceOp_FMINNUM else ReduceOp_FMAXNUM; - - __encoding aarch64_vector_reduce_fp_maxnm_simd - __instruction_set A64 - __field Q 30 +: 1 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx110000 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q != '01' then UNDEFINED; // .4S only - - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - ReduceOp op = if o1 == '1' then ReduceOp_FMINNUM else ReduceOp_FMAXNUM; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction aarch64_float_arithmetic_round_frint - __encoding aarch64_float_arithmetic_round_frint - __instruction_set A64 - __field ftype 22 +: 2 - __field rmode 15 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1001xx x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean exact = FALSE; - FPRounding rounding; - case rmode of - when '0xx' rounding = FPDecodeRounding(rmode[1:0]); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundInt(operand, FPCR, rounding, exact); - - V[d] = result; - -__instruction RBIT_Z_P_Z__ - __encoding RBIT_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx100111 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = BitReverse(element); - - Z[d] = result; - -__instruction UMULH_Z_P_ZZ__ - __encoding UMULH_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx010011 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean unsigned = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = Int(Elem[operand1, e, esize], unsigned); - integer element2 = Int(Elem[operand2, e, esize], unsigned); - if ElemP[mask, e, esize] == '1' then - integer product = (element1 * element2) >> esize; - Elem[result, e, esize] = product[esize-1:0]; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_sisd - __instruction_set A64 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 32 << UInt(sz); - integer datasize = esize; - integer elements = 1; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp16_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 x10xxxxx 0010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_cmp_fp_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field E 23 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field ac 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 1110x1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - CompareOp cmp; - boolean abs; - - case E:U:ac of - when '000' cmp = CompareOp_EQ; abs = FALSE; - when '010' cmp = CompareOp_GE; abs = FALSE; - when '011' cmp = CompareOp_GE; abs = TRUE; - when '110' cmp = CompareOp_GT; abs = FALSE; - when '111' cmp = CompareOp_GT; abs = TRUE; - otherwise UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element2; - boolean test_passed; - - for e = 0 to elements-1 - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - if abs then - element1 = FPAbs(element1); - element2 = FPAbs(element2); - case cmp of - when CompareOp_EQ test_passed = FPCompareEQ(element1, element2, FPCR); - when CompareOp_GE test_passed = FPCompareGE(element1, element2, FPCR); - when CompareOp_GT test_passed = FPCompareGT(element1, element2, FPCR); - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_integer_arithmetic_add_sub_carry - __encoding aarch64_integer_arithmetic_add_sub_carry - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx11010 000xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - - __execute - bits(datasize) result; - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(4) nzcv; - - if sub_op then - operand2 = NOT(operand2); - - (result, nzcv) = AddWithCarry(operand1, operand2, PSTATE.C); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - X[d] = result; - -__instruction LD1D_Z_P_BZ_D_x32_scaled - __encoding LD1D_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 1x1xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 3; - - __encoding LD1D_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 1x0xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 32; - boolean unsigned = TRUE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1D_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 111xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 3; - - __encoding LD1D_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 110xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - integer offs_size = 64; - boolean unsigned = TRUE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset = Z[m]; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_long - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_long - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 00x000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = Vpart[n, part]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - Elem[result, e, 2*esize] = sum[2*esize-1:0]; - - V[d] = result; - -__instruction LD1D_Z_P_BI_U64 - __encoding LD1D_Z_P_BI_U64 - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100101 1110xxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - boolean unsigned = TRUE; - integer offset = SInt(imm4); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * mbytes; - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - addr = addr + mbytes; - - Z[t] = result; - -__instruction aarch64_integer_arithmetic_add_sub_immediate - __encoding aarch64_integer_arithmetic_add_sub_immediate - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field S 29 +: 1 - __field sh 22 +: 1 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx10001 0xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - boolean setflags = (S == '1'); - bits(datasize) imm; - - case sh of - when '0' imm = ZeroExtend(imm12, datasize); - when '1' imm = ZeroExtend(imm12 : Zeros(12), datasize); - - __execute - bits(datasize) result; - bits(datasize) operand1 = if n == 31 then SP[] else X[n]; - bits(datasize) operand2 = imm; - bits(4) nzcv; - bit carry_in; - - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - else - carry_in = '0'; - - (result, nzcv) = AddWithCarry(operand1, operand2, carry_in); - - if setflags then - PSTATE.[N,Z,C,V] = nzcv; - - if d == 31 && !setflags then - SP[] = result; - else - X[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_fp_complex - __encoding aarch64_vector_arithmetic_binary_uniform_add_fp_complex - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field rot 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 xx0xxxxx 111x01xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFCADDExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size == '00' then UNDEFINED; - if Q == '0' && size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - if !HaveFP16Ext() && esize == 16 then UNDEFINED; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) operand3 = V[d]; - bits(datasize) result; - bits(esize) element1; - bits(esize) element3; - - for e = 0 to (elements DIV 2) -1 - case rot of - when '0' - element1 = FPNeg(Elem[operand2, e*2+1, esize]); - element3 = Elem[operand2, e*2, esize]; - when '1' - element1 = Elem[operand2, e*2+1, esize]; - element3 = FPNeg(Elem[operand2, e*2, esize]); - Elem[result, e*2, esize] = FPAdd(Elem[operand1, e*2, esize], element1, FPCR); - Elem[result, e*2+1, esize] = FPAdd(Elem[operand1, e*2+1, esize], element3, FPCR); - - V[d] = result; - -__instruction aarch64_integer_ins_ext_insert_movewide - __encoding aarch64_integer_ins_ext_insert_movewide - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field hw 21 +: 2 - __field imm16 5 +: 16 - __field Rd 0 +: 5 - __opcode 'xxx10010 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer datasize = if sf == '1' then 64 else 32; - bits(16) imm = imm16; - integer pos; - MoveWideOp opcode; - - case opc of - when '00' opcode = MoveWideOp_N; - when '10' opcode = MoveWideOp_Z; - when '11' opcode = MoveWideOp_K; - otherwise UNDEFINED; - - if sf == '0' && hw[1] == '1' then UNDEFINED; - pos = UInt(hw:'0000'); - - __execute - bits(datasize) result; - - if opcode == MoveWideOp_K then - result = X[d]; - else - result = Zeros(); - - result[pos+15:pos] = imm; - if opcode == MoveWideOp_N then - result = NOT(result); - X[d] = result; - -__instruction LD1SH_Z_P_BZ_S_x32_scaled - __encoding LD1SH_Z_P_BZ_S_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 1x1xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding LD1SH_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 1x1xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 1; - - __encoding LD1SH_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 1x0xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1SH_Z_P_BZ_S_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10000100 1x0xxxxx 000xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 32; - integer msize = 16; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LD1SH_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 111xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 1; - - __encoding LD1SH_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000100 110xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 16; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset = Z[m]; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction LSL_Z_ZW__ - __encoding LSL_Z_ZW__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx1xxxxx 100011xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(64) element2 = Elem[operand2, (e * esize) DIV 64, 64]; - integer shift = Min(UInt(element2), esize); - Elem[result, e, esize] = LSL(element1, shift); - - Z[d] = result; - -__instruction aarch64_vector_transfer_vector_permute_zip - __encoding aarch64_vector_transfer_vector_permute_zip - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx0xxxxx 0x1110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer part = UInt(op); - integer pairs = elements DIV 2; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer base = part * pairs; - - for p = 0 to pairs-1 - Elem[result, 2*p+0, esize] = Elem[operand1, base+p, esize]; - Elem[result, 2*p+1, esize] = Elem[operand2, base+p, esize]; - - V[d] = result; - -__instruction UQINCD_R_RS_UW - __encoding UQINCD_R_RS_UW - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1110xxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 32; - - __encoding UQINCD_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1111xxxx 111101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = TRUE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 + (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction CNT_Z_P_Z__ - __encoding CNT_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000100 xx011010 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = BitCount(element)[esize-1:0]; - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_add_fp16 - __encoding aarch64_vector_arithmetic_binary_uniform_add_fp16 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 010xxxxx 000101xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 16; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - - __encoding aarch64_vector_arithmetic_binary_uniform_add_fp - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x1xxxxx 110101xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean pair = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - bits(2*datasize) concat = operand2:operand1; - bits(esize) element1; - bits(esize) element2; - - for e = 0 to elements-1 - if pair then - element1 = Elem[concat, 2*e, esize]; - element2 = Elem[concat, (2*e)+1, esize]; - else - element1 = Elem[operand1, e, esize]; - element2 = Elem[operand2, e, esize]; - Elem[result, e, esize] = FPAdd(element1, element2, FPCR); - - V[d] = result; - -__instruction aarch64_memory_exclusive_single - __encoding aarch64_memory_exclusive_single - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 0x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '1' then AccType_ORDEREDATOMIC else AccType_ATOMIC; - boolean pair = FALSE; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = if pair then elsize * 2 else elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - boolean rt_unknown = FALSE; - boolean rn_unknown = FALSE; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if memop == MemOp_LOAD && pair && t == t2 then - Constraint c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // result is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE then - if s == t || (pair && s == t2) then - Constraint c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rt_unknown = TRUE; // store UNKNOWN value - when Constraint_NONE rt_unknown = FALSE; // store original value - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - if s == n && n != 31 then - Constraint c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); - assert c IN {Constraint_UNKNOWN, Constraint_NONE, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_UNKNOWN rn_unknown = TRUE; // address is UNKNOWN - when Constraint_NONE rn_unknown = FALSE; // address is original base - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - elsif rn_unknown then - address = bits(64) UNKNOWN; - else - address = X[n]; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - elsif pair then - bits(datasize DIV 2) el1 = X[t]; - bits(datasize DIV 2) el2 = X[t2]; - data = if BigEndian() then el1 : el2 else el2 : el1; - else - data = X[t]; - - bit status = '1'; - // Check whether the Exclusives monitors are set to include the - // physical memory locations corresponding to virtual address - // range [address, address+dbytes-1]. - if AArch64.ExclusiveMonitorsPass(address, dbytes) then - // This atomic write will be rejected if it does not refer - // to the same physical locations after address translation. - Mem[address, dbytes, acctype] = data; - status = ExclusiveMonitorsStatus(); - X[s] = ZeroExtend(status, 32); - - when MemOp_LOAD - // Tell the Exclusives monitors to record a sequence of one or more atomic - // memory reads from virtual address range [address, address+dbytes-1]. - // The Exclusives monitor will only be set if all the reads are from the - // same dbytes-aligned physical address, to allow for the possibility of - // an atomicity break if the translation is changed between reads. - AArch64.SetExclusiveMonitors(address, dbytes); - - if pair then - if rt_unknown then - // ConstrainedUNPREDICTABLE case - X[t] = bits(datasize) UNKNOWN; // In this case t = t2 - elsif elsize == 32 then - // 32-bit load exclusive pair (atomic) - data = Mem[address, dbytes, acctype]; - if BigEndian() then - X[t] = data[datasize-1:elsize]; - X[t2] = data[elsize-1:0]; - else - X[t] = data[elsize-1:0]; - X[t2] = data[datasize-1:elsize]; - else // elsize == 64 - // 64-bit load exclusive pair (not atomic), - // but must be 128-bit aligned - if address != Align(address, dbytes) then - iswrite = FALSE; - secondstage = FALSE; - AArch64.Abort(address, AArch64.AlignmentFault(acctype, iswrite, secondstage)); - X[t] = Mem[address + 0, 8, acctype]; - X[t2] = Mem[address + 8, 8, acctype]; - else - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_wide - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_wide - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 00x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand1 = V[n]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, 2*esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - Elem[result, e, 2*esize] = sum[2*esize-1:0]; - - V[d] = result; - -__instruction aarch64_integer_ins_ext_insert_movewide - __encoding aarch64_integer_ins_ext_insert_movewide - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field hw 21 +: 2 - __field imm16 5 +: 16 - __field Rd 0 +: 5 - __opcode 'xxx10010 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer datasize = if sf == '1' then 64 else 32; - bits(16) imm = imm16; - integer pos; - MoveWideOp opcode; - - case opc of - when '00' opcode = MoveWideOp_N; - when '10' opcode = MoveWideOp_Z; - when '11' opcode = MoveWideOp_K; - otherwise UNDEFINED; - - if sf == '0' && hw[1] == '1' then UNDEFINED; - pos = UInt(hw:'0000'); - - __execute - bits(datasize) result; - - if opcode == MoveWideOp_K then - result = X[d]; - else - result = Zeros(); - - result[pos+15:pos] = imm; - if opcode == MoveWideOp_N then - result = NOT(result); - X[d] = result; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction aarch64_vector_crypto_sha3op_sha1_hash_parity - __encoding aarch64_vector_crypto_sha3op_sha1_hash_parity - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 000xxxxx 000100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if !HaveSHA1Ext() then UNDEFINED; - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) X = V[d]; - bits(32) Y = V[n]; // Note: 32 not 128 bits wide - bits(128) W = V[m]; - bits(32) t; - - for e = 0 to 3 - t = SHAparity(X[63:32], X[95:64], X[127:96]); - Y = Y + ROL(X[31:0], 5) + t + Elem[W, e, 32]; - X[63:32] = ROL(X[63:32], 30); - [Y, X] = ROL(Y : X, 32); - V[d] = X; - -__instruction aarch64_vector_arithmetic_unary_special_recip_int - __encoding aarch64_vector_arithmetic_unary_special_recip_int - __instruction_set A64 - __field Q 30 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 1x100001 110010xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz == '1' then UNDEFINED; - integer esize = 32; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(32) element; - - for e = 0 to elements-1 - element = Elem[operand, e, 32]; - Elem[result, e, 32] = UnsignedRecipEstimate(element); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_element_mul_high_sisd - __encoding aarch64_vector_arithmetic_binary_element_mul_high_sisd - __instruction_set A64 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field op 12 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011111 xxxxxxxx 110xx0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - boolean round = (op == '1'); - - __encoding aarch64_vector_arithmetic_binary_element_mul_high_simd - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field L 21 +: 1 - __field M 20 +: 1 - __field Rm 16 +: 4 - __field op 12 +: 1 - __field H 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001111 xxxxxxxx 110xx0xx xxxxxxxx' - __guard TRUE - __decode - integer idxdsize = if H == '1' then 128 else 64; - integer index; - bit Rmhi; - case size of - when '01' index = UInt(H:L:M); Rmhi = '0'; - when '10' index = UInt(H:L); Rmhi = M; - otherwise UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rmhi:Rm); - - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - boolean round = (op == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(idxdsize) operand2 = V[m]; - bits(datasize) result; - integer round_const = if round then 1 << (esize - 1) else 0; - integer element1; - integer element2; - integer product; - boolean sat; - - element2 = SInt(Elem[operand2, index, esize]); - for e = 0 to elements-1 - element1 = SInt(Elem[operand1, e, esize]); - product = (2 * element1 * element2) + round_const; - // The following only saturates if element1 and element2 equal -(2^(esize-1)) - (Elem[result, e, esize], sat) = SignedSatQ(product >> esize, esize); - if sat then FPSR.QC = '1'; - - V[d] = result; - -__instruction INCP_Z_P_Z__ - __encoding INCP_Z_P_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Zdn 0 +: 5 - __opcode '00100101 xx101100 1000000x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Zdn); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) operand1 = Z[dn]; - bits(PL) operand2 = P[m]; - bits(VL) result; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[operand1, e, esize] + count; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_binary_disparate_add_sub_wide - __encoding aarch64_vector_arithmetic_binary_disparate_add_sub_wide - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field o1 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 00x100xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size == '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = 64; - integer part = UInt(Q); - integer elements = datasize DIV esize; - - boolean sub_op = (o1 == '1'); - boolean unsigned = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(2*datasize) operand1 = V[n]; - bits(datasize) operand2 = Vpart[m, part]; - bits(2*datasize) result; - integer element1; - integer element2; - integer sum; - - for e = 0 to elements-1 - element1 = Int(Elem[operand1, e, 2*esize], unsigned); - element2 = Int(Elem[operand2, e, esize], unsigned); - if sub_op then - sum = element1 - element2; - else - sum = element1 + element2; - Elem[result, e, 2*esize] = sum[2*esize-1:0]; - - V[d] = result; - -__instruction ST4B_Z_P_BI_Contiguous - __encoding ST4B_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11100100 0111xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - integer nreg = 4; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..3] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - for r = 0 to nreg-1 - values[r] = Z[(t+r) MOD 32]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Mem[addr, mbytes, AccType_NORMAL] = Elem[values[r], e, esize]; - addr = addr + mbytes; - -__instruction aarch64_memory_atomicops_ld - __encoding aarch64_memory_atomicops_ld - __instruction_set A64 - __field size 30 +: 2 - __field A 23 +: 1 - __field R 22 +: 1 - __field Rs 16 +: 5 - __field opc 12 +: 3 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - - integer t = UInt(Rt); - integer n = UInt(Rn); - integer s = UInt(Rs); - - integer datasize = 8 << UInt(size); - integer regsize = if datasize == 64 then 64 else 32; - AccType ldacctype = if A == '1' && Rt != '11111' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if R == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - MemAtomicOp op; - case opc of - when '000' op = MemAtomicOp_ADD; - when '001' op = MemAtomicOp_BIC; - when '010' op = MemAtomicOp_EOR; - when '011' op = MemAtomicOp_ORR; - when '100' op = MemAtomicOp_SMAX; - when '101' op = MemAtomicOp_SMIN; - when '110' op = MemAtomicOp_UMAX; - when '111' op = MemAtomicOp_UMIN; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) value; - bits(datasize) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - value = X[s]; - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomic(address, op, value, ldacctype, stacctype); - - if t != 31 then - X[t] = ZeroExtend(data, regsize); - -__instruction aarch64_vector_arithmetic_binary_uniform_shift_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - if S == '0' && size != '11' then UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer round_const = 0; - integer shift; - integer element; - boolean sat; - - for e = 0 to elements-1 - shift = SInt(Elem[operand2, e, esize][7:0]); - if rounding then - round_const = 1 << (-shift - 1); // 0 for left shift, 2^(n-1) for right shift - element = (Int(Elem[operand1, e, esize], unsigned) + round_const) << shift; - if saturating then - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - else - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction FCADD_Z_P_ZZ__ - __encoding FCADD_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field rot 16 +: 1 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100100 xx00000x 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean sub_i = (rot == '0'); - boolean sub_r = (rot == '1'); - - __execute - CheckSVEEnabled(); - integer pairs = VL DIV (2 * esize); - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for p = 0 to pairs-1 - acc_r = Elem[operand1, 2 * p + 0, esize]; - acc_i = Elem[operand1, 2 * p + 1, esize]; - elt2_r = Elem[operand2, 2 * p + 0, esize]; - elt2_i = Elem[operand2, 2 * p + 1, esize]; - if ElemP[mask, 2 * p + 0, esize] == '1' then - if sub_i then elt2_i = FPNeg(elt2_i); - acc_r = FPAdd(acc_r, elt2_i, FPCR); - if ElemP[mask, 2 * p + 1, esize] == '1' then - if sub_r then elt2_r = FPNeg(elt2_r); - acc_i = FPAdd(acc_i, elt2_r, FPCR); - Elem[result, 2 * p + 0, esize] = acc_r; - Elem[result, 2 * p + 1, esize] = acc_i; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_unary_not - __encoding aarch64_vector_arithmetic_unary_not - __instruction_set A64 - __field Q 30 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x101110 00100000 010110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 8; - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 8; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = NOT(element); - - V[d] = result; - -__instruction aarch64_memory_literal_general - __encoding aarch64_memory_literal_general - __instruction_set A64 - __field opc 30 +: 2 - __field imm19 5 +: 19 - __field Rt 0 +: 5 - __opcode 'xx011000 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - MemOp memop = MemOp_LOAD; - boolean signed = FALSE; - integer size; - bits(64) offset; - - case opc of - when '00' - size = 4; - when '01' - size = 8; - when '10' - size = 4; - signed = TRUE; - when '11' - memop = MemOp_PREFETCH; - - offset = SignExtend(imm19:'00', 64); - boolean tag_checked = FALSE; - - __execute - bits(64) address = PC[] + offset; - bits(size*8) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - case memop of - when MemOp_LOAD - data = Mem[address, size, AccType_NORMAL]; - if signed then - X[t] = SignExtend(data, 64); - else - X[t] = data; - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - -__instruction INCD_Z_ZS__ - __encoding INCD_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1111xxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding INCH_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 0111xxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding INCW_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1011xxxx 110000xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[operand1, e, esize] + (count * imm); - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean test_passed; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - case comparison of - when CompareOp_GT test_passed = element > 0; - when CompareOp_GE test_passed = element >= 0; - when CompareOp_EQ test_passed = element == 0; - when CompareOp_LE test_passed = element <= 0; - when CompareOp_LT test_passed = element < 0; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction WHILELT_P_P_RR__ - __encoding WHILELT_P_P_RR__ - __instruction_set A64 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field sf 12 +: 1 - __field Rn 5 +: 5 - __field Pd 0 +: 4 - __opcode '00100101 xx1xxxxx 000x01xx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer rsize = 32 << UInt(sf); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Pd); - boolean unsigned = FALSE; - SVECmp op = Cmp_LT; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = Ones(PL); - bits(rsize) operand1 = X[n]; - bits(rsize) operand2 = X[m]; - bits(PL) result; - boolean last = TRUE; - - for e = 0 to elements-1 - boolean cond; - case op of - when Cmp_LT cond = (Int(operand1, unsigned) < Int(operand2, unsigned)); - when Cmp_LE cond = (Int(operand1, unsigned) <= Int(operand2, unsigned)); - - last = last && cond; - ElemP[result, e, esize] = if last then '1' else '0'; - operand1 = operand1 + 1; - - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction INSR_Z_R__ - __encoding INSR_Z_R__ - __instruction_set A64 - __field size 22 +: 2 - __field Rm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000101 xx100100 001110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer dn = UInt(Zdn); - integer m = UInt(Rm); - - __execute - CheckSVEEnabled(); - bits(VL) dest = Z[dn]; - bits(esize) src = X[m]; - Z[dn] = dest[VL-esize-1:0] : src; - -__instruction SQINCW_R_RS_SX - __encoding SQINCW_R_RS_SX - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1010xxxx 111100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQINCW_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1011xxxx 111100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 + (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction DECP_R_P_R__ - __encoding DECP_R_P_R__ - __instruction_set A64 - __field size 22 +: 2 - __field Pm 5 +: 4 - __field Rdn 0 +: 5 - __opcode '00100101 xx101101 1000100x xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer m = UInt(Pm); - integer dn = UInt(Rdn); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) operand1 = X[dn]; - bits(PL) operand2 = P[m]; - integer count = 0; - - for e = 0 to elements-1 - if ElemP[operand2, e, esize] == '1' then - count = count + 1; - - X[dn] = operand1 - count; - -__instruction aarch64_memory_atomicops_cas_pair - __encoding aarch64_memory_atomicops_cas_pair - __instruction_set A64 - __field sz 30 +: 1 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001000 0x1xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveAtomicExt() then UNDEFINED; - if Rs[0] == '1' then UNDEFINED; - if Rt[0] == '1' then UNDEFINED; - - integer n = UInt(Rn); - integer t = UInt(Rt); - integer s = UInt(Rs); - - integer datasize = 32 << UInt(sz); - integer regsize = datasize; - AccType ldacctype = if L == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - AccType stacctype = if o0 == '1' then AccType_ORDEREDATOMICRW else AccType_ATOMICRW; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(2*datasize) comparevalue; - bits(2*datasize) newvalue; - bits(2*datasize) data; - - bits(datasize) s1 = X[s]; - bits(datasize) s2 = X[s+1]; - bits(datasize) t1 = X[t]; - bits(datasize) t2 = X[t+1]; - comparevalue = if BigEndian() then s1:s2 else s2:s1; - newvalue = if BigEndian() then t1:t2 else t2:t1; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - data = MemAtomicCompareAndSwap(address, comparevalue, newvalue, ldacctype, stacctype); - - if BigEndian() then - X[s] = ZeroExtend(data[2*datasize-1:datasize], regsize); - X[s+1] = ZeroExtend(data[datasize-1:0], regsize); - else - X[s] = ZeroExtend(data[datasize-1:0], regsize); - X[s+1] = ZeroExtend(data[2*datasize-1:datasize], regsize); - -__instruction aarch64_float_arithmetic_round_frint - __encoding aarch64_float_arithmetic_round_frint - __instruction_set A64 - __field ftype 22 +: 2 - __field rmode 15 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '00011110 xx1001xx x10000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize; - case ftype of - when '00' datasize = 32; - when '01' datasize = 64; - when '10' UNDEFINED; - when '11' - if HaveFP16Ext() then - datasize = 16; - else - UNDEFINED; - - boolean exact = FALSE; - FPRounding rounding; - case rmode of - when '0xx' rounding = FPDecodeRounding(rmode[1:0]); - when '100' rounding = FPRounding_TIEAWAY; - when '101' UNDEFINED; - when '110' rounding = FPRoundingMode(FPCR); exact = TRUE; - when '111' rounding = FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(datasize) result; - bits(datasize) operand = V[n]; - - result = FPRoundInt(operand, FPCR, rounding, exact); - - V[d] = result; - -__instruction aarch64_memory_single_general_register - __encoding aarch64_memory_single_general_register - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field Rm 16 +: 5 - __field option 13 +: 3 - __field S 12 +: 1 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx1xxxxx xxxx10xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - if option[1] == '0' then UNDEFINED; // sub-word index - ExtendType extend_type = DecodeRegExtend(option); - integer shift = if S == '1' then scale else 0; - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer m = UInt(Rm); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH; - __execute - bits(64) offset = ExtendReg(m, extend_type, shift); - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction BFCVTNT_Z_P_Z_S2BF - __encoding BFCVTNT_Z_P_Z_S2BF - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100100 10001010 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() || !HaveBF16Ext() then UNDEFINED; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV 32; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(32) element = Elem[operand, e, 32]; - if ElemP[mask, e, 32] == '1' then - Elem[result, 2*e+1, 16] = FPConvertBF(element, FPCR); - - Z[d] = result; - -__instruction ORN_P_P_PP_Z - __encoding ORN_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 1000xxxx 01xxxx0x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = FALSE; - - __encoding ORNS_P_P_PP_Z - __instruction_set A64 - __field Pm 16 +: 4 - __field Pg 10 +: 4 - __field Pn 5 +: 4 - __field Pd 0 +: 4 - __opcode '00100101 1100xxxx 01xxxx0x xxx1xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8; - integer g = UInt(Pg); - integer n = UInt(Pn); - integer m = UInt(Pm); - integer d = UInt(Pd); - boolean setflags = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(PL) operand1 = P[n]; - bits(PL) operand2 = P[m]; - bits(PL) result; - - for e = 0 to elements-1 - bit element1 = ElemP[operand1, e, esize]; - bit element2 = ElemP[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - ElemP[result, e, esize] = element1 OR (NOT element2); - else - ElemP[result, e, esize] = '0'; - - if setflags then - PSTATE.[N,Z,C,V] = PredTest(mask, result, esize); - P[d] = result; - -__instruction MAD_Z_P_ZZZ__ - __encoding MAD_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Za 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 xx0xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - integer a = UInt(Za); - boolean sub_op = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[a]; - bits(VL) result; - - for e = 0 to elements-1 - integer element1 = UInt(Elem[operand1, e, esize]); - integer element2 = UInt(Elem[operand2, e, esize]); - if ElemP[mask, e, esize] == '1' then - integer product = element1 * element2; - if sub_op then - Elem[result, e, esize] = Elem[operand3, e, esize] - product; - else - Elem[result, e, esize] = Elem[operand3, e, esize] + product; - else - Elem[result, e, esize] = Elem[operand1, e, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_transfer_vector_table - __encoding aarch64_vector_transfer_vector_table - __instruction_set A64 - __field Q 30 +: 1 - __field Rm 16 +: 5 - __field len 13 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 000xxxxx 0xxx00xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV 8; - integer regs = UInt(len) + 1; - boolean is_tbl = (op == '0'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) indices = V[m]; - bits(128*regs) table = Zeros(); - bits(datasize) result; - integer index; - - // Create table from registers - for i = 0 to regs - 1 - table[128*i+127:128*i] = V[n]; - n = (n + 1) MOD 32; - - result = if is_tbl then Zeros() else V[d]; - for i = 0 to elements - 1 - index = UInt(Elem[indices, i, 8]); - if index < 16 * regs then - Elem[result, i, 8] = Elem[table, index, 8]; - - V[d] = result; - -__instruction aarch64_float_convert_int - __encoding aarch64_float_convert_int - __instruction_set A64 - __field sf 31 +: 1 - __field ftype 22 +: 2 - __field rmode 19 +: 2 - __field opcode 16 +: 3 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011110 xx1xxxxx 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer intsize = if sf == '1' then 64 else 32; - integer fltsize; - FPConvOp op; - FPRounding rounding; - boolean unsigned; - integer part; - - case ftype of - when '00' - fltsize = 32; - when '01' - fltsize = 64; - when '10' - if opcode[2:1]:rmode != '11 01' then UNDEFINED; - fltsize = 128; - when '11' - if HaveFP16Ext() then - fltsize = 16; - else - UNDEFINED; - - case opcode[2:1]:rmode of - when '00 xx' // FCVT[NPMZ][US] - rounding = FPDecodeRounding(rmode); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '01 00' // [US]CVTF - rounding = FPRoundingMode(FPCR); - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_ItoF; - when '10 00' // FCVTA[US] - rounding = FPRounding_TIEAWAY; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI; - when '11 00' // FMOV - if fltsize != 16 && fltsize != intsize then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 0; - when '11 01' // FMOV D[1] - if intsize != 64 || fltsize != 128 then UNDEFINED; - op = if opcode[0] == '1' then FPConvOp_MOV_ItoF else FPConvOp_MOV_FtoI; - part = 1; - fltsize = 64; // size of D[1] is 64 - when '11 11' // FJCVTZS - if !HaveFJCVTZSExt() then UNDEFINED; - rounding = FPRounding_ZERO; - unsigned = (opcode[0] == '1'); - op = FPConvOp_CVT_FtoI_JS; - otherwise - UNDEFINED; - - __execute - CheckFPAdvSIMDEnabled64(); - - bits(fltsize) fltval; - bits(intsize) intval; - - case op of - when FPConvOp_CVT_FtoI - fltval = V[n]; - intval = FPToFixed(fltval, 0, unsigned, FPCR, rounding); - X[d] = intval; - when FPConvOp_CVT_ItoF - intval = X[n]; - fltval = FixedToFP(intval, 0, unsigned, FPCR, rounding); - V[d] = fltval; - when FPConvOp_MOV_FtoI - fltval = Vpart[n,part]; - intval = ZeroExtend(fltval, intsize); - X[d] = intval; - when FPConvOp_MOV_ItoF - intval = X[n]; - fltval = intval[fltsize-1:0]; - Vpart[d,part] = fltval; - when FPConvOp_CVT_FtoI_JS - bit Z; - fltval = V[n]; - (intval, Z) = FPToFixedJS(fltval, FPCR, TRUE); - PSTATE.[N,Z,C,V] = '0':Z:'00'; - X[d] = intval; - -__instruction aarch64_memory_single_general_immediate_signed_offset_lda_stl - __encoding aarch64_memory_single_general_immediate_signed_offset_lda_stl - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx011001 xx0xxxxx xxxx00xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_ORDERED; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - memop = MemOp_PREFETCH; - if opc[0] == '1' then UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction LD2B_Z_P_BI_Contiguous - __encoding LD2B_Z_P_BI_Contiguous - __instruction_set A64 - __field imm4 16 +: 4 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 0010xxxx 111xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer g = UInt(Pg); - integer esize = 8; - integer offset = SInt(imm4); - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if n == 31 then - CheckSPAlignment(); - if HaveMTEExt() then SetTagCheckedInstruction(FALSE); - base = SP[]; - else - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - base = X[n]; - - addr = base + offset * elements * nreg * mbytes; - for e = 0 to elements-1 - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction CLASTB_Z_P_ZZ__ - __encoding CLASTB_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000101 xx101001 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - boolean isBefore = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - integer last = LastActiveElement(mask, esize); - - if last < 0 then - result = operand1; - else - if !isBefore then - last = last + 1; - if last >= elements then last = 0; - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[operand2, last, esize]; - - Z[dn] = result; - -__instruction aarch64_vector_crypto_sm3_sm3partw2 - __encoding aarch64_vector_crypto_sm3_sm3partw2 - __instruction_set A64 - __field Rm 16 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 011xxxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSM3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) Vd = V[d]; - bits(128) result; - bits(128) tmp; - bits(32) tmp2; - tmp[127:0] = Vn EOR (ROL(Vm[127:96],7):ROL(Vm[95:64],7):ROL(Vm[63:32],7):ROL(Vm[31:0],7)); - result[127:0] = Vd[127:0] EOR tmp[127:0]; - tmp2 = ROL(tmp[31:0],15); - tmp2 = tmp2 EOR ROL(tmp2,15) EOR ROL(tmp2,23); - result[127:96] = result[127:96] EOR tmp2; - V[d]= result; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction SQINCD_R_RS_SX - __encoding SQINCD_R_RS_SX - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1110xxxx 111100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 32; - - __encoding SQINCD_R_RS_X - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Rdn 0 +: 5 - __opcode '00000100 1111xxxx 111100xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Rdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - boolean unsigned = FALSE; - integer ssize = 64; - - __execute - CheckSVEEnabled(); - integer count = DecodePredCount(pat, esize); - bits(ssize) operand1 = X[dn]; - bits(ssize) result; - - integer element1 = Int(operand1, unsigned); - (result, -) = SatQ(element1 + (count * imm), ssize, unsigned); - X[dn] = Extend(result, 64, unsigned); - -__instruction aarch64_vector_crypto_sha3_xar - __encoding aarch64_vector_crypto_sha3_xar - __instruction_set A64 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11001110 100xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSHA3Ext() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) Vm = V[m]; - bits(128) Vn = V[n]; - bits(128) tmp; - tmp = Vn EOR Vm; - V[d] = ROR(tmp[127:64], UInt(imm6)):ROR(tmp[63:0], UInt(imm6)); - -__instruction REVB_Z_Z__ - __encoding REVB_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx100100 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer swsize = 8; - - __encoding REVH_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx100101 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '1x' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer swsize = 16; - - __encoding REVW_Z_Z__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '00000101 xx100110 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer swsize = 32; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - bits(esize) element = Elem[operand, e, esize]; - Elem[result, e, esize] = Reverse(element, swsize); - - Z[d] = result; - -__instruction LD1D_Z_P_AI_D - __encoding LD1D_Z_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 101xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Zn); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 64; - boolean unsigned = TRUE; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(VL) base = Z[n]; - bits(64) addr; - bits(PL) mask = P[g]; - bits(VL) result; - bits(msize) data; - constant integer mbytes = msize DIV 8; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + offset * mbytes; - data = Mem[addr, mbytes, AccType_NORMAL]; - Elem[result, e, esize] = Extend(data, esize, unsigned); - else - Elem[result, e, esize] = Zeros(); - - Z[t] = result; - -__instruction aarch64_memory_ordered - __encoding aarch64_memory_ordered - __instruction_set A64 - __field size 30 +: 2 - __field L 22 +: 1 - __field Rs 16 +: 5 - __field o0 15 +: 1 - __field Rt2 10 +: 5 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx001000 1x0xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer t = UInt(Rt); - integer t2 = UInt(Rt2); // ignored by load/store single register - integer s = UInt(Rs); // ignored by all loads and store-release - - AccType acctype = if o0 == '0' then AccType_LIMITEDORDERED else AccType_ORDERED; - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer elsize = 8 << UInt(size); - integer regsize = if elsize == 64 then 64 else 32; - integer datasize = elsize; - boolean tag_checked = n != 31; - - __execute - bits(64) address; - bits(datasize) data; - constant integer dbytes = datasize DIV 8; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - case memop of - when MemOp_STORE - data = X[t]; - Mem[address, dbytes, acctype] = data; - - when MemOp_LOAD - data = Mem[address, dbytes, acctype]; - X[t] = ZeroExtend(data, regsize); - -__instruction FMINNM_Z_P_ZZ__ - __encoding FMINNM_Z_P_ZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx000101 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - if ElemP[mask, e, esize] == '1' then - Elem[result, e, esize] = FPMinNum(element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_integer_conditional_compare_register - __encoding aarch64_integer_conditional_compare_register - __instruction_set A64 - __field sf 31 +: 1 - __field op 30 +: 1 - __field Rm 16 +: 5 - __field cond 12 +: 4 - __field Rn 5 +: 5 - __field nzcv 0 +: 4 - __opcode 'xx111010 010xxxxx xxxx00xx xxx0xxxx' - __guard TRUE - __decode - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean sub_op = (op == '1'); - bits(4) condition = cond; - bits(4) flags = nzcv; - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bit carry_in = '0'; - - if ConditionHolds(condition) then - if sub_op then - operand2 = NOT(operand2); - carry_in = '1'; - (-, flags) = AddWithCarry(operand1, operand2, carry_in); - PSTATE.[N,Z,C,V] = flags; - -__instruction aarch64_vector_reduce_fp16_max_sisd - __encoding aarch64_vector_reduce_fp16_max_sisd - __instruction_set A64 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01011110 xx110000 111110xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFP16Ext() then UNDEFINED; - - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 16; - if sz == '1' then UNDEFINED; - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = if o1 == '1' then ReduceOp_FMIN else ReduceOp_FMAX; - - __encoding aarch64_vector_reduce_fp_max_sisd - __instruction_set A64 - __field o1 23 +: 1 - __field sz 22 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01111110 xx110000 111110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer esize = 32 << UInt(sz); - integer datasize = esize * 2; - integer elements = 2; - - ReduceOp op = if o1 == '1' then ReduceOp_FMIN else ReduceOp_FMAX; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - V[d] = Reduce(op, operand, esize); - -__instruction FMAD_Z_P_ZZZ__ - __encoding FMAD_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Za 16 +: 5 - __field Pg 10 +: 3 - __field Zm 5 +: 5 - __field Zdn 0 +: 5 - __opcode '01100101 xx1xxxxx 100xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer dn = UInt(Zdn); - integer m = UInt(Zm); - integer a = UInt(Za); - boolean op1_neg = FALSE; - boolean op3_neg = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[dn]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[a]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - bits(esize) element3 = Elem[operand3, e, esize]; - - if ElemP[mask, e, esize] == '1' then - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - else - Elem[result, e, esize] = element1; - - Z[dn] = result; - -__instruction aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd - __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __encoding aarch64_vector_arithmetic_unary_cmp_int_bulk_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 100x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - - CompareOp comparison; - case op:U of - when '00' comparison = CompareOp_GT; - when '01' comparison = CompareOp_GE; - when '10' comparison = CompareOp_EQ; - when '11' comparison = CompareOp_LE; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - boolean test_passed; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - case comparison of - when CompareOp_GT test_passed = element > 0; - when CompareOp_GE test_passed = element >= 0; - when CompareOp_EQ test_passed = element == 0; - when CompareOp_LE test_passed = element <= 0; - when CompareOp_LT test_passed = element < 0; - Elem[result, e, esize] = if test_passed then Ones() else Zeros(); - - V[d] = result; - -__instruction aarch64_vector_transfer_vector_permute_zip - __encoding aarch64_vector_transfer_vector_permute_zip - __instruction_set A64 - __field Q 30 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field op 14 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0x001110 xx0xxxxx 0x1110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer part = UInt(op); - integer pairs = elements DIV 2; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer base = part * pairs; - - for p = 0 to pairs-1 - Elem[result, 2*p+0, esize] = Elem[operand1, base+p, esize]; - Elem[result, 2*p+1, esize] = Elem[operand2, base+p, esize]; - - V[d] = result; - -__instruction aarch64_integer_arithmetic_mul_widening_32_64 - __encoding aarch64_integer_arithmetic_mul_widening_32_64 - __instruction_set A64 - __field U 23 +: 1 - __field Rm 16 +: 5 - __field o0 15 +: 1 - __field Ra 10 +: 5 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '10011011 x01xxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer a = UInt(Ra); - integer destsize = 64; - integer datasize = 32; - boolean sub_op = (o0 == '1'); - boolean unsigned = (U == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = X[m]; - bits(destsize) operand3 = X[a]; - - integer result; - - if sub_op then - result = Int(operand3, unsigned) - (Int(operand1, unsigned) * Int(operand2, unsigned)); - else - result = Int(operand3, unsigned) + (Int(operand1, unsigned) * Int(operand2, unsigned)); - - X[d] = result[63:0]; - -__instruction aarch64_system_monitors - __encoding aarch64_system_monitors - __instruction_set A64 - __field CRm 8 +: 4 - __opcode '11010101 00000011 0011xxxx 01011111' - __guard TRUE - __decode - // CRm field is ignored - - __execute - ClearExclusiveLocal(ProcessorID()); - -__instruction PRFB_I_P_AI_S - __encoding PRFB_I_P_AI_S - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - __opcode '10000100 000xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 0; - integer offset = UInt(imm5); - - __encoding PRFB_I_P_AI_D - __instruction_set A64 - __field imm5 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field prfop 0 +: 4 - __opcode '11000100 000xxxxx 111xxxxx xxx0xxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer level = UInt(prfop[2:1]); - boolean stream = (prfop[0] == '1'); - pref_hint = if prfop[3] == '0' then Prefetch_READ else Prefetch_WRITE; - integer scale = 0; - integer offset = UInt(imm5); - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) base; - bits(64) addr; - base = Z[n]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - addr = ZeroExtend(Elem[base, e, esize], 64) + (offset << scale); - Hint_Prefetch(addr, pref_hint, level, stream); - -__instruction LDFF1SW_Z_P_BZ_D_x32_scaled - __encoding LDFF1SW_Z_P_BZ_D_x32_scaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 0x1xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 2; - - __encoding LDFF1SW_Z_P_BZ_D_x32_unscaled - __instruction_set A64 - __field xs 22 +: 1 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 0x0xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 32; - boolean unsigned = FALSE; - boolean offs_unsigned = xs == '0'; - integer scale = 0; - - __encoding LDFF1SW_Z_P_BZ_D_64_scaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 011xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 2; - - __encoding LDFF1SW_Z_P_BZ_D_64_unscaled - __instruction_set A64 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '11000101 010xxxxx 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Zm); - integer g = UInt(Pg); - integer esize = 64; - integer msize = 32; - integer offs_size = 64; - boolean unsigned = FALSE; - boolean offs_unsigned = TRUE; - integer scale = 0; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(VL) offset; - bits(PL) mask = P[g]; - bits(VL) result; - bits(VL) orig = Z[t]; - bits(msize) data; - constant integer mbytes = msize DIV 8; - boolean first = TRUE; - boolean fault = FALSE; - boolean faulted = FALSE; - boolean unknown = FALSE; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - offset = Z[m]; - - for e = 0 to elements-1 - if ElemP[mask, e, esize] == '1' then - integer off = Int(Elem[offset, e, esize][offs_size-1:0], offs_unsigned); - addr = base + (off << scale); - if first then - // Mem[] will not return if a fault is detected for the first active element - data = Mem[addr, mbytes, AccType_NORMAL]; - first = FALSE; - else - // MemNF[] will return fault=TRUE if access is not performed for any reason - (data, fault) = MemNF[addr, mbytes, AccType_NONFAULT]; - else - (data, fault) = (Zeros(msize), FALSE); - - // FFR elements set to FALSE following a supressed access/fault - faulted = faulted || fault; - if faulted then - ElemFFR[e, esize] = '0'; - - // Value becomes CONSTRAINED UNPREDICTABLE after an FFR element is FALSE - unknown = unknown || ElemFFR[e, esize] == '0'; - if unknown then - if !fault && ConstrainUnpredictableBool(Unpredictable_SVELDNFDATA) then - Elem[result, e, esize] = Extend(data, esize, unsigned); - elsif ConstrainUnpredictableBool(Unpredictable_SVELDNFZERO) then - Elem[result, e, esize] = Zeros(); - else // merge - Elem[result, e, esize] = Elem[orig, e, esize]; - else - Elem[result, e, esize] = Extend(data, esize, unsigned); - - Z[t] = result; - -__instruction aarch64_integer_arithmetic_rbit - __encoding aarch64_integer_arithmetic_rbit - __instruction_set A64 - __field sf 31 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x1011010 11000000 000000xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer datasize = if sf == '1' then 64 else 32; - - __execute - bits(datasize) operand = X[n]; - bits(datasize) result; - - for i = 0 to datasize-1 - result[datasize-1-i] = operand[i]; - - X[d] = result; - -__instruction aarch64_integer_pac_pacib_dp_1src - __encoding aarch64_integer_pac_pacib_dp_1src - __instruction_set A64 - __field Z 13 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '11011010 11000001 00x001xx xxxxxxxx' - __guard TRUE - __decode - boolean source_is_sp = FALSE; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if !HavePACExt() then - UNDEFINED; - - if Z == '0' then // PACIB - if n == 31 then source_is_sp = TRUE; - else // PACIZB - if n != 31 then UNDEFINED; - - __encoding aarch64_integer_pac_pacib_hint - __instruction_set A64 - __field CRm 8 +: 4 - __field op2 5 +: 3 - __opcode '11010101 00000011 0010xxxx xxx11111' - __guard TRUE - __decode - integer d; - integer n; - boolean source_is_sp = FALSE; - - case CRm:op2 of - when '0011 010' // PACIBZ - d = 30; - n = 31; - when '0011 011' // PACIBSP - d = 30; - source_is_sp = TRUE; - if HaveBTIExt() then - // Check for branch target compatibility between PSTATE.BTYPE - // and implicit branch target of PACIBSP instruction. - SetBTypeCompatible(BTypeCompatible_PACIXSP()); - when '0001 010' // PACIB1716 - d = 17; - n = 16; - when '0001 000' SEE "PACIA"; - when '0001 100' SEE "AUTIA"; - when '0001 110' SEE "AUTIB"; - when '0011 00x' SEE "PACIA"; - when '0011 10x' SEE "AUTIA"; - when '0011 11x' SEE "AUTIB"; - when '0000 111' SEE "XPACLRI"; - otherwise SEE "HINT"; - - __execute - if HavePACExt() then - if source_is_sp then - X[d] = AddPACIB(X[d], SP[]); - else - X[d] = AddPACIB(X[d], X[n]); - -__instruction FCVTZS_Z_P_Z_FP162H - __encoding FCVTZS_Z_P_Z_FP162H - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01011010 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 16; - boolean unsigned = FALSE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZS_Z_P_Z_FP162W - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01011100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 32; - boolean unsigned = FALSE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZS_Z_P_Z_FP162X - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 01011110 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 16; - integer d_esize = 64; - boolean unsigned = FALSE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZS_Z_P_Z_S2W - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 10011100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 32; - boolean unsigned = FALSE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZS_Z_P_Z_S2X - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11011100 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 32; - integer d_esize = 64; - boolean unsigned = FALSE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZS_Z_P_Z_D2W - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11011000 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 32; - boolean unsigned = FALSE; - FPRounding rounding = FPRounding_ZERO; - - __encoding FCVTZS_Z_P_Z_D2X - __instruction_set A64 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zd 0 +: 5 - __opcode '01100101 11011110 101xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer g = UInt(Pg); - integer n = UInt(Zn); - integer d = UInt(Zd); - integer s_esize = 64; - integer d_esize = 64; - boolean unsigned = FALSE; - FPRounding rounding = FPRounding_ZERO; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand = Z[n]; - bits(VL) result = Z[d]; - - for e = 0 to elements-1 - bits(esize) element = Elem[operand, e, esize]; - if ElemP[mask, e, esize] == '1' then - bits(d_esize) res = FPToFixed(element[s_esize-1:0], 0, unsigned, FPCR, rounding); - Elem[result, e, esize] = Extend(res, unsigned); - - Z[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_shift_sisd - __encoding aarch64_vector_arithmetic_binary_uniform_shift_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - if S == '0' && size != '11' then UNDEFINED; - - __encoding aarch64_vector_arithmetic_binary_uniform_shift_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rm 16 +: 5 - __field R 12 +: 1 - __field S 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx1xxxxx 010xx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean unsigned = (U == '1'); - boolean rounding = (R == '1'); - boolean saturating = (S == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand1 = V[n]; - bits(datasize) operand2 = V[m]; - bits(datasize) result; - - integer round_const = 0; - integer shift; - integer element; - boolean sat; - - for e = 0 to elements-1 - shift = SInt(Elem[operand2, e, esize][7:0]); - if rounding then - round_const = 1 << (-shift - 1); // 0 for left shift, 2^(n-1) for right shift - element = (Int(Elem[operand1, e, esize], unsigned) + round_const) << shift; - if saturating then - (Elem[result, e, esize], sat) = SatQ(element, esize, unsigned); - if sat then FPSR.QC = '1'; - else - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction LD2B_Z_P_BR_Contiguous - __encoding LD2B_Z_P_BR_Contiguous - __instruction_set A64 - __field Rm 16 +: 5 - __field Pg 10 +: 3 - __field Rn 5 +: 5 - __field Zt 0 +: 5 - __opcode '10100100 001xxxxx 110xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if Rm == '11111' then UNDEFINED; - integer t = UInt(Zt); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer g = UInt(Pg); - integer esize = 8; - integer nreg = 2; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(64) base; - bits(64) addr; - bits(PL) mask = P[g]; - bits(64) offset = X[m]; - constant integer mbytes = esize DIV 8; - array [0..1] of bits(VL) values; - - if HaveMTEExt() then SetTagCheckedInstruction(TRUE); - - if n == 31 then - CheckSPAlignment(); - base = SP[]; - else - base = X[n]; - - for e = 0 to elements-1 - addr = base + UInt(offset) * mbytes; - for r = 0 to nreg-1 - if ElemP[mask, e, esize] == '1' then - Elem[values[r], e, esize] = Mem[addr, mbytes, AccType_NORMAL]; - else - Elem[values[r], e, esize] = Zeros(); - addr = addr + mbytes; - offset = offset + nreg; - - for r = 0 to nreg-1 - Z[(t+r) MOD 32] = values[r]; - -__instruction aarch64_vector_transfer_vector_insert - __encoding aarch64_vector_transfer_vector_insert - __instruction_set A64 - __field imm5 16 +: 5 - __field imm4 11 +: 4 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01101110 000xxxxx 0xxxx1xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - integer size = LowestSetBit(imm5); - if size > 3 then UNDEFINED; - - integer dst_index = UInt(imm5[4:size+1]); - integer src_index = UInt(imm4[3:size]); - integer idxdsize = if imm4[3] == '1' then 128 else 64; - // imm4[size-1:0] is IGNORED - - integer esize = 8 << size; - - __execute - CheckFPAdvSIMDEnabled64(); - bits(idxdsize) operand = V[n]; - bits(128) result; - - result = V[d]; - Elem[result, dst_index, esize] = Elem[operand, src_index, esize]; - V[d] = result; - -__instruction aarch64_vector_logical - __encoding aarch64_vector_logical - __instruction_set A64 - __field Q 30 +: 1 - __field op 29 +: 1 - __field a 18 +: 1 - __field b 17 +: 1 - __field c 16 +: 1 - __field cmode 12 +: 4 - __field d 9 +: 1 - __field e 8 +: 1 - __field f 7 +: 1 - __field g 6 +: 1 - __field h 5 +: 1 - __field Rd 0 +: 5 - __opcode '0xx01111 00000xxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - integer rd = UInt(Rd); - - integer datasize = if Q == '1' then 128 else 64; - bits(datasize) imm; - bits(64) imm64; - - ImmediateOp operation; - case cmode:op of - when '0xx00' operation = ImmediateOp_MOVI; - when '0xx01' operation = ImmediateOp_MVNI; - when '0xx10' operation = ImmediateOp_ORR; - when '0xx11' operation = ImmediateOp_BIC; - when '10x00' operation = ImmediateOp_MOVI; - when '10x01' operation = ImmediateOp_MVNI; - when '10x10' operation = ImmediateOp_ORR; - when '10x11' operation = ImmediateOp_BIC; - when '110x0' operation = ImmediateOp_MOVI; - when '110x1' operation = ImmediateOp_MVNI; - when '1110x' operation = ImmediateOp_MOVI; - when '11110' operation = ImmediateOp_MOVI; - when '11111' - // FMOV Dn,#imm is in main FP instruction set - if Q == '0' then UNDEFINED; - operation = ImmediateOp_MOVI; - - imm64 = AdvSIMDExpandImm(op, cmode, a:b:c:d:e:f:g:h); - imm = Replicate(imm64, datasize DIV 64); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand; - bits(datasize) result; - - case operation of - when ImmediateOp_MOVI - result = imm; - when ImmediateOp_MVNI - result = NOT(imm); - when ImmediateOp_ORR - operand = V[rd]; - result = operand OR imm; - when ImmediateOp_BIC - operand = V[rd]; - result = operand AND NOT(imm); - - V[rd] = result; - -__instruction DECD_Z_ZS__ - __encoding DECD_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1111xxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 64; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding DECH_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 0111xxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 16; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __encoding DECW_Z_ZS__ - __instruction_set A64 - __field imm4 16 +: 4 - __field pattern 5 +: 5 - __field Zdn 0 +: 5 - __opcode '00000100 1011xxxx 110001xx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - integer esize = 32; - integer dn = UInt(Zdn); - bits(5) pat = pattern; - integer imm = UInt(imm4) + 1; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - integer count = DecodePredCount(pat, esize); - bits(VL) operand1 = Z[dn]; - bits(VL) result; - - for e = 0 to elements-1 - Elem[result, e, esize] = Elem[operand1, e, esize] - (count * imm); - - Z[dn] = result; - -__instruction FNMLA_Z_P_ZZZ__ - __encoding FNMLA_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100101 xx1xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = TRUE; - boolean op3_neg = TRUE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - bits(esize) element3 = Elem[operand3, e, esize]; - - if ElemP[mask, e, esize] == '1' then - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - else - Elem[result, e, esize] = element3; - - Z[da] = result; - -__instruction aarch64_memory_single_general_immediate_signed_post_idx - __encoding aarch64_memory_single_general_immediate_signed_post_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx01xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = TRUE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_signed_pre_idx - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm9 12 +: 9 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111000 xx0xxxxx xxxx11xx xxxxxxxx' - __guard TRUE - __decode - boolean wback = TRUE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = SignExtend(imm9, 64); - - __encoding aarch64_memory_single_general_immediate_unsigned - __instruction_set A64 - __field size 30 +: 2 - __field opc 22 +: 2 - __field imm12 10 +: 12 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode 'xx111001 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - boolean wback = FALSE; - boolean postindex = FALSE; - integer scale = UInt(size); - bits(64) offset = LSL(ZeroExtend(imm12, 64), scale); - - __postdecode - integer n = UInt(Rn); - integer t = UInt(Rt); - AccType acctype = AccType_NORMAL; - MemOp memop; - boolean signed; - integer regsize; - - if opc[1] == '0' then - // store or zero-extending load - memop = if opc[0] == '1' then MemOp_LOAD else MemOp_STORE; - regsize = if size == '11' then 64 else 32; - signed = FALSE; - else - if size == '11' then - UNDEFINED; - else - // sign-extending load - memop = MemOp_LOAD; - if size == '10' && opc[0] == '1' then UNDEFINED; - regsize = if opc[0] == '1' then 32 else 64; - signed = TRUE; - - integer datasize = 8 << scale; - boolean tag_checked = memop != MemOp_PREFETCH && (wback || n != 31); - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - bits(64) address; - bits(datasize) data; - - boolean wb_unknown = FALSE; - boolean rt_unknown = FALSE; - - if memop == MemOp_LOAD && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); - assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_WBSUPPRESS wback = FALSE; // writeback is suppressed - when Constraint_UNKNOWN wb_unknown = TRUE; // writeback is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if memop == MemOp_STORE && wback && n == t && n != 31 then - c = ConstrainUnpredictable(Unpredictable_WBOVERLAPST); - assert c IN {Constraint_NONE, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; - case c of - when Constraint_NONE rt_unknown = FALSE; // value stored is original value - when Constraint_UNKNOWN rt_unknown = TRUE; // value stored is UNKNOWN - when Constraint_UNDEF UNDEFINED; - when Constraint_NOP EndOfInstruction(); - - if n == 31 then - if memop != MemOp_PREFETCH then CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - if ! postindex then - address = address + offset; - - case memop of - when MemOp_STORE - if rt_unknown then - data = bits(datasize) UNKNOWN; - else - data = X[t]; - Mem[address, datasize DIV 8, acctype] = data; - - when MemOp_LOAD - data = Mem[address, datasize DIV 8, acctype]; - if signed then - X[t] = SignExtend(data, regsize); - else - X[t] = ZeroExtend(data, regsize); - - when MemOp_PREFETCH - Prefetch(address, t[4:0]); - - if wback then - if wb_unknown then - address = bits(64) UNKNOWN; - elsif postindex then - address = address + offset; - if n == 31 then - SP[] = address; - else - X[n] = address; - -__instruction FMLS_Z_P_ZZZ__ - __encoding FMLS_Z_P_ZZZ__ - __instruction_set A64 - __field size 22 +: 2 - __field Zm 16 +: 5 - __field Pg 10 +: 3 - __field Zn 5 +: 5 - __field Zda 0 +: 5 - __opcode '01100101 xx1xxxxx 001xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveSVE() then UNDEFINED; - if size == '00' then UNDEFINED; - integer esize = 8 << UInt(size); - integer g = UInt(Pg); - integer n = UInt(Zn); - integer m = UInt(Zm); - integer da = UInt(Zda); - boolean op1_neg = TRUE; - boolean op3_neg = FALSE; - - __execute - CheckSVEEnabled(); - integer elements = VL DIV esize; - bits(PL) mask = P[g]; - bits(VL) operand1 = Z[n]; - bits(VL) operand2 = Z[m]; - bits(VL) operand3 = Z[da]; - bits(VL) result; - - for e = 0 to elements-1 - bits(esize) element1 = Elem[operand1, e, esize]; - bits(esize) element2 = Elem[operand2, e, esize]; - bits(esize) element3 = Elem[operand3, e, esize]; - - if ElemP[mask, e, esize] == '1' then - if op1_neg then element1 = FPNeg(element1); - if op3_neg then element3 = FPNeg(element3); - Elem[result, e, esize] = FPMulAdd(element3, element1, element2, FPCR); - else - Elem[result, e, esize] = element3; - - Z[da] = result; - -__instruction aarch64_integer_logical_shiftedreg - __encoding aarch64_integer_logical_shiftedreg - __instruction_set A64 - __field sf 31 +: 1 - __field opc 29 +: 2 - __field shift 22 +: 2 - __field N 21 +: 1 - __field Rm 16 +: 5 - __field imm6 10 +: 6 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'xxx01010 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - integer datasize = if sf == '1' then 64 else 32; - boolean setflags; - LogicalOp op; - case opc of - when '00' op = LogicalOp_AND; setflags = FALSE; - when '01' op = LogicalOp_ORR; setflags = FALSE; - when '10' op = LogicalOp_EOR; setflags = FALSE; - when '11' op = LogicalOp_AND; setflags = TRUE; - - if sf == '0' && imm6[5] == '1' then UNDEFINED; - - ShiftType shift_type = DecodeShift(shift); - integer shift_amount = UInt(imm6); - boolean invert = (N == '1'); - - __execute - bits(datasize) operand1 = X[n]; - bits(datasize) operand2 = ShiftReg(m, shift_type, shift_amount); - - if invert then operand2 = NOT(operand2); - - case op of - when LogicalOp_AND result = operand1 AND operand2; - when LogicalOp_ORR result = operand1 OR operand2; - when LogicalOp_EOR result = operand1 EOR operand2; - - if setflags then - PSTATE.[N,Z,C,V] = result[datasize-1]:IsZeroBit(result):'00'; - - X[d] = result; - -__instruction aarch64_memory_vector_single_no_wb - __encoding aarch64_memory_vector_single_no_wb - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 0xx00000 xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = integer UNKNOWN; - boolean wback = FALSE; - boolean tag_checked = wback || n != 31; - - __encoding aarch64_memory_vector_single_post_inc - __instruction_set A64 - __field Q 30 +: 1 - __field L 22 +: 1 - __field R 21 +: 1 - __field Rm 16 +: 5 - __field opcode 13 +: 3 - __field S 12 +: 1 - __field size 10 +: 2 - __field Rn 5 +: 5 - __field Rt 0 +: 5 - __opcode '0x001101 1xxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer n = UInt(Rn); - integer m = UInt(Rm); - boolean wback = TRUE; - boolean tag_checked = wback || n != 31; - - __postdecode - integer scale = UInt(opcode[2:1]); - integer selem = UInt(opcode[0]:R) + 1; - boolean replicate = FALSE; - integer index; - - case scale of - when 3 - // load and replicate - if L == '0' || S == '1' then UNDEFINED; - scale = UInt(size); - replicate = TRUE; - when 0 - index = UInt(Q:S:size); // B[0-15] - when 1 - if size[0] == '1' then UNDEFINED; - index = UInt(Q:S:size[1]); // H[0-7] - when 2 - if size[1] == '1' then UNDEFINED; - if size[0] == '0' then - index = UInt(Q:S); // S[0-3] - else - if S == '1' then UNDEFINED; - index = UInt(Q); // D[0-1] - scale = 3; - - MemOp memop = if L == '1' then MemOp_LOAD else MemOp_STORE; - integer datasize = if Q == '1' then 128 else 64; - integer esize = 8 << scale; - __execute - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - bits(64) address; - bits(64) offs; - bits(128) rval; - bits(esize) element; - constant integer ebytes = esize DIV 8; - - if n == 31 then - CheckSPAlignment(); - address = SP[]; - else - address = X[n]; - - offs = Zeros(); - if replicate then - // load and replicate to all elements - for s = 0 to selem-1 - element = Mem[address + offs, ebytes, AccType_VEC]; - // replicate to fill 128- or 64-bit register - V[t] = Replicate(element, datasize DIV esize); - offs = offs + ebytes; - t = (t + 1) MOD 32; - else - // load/store one element per register - for s = 0 to selem-1 - rval = V[t]; - if memop == MemOp_LOAD then - // insert into one lane of 128-bit register - Elem[rval, index, esize] = Mem[address + offs, ebytes, AccType_VEC]; - V[t] = rval; - else // memop == MemOp_STORE - // extract from one lane of 128-bit register - Mem[address + offs, ebytes, AccType_VEC] = Elem[rval, index, esize]; - offs = offs + ebytes; - t = (t + 1) MOD 32; - - if wback then - if m != 31 then - offs = X[m]; - if n == 31 then - SP[] = address + offs; - else - X[n] = address + offs; - -__instruction aarch64_vector_arithmetic_unary_float_round_frint_32_64 - __encoding aarch64_vector_arithmetic_unary_float_round_frint_32_64 - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field sz 22 +: 1 - __field op 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 0x100001 111x10xx xxxxxxxx' - __guard TRUE - __decode - if !HaveFrintExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - - if sz:Q == '10' then UNDEFINED; - integer esize = 32 << UInt(sz); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - integer intsize = if op == '0' then 32 else 64; - FPRounding rounding = if U == '0' then FPRounding_ZERO else FPRoundingMode(FPCR); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - bits(esize) element; - - for e = 0 to elements-1 - element = Elem[operand, e, esize]; - Elem[result, e, esize] = FPRoundIntN(element, FPCR, rounding, intsize); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_unary_diff_neg_int_sisd - __encoding aarch64_vector_arithmetic_unary_diff_neg_int_sisd - __instruction_set A64 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x11110 xx100000 101110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size != '11' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = esize; - integer elements = 1; - boolean neg = (U == '1'); - - __encoding aarch64_vector_arithmetic_unary_diff_neg_int_simd - __instruction_set A64 - __field Q 30 +: 1 - __field U 29 +: 1 - __field size 22 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '0xx01110 xx100000 101110xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - - if size:Q == '110' then UNDEFINED; - integer esize = 8 << UInt(size); - integer datasize = if Q == '1' then 128 else 64; - integer elements = datasize DIV esize; - boolean neg = (U == '1'); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(datasize) operand = V[n]; - bits(datasize) result; - integer element; - - for e = 0 to elements-1 - element = SInt(Elem[operand, e, esize]); - if neg then - element = -element; - else - element = Abs(element); - Elem[result, e, esize] = element[esize-1:0]; - - V[d] = result; - -__instruction aarch64_vector_crypto_aes_round - __encoding aarch64_vector_crypto_aes_round - __instruction_set A64 - __field D 12 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01001110 00101000 010x10xx xxxxxxxx' - __guard TRUE - __decode - integer d = UInt(Rd); - integer n = UInt(Rn); - if !HaveAESExt() then UNDEFINED; - boolean decrypt = (D == '1'); - - __execute - AArch64.CheckFPAdvSIMDEnabled(); - - bits(128) operand1 = V[d]; - bits(128) operand2 = V[n]; - bits(128) result; - result = operand1 EOR operand2; - if decrypt then - result = AESInvSubBytes(AESInvShiftRows(result)); - else - result = AESSubBytes(AESShiftRows(result)); - - V[d] = result; - -__instruction aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla - __encoding aarch64_vector_arithmetic_binary_uniform_mat_mul_int_mla - __instruction_set A64 - __field U 29 +: 1 - __field Rm 16 +: 5 - __field B 11 +: 1 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode '01x01110 100xxxxx 1010x1xx xxxxxxxx' - __guard TRUE - __decode - if !HaveInt8MatMulExt() then UNDEFINED; - case B:U of - when '00' op1_unsigned = FALSE; op2_unsigned = FALSE; - when '01' op1_unsigned = TRUE; op2_unsigned = TRUE; - when '10' op1_unsigned = TRUE; op2_unsigned = FALSE; - when '11' UNDEFINED; - integer n = UInt(Rn); - integer m = UInt(Rm); - integer d = UInt(Rd); - - __execute - CheckFPAdvSIMDEnabled64(); - bits(128) operand1 = V[n]; - bits(128) operand2 = V[m]; - bits(128) addend = V[d]; - - V[d] = MatMulAdd(addend, operand1, operand2, op1_unsigned, op2_unsigned); - -__instruction aarch64_memory_literal_simdfp - __encoding aarch64_memory_literal_simdfp - __instruction_set A64 - __field opc 30 +: 2 - __field imm19 5 +: 19 - __field Rt 0 +: 5 - __opcode 'xx011100 xxxxxxxx xxxxxxxx xxxxxxxx' - __guard TRUE - __decode - integer t = UInt(Rt); - integer size; - bits(64) offset; - - case opc of - when '00' - size = 4; - when '01' - size = 8; - when '10' - size = 16; - when '11' - UNDEFINED; - - offset = SignExtend(imm19:'00', 64); - boolean tag_checked = FALSE; - - __execute - bits(64) address = PC[] + offset; - bits(size*8) data; - - if HaveMTEExt() then - SetTagCheckedInstruction(tag_checked); - - CheckFPAdvSIMDEnabled64(); - - data = Mem[address, size, AccType_VEC]; - V[t] = data; - -__instruction aarch64_integer_crc - __encoding aarch64_integer_crc - __instruction_set A64 - __field sf 31 +: 1 - __field Rm 16 +: 5 - __field C 12 +: 1 - __field sz 10 +: 2 - __field Rn 5 +: 5 - __field Rd 0 +: 5 - __opcode 'x0011010 110xxxxx 010xxxxx xxxxxxxx' - __guard TRUE - __decode - if !HaveCRCExt() then UNDEFINED; - integer d = UInt(Rd); - integer n = UInt(Rn); - integer m = UInt(Rm); - if sf == '1' && sz != '11' then UNDEFINED; - if sf == '0' && sz == '11' then UNDEFINED; - integer size = 8 << UInt(sz); // 2-bit size field -> 8, 16, 32, 64 - boolean crc32c = (C == '1'); - - __execute - bits(32) acc = X[n]; // accumulator - bits(size) val = X[m]; // input value - bits(32) poly = (if crc32c then 0x1EDC6F41 else 0x04C11DB7)[31:0]; - - bits(32+size) tempacc = BitReverse(acc) : Zeros(size); - bits(size+32) tempval = BitReverse(val) : Zeros(32); - - // Poly32Mod2 on a bitstring does a polynomial Modulus over {0,1} operation - X[d] = BitReverse(Poly32Mod2(tempacc EOR tempval, poly)); - -//////////////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////////////// diff --git a/mra_tools/arch/regs.asl b/mra_tools/arch/regs.asl deleted file mode 100644 index 73a5f7a9..00000000 --- a/mra_tools/arch/regs.asl +++ /dev/null @@ -1,2928 +0,0 @@ -//////////////////////////////////////////////////////////////////////// -// Proprietary Notice -// -// This document is protected by copyright and other related rights -// and the practice or implementation of the information contained in -// this document may be protected by one or more patents or pending -// patent applications. No part of this document may be reproduced in any -// form by any means without the express prior written permission of -// Arm. No license, express or implied, by estoppel or otherwise to -// any intellectual property rights is granted by this document unless -// specifically stated. -// -// Your access to the information in this document is conditional upon -// your acceptance that you will not use or permit others to use the -// information for the purposes of determining whether implementations -// infringe any third party patents. -// -// THIS DOCUMENT IS PROVIDED "AS IS". ARM PROVIDES NO REPRESENTATIONS -// AND NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT -// LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY -// QUALITY, NON-INFRINGEMENT OR FITNESS FOR A PARTICULAR PURPOSE WITH -// RESPECT TO THE DOCUMENT. For the avoidance of doubt, Arm makes no -// representation with respect to, and has undertaken no analysis to -// identify or understand the scope and content of, patents, copyrights, -// trade secrets, or other rights. -// -// This document may include technical inaccuracies or typographical -// errors. -// -// TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL ARM BE -// LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION ANY DIRECT, -// INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES, -// HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT -// OF ANY USE OF THIS DOCUMENT, EVEN IF ARM HAS BEEN ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGES. -// -// This document consists solely of commercial items. You shall be -// responsible for ensuring that any use, duplication or disclosure of -// this document complies fully with any relevant export laws and -// regulations to assure that this document or any portion thereof is not -// exported, directly or indirectly, in violation of such export -// laws. Use of the word "partner" in reference to Arm"s customers is not -// intended to create or refer to any partnership relationship with any -// other company. Arm may make changes to this document at any time and -// without notice. -// -// If any of the provisions contained in these terms conflict with -// any of the provisions of any click through or signed written agreement -// covering this document with Arm, then the click through or signed -// written agreement prevails over and supersedes the conflicting -// provisions of these terms. This document may be translated into other -// languages for convenience, and you agree that if there is any conflict -// between the English version of this document and any translation, the -// terms of the English version of the Agreement shall prevail. -// -// The Arm corporate logo and words marked with (R) or (TM) -// are registered trademarks or trademarks of Arm Limited (or its -// subsidiaries) in the US and/or elsewhere. All rights reserved. Other -// brands and names mentioned in this document may be the trademarks of -// their respective owners. Please follow Arm"s trademark usage -// guidelines at -// http://www.arm.com/company/policies/trademarks. -// -// Copyright (C) 2019 Arm Limited (or its affiliates). All rights reserved. -// -// Arm Limited. Company 02557590 registered in England. -// -// 110 Fulbourn Road, Cambridge, England CB1 9NJ. -// -// LES-PRE-20349 -//////////////////////////////////////////////////////////////////////// - -// CPU Interface Interrupt Acknowledge Register -__register 32 { 23:0 INTID } GICC_IAR; - -// Hyp Architectural Feature Trap Register -__register 32 { 31:31 TCPAC, 30:30 TAM, 20:20 TTA, 15:15 TASE, 11:11 TCP11, 10:10 TCP10 } HCPTR; - -// Interrupt Controller Software Generated Interrupt Group 0 Register -__register 64 { 55:48 Aff3, 47:44 RS, 40:40 IRM, 39:32 Aff2, 27:24 INTID, 23:16 Aff1, 15:0 TargetList } ICC_SGI0R; - -// Pointer Authentication Key A for Code (bits[63:0]) -__register 64 { } APGAKeyLo_EL1; - -// Counter Control Register -__register 32 { 17:8 FCREQ, 2:2 SCEN, 1:1 HDBG, 0:0 EN } CNTCR; - -// Activity Monitors Event Counter Registers 1 -array [0..15] of __register 64 { 63:0 ACNT } AMEVCNTR1; - -// Interrupt Controller Running Priority Register -__register 32 { 7:0 Priority } ICC_RPR_EL1; - -// Counter-timer Virtual Timer TimerValue -__register 32 { 31:0 TimerValue } CNTV_TVAL; - -// Data Independent Timing -__register 32 { 24:24 DIT } DIT; - -// External Debug Peripheral Identification Register 2 -__register 32 { 7:4 REVISION, 3:3 JEDEC, 2:0 DES_1 } EDPIDR2; - -// Monitor DCC Status Register -__register 32 { 30:30 RXfull, 29:29 TXfull } MDCCSR_EL0; - -// Hypervisor Configuration Register -__register 64 { 63:60 TWEDEL, 59:59 TWEDEn, 58:58 TID5, 57:57 DCT, 56:56 ATA, 55:55 TTLBOS, 54:54 TTLBIS, 53:53 EnSCXT, 52:52 TOCU, 51:51 AMVOFFEN, 50:50 TICAB, 49:49 TID4, 47:47 FIEN, 46:46 FWB, 45:45 NV2, 44:44 AT, 43:43 NV1, 42:42 NV, 41:41 API, 40:40 APK, 38:38 MIOCNCE, 37:37 TEA, 36:36 TERR, 35:35 TLOR, 34:34 E2H, 33:33 ID, 32:32 CD, 31:31 RW, 30:30 TRVM, 29:29 HCD, 28:28 TDZ, 27:27 TGE, 26:26 TVM, 25:25 TTLB, 24:24 TPU, 23:23 TPCP, 23:23 TPC, 22:22 TSW, 21:21 TACR, 20:20 TIDCP, 19:19 TSC, 18:18 TID3, 17:17 TID2, 16:16 TID1, 15:15 TID0, 14:14 TWE, 13:13 TWI, 12:12 DC, 11:10 BSU, 9:9 FB, 8:8 VSE, 7:7 VI, 6:6 VF, 5:5 AMO, 4:4 IMO, 3:3 FMO, 2:2 PTW, 1:1 SWIO, 0:0 VM } HCR_EL2; - -// Debug Status and Control Register, Internal View -__register 32 { 30:30 RXfull, 29:29 TXfull, 18:18 NS, 17:17 SPNIDdis, 16:16 SPIDdis, 15:15 MDBGen, 12:12 UDCCdis, 5:2 MOE } DBGDSCRint; - -// Auxiliary Fault Status Register 1 (EL2) -__register 32 { } AFSR1_EL2; - -// Reset Management Register (EL1) -__register 32 { 1:1 RR, 0:0 AA64 } RMR_EL1; - -// Secure Debug Control Register -__register 32 { 28:28 MTPME, 27:27 TDCC, 23:23 SCCD, 21:21 EPMAD, 20:20 EDAD, 19:19 TTRF, 18:18 STE, 17:17 SPME, 15:14 SPD } SDCR; - -// Floating-Point Exception Control register -__register 32 { 31:31 EX, 30:30 EN, 29:29 DEX, 28:28 FP2V, 27:27 VV, 26:26 TFV, 10:8 VECITR, 7:7 IDF, 4:4 IXF, 3:3 UFF, 2:2 OFF, 1:1 DZF, 0:0 IOF } FPEXC; - -// Virtual Redistributor Properties Base Address Register -__register 64 { 58:56 OuterCache, 51:12 Physical_Address, 11:10 Shareability, 9:7 InnerCache, 4:0 IDbits, 63:63 Valid, 61:59 Entry_Size, 55:55 Indirect, 54:53 Page_Size, 52:52 Z, 6:0 Size } GICR_VPROPBASER; - -// Architectural Feature Access Control Register -__register 32 { 28:28 TTA, 21:20 FPEN, 17:16 ZEN } CPACR_EL1; - -// Counter-timer Virtual Timer CompareValue register (EL2) -__register 64 { 63:0 CompareValue } CNTHV_CVAL; - -// Performance Monitors Peripheral Identification Register 4 -__register 32 { 7:4 SIZE, 3:0 DES_2 } PMPIDR4; - -// Processor Feature Register 1 -__register 32 { 31:28 GIC, 27:24 Virt_frac, 23:20 Sec_frac, 19:16 GenTimer, 15:12 Virtualization, 11:8 MProgMod, 7:4 Security, 3:0 ProgMod } ID_PFR1; - -// AArch64 Debug Feature Register 1 -__register 64 { } ID_AA64DFR1_EL1; - -// Interrupt Controller Virtual Interrupt Group 0 Enable register -__register 32 { 0:0 Enable } ICV_IGRPEN0_EL1; - -// Hypervisor Fine-Grained Instruction Trap Register -__register 64 { 54:54 DCCVAC, 53:53 SVC_EL1, 52:52 SVC_EL0, 51:51 ERET, 50:50 CPPRCTX, 49:49 DVPRCTX, 48:48 CFPRCTX, 47:47 TLBIVAALE1, 46:46 TLBIVALE1, 45:45 TLBIVAAE1, 44:44 TLBIASIDE1, 43:43 TLBIVAE1, 42:42 TLBIVMALLE1, 41:41 TLBIRVAALE1, 40:40 TLBIRVALE1, 39:39 TLBIRVAAE1, 38:38 TLBIRVAE1, 37:37 TLBIRVAALE1IS, 36:36 TLBIRVALE1IS, 35:35 TLBIRVAAE1IS, 34:34 TLBIRVAE1IS, 33:33 TLBIVAALE1IS, 32:32 TLBIVALE1IS, 31:31 TLBIVAAE1IS, 30:30 TLBIASIDE1IS, 29:29 TLBIVAE1IS, 28:28 TLBIVMALLE1IS, 27:27 TLBIRVAALE1OS, 26:26 TLBIRVALE1OS, 25:25 TLBIRVAAE1OS, 24:24 TLBIRVAE1OS, 23:23 TLBIVAALE1OS, 22:22 TLBIVALE1OS, 21:21 TLBIVAAE1OS, 20:20 TLBIASIDE1OS, 19:19 TLBIVAE1OS, 18:18 TLBIVMALLE1OS, 17:17 ATS1E1WP, 16:16 ATS1E1RP, 15:15 ATS1E0W, 14:14 ATS1E0R, 13:13 ATS1E1W, 12:12 ATS1E1R, 11:11 DCZVA, 10:10 DCCIVAC, 9:9 DCCVADP, 8:8 DCCVAP, 7:7 DCCVAU, 6:6 DCCISW, 5:5 DCCSW, 4:4 DCISW, 3:3 DCIVAC, 2:2 ICIVAU, 1:1 ICIALLU, 0:0 ICIALLUIS } HFGITR_EL2; - -// EL1 Read/Write Software Context Number -__register 64 { } SCXTNUM_EL1; - -// CTI Trigger In Status register -__register 32 { } CTITRIGINSTATUS; - -// LORegion Number (EL1) -__register 64 { 7:0 Num } LORN_EL1; - -// Performance Monitors Overflow Flag Status Clear Register -__register 32 { 31:31 C } PMOVSCLR_EL0; - -// Virtual Deferred Interrupt Status Register -__register 64 { 31:31 A, 24:24 IDS, 23:0 ISS, 15:14 AET, 12:12 ExT, 9:9 LPAE, 5:0 STATUS, 10:10, 3:0 FS } VDISR_EL2; - -// Hyp System Trap Register -__register 32 { } HSTR; - -// Redistributor Implementer Identification Register -__register 32 { 31:24 ProductID, 19:16 Variant, 15:12 Revision, 11:0 Implementer } GICR_IIDR; - -// Counter-timer Virtual Timer CompareValue register (EL2) -__register 64 { 63:0 CompareValue } CNTHV_CVAL_EL2; - -// Hypervisor IPA Fault Address Register -__register 64 { 63:63 NS, 43:40, 39:4 FIPA } HPFAR_EL2; - -// Counter-timer Physical Count register -__register 64 { } CNTPCT; - -// MPAM Memory System Monitor Configure Cache Storage Usage Monitor Control Register -__register 32 { 31:31 EN, 30:28 CAPT_EVNT, 27:27 CAPT_RESET, 26:26 OFLOW_STATUS, 25:25 OFLOW_INTR, 24:24 OFLOW_FRZ, 23:20 SUBTYPE, 17:17 MATCH_PMG, 16:16 MATCH_PARTID, 7:0 TYPE } MSMON_CFG_CSU_CTL; - -// Activity Monitors Control Register -__register 32 { 10:10 HDBG, 17:17 CG1RZ } AMCR; - -// Performance Monitors Overflow Flag Status Register -__register 32 { 31:31 C } PMOVSR; - -// Application Program Status Register -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 19:16 GE } APSR; - -// Performance Monitors Peripheral Identification Register 3 -__register 32 { 7:4 REVAND, 3:0 CMOD } PMPIDR3; - -// CTI Device ID register 2 -__register 32 { } CTIDEVID2; - -// LORegion Start Address (EL1) -__register 64 { 0:0 Valid, 51:48, 47:16 SA } LORSA_EL1; - -// ITS Translation Table Descriptors -array [0..7] of __register 64 { 63:63 Valid, 62:62 Indirect, 61:59 InnerCache, 58:56 Type, 55:53 OuterCache, 52:48 Entry_Size, 47:12 Physical_Address, 11:10 Shareability, 9:8 Page_Size, 7:0 Size } GITS_BASER; - -// Activity Monitors Count Enable Set Register 0 -__register 32 { } AMCNTENSET0; - -// Performance Monitors Event Type Registers -array [0..30] of __register 64 { 31:31 P, 30:30 U, 29:29 NSK, 28:28 NSU, 27:27 NSH, 26:26 M, 25:25 MT, 24:24 SH, 15:10, 9:0 evtCount } PMEVTYPER_EL0; - -// Main ID Register -__register 32 { 31:24 Implementer, 23:20 Variant, 19:16 Architecture, 15:4 PartNum, 3:0 Revision } MIDR_EL1; - -// Counter-timer Physical Timer CompareValue register -__register 64 { 63:0 CompareValue } CNTP_CVAL; - -// Counter-timer Physical Timer TimerValue register -__register 32 { 31:0 TimerValue } CNTP_TVAL; - -// Virtual Machine Interrupt Acknowledge Register -__register 32 { 24:0 INTID } GICV_IAR; - -// Fault-Handling Interrupt Configuration Register 1 -__register 32 { 31:0 DATA } ERRFHICR1; - -// Interrupt Set-Pending Registers -array [1..2] of __register 32 { } GICR_ISPENDRE; - -// Auxiliary ID Register -__register 32 { } AIDR; - -// Saved Program Status Register (EL1) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 DIT, 12:12 SSBS, 22:22 PAN, 21:21 SS, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 25:25 TCO, 23:23 UAO, 11:10 BTYPE, 9:9 D, 15:10, 26:25 IT, 4:4, 4:4, 3:0, 3:0 M } SPSR_EL1; - -// Debug OS Lock Exception Catch Control Register -__register 32 { 31:0 EDECCR } DBGOSECCR; - -// ITS Control Register -__register 32 { 31:31 Quiescent, 7:4 ITS_Number, 1:1 ImDe, 0:0 Enabled } GITS_CTLR; - -// Reset Management Register (EL2) -__register 32 { 1:1 RR, 0:0 AA64 } RMR_EL2; - -// Performance Monitors Interrupt Enable Set register -__register 32 { 31:31 C } PMINTENSET; - -// Hyp Trace Filter Control Register -__register 32 { 6:5 TS, 3:3 CX, 1:1 E2TRE, 0:0 E0HTRE } HTRFCR; - -// AArch32 Media and VFP Feature Register 0 -__register 32 { 31:28 FPRound, 27:24 FPShVec, 23:20 FPSqrt, 19:16 FPDivide, 15:12 FPTrap, 11:8 FPDP, 7:4 FPSP, 3:0 SIMDReg } MVFR0_EL1; - -// Speculative Store Bypass Safe -__register 32 { 12:12 SSBS } SSBS; - -// Saved Program Status Register (IRQ mode) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 J, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:0 M } SPSR_irq; - -// Cache Size Selection Register -__register 32 { 3:1 Level, 0:0 InD } CSSELR; - -// Interrupt Controller Virtual Active Priorities Group 1 Registers -array [0..3] of __register 64 { } ICV_AP1R_EL1; - -// MPAM Cache Storage Usage Monitor Register -__register 32 { 31:31 NRDY, 30:0 VALUE } MSMON_CSU; - -// Activity Monitors Event Type Registers 0 -array [0..15] of __register 32 { 15:0 evtCount } AMEVTYPER0; - -// AArch64 Memory Model Feature Register 1 -__register 64 { 39:36 ETS, 35:32 TWED, 31:28 XNX, 27:24 SpecSEI, 23:20 PAN, 19:16 LO, 15:12 HPDS, 11:8 VH, 7:4 VMIDBits, 3:0 HAFDBS } ID_AA64MMFR1_EL1; - -// Counter Frequency ID -__register 32 { 31:0 Frequency } CNTFID0; - -// Interrupt Controller Virtual Highest Priority Pending Interrupt Register 0 -__register 32 { 23:0 INTID } ICV_HPPIR0; - -// Interrupt Controller Control Register (EL3) -__register 32 { 19:19 ExtRange, 18:18 RSS, 17:17 nDS, 15:15 A3V, 14:14 SEIS, 13:11 IDbits, 10:8 PRIbits, 6:6 PMHE, 5:5 RM, 4:4 EOImode_EL1NS, 3:3 EOImode_EL1S, 2:2 EOImode_EL3, 1:1 CBPR_EL1NS, 0:0 CBPR_EL1S } ICC_CTLR_EL3; - -// Selected Error Record Address Register -__register 32 { } ERXADDR; - -// Interrupt Controller Virtual Machine Control Register -__register 32 { 31:24 VPMR, 23:21 VBPR0, 20:18 VBPR1, 9:9 VEOIM, 4:4 VCBPR, 3:3 VFIQEn, 2:2 VAckCtl, 1:1 VENG1, 0:0 VENG0 } ICH_VMCR_EL2; - -// MPAM Virtual Partition Mapping Valid Register -__register 64 { } MPAMVPMV_EL2; - -// Interrupt Controller End Of Interrupt Register 1 -__register 32 { 23:0 INTID } ICC_EOIR1; - -// Interrupt Controller Monitor Interrupt Group 1 Enable register -__register 32 { 1:1 EnableGrp1S, 0:0 EnableGrp1NS } ICC_MGRPEN1; - -// CPU Interface End Of Interrupt Register -__register 32 { 23:0 INTID } GICC_EOIR; - -// Error Interrupt Status Register -__register 64 { 5:5 CRIERR, 4:4 CRI, 3:3 ERIERR, 2:2 ERI, 1:1 FHIERR, 0:0 FHI } ERRIRQSR; - -// Virtualization Secure Translation Control Register -__register 32 { 30:30 SA, 29:29 SW, 15:14 TG0, 7:6 SL0, 5:0 T0SZ } VSTCR_EL2; - -// Selected Error Record Miscellaneous Register 3 -__register 64 { } ERXMISC3_EL1; - -// EL0 Read/Write Software Context Number -__register 64 { } SCXTNUM_EL0; - -// PL0 Read/Write Software Thread ID Register -__register 32 { } TPIDRURW; - -// Critical Error Interrupt Configuration Register 2 -__register 32 { 7:7 IRQEN, 6:6 NSMSI, 5:4 SH, 3:0 MemAttr } ERRCRICR2; - -// Clear Secure SPI Pending Register -__register 32 { 12:0 INTID } GICD_CLRSPI_SR; - -// Virtualization Processor ID Register -__register 32 { 31:24 Implementer, 23:20 Variant, 19:16 Architecture, 15:4 PartNum, 3:0 Revision } VPIDR_EL2; - -// Selected Error Record Miscellaneous Register 1 -__register 64 { } ERXMISC1_EL1; - -// AArch32 Memory Model Feature Register 5 -__register 64 { 3:0 ETS } ID_MMFR5_EL1; - -// Tag Fault Status Register (EL1) -__register 64 { 1:1 TF1, 0:0 TF0 } TFSR_EL1; - -// AArch32 Processor Feature Register 1 -__register 32 { 31:28 GIC, 27:24 Virt_frac, 23:20 Sec_frac, 19:16 GenTimer, 15:12 Virtualization, 11:8 MProgMod, 7:4 Security, 3:0 ProgMod } ID_PFR1_EL1; - -// CTI Lock Access Register -__register 32 { 31:0 KEY } CTILAR; - -// Maintenance Interrupt Status Register -__register 32 { 7:7 VGrp1D, 6:6 VGrp1E, 5:5 VGrp0D, 4:4 VGrp0E, 3:3 NP, 2:2 LRENP, 1:1 U, 0:0 EOI } GICH_MISR; - -// Reset Vector Base Address Register (if EL2 and EL3 not implemented) -__register 64 { } RVBAR_EL1; - -// Performance Monitors Machine Identification Register -__register 32 { 7:0 SLOTS } PMMIR; - -// MPAM Memory Bandwidth Proportional Stride Partition Configuration Register -__register 32 { 31:31 EN, 15:0 STRIDEM1 } MPAMCFG_MBW_PROP; - -// Hypervisor Fine-Grained Write Trap Register -__register 64 { 49:49 ERXADDR_EL1, 48:48 ERXPFGCDN_EL1, 47:47 ERXPFGCTL_EL1, 45:45 ERXMISCn_EL1, 44:44 ERXSTATUS_EL1, 43:43 ERXCTLR_EL1, 41:41 ERRSELR_EL1, 39:39 ICC_IGRPENn_EL1, 38:38 VBAR_EL1, 37:37 TTBR1_EL1, 36:36 TTBR0_EL1, 35:35 TPIDR_EL0, 34:34 TPIDRRO_EL0, 33:33 TPIDR_EL1, 32:32 TCR_EL1, 31:31 SCXTNUM_EL0, 30:30 SCXTNUM_EL1, 29:29 SCTLR_EL1, 27:27 PAR_EL1, 24:24 MAIR_EL1, 23:23 LORSA_EL1, 22:22 LORN_EL1, 20:20 LOREA_EL1, 19:19 LORC_EL1, 17:17 FAR_EL1, 16:16 ESR_EL1, 13:13 CSSELR_EL1, 12:12 CPACR_EL1, 11:11 CONTEXTIDR_EL1, 8:8 APIBKey, 7:7 APIAKey, 6:6 APGAKey, 5:5 APDBKey, 4:4 APDAKey, 3:3 AMAIR_EL1, 1:1 AFSR1_EL1, 0:0 AFSR0_EL1 } HFGWTR_EL2; - -// Interrupt Controller Binary Point Register 1 -__register 32 { 2:0 BinaryPoint } ICC_BPR1; - -// Activity Monitors Count Enable Clear Register 1 -__register 32 { } AMCNTENCLR1; - -// Hypervisor Debug Fine-Grained Read Trap Register -__register 64 { 58:58 PMCEIDn_EL0, 57:57 PMUSERENR_EL0, 48:48 TRCVICTLR, 47:47 TRCSTATR, 46:46 TRCSSCSRn, 45:45 TRCSEQSTR, 44:44 TRCPRGCTLR, 43:43 TRCOSLSR, 41:41 TRCIMSPECn, 40:40 TRCID, 37:37 TRCCNTVRn, 36:36 TRCCLAIM, 35:35 TRCAUXCTLR, 34:34 TRCAUTHSTATUS, 33:33 TRC, 32:32 PMSLATFR_EL1, 31:31 PMSIRR_EL1, 30:30 PMSIDR_EL1, 29:29 PMSICR_EL1, 28:28 PMSFCR_EL1, 27:27 PMSEVFR_EL1, 26:26 PMSCR_EL1, 25:25 PMBSR_EL1, 24:24 PMBPTR_EL1, 23:23 PMBLIMITR_EL1, 22:22 PMMIR_EL1, 19:19 PMSELR_EL0, 18:18 PMOVS, 17:17 PMINTEN, 16:16 PMCNTEN, 15:15 PMCCNTR_EL0, 14:14 PMCCFILTR_EL0, 13:13 PMEVTYPERn_EL0, 12:12 PMEVCNTRn_EL0, 11:11 OSDLR_EL1, 10:10 OSECCR_EL1, 9:9 OSLSR_EL1, 7:7 DBGPRCR_EL1, 6:6 DBGAUTHSTATUS_EL1, 5:5 DBGCLAIM, 4:4 MDSCR_EL1, 3:3 DBGWVRn_EL1, 2:2 DBGWCRn_EL1, 1:1 DBGBVRn_EL1, 0:0 DBGBCRn_EL1 } HDFGRTR_EL2; - -// Architectural Feature Access Control Register -__register 32 { 31:31 ASEDIS, 28:28 TRCDIS, 23:22 cp11, 21:20 cp10 } CPACR; - -// Translation Control Register (EL3) -__register 32 { 30:30 TCMA, 29:29 TBID, 28:28 HWU62, 27:27 HWU61, 26:26 HWU60, 25:25 HWU59, 24:24 HPD, 22:22 HD, 21:21 HA, 20:20 TBI, 18:16 PS, 15:14 TG0, 13:12 SH0, 11:10 ORGN0, 9:8 IRGN0, 5:0 T0SZ } TCR_EL3; - -// Debug Breakpoint Value Registers -array [0..15] of __register 32 { 31:0 ContextID, 31:2 VA } DBGBVR; - -// Interrupt Controller Virtual Control Register -__register 32 { 19:19 ExtRange, 18:18 RSS, 15:15 A3V, 14:14 SEIS, 13:11 IDbits, 10:8 PRIbits, 1:1 EOImode, 0:0 CBPR } ICV_CTLR; - -// Hypervisor System Trap Register -__register 32 { } HSTR_EL2; - -// Activity Monitors Event Type Registers 0 -array [0..15] of __register 64 { 15:0 evtCount } AMEVTYPER0_EL0; - -// Generic Error Interrupt Configuration Register -array [0..15] of __register 64 { } ERRIRQCR; - -// Counter-timer Hypervisor Control register -__register 32 { 17:17 EVNTIS, 16:16 EL1NVVCT, 15:15 EL1NVPCT, 14:14 EL1TVCT, 13:13 EL1TVT, 12:12 ECV, 11:11 EL1PTEN, 0:0 EL1PCTEN, 9:9 EL0PTEN, 8:8 EL0VTEN, 7:4 EVNTI, 3:3 EVNTDIR, 2:2 EVNTEN, 1:1 EL0VCTEN, 0:0 EL0PCTEN, 1:1 EL1PCEN } CNTHCTL_EL2; - -// Error Record Control Register -array [0..65534] of __register 64 { 13:13 CI, 11:11 WDUI, 10:10 DUI, 10:10 RDUI, 9:9 WCFI, 8:8 CFI, 8:8 RCFI, 7:7 WUE, 6:6 WFI, 5:5 WUI, 4:4 UE, 4:4 RUE, 3:3 FI, 3:3 RFI, 2:2 UI, 2:2 RUI, 0:0 ED } ERRCTLR; - -// Profiling Buffer ID Register -__register 64 { 5:5 F, 4:4 P, 3:0 Align } PMBIDR_EL1; - -// Error Record Address Register -array [0..65534] of __register 64 { 63:63 NS, 62:62 SI, 61:61 AI, 60:60 VA, 55:0 PADDR } ERRADDR; - -// MPAM Cache Portion Bitmap Partition Configuration Register -__register 32768 { } MPAMCFG_CPBM; - -// OS Lock Data Transfer Register, Receive -__register 32 { } OSDTRRX_EL1; - -// Activity Monitors Implementation Identification Register -__register 32 { 31:20 ProductID, 19:16 Variant, 15:12 Revision, 11:0 Implementer } AMIIDR; - -// MPAM Memory Bandwidth Usage Monitor Capture Register -__register 32 { 31:31 NRDY, 30:0 VALUE } MSMON_MBWU_CAPTURE; - -// Performance Monitors Component Identification Register 1 -__register 32 { 7:4 CLASS, 3:0 PRMBL_1 } PMCIDR1; - -// Debug Saved Program Status Register -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 DIT, 12:12 SSBS, 22:22 PAN, 21:21 SS, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 25:25 TCO, 23:23 UAO, 11:10 BTYPE, 9:9 D, 15:10, 26:25 IT, 4:4, 4:4, 3:0, 3:0 M } DSPSR_EL0; - -// CONTEXTIDR_EL1 Sample Register -__register 32 { 31:0 CONTEXTIDR_EL1 } PMCID1SR; - -// Counter-timer Hyp Physical CompareValue register -__register 64 { 63:0 CompareValue } CNTHP_CVAL; - -// Interrupt Controller Interrupt Priority Mask Register -__register 32 { 7:0 Priority } ICC_PMR_EL1; - -// Auxiliary Memory Attribute Indirection Register 0 -__register 32 { } AMAIR0; - -// Current Cache Size ID Register -__register 32 { 27:13 NumSets, 12:3 Associativity, 2:0 LineSize } CCSIDR_EL1; - -// AArch32 Instruction Set Attribute Register 0 -__register 32 { 27:24 Divide, 23:20 Debug, 19:16 Coproc, 15:12 CmpBranch, 11:8 BitField, 7:4 BitCount, 3:0 Swap } ID_ISAR0_EL1; - -// Performance Monitors Peripheral Identification Register 2 -__register 32 { 7:4 REVISION, 3:3 JEDEC, 2:0 DES_1 } PMPIDR2; - -// MPAM Cache Maximum Capacity Partition Configuration Register -__register 32 { 15:0 MIN } MPAMCFG_MBW_MIN; - -// Interrupt Controller Control Register (EL1) -__register 32 { 19:19 ExtRange, 18:18 RSS, 15:15 A3V, 14:14 SEIS, 13:11 IDbits, 10:8 PRIbits, 6:6 PMHE, 1:1 EOImode, 0:0 CBPR } ICC_CTLR_EL1; - -// Trace Filter Control Register (EL2) -__register 64 { 6:5 TS, 3:3 CX, 1:1 E2TRE, 0:0 E0HTRE } TRFCR_EL2; - -// Hyp Auxiliary Memory Attribute Indirection Register 1 -__register 32 { } HAMAIR1; - -// Trace Filter Control Register -__register 32 { 6:5 TS, 1:1 E1TRE, 0:0 E0TRE } TRFCR; - -// CTI Authentication Status register -__register 32 { 3:2 NSNID, 1:0 NSID } CTIAUTHSTATUS; - -// AArch32 Processor Feature Register 2 -__register 32 { 11:8 RAS_frac, 7:4 SSBS, 3:0 CSV3 } ID_PFR2_EL1; - -// Peripheral Identification Register 3 -__register 32 { 7:4 REVAND, 3:0 CMOD, 7:4 REVISION } ERRPIDR3; - -// Component Identification Register 3 -__register 32 { 7:0 PRMBL_3 } ERRCIDR3; - -// Auxiliary Control Register (EL3) -__register 64 { } ACTLR_EL3; - -// Current Cache Size ID Register 2 -__register 32 { 23:0 NumSets } CCSIDR2; - -// Interrupt Controller Hyp Control Register -__register 32 { 31:27 EOIcount, 14:14 TDIR, 13:13 TSEI, 12:12 TALL1, 11:11 TALL0, 10:10 TC, 8:8 vSGIEOICount, 7:7 VGrp1DIE, 6:6 VGrp1EIE, 5:5 VGrp0DIE, 4:4 VGrp0EIE, 3:3 NPIE, 2:2 LRENPIE, 1:1 UIE, 0:0 En } ICH_HCR_EL2; - -// Interrupt Controller Empty List Register Status Register -__register 32 { } ICH_ELRSR_EL2; - -// Interrupt Group Registers (extended SPI range) -array [0..31] of __register 32 { } GICD_IGROUPRE; - -// Activity Monitors Device Affinity Register 1 -__register 32 { 31:0 MPIDR_EL1hi } AMDEVAFF1; - -// Instruction Fault Status Register -__register 32 { 16:16 FnV, 12:12 ExT, 9:9 LPAE, 5:0 STATUS, 10:10, 3:0 FS } IFSR; - -// Activity Monitors Event Counter Registers 1 -array [0..15] of __register 64 { 63:0 ACNT } AMEVCNTR1_EL0; - -// Virtual Deferred Interrupt Status Register -__register 32 { 31:31 A, 15:14 AET, 12:12 ExT, 9:9 LPAE, 5:0 STATUS, 10:10, 3:0 FS } VDISR; - -// PL0 Read-Only Software Thread ID Register -__register 32 { } TPIDRURO; - -// Counter-timer Virtual Timer Control -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTV_CTL; - -// Redistributor Control Register -__register 32 { 31:31 UWP, 26:26 DPG1S, 25:25 DPG1NS, 24:24 DPG0, 3:3 RWP, 1:1 CES, 0:0 EnableLPIs } GICR_CTLR; - -// Counter-timer Virtual Timer TimerValue register (EL2) -__register 32 { 31:0 TimerValue } CNTHV_TVAL; - -// Sampling Event Filter Register -__register 64 { 63:63, 62:62, 61:61, 60:60, 59:59, 58:58, 57:57, 56:56, 55:55, 54:54, 53:53, 52:52, 51:51, 50:50, 49:49, 48:48, 31:31, 30:30, 29:29, 28:28, 27:27, 26:26, 25:25, 24:24, 18:18, 17:17, 15:15, 14:14, 13:13, 12:12, 11:11, 7:7, 5:5, 3:3, 1:1 E } PMSEVFR_EL1; - -// Implementation Identification Register -__register 32 { 31:20 ProductID, 19:16 Variant, 15:12 Revision, 11:0 Implementer } ERRIIDR; - -// Interrupt Status Register -__register 32 { 8:8 A, 7:7 I, 6:6 F } ISR; - -// Holds the priority of the corresponding interrupt for each extended SPI supported by the GIC. -array [0..255] of __register 32 { 31:24 Priority_offset_3B, 23:16 Priority_offset_2B, 15:8 Priority_offset_1B, 7:0 Priority_offset_0B } GICD_IPRIORITYRE; - -// CPU Interface Status Register -__register 32 { 4:4 ASV, 3:3 WROD, 2:2 RWOD, 1:1 WRD, 0:0 RRD } GICC_STATUSR; - -// MPAM Internal PARTID Narrowing Configuration Register -__register 32 { 16:16 INTERNAL, 15:0 INTPARTID } MPAMCFG_INTPARTID; - -// External Debug Execution Control Register -__register 32 { 2:2 SS, 1:1 RCE, 0:0 OSUCE } EDECR; - -// Profiling Buffer Status/syndrome Register -__register 64 { 31:26 EC, 19:19 DL, 18:18 EA, 17:17 S, 16:16 COLL, 15:0 MSS } PMBSR_EL1; - -// Counter-timer Secure Physical Timer TimerValue register (EL2) -__register 32 { 31:0 TimerValue } CNTHPS_TVAL_EL2; - -// CTI Component Identification Register 3 -__register 32 { 7:0 PRMBL_3 } CTICIDR3; - -// CTI Peripheral Identification Register 3 -__register 32 { 7:4 REVAND, 3:0 CMOD } CTIPIDR3; - -// Instruction Set Attribute Register 6 -__register 32 { 27:24 I8MM, 23:20 BF16, 19:16 SPECRES, 15:12 SB, 11:8 FHM, 7:4 DP, 3:0 JSCVT } ID_ISAR6; - -// CTI Device Affinity register 0 -__register 32 { 31:0 MPIDR_EL1lo } CTIDEVAFF0; - -// AArch32 Secure Debug Enable Register -__register 32 { 1:1 SUNIDEN, 0:0 SUIDEN } SDER32_EL3; - -// Counter-timer Hyp Control register -__register 32 { 17:17 EVNTIS, 7:4 EVNTI, 3:3 EVNTDIR, 2:2 EVNTEN, 1:1 PL1PCEN, 0:0 PL1PCTEN } CNTHCTL; - -// Interrupt Controller Virtual End Of Interrupt Register 1 -__register 32 { 23:0 INTID } ICV_EOIR1_EL1; - -// Performance Monitors Overflow Flag Status Set register -__register 32 { 31:31 C } PMOVSSET_EL0; - -// Debug Self Address Register -__register 64 { } DBGDSAR; - -// Pointer Authentication Key B for Data (bits[63:0]) -__register 64 { } APDBKeyLo_EL1; - -// Counter-timer Virtual Timer CompareValue register -__register 64 { 63:0 CompareValue } CNTV_CVAL; - -// External Debug AArch32 Processor Feature Register -__register 64 { 15:12 EL3, 11:8 EL2, 7:4 PMSA, 3:0 VMSA } EDAA32PFR; - -// Hyp Memory Attribute Indirection Register 0 -__register 32 { } HMAIR0; - -// Saved Program Status Register -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 J, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:4, 3:0 M } SPSR; - -// Interrupt Group Registers -array [0..31] of __register 32 { } GICD_IGROUPR; - -// External Debug Power/Reset Control Register -__register 32 { 1:1 CWRR, 0:0 CORENPDRQ, 3:3 COREPURQ } EDPRCR; - -// Virtual Machine Aliased Interrupt Acknowledge Register -__register 32 { 24:0 INTID } GICV_AIAR; - -// Non-secure Access Control Registers -array [0..63] of __register 32 { } GICD_NSACR; - -// Statistical Profiling Control Register (EL2) -__register 64 { 7:6 PCT, 5:5 TS, 4:4 PA, 3:3 CX, 1:1 E2SPE, 0:0 E0HSPE } PMSCR_EL2; - -// Counter-timer Hypervisor Physical Timer Control register -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTHP_CTL_EL2; - -// Profiling Buffer Limit Address Register -__register 64 { 63:12 LIMIT, 2:1 FM, 0:0 E } PMBLIMITR_EL1; - -// Activity Monitors Event Counter Virtual Offset Registers 1 -array [0..15] of __register 64 { } AMEVCNTVOFF1_EL2; - -// Memory Model Feature Register 5 -__register 32 { 3:0 ETS } ID_MMFR5; - -// Memory Model Feature Register 4 -__register 32 { 31:28 EVT, 27:24 CCIDX, 23:20 LSM, 19:16 HPDS, 15:12 CnP, 11:8 XNX, 7:4 AC2, 3:0 SpecSEI } ID_MMFR4; - -// Activity Monitors Count Enable Clear Register 0 -__register 32 { } AMCNTENCLR0; - -// Interrupt Clear-Enable Registers -array [0..31] of __register 32 { } GICD_ICENABLERE; - -// Interrupt Configuration Register 1 -__register 32 { } GICR_ICFGR1; - -// Counter-timer Virtual Timer Control register -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTV_CTL_EL0; - -// Interrupt Controller Virtual Binary Point Register 0 -__register 32 { 2:0 BinaryPoint } ICV_BPR0_EL1; - -// Saved Program Status Register (FIQ mode) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 J, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:0 M } SPSR_fiq; - -// Hyp Configuration Register 2 -__register 32 { 22:22 TTLBIS, 20:20 TOCU, 18:18 TICAB, 17:17 TID4, 6:6 MIOCNCE, 5:5 TEA, 4:4 TERR, 1:1 ID, 0:0 CD } HCR2; - -// Data Fault Address Register -__register 32 { } DFAR; - -// Debug CLAIM Tag Clear register -__register 32 { 7:0 CLAIM } DBGCLAIMCLR; - -// Hyp Software Thread ID Register -__register 32 { } HTPIDR; - -// Pointer Authentication Key B for Data (bits[127:64]) -__register 64 { } APDBKeyHi_EL1; - -// Hypervisor Control Register -__register 32 { 31:27 EOICount, 7:7 VGrp1DIE, 6:6 VGrp1EIE, 5:5 VGrp0DIE, 4:4 VGrp0EIE, 3:3 NPIE, 2:2 LRENPIE, 1:1 UIE, 0:0 En } GICH_HCR; - -// Floating-point Status Register -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 QC, 7:7 IDC, 4:4 IXC, 3:3 UFC, 2:2 OFC, 1:1 DZC, 0:0 IOC } FPSR; - -// Interrupt Priority Registers -array [0..7] of __register 32 { 31:24 Priority_offset_3B, 23:16 Priority_offset_2B, 15:8 Priority_offset_1B, 7:0 Priority_offset_0B } GICR_IPRIORITYR; - -// Fault Address Register (EL1) -__register 64 { } FAR_EL1; - -// Activity Monitors Event Counter Virtual Offset Registers 0 -array [0..15] of __register 64 { } AMEVCNTVOFF0_EL2; - -// Performance Monitors Count Enable Set register -__register 32 { 31:31 C } PMCNTENSET_EL0; - -// Interrupt Controller Virtual Interrupt Group 0 Enable register -__register 32 { 0:0 Enable } ICV_IGRPEN0; - -// Performance Monitors Count Enable Clear register -__register 32 { 31:31 C } PMCNTENCLR_EL0; - -// Virtualization Processor ID Register -__register 32 { 31:24 Implementer, 23:20 Variant, 19:16 Architecture, 15:4 PartNum, 3:0 Revision } VPIDR; - -// Selected Error Record Control Register -__register 32 { } ERXCTLR; - -// Report maximum PARTID and PMG Register -__register 32 { 23:16 PMGmax, 15:0 PARTIDmax } GICR_MPAMIDR; - -// Performance Monitors Control Register -__register 32 { 7:7 LP, 6:6 LC, 5:5 DP, 4:4 X, 3:3 D, 2:2 C, 1:1 P, 0:0 E, 31:24 IMP, 23:16 IDCODE, 15:11 N } PMCR_EL0; - -// MPAM Virtual PARTID Mapping Register 2 -__register 64 { 63:48 PhyPARTID11, 47:32 PhyPARTID10, 31:16 PhyPARTID9, 15:0 PhyPARTID8 } MPAMVPM2_EL2; - -// Floating-Point Exception Control register -__register 32 { 31:31 EX, 30:30 EN, 29:29 DEX, 28:28 FP2V, 27:27 VV, 26:26 TFV, 10:8 VECITR, 7:7 IDF, 4:4 IXF, 3:3 UFF, 2:2 OFF, 1:1 DZF, 0:0 IOF } FPEXC32_EL2; - -// Debug OS Lock Status Register -__register 32 { 2:2 nTT, 1:1 OSLK, 3:3, 0:0 OSLM } DBGOSLSR; - -// Performance Monitors Selected Event Count Register -__register 32 { } PMXEVCNTR_EL0; - -// Hyp Memory Attribute Indirection Register 1 -__register 32 { } HMAIR1; - -// Peripheral Identification Register 4 -__register 32 { 7:4 SIZE, 3:0 DES_2 } ERRPIDR4; - -// Instruction Set Attribute Register 5 -__register 32 { 31:28 VCMA, 27:24 RDM, 19:16 CRC32, 15:12 SHA2, 11:8 SHA1, 7:4 AES, 3:0 SEVL } ID_ISAR5; - -// Memory Model Feature Register 3 -__register 32 { 31:28 Supersec, 27:24 CMemSz, 23:20 CohWalk, 19:16 PAN, 15:12 MaintBcst, 11:8 BPMaint, 7:4 CMaintSW, 3:0 CMaintVA } ID_MMFR3; - -// Selected Error Record Control Register -__register 64 { } ERXCTLR_EL1; - -// Interrupt Controller Interrupt Acknowledge Register 1 -__register 32 { 23:0 INTID } ICC_IAR1; - -// Performance Monitors Interrupt Enable Set register -__register 32 { 31:31 C } PMINTENSET_EL1; - -// Error Group Status Register -__register 64 { } ERRGSR; - -// External Debug Component Identification Register 1 -__register 32 { 7:4 CLASS, 3:0 PRMBL_1 } EDCIDR1; - -// AArch32 Secure Debug Enable Register -__register 32 { 1:1 SUNIDEN, 0:0 SUIDEN } SDER32_EL2; - -// Activity Monitors Component Identification Register 2 -__register 32 { 7:0 PRMBL_2 } AMCIDR2; - -// Interrupt Set-Active Registers -array [1..2] of __register 32 { } GICR_ISACTIVERE; - -// Instruction Set Attribute Register 0 -__register 32 { 27:24 Divide, 23:20 Debug, 19:16 Coproc, 15:12 CmpBranch, 11:8 BitField, 7:4 BitCount, 3:0 Swap } ID_ISAR0; - -// Interrupt Controller Alias Software Generated Interrupt Group 1 Register -__register 64 { 55:48 Aff3, 47:44 RS, 40:40 IRM, 39:32 Aff2, 27:24 INTID, 23:16 Aff1, 15:0 TargetList } ICC_ASGI1R; - -// Set PARTID and PMG Register -__register 32 { 23:16 PMG, 15:0 PARTID } GICR_PARTIDR; - -// System Control Register (EL3) -__register 64 { 44:44 DSSBS, 43:43 ATA, 41:40 TCF, 37:37 ITFSB, 36:36 BT, 31:31 EnIA, 30:30 EnIB, 27:27 EnDA, 25:25 EE, 22:22 EIS, 21:21 IESB, 19:19 WXN, 13:13 EnDB, 12:12 I, 11:11 EOS, 6:6 nAA, 3:3 SA, 2:2 C, 1:1 A, 0:0 M } SCTLR_EL3; - -// OS Lock Status Register -__register 32 { 2:2 nTT, 1:1 OSLK, 3:3, 0:0 OSLM } OSLSR_EL1; - -// MPAM Long Memory Bandwidth Usage Monitor Capture Register -__register 64 { 63:63 NRDY, 62:0 VALUE } MSMON_MBWU_L_CAPTURE; - -// Interrupt Controller Deactivate Interrupt Register -__register 32 { 23:0 INTID } ICC_DIR; - -// CTI Peripheral Identification Register 2 -__register 32 { 7:4 REVISION, 3:3 JEDEC, 2:0 DES_1 } CTIPIDR2; - -// Pointer Authentication Key A for Instruction (bits[127:64]) -__register 64 { } APIAKeyHi_EL1; - -// Translation Control Register (EL2) -__register 64 { 30:30 TCMA, 29:29 TBID, 28:28 HWU62, 27:27 HWU61, 26:26 HWU60, 25:25 HWU59, 24:24 HPD, 40:40 HD, 39:39 HA, 20:20 TBI, 18:16 PS, 15:14 TG0, 13:12 SH0, 11:10 ORGN0, 9:8 IRGN0, 5:0 T0SZ, 58:58 TCMA1, 57:57 TCMA0, 56:56 E0PD1, 55:55 E0PD0, 54:54 NFD1, 53:53 NFD0, 52:52 TBID1, 51:51 TBID0, 50:50 HWU162, 49:49 HWU161, 48:48 HWU160, 47:47 HWU159, 46:46 HWU062, 45:45 HWU061, 44:44 HWU060, 43:43 HWU059, 42:42 HPD1, 41:41 HPD0, 38:38 TBI1, 37:37 TBI0, 36:36 AS, 34:32 IPS, 31:30 TG1, 29:28 SH1, 27:26 ORGN1, 25:24 IRGN1, 23:23 EPD1, 22:22 A1, 21:16 T1SZ, 7:7 EPD0 } TCR_EL2; - -// Auxiliary Fault Status Register 1 (EL1) -__register 32 { } AFSR1_EL1; - -// AArch64 Memory Model Feature Register 2 -__register 64 { 63:60 E0PD, 59:56 EVT, 55:52 BBM, 51:48 TTL, 43:40 FWB, 39:36 IDS, 35:32 AT, 31:28 ST, 27:24 NV, 23:20 CCIDX, 19:16 VARange, 15:12 IESB, 11:8 LSM, 7:4 UAO, 3:0 CnP } ID_AA64MMFR2_EL1; - -// Exception Syndrome Register (EL2) -__register 32 { 31:26 EC, 25:25 IL, 24:0 ISS } ESR_EL2; - -// Counter-timer Physical Timer TimerValue register (EL2) -__register 32 { 31:0 TimerValue } CNTHP_TVAL_EL2; - -// Counter ID registers -array [0..11] of __register 32 { } CounterID; - -// MPAM Long Memory Bandwidth Usage Monitor Register -__register 64 { 63:63 NRDY, 62:0 VALUE } MSMON_MBWU_L; - -// AArch64 Auxiliary Feature Register 0 -__register 64 { } ID_AA64AFR0_EL1; - -// Virtual Machine Aliased Highest Priority Pending Interrupt Register -__register 32 { 24:0 INTID } GICV_AHPPIR; - -// CTI Input Trigger to Output Channel Enable registers -array [0..31] of __register 32 { } CTIINEN; - -// Fault-Handling Interrupt Configuration Register 2 -__register 32 { 7:7 IRQEN, 6:6 NSMSI, 5:4 SH, 3:0 MemAttr } ERRFHICR2; - -// Interrupt Priority Registers -array [0..254] of __register 32 { 31:24 Priority_offset_3B, 23:16 Priority_offset_2B, 15:8 Priority_offset_1B, 7:0 Priority_offset_0B } GICD_IPRIORITYR; - -// Performance Monitors Cycle Count Register -__register 64 { 63:0 CCNT } PMCCNTR_EL0; - -// CTI Device Architecture register -__register 32 { 31:21 ARCHITECT, 20:20 PRESENT, 19:16 REVISION, 15:0 ARCHID } CTIDEVARCH; - -// Virtualization Multiprocessor ID Register -__register 64 { 39:32 Aff3, 30:30 U, 24:24 MT, 23:16 Aff2, 15:8 Aff1, 7:0 Aff0 } VMPIDR_EL2; - -// Hypervisor Debug Fine-Grained Write Trap Register -__register 64 { 57:57 PMUSERENR_EL0, 49:49 TRFCR_EL1, 48:48 TRCVICTLR, 46:46 TRCSSCSRn, 45:45 TRCSEQSTR, 44:44 TRCPRGCTLR, 42:42 TRCOSLAR, 41:41 TRCIMSPECn, 37:37 TRCCNTVRn, 36:36 TRCCLAIM, 35:35 TRCAUXCTLR, 33:33 TRC, 32:32 PMSLATFR_EL1, 31:31 PMSIRR_EL1, 29:29 PMSICR_EL1, 28:28 PMSFCR_EL1, 27:27 PMSEVFR_EL1, 26:26 PMSCR_EL1, 25:25 PMBSR_EL1, 24:24 PMBPTR_EL1, 23:23 PMBLIMITR_EL1, 21:21 PMCR_EL0, 20:20 PMSWINC_EL0, 19:19 PMSELR_EL0, 18:18 PMOVS, 17:17 PMINTEN, 16:16 PMCNTEN, 15:15 PMCCNTR_EL0, 14:14 PMCCFILTR_EL0, 13:13 PMEVTYPERn_EL0, 12:12 PMEVCNTRn_EL0, 11:11 OSDLR_EL1, 10:10 OSECCR_EL1, 8:8 OSLAR_EL1, 7:7 DBGPRCR_EL1, 5:5 DBGCLAIM, 4:4 MDSCR_EL1, 3:3 DBGWVRn_EL1, 2:2 DBGWCRn_EL1, 1:1 DBGBVRn_EL1, 0:0 DBGBCRn_EL1 } HDFGWTR_EL2; - -// Debug Power Control Register -__register 32 { 0:0 CORENPDRQ } DBGPRCR; - -// Interrupt Controller Hyp Active Priorities Group 0 Registers -array [0..3] of __register 64 { } ICH_AP0R_EL2; - -// Activity Monitors Device Affinity Register 0 -__register 32 { 31:0 MPIDR_EL1lo } AMDEVAFF0; - -// OS Lock Data Transfer Register, Transmit -__register 32 { } OSDTRTX_EL1; - -// External Debug Processor Status Register -__register 32 { 11:11 SDR, 10:10 SPMAD, 9:9 EPMAD, 8:8 SDAD, 7:7 EDAD, 6:6 DLK, 5:5 OSLK, 4:4 HALTED, 3:3 SR, 2:2 R, 1:1 SPD, 0:0 PU } EDPRSR; - -// Activity Monitors Device Architecture Register -__register 32 { 31:21 ARCHITECT, 20:20 PRESENT, 19:16 REVISION, 15:0 ARCHID } AMDEVARCH; - -// Interrupt Controller Type Register 2 -__register 32 { 7:7 VIL, 4:0 VID } GICD_TYPER2; - -// Program Counter Sample Register -__register 64 { 63:63 NS, 62:61 EL, 55:32, 31:0 PCSample } PMPCSR; - -// Activity Monitors Device Type Register -__register 32 { 7:4 SUB, 3:0 MAJOR } AMDEVTYPE; - -// Processor Feature Register 0 -__register 32 { 31:28 RAS, 27:24 DIT, 23:20 AMU, 19:16 CSV2, 15:12 State3, 11:8 State2, 7:4 State1, 3:0 State0 } ID_PFR0; - -// Current Exception Level -__register 64 { 3:2 EL } CurrentEL; - -// CONTEXTIDR_EL2 Sample Register -__register 32 { 31:0 CONTEXTIDR_EL2 } PMCID2SR; - -// AArch64 Processor Feature Register 0 -__register 64 { 63:60 CSV3, 59:56 CSV2, 51:48 DIT, 47:44 AMU, 43:40 MPAM, 39:36 SEL2, 35:32 SVE, 31:28 RAS, 27:24 GIC, 23:20 AdvSIMD, 19:16 FP, 15:12 EL3, 11:8 EL2, 7:4 EL1, 3:0 EL0 } ID_AA64PFR0_EL1; - -// CTI Peripheral Identification Register 4 -__register 32 { 7:4 SIZE, 3:0 DES_2 } CTIPIDR4; - -// MPAM Resource Monitoring Identification Register -__register 32 { 31:31 HAS_LOCAL_CAPT_EVNT, 17:17 MSMON_MBWU, 16:16 MSMON_CSU } MPAMF_MSMON_IDR; - -// Interrupt Controller Alias Software Generated Interrupt Group 1 Register -__register 64 { 55:48 Aff3, 47:44 RS, 40:40 IRM, 39:32 Aff2, 27:24 INTID, 23:16 Aff1, 15:0 TargetList } ICC_ASGI1R_EL1; - -// Interrupt Controller Deactivate Virtual Interrupt Register -__register 32 { 23:0 INTID } ICV_DIR; - -// Cache Type Register -__register 32 { 37:32 TminLine, 29:29 DIC, 28:28 IDC, 27:24 CWG, 23:20 ERG, 19:16 DminLine, 15:14 L1Ip, 3:0 IminLine } CTR_EL0; - -// Performance Monitors Common Event Identification register 0 -__register 64 { } PMCEID0_EL0; - -// Virtual Machine CPU Interface Identification Register -__register 32 { 31:20 ProductID, 19:16 Architecture_version, 15:12 Revision, 11:0 Implementer } GICV_IIDR; - -// CPU Interface Deactivate Interrupt Register -__register 32 { 23:0 INTID } GICC_DIR; - -// Interrupt Controller Deactivate Interrupt Register -__register 32 { 23:0 INTID } ICC_DIR_EL1; - -// MPAM Virtual PARTID Mapping Register 4 -__register 64 { 63:48 PhyPARTID19, 47:32 PhyPARTID18, 31:16 PhyPARTID17, 15:0 PhyPARTID16 } MPAMVPM4_EL2; - -// Virtual Nested Control Register -__register 64 { 63:53 RESS, 52:12 BADDR } VNCR_EL2; - -// Performance Monitors Event Counter Selection Register -__register 32 { 4:0 SEL } PMSELR; - -// Debug Watchpoint Control Registers -array [0..15] of __register 64 { 28:24 MASK, 20:20 WT, 19:16 LBN, 15:14 SSC, 13:13 HMC, 12:5 BAS, 4:3 LSC, 2:1 PAC, 0:0 E } DBGWCR_EL1; - -// Interrupt Controller Virtual Interrupt Acknowledge Register 1 -__register 32 { 23:0 INTID } ICV_IAR1; - -// Selected Error Record Control Register 2 -__register 32 { } ERXCTLR2; - -// Counter-timer Virtual Count register -__register 64 { } CNTVCT; - -// Redistributor Invalidate LPI Register -__register 64 { 63:63 V, 47:32 vPEID, 31:0 INTID } GICR_INVLPIR; - -// CTI CLAIM Tag Set register -__register 32 { } CTICLAIMSET; - -// MPAM3 Register (EL3) -__register 64 { 63:63 MPAMEN, 62:62 TRAPLOWER, 61:61 SDEFLT, 60:60 FORCE_NS, 47:40 PMG_D, 39:32 PMG_I, 31:16 PARTID_D, 15:0 PARTID_I } MPAM3_EL3; - -// Virtualization Secure Translation Table Base Register -__register 64 { 47:1 BADDR, 0:0 CnP } VSTTBR_EL2; - -// Error Record ID Register -__register 64 { 15:0 NUM } ERRIDR_EL1; - -// System Control Register -__register 32 { 31:31 DSSBS, 30:30 TE, 29:29 AFE, 28:28 TRE, 25:25 EE, 23:23 SPAN, 20:20 UWXN, 19:19 WXN, 18:18 nTWE, 16:16 nTWI, 13:13 V, 12:12 I, 10:10 EnRCTX, 8:8 SED, 7:7 ITD, 6:6 UNK, 5:5 CP15BEN, 4:4 LSMAOE, 3:3 nTLSMD, 2:2 C, 1:1 A, 0:0 M } SCTLR; - -// Device Affinity Register -__register 64 { 39:32 Aff3, 31:31 F0V, 30:30 U, 24:24 MT, 23:16 Aff2, 15:8 Aff1, 7:0 Aff0 } ERRDEVAFF; - -// Activity Monitors Peripheral Identification Register 1 -__register 32 { 7:4 DES_0, 3:0 PART_1 } AMPIDR1; - -// Hyp Translation Table Base Register -__register 64 { 47:1 BADDR, 0:0 CnP } HTTBR; - -// Error Reporting Status Register -__register 32 { 3:3 WROD, 2:2 RWOD, 1:1 WRD, 0:0 RRD } GICR_STATUSR; - -// CTI Channel Gate Enable register -__register 32 { } CTIGATE; - -// AArch64 Processor Feature Register 1 -__register 64 { 19:16 MPAM_frac, 15:12 RAS_frac, 11:8 MTE, 7:4 SSBS, 3:0 BT } ID_AA64PFR1_EL1; - -// CTI Channel In Status register -__register 32 { } CTICHINSTATUS; - -// MPAM Virtual PARTID Mapping Register 5 -__register 64 { 63:48 PhyPARTID23, 47:32 PhyPARTID22, 31:16 PhyPARTID21, 15:0 PhyPARTID20 } MPAMVPM5_EL2; - -// CTI Peripheral Identification Register 1 -__register 32 { 7:4 DES_0, 3:0 PART_1 } CTIPIDR1; - -// Interrupt Controller Virtual Binary Point Register 0 -__register 32 { 2:0 BinaryPoint } ICV_BPR0; - -// Interrupt Controller List Registers -array [0..15] of __register 32 { 31:30 State, 29:29 HW, 28:28 Group, 23:16 Priority, 12:0 pINTID } ICH_LRC; - -// Interrupt Controller Empty List Register Status Register -__register 32 { } ICH_ELRSR; - -// Critical Error Interrupt Configuration Register 0 -__register 64 { 55:2 ADDR } ERRCRICR0; - -// Interrupt Priority Registers (extended PPI range) -array [8..23] of __register 32 { 31:24 Priority_offset_3B, 23:16 Priority_offset_2B, 15:8 Priority_offset_1B, 7:0 Priority_offset_0B } GICR_IPRIORITYRE; - -// MPAM Features Identification Register -__register 64 { 59:56 RIS_MAX, 39:39 HAS_ESR, 38:38 HAS_EXTD_ESR, 37:37 NO_IMPL_MSMON, 36:36 NO_IMPL_PART, 32:32 HAS_RIS, 31:31 HAS_PARTID_NRW, 30:30 HAS_MSMON, 29:29 HAS_IMPL_IDR, 28:28 EXT, 27:27 HAS_PRI_PART, 26:26 HAS_MBW_PART, 25:25 HAS_CPOR_PART, 24:24 HAS_CCAP_PART, 23:16 PMG_MAX, 15:0 PARTID_MAX } MPAMF_IDR; - -// AArch32 Instruction Set Attribute Register 6 -__register 32 { 27:24 I8MM, 23:20 BF16, 19:16 SPECRES, 15:12 SB, 11:8 FHM, 7:4 DP, 3:0 JSCVT } ID_ISAR6_EL1; - -// Virtual Machine Control Register -__register 32 { 31:24 VPMR, 23:21 VBPR0, 20:18 VBPR1, 9:9 VEOIM, 4:4 VCBPR, 3:3 VFIQEn, 2:2 VAckCtl, 1:1 VENG1, 0:0 VENG0 } GICH_VMCR; - -// Auxiliary Memory Attribute Indirection Register 1 -__register 32 { } AMAIR1; - -// Counter-timer Virtual Timer Control register (EL2) -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTHV_CTL_EL2; - -// Pseudo-fault Generation Control Register -array [0..65534] of __register 64 { 31:31 CDNEN, 30:30 R, 12:12 MV, 11:11 AV, 10:10 PN, 9:9 ER, 8:8 CI, 7:6 CE, 5:5 DE, 4:4 UEO, 3:3 UER, 2:2 UEU, 1:1 UC, 0:0 OF } ERRPFGCTL; - -// Memory Attribute Indirection Register 1 -__register 32 { } MAIR1; - -// OS Double Lock Register -__register 32 { 0:0 DLK } OSDLR_EL1; - -// Counter-timer Virtual Timer TimerValue Register (EL2) -__register 32 { 31:0 TimerValue } CNTHV_TVAL_EL2; - -// Translation Table Base Register 0 (EL1) -__register 64 { 63:48 ASID, 47:1 BADDR, 0:0 CnP } TTBR0_EL1; - -// Monitor DCC Interrupt Enable Register -__register 32 { 30:30 RX, 29:29 TX } MDCCINT_EL1; - -// Counter-timer Physical Timer Control register -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTP_CTL_EL0; - -// Selected Error Record Miscellaneous Register 0 -__register 64 { } ERXMISC0_EL1; - -// MPAM Partition Configuration Selection Register -__register 32 { 27:24 RIS, 16:16 INTERNAL, 15:0 PARTID_SEL } MPAMCFG_PART_SEL; - -// Performance Monitors Cycle Counter Filter Register -__register 32 { 31:31 P, 30:30 U, 29:29 NSK, 28:28 NSU, 27:27 NSH, 26:26 M, 24:24 SH } PMCCFILTR_EL0; - -// CTI CLAIM Tag Clear register -__register 32 { } CTICLAIMCLR; - -// Auxiliary Data Fault Status Register -__register 32 { } ADFSR; - -// Redistributor Type Register -__register 64 { 63:32 Affinity_Value, 31:27 PPInum, 26:26 VSGI, 25:24 CommonLPIAff, 23:8 Processor_Number, 7:7 RVPEID, 6:6 MPAM, 5:5 DPGS, 4:4 Last, 3:3 DirectLPI, 2:2 Dirty, 1:1 VLPIS, 0:0 PLPIS } GICR_TYPER; - -// Counter-timer Physical Timer Control register -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTP_CTL; - -// MPAM Hypervisor Control Register (EL2) -__register 64 { 31:31 TRAP_MPAMIDR_EL1, 8:8 GSTAPP_PLK, 1:1 EL1_VPMEN, 0:0 EL0_VPMEN } MPAMHCR_EL2; - -// Performance Monitors Component Identification Register 3 -__register 32 { 7:0 PRMBL_3 } PMCIDR3; - -// Interrupt Configuration Registers -array [0..63] of __register 32 { } GICD_ICFGR; - -// Debug Data Transfer Register, Transmit -__register 32 { } DBGDTRTXint; - -// EL3 Software Thread ID Register -__register 64 { } TPIDR_EL3; - -// Interrupt Controller Virtual Interrupt Acknowledge Register 0 -__register 32 { 23:0 INTID } ICV_IAR0; - -// Error Record Feature Register -array [0..65534] of __register 64 { 54:53 CE, 52:52 DE, 51:51 UEO, 50:50 UER, 49:49 UEU, 48:48 UC, 31:31 FRX, 25:24 TS, 23:22 CI, 21:20 INJ, 19:18 CEO, 17:16 DUI, 15:15 RP, 14:12 CEC, 11:10 CFI, 9:8 UE, 7:6 FI, 5:4 UI, 1:0 ED } ERRFR; - -// ITS Translation Register -__register 32 { 31:0 EventID } GITS_TRANSLATER; - -// MPAM2 Register (EL2) -__register 64 { 63:63 MPAMEN, 58:58 TIDR, 49:49 TRAPMPAM0EL1, 48:48 TRAPMPAM1EL1, 47:40 PMG_D, 39:32 PMG_I, 31:16 PARTID_D, 15:0 PARTID_I } MPAM2_EL2; - -// Debug Breakpoint Control Registers -array [0..15] of __register 32 { 23:20 BT, 19:16 LBN, 15:14 SSC, 13:13 HMC, 8:5 BAS, 2:1 PMC, 0:0 E } DBGBCR; - -// MPAM Virtual PARTID Mapping Register 0 -__register 64 { 63:48 PhyPARTID3, 47:32 PhyPARTID2, 31:16 PhyPARTID1, 15:0 PhyPARTID0 } MPAMVPM0_EL2; - -// Peripheral Identification Register 2 -__register 32 { 7:4 REVISION, 3:3 JEDEC, 2:0 DES_1, 7:4 PART_2 } ERRPIDR2; - -// Random Allocation Tag Seed Register. -__register 32 { 23:8 SEED, 3:0 TAG } RGSR_EL1; - -// Media and VFP Feature Register 1 -__register 32 { 31:28 SIMDFMAC, 27:24 FPHP, 23:20 SIMDHP, 19:16 SIMDSP, 15:12 SIMDInt, 11:8 SIMDLS, 7:4 FPDNaN, 3:0 FPFtZ } MVFR1; - -// Debug Vector Catch Register -__register 32 { 31:31 NSF, 30:30 NSI, 28:28 NSD, 27:27 NSP, 26:26 NSS, 25:25 NSU, 15:15 MF, 14:14 MI, 12:12 MD, 11:11 MP, 10:10 MS, 7:7 SF, 6:6 SI, 4:4 SD, 3:3 SP, 2:2 SS, 1:1 SU, 7:7 F, 6:6 I, 4:4 D, 3:3 P, 2:2 S, 1:1 U } DBGVCR; - -// Activity Monitors Configuration Register -__register 64 { 31:28 NCG, 24:24 HDBG, 13:8 SIZE, 7:0 N } AMCFGR_EL0; - -// Performance Monitors Software Increment register -__register 32 { } PMSWINC; - -// Stack Pointer (EL2) -__register 64 { } SP_EL2; - -// Saved Program Status Register (Hyp mode) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 J, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:0 M } SPSR_hyp; - -// Deferred Interrupt Status Register -__register 32 { 31:31 A, 15:14 AET, 9:9 EA, 5:0 DFSC, 12:12 ExT, 9:9 LPAE, 5:0 STATUS, 10:10, 3:0 FS } DISR; - -// Activity Monitors Event Type Registers 1 -array [0..15] of __register 64 { 15:0 evtCount } AMEVTYPER1_EL0; - -// Interrupt Clear-Pending Register 0 -__register 32 { } GICR_ICPENDR0; - -// ITS Type Register -__register 64 { 43:43 nID, 42:41 SVPET, 40:40 VMAPP, 39:39 VSGI, 38:38 MPAM, 37:37 VMOVP, 36:36 CIL, 35:32 CIDbits, 31:24 HCC, 19:19 PTA, 18:18 SEIS, 17:13 Devbits, 12:8 ID_bits, 7:4 ITT_entry_size, 2:2 CCT, 1:1 Virtual, 0:0 Physical } GITS_TYPER; - -// Interrupt Controller Software Generated Interrupt Group 0 Register -__register 64 { 55:48 Aff3, 47:44 RS, 40:40 IRM, 39:32 Aff2, 27:24 INTID, 23:16 Aff1, 15:0 TargetList } ICC_SGI0R_EL1; - -// Interrupt Controller Virtual Interrupt Acknowledge Register 1 -__register 32 { 23:0 INTID } ICV_IAR1_EL1; - -// Error Record Primary Status Register -array [0..65534] of __register 64 { 31:31 AV, 30:30 V, 29:29 UE, 28:28 ER, 27:27 OF, 26:26 MV, 25:24 CE, 23:23 DE, 22:22 PN, 21:20 UET, 19:19 CI, 15:8 IERR, 7:0 SERR } ERRSTATUS; - -// MPAM Virtual PARTID Mapping Register 1 -__register 64 { 63:48 PhyPARTID7, 47:32 PhyPARTID6, 31:16 PhyPARTID5, 15:0 PhyPARTID4 } MPAMVPM1_EL2; - -// Pointer Authentication Key A for Instruction (bits[63:0]) -__register 64 { } APIAKeyLo_EL1; - -// Instruction Set Attribute Register 2 -__register 32 { 31:28 Reversal, 27:24 PSR_AR, 23:20 MultU, 19:16 MultS, 15:12 Mult, 11:8 MultiAccessInt, 7:4 MemHint, 3:0 LoadStore } ID_ISAR2; - -// Performance Monitors Interrupt Enable Clear register -__register 32 { 31:31 C } PMINTENCLR_EL1; - -// Secure Configuration Register -__register 64 { 35:35 AMVOFFEN, 33:30 TWEDEL, 29:29 TWEDEn, 28:28 ECVEn, 27:27 FGTEn, 26:26 ATA, 25:25 EnSCXT, 21:21 FIEN, 20:20 NMEA, 19:19 EASE, 18:18 EEL2, 17:17 API, 16:16 APK, 15:15 TERR, 14:14 TLOR, 13:13 TWE, 12:12 TWI, 11:11 ST, 10:10 RW, 9:9 SIF, 8:8 HCE, 7:7 SMD, 3:3 EA, 2:2 FIQ, 1:1 IRQ, 0:0 NS } SCR_EL3; - -// MPAM Error Status Register -__register 64 { 35:32 RIS, 31:31 OVRWR, 27:24 ERRCODE, 23:16 PMG, 15:0 PARTID_MON } MPAMF_ESR; - -// MPAM Features Cache Portion Partitioning ID register -__register 32 { 15:0 CPBM_WD } MPAMF_CPOR_IDR; - -// Interrupt Controller End Of Interrupt Register 1 -__register 32 { 23:0 INTID } ICC_EOIR1_EL1; - -// CTI Component Identification Register 0 -__register 32 { 7:0 PRMBL_0 } CTICIDR0; - -// System Control Register (EL1) -__register 64 { 49:46 TWEDEL, 45:45 TWEDEn, 44:44 DSSBS, 43:43 ATA, 42:42 ATA0, 41:40 TCF, 39:38 TCF0, 37:37 ITFSB, 36:36 BT1, 35:35 BT0, 31:31 EnIA, 30:30 EnIB, 29:29 LSMAOE, 28:28 nTLSMD, 27:27 EnDA, 26:26 UCI, 25:25 EE, 24:24 E0E, 23:23 SPAN, 22:22 EIS, 21:21 IESB, 20:20 TSCXT, 19:19 WXN, 18:18 nTWE, 16:16 nTWI, 15:15 UCT, 14:14 DZE, 13:13 EnDB, 12:12 I, 11:11 EOS, 10:10 EnRCTX, 9:9 UMA, 8:8 SED, 7:7 ITD, 6:6 nAA, 5:5 CP15BEN, 4:4 SA0, 3:3 SA, 2:2 C, 1:1 A, 0:0 M } SCTLR_EL1; - -// External Debug Peripheral Identification Register 3 -__register 32 { 7:4 REVAND, 3:0 CMOD } EDPIDR3; - -// Debug Data Transfer Register, Receive -__register 32 { } DBGDTRRX_EL0; - -// External Debug Device ID register 0 -__register 32 { 27:24 AuxRegs, 7:4 DebugPower, 3:0 PCSample } EDDEVID; - -// MPAM Bandwidth Portion Bitmap Partition Configuration Register -__register 4096 { } MPAMCFG_MBW_PBM; - -// Activity Monitors User Enable Register -__register 32 { 0:0 EN } AMUSERENR; - -// Interrupt Controller Virtual Interrupt Group 1 Enable register -__register 32 { 0:0 Enable } ICV_IGRPEN1_EL1; - -// MPAM Monitor Instance Selection Register -__register 32 { 27:24 RIS, 15:0 MON_SEL } MSMON_CFG_MON_SEL; - -// Memory Attribute Indirection Register 0 -__register 32 { } MAIR0; - -// Pointer Authentication Key B for Instruction (bits[127:64]) -__register 64 { } APIBKeyHi_EL1; - -// Context ID Register (EL2) -__register 32 { 31:0 PROCID } CONTEXTIDR_EL2; - -// Counter-timer Frequency register -__register 32 { } CNTFRQ; - -// Counter-timer Access Control Registers -array [0..7] of __register 32 { 5:5 RWPT, 4:4 RWVT, 3:3 RVOFF, 2:2 RFRQ, 1:1 RVCT, 0:0 RPCT } CNTACR; - -// Interrupt Clear-Enable Registers -array [1..2] of __register 32 { } GICR_ICENABLERE; - -// Counter-timer Secure Virtual Timer TimerValue register (EL2) -__register 32 { 31:0 TimerValue } CNTHVS_TVAL_EL2; - -// Selected Error Record Feature Register -__register 32 { } ERXFR; - -// Virtual Machine End Of Interrupt Register -__register 32 { 24:0 INTID } GICV_EOIR; - -// MPAM Features Secure Identification Register -__register 32 { 23:16 S_PMG_MAX, 15:0 S_PARTID_MAX } MPAMF_SIDR; - -// Jazelle Main Configuration Register -__register 32 { } JMCR; - -// Interrupt Controller System Register Enable register (EL2) -__register 32 { 3:3 Enable, 2:2 DIB, 1:1 DFB, 0:0 SRE } ICC_SRE_EL2; - -// MPAM Memory Bandwidth Usage Monitor Register -__register 32 { 31:31 NRDY, 30:0 VALUE } MSMON_MBWU; - -// Interrupt Controller Virtual End Of Interrupt Register 0 -__register 32 { 23:0 INTID } ICV_EOIR0; - -// Interrupt Controller End of Interrupt Status Register -__register 32 { } ICH_EISR_EL2; - -// Activity Monitors Peripheral Identification Register 3 -__register 32 { 7:4 REVAND, 3:0 CMOD } AMPIDR3; - -// Debug Breakpoint Value Registers -array [0..15] of __register 64 { 31:0 ContextID, 63:32 ContextID2, 63:53, 52:49 RESS, 52:49, 48:2 VA, 47:40, 47:40, 39:32, 39:32 VMID } DBGBVR_EL1; - -// Pointer Authentication Key A for Data (bits[127:64]) -__register 64 { } APDAKeyHi_EL1; - -// Context ID Register -__register 32 { 31:0 PROCID, 7:0 ASID } CONTEXTIDR; - -// Auxiliary Fault Status Register 0 (EL1) -__register 32 { } AFSR0_EL1; - -// CTI Device Type register -__register 32 { 7:4 SUB, 3:0 MAJOR } CTIDEVTYPE; - -// Set Secure SPI Pending Register -__register 32 { 12:0 INTID } GICD_SETSPI_SR; - -// Counter-timer Secure Physical Timer CompareValue Register (EL2) -__register 64 { 63:0 CompareValue } CNTHPS_CVAL; - -// Debug CLAIM Tag Set register -__register 32 { 7:0 CLAIM } DBGCLAIMSET; - -// Selected Error Record Miscellaneous Register 3 -__register 32 { } ERXMISC3; - -// Auxiliary ID Register -__register 32 { } AIDR_EL1; - -// Interrupt Controller Virtual Machine Control Register -__register 32 { 31:24 VPMR, 23:21 VBPR0, 20:18 VBPR1, 9:9 VEOIM, 4:4 VCBPR, 3:3 VFIQEn, 2:2 VAckCtl, 1:1 VENG1, 0:0 VENG0 } ICH_VMCR; - -// Hypervisor Auxiliary Control Register -__register 32 { } HACR_EL2; - -// External Debug Component Identification Register 2 -__register 32 { 7:0 PRMBL_2 } EDCIDR2; - -// Activity Monitors Count Enable Set Register 1 -__register 32 { } AMCNTENSET1; - -// CTI Application Pulse register -__register 32 { } CTIAPPPULSE; - -// Sampling Interval Reload Register -__register 64 { 31:8 INTERVAL, 0:0 RND } PMSIRR_EL1; - -// Tag Control Register. -__register 64 { 16:16 RRND, 15:0 Exclude } GCR_EL1; - -// Fault Address Register (EL3) -__register 64 { } FAR_EL3; - -// Jazelle ID Register -__register 32 { } JIDR; - -// SVE Control Register for EL3 -__register 64 { 3:0 LEN } ZCR_EL3; - -// Processor Feature Register 2 -__register 32 { 11:8 RAS_frac, 7:4 SSBS, 3:0 CSV3 } ID_PFR2; - -// Empty List Register Status Register -__register 32 { } GICH_ELRSR; - -// Vector Base Address Register -__register 32 { } VBAR; - -// Interrupt Controller End of Interrupt Status Register -__register 32 { } ICH_EISR; - -// User Access Override -__register 32 { 23:23 UAO } UAO; - -// Multiprocessor Affinity Register -__register 32 { 31:31 M, 30:30 U, 24:24 MT, 23:16 Aff2, 15:8 Aff1, 7:0 Aff0 } MPIDR; - -// Counter-timer Hyp Physical Timer Control register -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTHP_CTL; - -// Error Recovery Interrupt Configuration Register 0 -__register 64 { 55:2 ADDR } ERRERICR0; - -// Trace Filter Control Register (EL1) -__register 64 { 6:5 TS, 1:1 E1TRE, 0:0 E0TRE } TRFCR_EL1; - -// Performance Monitors Event Counter Selection Register -__register 32 { 4:0 SEL } PMSELR_EL0; - -// Activity Monitors Counter Group Configuration Register -__register 32 { 15:8 CG1NC, 7:0 CG0NC } AMCGCR; - -// PL1 Software Thread ID Register -__register 32 { } TPIDRPRW; - -// Interrupt Controller Interrupt Group 1 Enable register -__register 32 { 0:0 Enable } ICC_IGRPEN1; - -// Interrupt Controller Active Priorities Group 1 Registers -array [0..3] of __register 32 { } ICC_AP1R; - -// CTI Device ID register 1 -__register 32 { } CTIDEVID1; - -// Virtual Machine Aliased End Of Interrupt Register -__register 32 { 24:0 INTID } GICV_AEOIR; - -// AArch32 Auxiliary Feature Register 0 -__register 32 { } ID_AFR0_EL1; - -// Translation Table Base Register 0 (EL3) -__register 64 { 47:1 BADDR, 0:0 CnP } TTBR0_EL3; - -// External Debug Watchpoint Address Register -__register 64 { } EDWAR; - -// MPAM Features Cache Capacity Partitioning ID register -__register 32 { 5:0 CMAX_WD } MPAMF_CCAP_IDR; - -// Interrupt Status Register -__register 32 { 8:8 A, 7:7 I, 6:6 F } ISR_EL1; - -// Interrupt Controller Control Register -__register 32 { 19:19 ExtRange, 18:18 RSS, 15:15 A3V, 14:14 SEIS, 13:11 IDbits, 10:8 PRIbits, 6:6 PMHE, 1:1 EOImode, 0:0 CBPR } ICC_CTLR; - -// Counter-timer Self-Synchronized Virtual Count register -__register 64 { } CNTVCTSS_EL0; - -// Sampling Profiling ID Register -__register 64 { 19:16 CountSize, 15:12 MaxSize, 11:8 Interval, 5:5 ERnd, 4:4 LDS, 3:3 ArchInst, 2:2 FL, 1:1 FT, 0:0 FE } PMSIDR_EL1; - -// Secure Configuration Register -__register 32 { 15:15 TERR, 13:13 TWE, 12:12 TWI, 9:9 SIF, 8:8 HCE, 7:7 SCD, 6:6 nET, 5:5 AW, 4:4 FW, 3:3 EA, 2:2 FIQ, 1:1 IRQ, 0:0 NS } SCR; - -// CPU Interface Highest Priority Pending Interrupt Register -__register 32 { 23:0 INTID } GICC_HPPIR; - -// Interrupt Controller Virtual Highest Priority Pending Interrupt Register 0 -__register 32 { 23:0 INTID } ICV_HPPIR0_EL1; - -// ITS Command Queue Descriptor -__register 64 { 63:63 Valid, 61:59 InnerCache, 55:53 OuterCache, 51:12 Physical_Address, 11:10 Shareability, 7:0 Size } GITS_CBASER; - -// Interrupt Controller List Registers -array [0..15] of __register 64 { 63:62 State, 61:61 HW, 60:60 Group, 55:48 Priority, 44:32 pINTID, 31:0 vINTID } ICH_LR_EL2; - -// Hyp Data Fault Address Register -__register 32 { } HDFAR; - -// Activity Monitors Count Enable Clear Register 1 -__register 64 { } AMCNTENCLR1_EL0; - -// LORegionID (EL1) -__register 64 { 23:16 LD, 7:0 LR } LORID_EL1; - -// Interrupt Controller Highest Priority Pending Interrupt Register 1 -__register 32 { 23:0 INTID } ICC_HPPIR1; - -// Interrupt Group Registers -array [1..2] of __register 32 { } GICR_IGROUPRE; - -// LORegion Control (EL1) -__register 64 { 9:2 DS, 0:0 EN } LORC_EL1; - -// Interrupt configuration registers -array [2..5] of __register 32 { } GICR_ICFGRE; - -// Interrupt Controller Deactivate Virtual Interrupt Register -__register 32 { 23:0 INTID } ICV_DIR_EL1; - -// Debug Watchpoint Control Registers -array [0..15] of __register 32 { 28:24 MASK, 20:20 WT, 19:16 LBN, 15:14 SSC, 13:13 HMC, 12:5 BAS, 4:3 LSC, 2:1 PAC, 0:0 E } DBGWCR; - -// SVE Feature ID register 0 -__register 64 { 59:56 F64MM, 55:52 F32MM, 47:44 I8MM, 23:20 BF16, 3:0 SVEver } ID_AA64ZFR0_EL1; - -// Tag Fault Status Register (EL2) -__register 64 { 1:1 TF1, 0:0 TF0 } TFSR_EL2; - -// Instruction Set Attribute Register 3 -__register 32 { 31:28 T32EE, 27:24 TrueNOP, 23:20 T32Copy, 19:16 TabBranch, 15:12 SynchPrim, 11:8 SVC, 7:4 SIMD, 3:0 Saturate } ID_ISAR3; - -// Error Record Miscellaneous Register 3 -array [0..65534] of __register 64 { 63:0 TS } ERRMISC3; - -// Domain Access Control Register -__register 32 { } DACR; - -// AArch32 Instruction Set Attribute Register 5 -__register 32 { 31:28 VCMA, 27:24 RDM, 19:16 CRC32, 15:12 SHA2, 11:8 SHA1, 7:4 AES, 3:0 SEVL } ID_ISAR5_EL1; - -// AArch64 Instruction Set Attribute Register 0 -__register 64 { 63:60 RNDR, 59:56 TLB, 55:52 TS, 51:48 FHM, 47:44 DP, 43:40 SM4, 39:36 SM3, 35:32 SHA3, 31:28 RDM, 23:20 Atomic, 19:16 CRC32, 15:12 SHA2, 11:8 SHA1, 7:4 AES } ID_AA64ISAR0_EL1; - -// Floating-Point Status and Control Register -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 QC, 26:26 AHP, 25:25 DN, 24:24 FZ, 23:22 RMode, 21:20 Stride, 19:19 FZ16, 18:16 Len, 15:15 IDE, 12:12 IXE, 11:11 UFE, 10:10 OFE, 9:9 DZE, 8:8 IOE, 7:7 IDC, 4:4 IXC, 3:3 UFC, 2:2 OFC, 1:1 DZC, 0:0 IOC } FPSCR; - -// Interrupt Clear-Enable Register 0 -__register 32 { } GICR_ICENABLER0; - -// External Debug Device Architecture register -__register 32 { 31:21 ARCHITECT, 20:20 PRESENT, 19:16 REVISION, 15:12 ARCHVER, 11:0 ARCHPART } EDDEVARCH; - -// Redistributor LPI Pending Table Base Address Register -__register 64 { 62:62 PTZ, 58:56 OuterCache, 51:16 Physical_Address, 11:10 Shareability, 9:7 InnerCache } GICR_PENDBASER; - -// Component Identification Register 0 -__register 32 { 7:0 PRMBL_0 } ERRCIDR0; - -// Selected Error Record Address Register 2 -__register 32 { } ERXADDR2; - -// Distributor Implementer Identification Register -__register 32 { 31:24 ProductID, 19:16 Variant, 15:12 Revision, 11:0 Implementer } GICD_IIDR; - -// Debug Feature Register 0 -__register 32 { 31:28 TraceFilt, 27:24 PerfMon, 23:20 MProfDbg, 11:8 MMapDbg, 7:4 CopSDbg, 3:0 CopDbg } ID_DFR0; - -// Interrupt Controller Virtual Interrupt Priority Mask Register -__register 32 { 7:0 Priority } ICV_PMR; - -// Counter Frequency IDs, n > 0 -array [1..1003] of __register 32 { 31:0 Frequency } CNTFID; - -// SVE Control Register for EL2 -__register 64 { 3:0 LEN } ZCR_EL2; - -// Sampling Interval Counter Register -__register 64 { 63:56 ECOUNT, 31:0 COUNT } PMSICR_EL1; - -// Report maximum PARTID and PMG Register -__register 32 { 23:16 PMGmax, 15:0 PARTIDmax } GITS_MPAMIDR; - -// Debug Device ID register 1 -__register 32 { 3:0 PCSROffset } DBGDEVID1; - -// Selected Error Record Miscellaneous Register 7 -__register 32 { } ERXMISC7; - -// Component Identification Register 2 -__register 32 { 7:0 PRMBL_2 } ERRCIDR2; - -// Interrupt Controller Hyp Active Priorities Group 1 Registers -array [0..3] of __register 32 { } ICH_AP1R; - -// Performance Monitors Common Event Identification register 0 -__register 32 { } PMCEID0; - -// Virtual SError Exception Syndrome Register -__register 32 { 15:14 AET, 12:12 ExT } VDFSR; - -// Performance Monitors Common Event Identification register 1 -__register 32 { } PMCEID1; - -// Interrupt Clear-Enable Registers -array [0..31] of __register 32 { } GICD_ICENABLER; - -// Monitor Debug Configuration Register (EL2) -__register 32 { 28:28 MTPME, 27:27 TDCC, 26:26 HLP, 23:23 HCCD, 19:19 TTRF, 17:17 HPMD, 14:14 TPMS, 13:12 E2PB, 11:11 TDRA, 10:10 TDOSA, 9:9 TDA, 8:8 TDE, 7:7 HPME, 6:6 TPM, 5:5 TPMCR, 4:0 HPMN } MDCR_EL2; - -// Interrupt Controller Binary Point Register 0 -__register 32 { 2:0 BinaryPoint } ICC_BPR0_EL1; - -// Activity Monitors Counter Group Configuration Register -__register 64 { 15:8 CG1NC, 7:0 CG0NC } AMCGCR_EL0; - -// Debug Status and Control Register, External View -__register 32 { 31:31 TFO, 30:30 RXfull, 29:29 TXfull, 27:27 RXO, 26:26 TXU, 23:22 INTdis, 21:21 TDA, 19:19 SC2, 18:18 NS, 17:17 SPNIDdis, 16:16 SPIDdis, 15:15 MDBGen, 14:14 HDE, 12:12 UDCCdis, 6:6 ERR, 5:2 MOE } DBGDSCRext; - -// Counter-timer Secure Virtual Timer CompareValue Register (EL2) -__register 64 { 63:0 CompareValue } CNTHVS_CVAL; - -// Interrupt Controller Highest Priority Pending Interrupt Register 1 -__register 32 { 23:0 INTID } ICC_HPPIR1_EL1; - -// Instruction Fault Status Register (EL2) -__register 32 { 16:16 FnV, 12:12 ExT, 9:9 LPAE, 5:0 STATUS, 10:10, 3:0 FS } IFSR32_EL2; - -// Virtual Machine Aliased Binary Point Register -__register 32 { 2:0 Binary_Point } GICV_ABPR; - -// Interrupt Set-Enable Register 0 -__register 32 { } GICR_ISENABLER0; - -// Exception Link Register (EL3) -__register 64 { } ELR_EL3; - -// List Registers -array [0..15] of __register 32 { 31:31 HW, 30:30 Group, 29:28 State, 27:23 Priority, 19:10 pINTID, 9:0 vINTID } GICH_LR; - -// Redistributor Properties Base Address Register -__register 64 { 58:56 OuterCache, 51:12 Physical_Address, 11:10 Shareability, 9:7 InnerCache, 4:0 IDbits } GICR_PROPBASER; - -// Data Fault Status Register -__register 32 { 16:16 FnV, 15:14 AET, 13:13 CM, 12:12 ExT, 11:11 WnR, 9:9 LPAE, 7:4 Domain, 5:0 STATUS, 10:10, 3:0 FS } DFSR; - -// Debug CLAIM Tag Set register -__register 32 { 7:0 CLAIM } DBGCLAIMSET_EL1; - -// Translation Table Base Register 1 -__register 64 { 31:7 TTB1, 5:5 NOS, 4:3 RGN, 2:2 IMP, 1:1 S, 55:48 ASID, 47:1 BADDR, 0:0 CnP, 6:6, 0:0 IRGN } TTBR1; - -// Auxiliary Control Register -__register 32 { } ACTLR; - -// Saved Program Status Register (EL3) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 DIT, 12:12 SSBS, 22:22 PAN, 21:21 SS, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 25:25 TCO, 23:23 UAO, 11:10 BTYPE, 9:9 D, 15:10, 26:25 IT, 4:4, 4:4, 3:0, 3:0 M } SPSR_EL3; - -// Counter Status Register -__register 32 { 31:8 FCACK, 1:1 DBGH } CNTSR; - -// Interrupt Controller Virtual End Of Interrupt Register 1 -__register 32 { 23:0 INTID } ICV_EOIR1; - -// Debug OS Lock Data Transfer Register, Transmit -__register 32 { } DBGDTRTXext; - -// Performance Monitors Selected Event Type Register -__register 32 { } PMXEVTYPER_EL0; - -// Counter-timer Secure Physical Timer TimerValue Register (EL2) -__register 32 { 31:0 TimerValue } CNTHPS_TVAL; - -// Hyp Syndrome Register -__register 32 { 31:26 EC, 25:25 IL, 24:0 ISS } HSR; - -// Virtualization Multiprocessor ID Register -__register 32 { 31:31 M, 30:30 U, 24:24 MT, 23:16 Aff2, 15:8 Aff1, 7:0 Aff0 } VMPIDR; - -// Debug Data Transfer Register, Transmit -__register 32 { } DBGDTRTX_EL0; - -// Interrupt Controller Hyp Active Priorities Group 0 Registers -array [0..3] of __register 32 { } ICH_AP0R; - -// External Debug Device Type register -__register 32 { 7:4 SUB, 3:0 MAJOR } EDDEVTYPE; - -// Interrupt Group Modifier Registers -array [0..31] of __register 32 { } GICD_IGRPMODR; - -// SGI Clear-Pending Registers -array [0..3] of __register 32 { } GICD_CPENDSGIR; - -// Activity Monitors Peripheral Identification Register 0 -__register 32 { 7:0 PART_0 } AMPIDR0; - -// Interrupt Controller Active Priorities Group 1 Registers -array [0..3] of __register 64 { } ICC_AP1R_EL1; - -// Redistributor Synchronize Register -__register 32 { 0:0 Busy } GICR_SYNCR; - -// Interrupt Controller Maintenance Interrupt State Register -__register 32 { 7:7 VGrp1D, 6:6 VGrp1E, 5:5 VGrp0D, 4:4 VGrp0E, 3:3 NP, 2:2 LRENP, 1:1 U, 0:0 EOI } ICH_MISR_EL2; - -// AArch32 Instruction Set Attribute Register 2 -__register 32 { 31:28 Reversal, 27:24 PSR_AR, 23:20 MultU, 19:16 MultS, 15:12 Mult, 11:8 MultiAccessInt, 7:4 MemHint, 3:0 LoadStore } ID_ISAR2_EL1; - -// Interrupt Routing Registers (Extended SPI Range) -array [0..1023] of __register 64 { 39:32 Aff3, 31:31 Interrupt_Routing_Mode, 23:16 Aff2, 15:8 Aff1, 7:0 Aff0 } GICD_IROUTERE; - -// Virtual Machine Control Register -__register 32 { 9:9 EOImode, 4:4 CBPR, 3:3 FIQEn, 2:2 AckCtl, 1:1 EnableGrp1, 0:0 EnableGrp0 } GICV_CTLR; - -// Error Record ID Register -__register 32 { 15:0 NUM } ERRIDR; - -// Condition Flags -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V } NZCV; - -// Interrupt Clear-Active Registers (extended SPI range) -array [0..31] of __register 32 { } GICD_ICACTIVERE; - -// Interrupt Controller Interrupt Priority Mask Register -__register 32 { 7:0 Priority } ICC_PMR; - -// CTI Component Identification Register 2 -__register 32 { 7:0 PRMBL_2 } CTICIDR2; - -// System Control Register (EL2) -__register 64 { 44:44 DSSBS, 43:43 ATA, 41:40 TCF, 37:37 ITFSB, 36:36 BT, 31:31 EnIA, 30:30 EnIB, 27:27 EnDA, 25:25 EE, 22:22 EIS, 21:21 IESB, 19:19 WXN, 13:13 EnDB, 12:12 I, 11:11 EOS, 6:6 nAA, 3:3 SA, 2:2 C, 1:1 A, 0:0 M, 49:46 TWEDEL, 45:45 TWEDEn, 42:42 ATA0, 39:38 TCF0, 36:36 BT1, 35:35 BT0, 29:29 LSMAOE, 28:28 nTLSMD, 26:26 UCI, 24:24 E0E, 23:23 SPAN, 20:20 TSCXT, 18:18 nTWE, 16:16 nTWI, 15:15 UCT, 14:14 DZE, 10:10 EnRCTX, 8:8 SED, 7:7 ITD, 5:5 CP15BEN, 4:4 SA0 } SCTLR_EL2; - -// Interrupt Set-Pending Register 0 -__register 32 { } GICR_ISPENDR0; - -// Non-secure Access Control Registers -array [0..63] of __register 32 { } GICD_NSACRE; - -// Virtual Type Register -__register 32 { 31:29 PRIbits, 28:26 PREbits, 25:23 IDbits, 22:22 SEIS, 21:21 A3V, 4:0 ListRegs } GICH_VTR; - -// Translation Table Base Control Register 2 -__register 32 { 18:18 HWU162, 17:17 HWU161, 16:16 HWU160, 15:15 HWU159, 14:14 HWU062, 13:13 HWU061, 12:12 HWU060, 11:11 HWU059, 10:10 HPD1, 9:9 HPD0 } TTBCR2; - -// Activity Monitors Peripheral Identification Register 4 -__register 32 { 7:4 SIZE, 3:0 DES_2 } AMPIDR4; - -// Hypervisor Fine-Grained Read Trap Register -__register 64 { 49:49 ERXADDR_EL1, 48:48 ERXPFGCDN_EL1, 47:47 ERXPFGCTL_EL1, 46:46 ERXPFGF_EL1, 45:45 ERXMISCn_EL1, 44:44 ERXSTATUS_EL1, 43:43 ERXCTLR_EL1, 42:42 ERXFR_EL1, 41:41 ERRSELR_EL1, 40:40 ERRIDR_EL1, 39:39 ICC_IGRPENn_EL1, 38:38 VBAR_EL1, 37:37 TTBR1_EL1, 36:36 TTBR0_EL1, 35:35 TPIDR_EL0, 34:34 TPIDRRO_EL0, 33:33 TPIDR_EL1, 32:32 TCR_EL1, 31:31 SCXTNUM_EL0, 30:30 SCXTNUM_EL1, 29:29 SCTLR_EL1, 28:28 REVIDR_EL1, 27:27 PAR_EL1, 26:26 MPIDR_EL1, 25:25 MIDR_EL1, 24:24 MAIR_EL1, 23:23 LORSA_EL1, 22:22 LORN_EL1, 21:21 LORID_EL1, 20:20 LOREA_EL1, 19:19 LORC_EL1, 18:18 ISR_EL1, 17:17 FAR_EL1, 16:16 ESR_EL1, 15:15 DCZID_EL0, 14:14 CTR_EL0, 13:13 CSSELR_EL1, 12:12 CPACR_EL1, 11:11 CONTEXTIDR_EL1, 10:10 CLIDR_EL1, 9:9 CCSIDR_EL1, 8:8 APIBKey, 7:7 APIAKey, 6:6 APGAKey, 5:5 APDBKey, 4:4 APDAKey, 3:3 AMAIR_EL1, 2:2 AIDR_EL1, 1:1 AFSR1_EL1, 0:0 AFSR0_EL1 } HFGRTR_EL2; - -// Counter Count Value register -__register 64 { 63:0 CountValue } CNTCV; - -// Component Identification Register 1 -__register 32 { 7:4 CLASS, 3:0 PRMBL_1 } ERRCIDR1; - -// Physical Address Register -__register 64 { 39:12 PA, 11:11 LPAE, 10:10 NOS, 9:9 NS, 8:7 SH, 1:1 SS, 0:0 F, 63:56 ATTR, 9:9 FSTAGE, 8:8 S2WLK, 6:1 FST, 6:4 Inner, 3:2 Outer, 6:6, 5:1 FS } PAR; - -// Instruction Set Attribute Register 4 -__register 32 { 31:28 SWP_frac, 27:24 PSR_M, 23:20 SynchPrim_frac, 19:16 Barrier, 15:12 SMC, 11:8 Writeback, 7:4 WithShifts, 3:0 Unpriv } ID_ISAR4; - -// Activity Monitors Configuration Register -__register 32 { 31:28 NCG, 24:24 HDBG, 13:8 SIZE, 7:0 N } AMCFGR; - -// Performance Monitors Cycle Count Filter Register -__register 32 { 31:31 P, 30:30 U, 29:29 NSK, 28:28 NSU, 27:27 NSH } PMCCFILTR; - -// CPU Interface Identification Register -__register 32 { 31:20 ProductID, 19:16 Architecture_version, 15:12 Revision, 11:0 Implementer } GICC_IIDR; - -// MPAM1 Register (EL1) -__register 64 { 63:63 MPAMEN, 60:60 FORCED_NS, 47:40 PMG_D, 39:32 PMG_I, 31:16 PARTID_D, 15:0 PARTID_I } MPAM1_EL1; - -// Interrupt Controller Software Generated Interrupt Group 1 Register -__register 64 { 55:48 Aff3, 47:44 RS, 40:40 IRM, 39:32 Aff2, 27:24 INTID, 23:16 Aff1, 15:0 TargetList } ICC_SGI1R; - -// Context ID Register (EL1) -__register 32 { 31:0 PROCID } CONTEXTIDR_EL1; - -// Debug Link Register -__register 32 { } DLR; - -// Statistical Profiling Control Register (EL1) -__register 64 { 7:6 PCT, 5:5 TS, 4:4 PA, 3:3 CX, 1:1 E1SPE, 0:0 E0SPE } PMSCR_EL1; - -// Monitor Debug Configuration Register (EL3) -__register 32 { 28:28 MTPME, 27:27 TDCC, 23:23 SCCD, 21:21 EPMAD, 20:20 EDAD, 19:19 TTRF, 18:18 STE, 17:17 SPME, 16:16 SDD, 15:14 SPD32, 13:12 NSPB, 10:10 TDOSA, 9:9 TDA, 6:6 TPM } MDCR_EL3; - -// External Debug Component Identification Register 3 -__register 32 { 7:0 PRMBL_3 } EDCIDR3; - -// Interrupt Controller System Register Enable register -__register 32 { 2:2 DIB, 1:1 DFB, 0:0 SRE } ICC_SRE; - -// Interrupt Controller Interrupt Group 1 Enable register (EL3) -__register 32 { 1:1 EnableGrp1S, 0:0 EnableGrp1NS } ICC_IGRPEN1_EL3; - -// Normal Memory Remap Register -__register 32 { } NMRR; - -// EL2 Software Thread ID Register -__register 64 { } TPIDR_EL2; - -// Interrupt Group Register 0 -__register 32 { } GICR_IGROUPR0; - -// Error Record Miscellaneous Register 0 -array [0..65534] of __register 64 { 39:39 OF, 38:32 CEC, 47:47 OFO, 46:40 CECO, 39:39 OFR, 38:32 CECR } ERRMISC0; - -// CPU Interface Aliased Interrupt Acknowledge Register -__register 32 { 23:0 INTID } GICC_AIAR; - -// Hyp Vector Base Address Register -__register 32 { } HVBAR; - -// Reseeded Random Number -__register 64 { 63:0 RNDRRS } RNDRRS; - -// Redistributor virtual SGI pending state request register -__register 32 { 15:0 vPEID } GICR_VSGIR; - -// Interrupt Group Modifier Registers -array [1..2] of __register 32 { } GICR_IGRPMODRE; - -// Performance Monitors Selected Event Count Register -__register 32 { } PMXEVCNTR; - -// Selected Error Record Feature Register -__register 64 { } ERXFR_EL1; - -// CTI External Multiplexer Control register -__register 32 { } ASICCTL; - -// MPAM Virtual PARTID Mapping Register 3 -__register 64 { 63:48 PhyPARTID15, 47:32 PhyPARTID14, 31:16 PhyPARTID13, 15:0 PhyPARTID12 } MPAMVPM3_EL2; - -// Debug Feature Register 1 -__register 64 { 3:0 MTPMU } ID_DFR1_EL1; - -// External Debug Integration mode Control register -__register 32 { 0:0 IME } EDITCTRL; - -// Selected Error Record Miscellaneous Register 2 -__register 64 { } ERXMISC2_EL1; - -// External Debug Virtual Context Sample Register -__register 32 { 31:31 NS, 30:30 E2, 29:29 E3, 28:28 HV, 31:0 CONTEXTIDR_EL2, 15:8, 7:0 VMID } EDVIDSR; - -// Fault Address Register (EL2) -__register 64 { } FAR_EL2; - -// Hyp Translation Control Register -__register 32 { 28:28 HWU62, 27:27 HWU61, 26:26 HWU60, 25:25 HWU59, 24:24 HPD, 13:12 SH0, 11:10 ORGN0, 9:8 IRGN0, 2:0 T0SZ } HTCR; - -// Hyp Auxiliary Configuration Register -__register 32 { } HACR; - -// FCSE Process ID register -__register 32 { } FCSEIDR; - -// Performance Monitors Component Identification Register 0 -__register 32 { 7:0 PRMBL_0 } PMCIDR0; - -// Debug Breakpoint Extended Value Registers -array [0..15] of __register 32 { 31:0 ContextID2, 15:8, 7:0 VMID } DBGBXVR; - -// Virtual SError Exception Syndrome Register -__register 64 { 15:14 AET, 12:12 ExT, 24:24 IDS, 23:0 ISS } VSESR_EL2; - -// External Debug Auxiliary Control Register -__register 32 { } EDACR; - -// Interrupt Controller Maintenance Interrupt State Register -__register 32 { 7:7 VGrp1D, 6:6 VGrp1E, 5:5 VGrp0D, 4:4 VGrp0E, 3:3 NP, 2:2 LRENP, 1:1 U, 0:0 EOI } ICH_MISR; - -// Architectural Feature Trap Register (EL2) -__register 32 { 31:31 TCPAC, 30:30 TAM, 20:20 TTA, 21:20 FPEN, 17:16 ZEN, 10:10 TFP, 8:8 TZ } CPTR_EL2; - -// Performance Monitors Component Identification Register 2 -__register 32 { 7:0 PRMBL_2 } PMCIDR2; - -// LORegion End Address (EL1) -__register 64 { 51:48, 47:16 EA } LOREA_EL1; - -// Hyp Configuration Register -__register 32 { 30:30 TRVM, 29:29 HCD, 27:27 TGE, 26:26 TVM, 25:25 TTLB, 24:24 TPU, 23:23 TPC, 22:22 TSW, 21:21 TAC, 20:20 TIDCP, 19:19 TSC, 18:18 TID3, 17:17 TID2, 16:16 TID1, 15:15 TID0, 14:14 TWE, 13:13 TWI, 12:12 DC, 11:10 BSU, 9:9 FB, 8:8 VA, 7:7 VI, 6:6 VF, 5:5 AMO, 4:4 IMO, 3:3 FMO, 2:2 PTW, 1:1 SWIO, 0:0 VM } HCR; - -// Performance Monitors Lock Access Register -__register 32 { 31:0 KEY } PMLAR; - -// Interrupt Controller System Register Enable register (EL3) -__register 32 { 3:3 Enable, 2:2 DIB, 1:1 DFB, 0:0 SRE } ICC_SRE_EL3; - -// Interrupt Controller Virtual Highest Priority Pending Interrupt Register 1 -__register 32 { 23:0 INTID } ICV_HPPIR1; - -// Performance Monitors Peripheral Identification Register 0 -__register 32 { 7:0 PART_0 } PMPIDR0; - -// Sampling Latency Filter Register -__register 64 { 11:0 MINLAT } PMSLATFR_EL1; - -// ITS Read Register -__register 64 { 19:5 Offset, 0:0 Stalled } GITS_CREADR; - -// Interrupt Controller Hyp System Register Enable register -__register 32 { 3:3 Enable, 2:2 DIB, 1:1 DFB, 0:0 SRE } ICC_HSRE; - -// MPAM Capture Event Generation Register -__register 32 { 1:1 ALL, 0:0 NOW } MSMON_CAPT_EVNT; - -// EL0 Read-Only Software Thread ID Register -__register 64 { } TPIDRRO_EL0; - -// Virtualization Translation Control Register -__register 32 { 28:28 HWU62, 27:27 HWU61, 26:26 HWU60, 25:25 HWU59, 13:12 SH0, 11:10 ORGN0, 9:8 IRGN0, 7:6 SL0, 4:4 S, 3:0 T0SZ } VTCR; - -// DCC Interrupt Enable Register -__register 32 { 30:30 RX, 29:29 TX } DBGDCCINT; - -// Debug Saved Program Status Register -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 DIT, 23:23 SSBS, 22:22 PAN, 21:21 SS, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:0 M } DSPSR; - -// Profiling Buffer Write Pointer Register -__register 64 { 63:0 PTR } PMBPTR_EL1; - -// Debug Authentication Status register -__register 32 { 7:6 SNID, 5:4 SID, 3:2 NSNID, 1:0 NSID } DBGAUTHSTATUS; - -// Counter-timer Frequency register -__register 32 { } CNTFRQ_EL0; - -// Interrupt Set-Active Registers (extended SPI range) -array [0..31] of __register 32 { } GICD_ISACTIVERE; - -// Report ITS's affinity. -__register 32 { 31:24 Aff3, 23:16 Aff2, 15:8 Aff1 } GITS_MPIDR; - -// VMID Sample Register -__register 32 { 15:8, 7:0 VMID } PMVIDSR; - -// Interrupt Controller Virtual Running Priority Register -__register 32 { 7:0 Priority } ICV_RPR; - -// Activity Monitors Event Type Registers 1 -array [0..15] of __register 32 { 15:0 evtCount } AMEVTYPER1; - -// Main ID Register -__register 32 { 31:24 Implementer, 23:20 Variant, 19:16 Architecture, 15:4 PartNum, 3:0 Revision } MIDR; - -// Selected Error Record Feature Register 2 -__register 32 { } ERXFR2; - -// Data Cache Zero ID register -__register 32 { 4:4 DZP, 3:0 BS } DCZID_EL0; - -// Error Record Select Register -__register 32 { 15:0 SEL } ERRSELR; - -// MPAM Implementation-Specific Partitioning Feature Identification Register -__register 32 { } MPAMF_IMPL_IDR; - -// Performance Monitors Common Event Identification register 3 -__register 32 { } PMCEID3; - -// Media and VFP Feature Register 2 -__register 32 { 7:4 FPMisc, 3:0 SIMDMisc } MVFR2; - -// Debug Watchpoint Value Registers -array [0..15] of __register 64 { 63:53, 52:49 RESS, 52:49, 48:2 VA } DBGWVR_EL1; - -// Exception Link Register (Hyp mode) -__register 32 { } ELR_hyp; - -// Floating-point Control Register -__register 32 { 26:26 AHP, 25:25 DN, 24:24 FZ, 23:22 RMode, 21:20 Stride, 19:19 FZ16, 18:16 Len, 15:15 IDE, 12:12 IXE, 11:11 UFE, 10:10 OFE, 9:9 DZE, 8:8 IOE } FPCR; - -// Performance Monitors Lock Status Register -__register 32 { 2:2 nTT, 1:1 SLK, 0:0 SLI } PMLSR; - -// CTI Application Trigger Set register -__register 32 { } CTIAPPSET; - -// Stack Pointer (EL0) -__register 64 { } SP_EL0; - -// Vector Base Address Register (EL2) -__register 64 { } VBAR_EL2; - -// Interrupt Configuration Registers (Extended SPI Range) -array [0..63] of __register 32 { } GICD_ICFGRE; - -// Selected Error Record Miscellaneous Register 1 -__register 32 { } ERXMISC1; - -// AArch64 Instruction Set Attribute Register 1 -__register 64 { 55:52 I8MM, 51:48 DGH, 47:44 BF16, 43:40 SPECRES, 39:36 SB, 35:32 FRINTTS, 31:28 GPI, 27:24 GPA, 23:20 LRCPC, 19:16 FCMA, 15:12 JSCVT, 11:8 API, 7:4 APA, 3:0 DPB } ID_AA64ISAR1_EL1; - -// Virtual Machine Highest Priority Pending Interrupt Register -__register 32 { 24:0 INTID } GICV_HPPIR; - -// Debug Vector Catch Register -__register 32 { 31:31 NSF, 30:30 NSI, 28:28 NSD, 27:27 NSP, 26:26 NSS, 25:25 NSU, 7:7 SF, 6:6 SI, 4:4 SD, 3:3 SP, 2:2 SS, 1:1 SU, 7:7 F, 6:6 I, 4:4 D, 3:3 P, 2:2 S, 1:1 U } DBGVCR32_EL2; - -// Sampling Filter Control Register -__register 64 { 18:18 ST, 17:17 LD, 16:16 B, 2:2 FL, 1:1 FT, 0:0 FE } PMSFCR_EL1; - -// Performance Monitors Configuration Register -__register 32 { 31:28 NCG, 19:19 UEN, 18:18 WT, 17:17 NA, 16:16 EX, 15:15 CCD, 14:14 CC, 13:8 SIZE, 7:0 N } PMCFGR; - -// Interrupt Controller Virtual Binary Point Register 1 -__register 32 { 2:0 BinaryPoint } ICV_BPR1_EL1; - -// Performance Monitors Interrupt Enable Clear register -__register 32 { 31:31 C } PMINTENCLR; - -// Stack Pointer (EL1) -__register 64 { } SP_EL1; - -// Performance Monitors Overflow Flag Status Set register -__register 32 { 31:31 C } PMOVSSET; - -// Interrupt Set-Active Registers -array [0..31] of __register 32 { } GICD_ISACTIVER; - -// Selected Pseudo-fault Generation Countdown register -__register 64 { } ERXPFGCDN_EL1; - -// SVE Control Register for EL1 -__register 64 { 3:0 LEN } ZCR_EL1; - -// Debug Data Transfer Register, half-duplex -__register 64 { 63:32 HighWord, 31:0 LowWord } DBGDTR_EL0; - -// Performance Monitors Count Enable Set register -__register 32 { 31:31 C } PMCNTENSET; - -// Interrupt Controller Highest Priority Pending Interrupt Register 0 -__register 32 { 23:0 INTID } ICC_HPPIR0; - -// Translation Table Base Register 1 (EL2) -__register 64 { 63:48 ASID, 47:1 BADDR, 0:0 CnP } TTBR1_EL2; - -// Debug OS Lock Data Transfer Register, Receive, External View -__register 32 { } DBGDTRRXext; - -// Performance Monitors User Enable Register -__register 32 { 3:3 ER, 2:2 CR, 1:1 SW, 0:0 EN } PMUSERENR; - -// Pseudo-fault Generation Countdown Register -array [0..65534] of __register 64 { 31:0 CDN } ERRPFGCDN; - -// Selected Error Record Miscellaneous Register 4 -__register 32 { } ERXMISC4; - -// Hyp Auxiliary Control Register -__register 32 { } HACTLR; - -// MPAM0 Register (EL1) -__register 64 { 47:40 PMG_D, 39:32 PMG_I, 31:16 PARTID_D, 15:0 PARTID_I } MPAM0_EL1; - -// Hyp Auxiliary Instruction Fault Status Register -__register 32 { } HAIFSR; - -// External Debug Instruction Transfer Register -__register 32 { 31:16 T32Second, 15:0 T32First } EDITR; - -// Counter-timer Physical Timer CompareValue register (EL2) -__register 64 { 63:0 CompareValue } CNTHP_CVAL_EL2; - -// Device Architecture Register -__register 32 { 31:21 ARCHITECT, 20:20 PRESENT, 19:16 REVISION, 15:12 ARCHVER, 11:0 ARCHPART } ERRDEVARCH; - -// Hypervisor Activity Monitors Fine-Grained Read Trap Register -__register 64 { 49:49 AMEVTYPER115_EL0, 48:48 AMEVCNTR115_EL0, 47:47 AMEVTYPER114_EL0, 46:46 AMEVCNTR114_EL0, 45:45 AMEVTYPER113_EL0, 44:44 AMEVCNTR113_EL0, 43:43 AMEVTYPER112_EL0, 42:42 AMEVCNTR112_EL0, 41:41 AMEVTYPER111_EL0, 40:40 AMEVCNTR111_EL0, 39:39 AMEVTYPER110_EL0, 38:38 AMEVCNTR110_EL0, 37:37 AMEVTYPER19_EL0, 36:36 AMEVCNTR19_EL0, 35:35 AMEVTYPER18_EL0, 34:34 AMEVCNTR18_EL0, 33:33 AMEVTYPER17_EL0, 32:32 AMEVCNTR17_EL0, 31:31 AMEVTYPER16_EL0, 30:30 AMEVCNTR16_EL0, 29:29 AMEVTYPER15_EL0, 28:28 AMEVCNTR15_EL0, 27:27 AMEVTYPER14_EL0, 26:26 AMEVCNTR14_EL0, 25:25 AMEVTYPER13_EL0, 24:24 AMEVCNTR13_EL0, 23:23 AMEVTYPER12_EL0, 22:22 AMEVCNTR12_EL0, 21:21 AMEVTYPER11_EL0, 20:20 AMEVCNTR11_EL0, 19:19 AMEVTYPER10_EL0, 18:18 AMEVCNTR10_EL0, 17:17 AMCNTEN1, 0:0 AMCNTEN0 } HAFGRTR_EL2; - -// Memory Model Feature Register 1 -__register 32 { 31:28 BPred, 27:24 L1TstCln, 23:20 L1Uni, 19:16 L1Hvd, 15:12 L1UniSW, 11:8 L1HvdSW, 7:4 L1UniVA, 3:0 L1HvdVA } ID_MMFR1; - -// Auxiliary Memory Attribute Indirection Register (EL2) -__register 64 { } AMAIR_EL2; - -// Translation Table Base Control Register -__register 32 { 31:31 EAE, 5:5 PD1, 4:4 PD0, 2:0 N, 29:28 SH1, 27:26 ORGN1, 25:24 IRGN1, 23:23 EPD1, 22:22 A1, 18:16 T1SZ, 13:12 SH0, 11:10 ORGN0, 9:8 IRGN0, 7:7 EPD0, 6:6 T2E, 2:0 T0SZ } TTBCR; - -// External Debug Processor Feature Register -__register 64 { 47:44 AMU, 39:36 SEL2, 35:32 SVE, 27:24 GIC, 23:20 AdvSIMD, 19:16 FP, 15:12 EL3, 11:8 EL2, 7:4 EL1, 3:0 EL0 } EDPFR; - -// Interrupt Controller Monitor System Register Enable register -__register 32 { 3:3 Enable, 2:2 DIB, 1:1 DFB, 0:0 SRE } ICC_MSRE; - -// Activity Monitors User Enable Register -__register 64 { 0:0 EN } AMUSERENR_EL0; - -// Error Record Select Register -__register 64 { 15:0 SEL } ERRSELR_EL1; - -// Interrupt Set-Active Register 0 -__register 32 { } GICR_ISACTIVER0; - -// AArch32 Memory Model Feature Register 1 -__register 32 { 31:28 BPred, 27:24 L1TstCln, 23:20 L1Uni, 19:16 L1Hvd, 15:12 L1UniSW, 11:8 L1HvdSW, 7:4 L1UniVA, 3:0 L1HvdVA } ID_MMFR1_EL1; - -// Counter Scale Register -__register 32 { 31:0 ScaleVal } CNTSCR; - -// AArch32 Instruction Set Attribute Register 1 -__register 32 { 31:28 Jazelle, 27:24 Interwork, 23:20 Immediate, 19:16 IfThen, 15:12 Extend, 11:8 Except_AR, 7:4 Except, 3:0 Endian } ID_ISAR1_EL1; - -// Debug ROM Address Register -__register 64 { 1:0 Valid, 47:12 ROMADDR } DBGDRAR; - -// Activity Monitors Event Counter Registers 0 -array [0..15] of __register 64 { 63:0 ACNT } AMEVCNTR0_EL0; - -// External Debug Lock Access Register -__register 32 { 31:0 KEY } EDLAR; - -// Counter-timer Virtual Offsets -array [0..7] of __register 64 { } CNTVOFF; - -// Privileged Access Never -__register 32 { 22:22 PAN } PAN; - -// Monitor Debug ROM Address Register -__register 64 { 1:0 Valid, 51:48, 47:12 ROMADDR } MDRAR_EL1; - -// Non-Secure Access Control Register -__register 32 { 20:20 NSTRCDIS, 15:15 NSASEDIS, 11:11 cp11, 10:10 cp10 } NSACR; - -// Current Program Status Register -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 3:0 M } CPSR; - -// Monitor Vector Base Address Register -__register 32 { 4:0 Reserved } MVBAR; - -// Performance Monitors User Enable Register -__register 32 { 3:3 ER, 2:2 CR, 1:1 SW, 0:0 EN } PMUSERENR_EL0; - -// External Debug Exception Catch Control Register -__register 32 { } EDECCR; - -// External Debug Component Identification Register 0 -__register 32 { 7:0 PRMBL_0 } EDCIDR0; - -// Activity Monitors Count Enable Set Register 1 -__register 64 { } AMCNTENSET1_EL0; - -// External Debug Peripheral Identification Register 4 -__register 32 { 7:4 SIZE, 3:0 DES_2 } EDPIDR4; - -// AArch32 Debug Feature Register 0 -__register 32 { 31:28 TraceFilt, 27:24 PerfMon, 23:20 MProfDbg, 11:8 MMapDbg, 7:4 CopSDbg, 3:0 CopDbg } ID_DFR0_EL1; - -// EL0 Read/Write Software Thread ID Register -__register 64 { } TPIDR_EL0; - -// Activity Monitors Event Counter Registers 0 -array [0..15] of __register 64 { 63:0 ACNT } AMEVCNTR0; - -// Secure Debug Enable Register -__register 32 { 1:1 SUNIDEN, 0:0 SUIDEN } SDER; - -// Hyp IPA Fault Address Register -__register 32 { 31:4 FIPA } HPFAR; - -// Counter-timer Timer ID Register -__register 32 { } CNTTIDR; - -// Interrupt Controller Monitor Control Register -__register 32 { 19:19 ExtRange, 18:18 RSS, 17:17 nDS, 15:15 A3V, 14:14 SEIS, 13:11 IDbits, 10:8 PRIbits, 6:6 PMHE, 5:5 RM, 4:4 EOImode_EL1NS, 3:3 EOImode_EL1S, 2:2 EOImode_EL3, 1:1 CBPR_EL1NS, 0:0 CBPR_EL1S } ICC_MCTLR; - -// CTI Peripheral Identification Register 0 -__register 32 { 7:0 PART_0 } CTIPIDR0; - -// Debug Power Control Register -__register 32 { 0:0 CORENPDRQ } DBGPRCR_EL1; - -// Interrupt Controller VGIC Type Register -__register 32 { 31:29 PRIbits, 28:26 PREbits, 25:23 IDbits, 22:22 SEIS, 21:21 A3V, 20:20 nV4, 19:19 TDS, 4:0 ListRegs } ICH_VTR_EL2; - -// Interrupt Controller Hyp Active Priorities Group 1 Registers -array [0..3] of __register 64 { } ICH_AP1R_EL2; - -// CPU Interface Running Priority Register -__register 32 { 7:0 Priority } GICC_RPR; - -// Counter-timer Kernel Control register -__register 32 { 17:17 EVNTIS, 9:9 EL0PTEN, 8:8 EL0VTEN, 7:4 EVNTI, 3:3 EVNTDIR, 2:2 EVNTEN, 1:1 EL0VCTEN, 0:0 EL0PCTEN } CNTKCTL_EL1; - -// Counter-timer Virtual Count register -__register 64 { } CNTVCT_EL0; - -// EL2 Read/Write Software Context Number -__register 64 { } SCXTNUM_EL2; - -// ITS Identification Register -__register 32 { 31:24 ProductID, 19:16 Variant, 15:12 Revision, 11:0 Implementer } GITS_IIDR; - -// Counter-timer Virtual Timer Control register (EL2) -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTHV_CTL; - -// CTI Lock Status Register -__register 32 { 2:2 nTT, 1:1 SLK, 0:0 SLI } CTILSR; - -// End Interrupt Status Register -__register 32 { } GICH_EISR; - -// Interrupt Controller VGIC Type Register -__register 32 { 31:29 PRIbits, 28:26 PREbits, 25:23 IDbits, 22:22 SEIS, 21:21 A3V, 20:20 nV4, 19:19 TDS, 4:0 ListRegs } ICH_VTR; - -// AArch64 Memory Model Feature Register 0 -__register 64 { 63:60 ECV, 59:56 FGT, 47:44 ExS, 43:40 TGran4_2, 39:36 TGran64_2, 35:32 TGran16_2, 31:28 TGran4, 27:24 TGran64, 23:20 TGran16, 19:16 BigEndEL0, 15:12 SNSMem, 11:8 BigEnd, 7:4 ASIDBits, 3:0 PARange } ID_AA64MMFR0_EL1; - -// Interrupt Clear-Pending Registers -array [0..31] of __register 32 { } GICD_ICPENDR; - -// Virtual Machine Deactivate Interrupt Register -__register 32 { 24:0 INTID } GICV_DIR; - -// Debug Link Register -__register 64 { } DLR_EL0; - -// Translation Table Base Register 1 (EL1) -__register 64 { 63:48 ASID, 47:1 BADDR, 0:0 CnP } TTBR1_EL1; - -// Performance Monitors Common Event Identification register 1 -__register 64 { } PMCEID1_EL0; - -// SGI Set-Pending Registers -array [0..3] of __register 32 { } GICD_SPENDSGIR; - -// Peripheral Identification Register 0 -__register 32 { 7:0 PART_0 } ERRPIDR0; - -// Exception Link Register (EL2) -__register 64 { } ELR_EL2; - -// Hyp Auxiliary Control Register 2 -__register 32 { } HACTLR2; - -// Activity Monitors Counter Group 1 Identification Register -__register 64 { } AMCG1IDR_EL0; - -// MPAM Memory System Monitor Configure Memory Bandwidth Usage Monitor Filter Register -__register 32 { 23:16 PMG, 15:0 PARTID } MSMON_CFG_MBWU_FLT; - -// Vector Base Address Register (EL3) -__register 64 { } VBAR_EL3; - -// Software Generated Interrupt Register -__register 32 { 25:24 TargetListFilter, 23:16 CPUTargetList, 15:15 NSATT, 3:0 INTID } GICD_SGIR; - -// Pointer Authentication Key A for Code (bits[127:64]) -__register 64 { } APGAKeyHi_EL1; - -// CTI Trigger Out Status register -__register 32 { } CTITRIGOUTSTATUS; - -// Interrupt Controller Virtual Active Priorities Group 0 Registers -array [0..3] of __register 64 { } ICV_AP0R_EL1; - -// Performance Monitors Event Count Registers -array [0..30] of __register 32 { } PMEVCNTR; - -// Auxiliary Memory Attribute Indirection Register (EL3) -__register 64 { } AMAIR_EL3; - -// Debug OS Double Lock Register -__register 32 { 0:0 DLK } DBGOSDLR; - -// Interrupt Controller End Of Interrupt Register 0 -__register 32 { 23:0 INTID } ICC_EOIR0; - -// Counter-timer Secure Virtual Timer Control Register (EL2) -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTHVS_CTL; - -// Primary Region Remap Register -__register 32 { 19:19 NS1, 18:18 NS0, 17:17 DS1, 16:16 DS0 } PRRR; - -// Instruction Set Attribute Register 1 -__register 32 { 31:28 Jazelle, 27:24 Interwork, 23:20 Immediate, 19:16 IfThen, 15:12 Extend, 11:8 Except_AR, 7:4 Except, 3:0 Endian } ID_ISAR1; - -// Reset Vector Base Address Register -__register 32 { } RVBAR; - -// External Debug Device Affinity register 0 -__register 32 { 31:0 MPIDR_EL1lo } EDDEVAFF0; - -// Auxiliary Control Register (EL1) -__register 64 { } ACTLR_EL1; - -// Counter-timer Self-Synchronized Virtual Count register -__register 64 { } CNTVCTSS; - -// Selected Error Record Primary Status Register -__register 64 { } ERXSTATUS_EL1; - -// Reset Management Register -__register 32 { 1:1 RR, 0:0 AA64 } RMR; - -// ITS Write Register -__register 64 { 19:5 Offset, 0:0 Retry } GITS_CWRITER; - -// Cache Size Selection Register -__register 32 { 4:4 TnD, 3:1 Level, 0:0 InD } CSSELR_EL1; - -// CPU Interface Aliased Binary Point Register -__register 32 { 2:0 Binary_Point } GICC_ABPR; - -// Redistributor virtual SGI pending state register -__register 32 { 31:31 Busy, 15:0 Pending } GICR_VSGIPENDR; - -// Translation Table Base Register 0 -__register 64 { 31:7 TTB0, 5:5 NOS, 4:3 RGN, 2:2 IMP, 1:1 S, 55:48 ASID, 47:1 BADDR, 0:0 CnP, 0:0, 6:6 IRGN } TTBR0; - -// Interrupt Configuration Register 0 -__register 32 { } GICR_ICFGR0; - -// Redistributor Wake Register -__register 32 { 2:2 ChildrenAsleep, 1:1 ProcessorSleep } GICR_WAKER; - -// Selected Error Record Miscellaneous Register 2 -__register 32 { } ERXMISC2; - -// Exception Syndrome Register (EL1) -__register 32 { 31:26 EC, 25:25 IL, 24:0 ISS } ESR_EL1; - -// CTI Device ID register 0 -__register 32 { 25:24 INOUT, 21:16 NUMCHAN, 13:8 NUMTRIG, 4:0 EXTMUXNUM } CTIDEVID; - -// Performance Monitors Peripheral Identification Register 1 -__register 32 { 7:4 DES_0, 3:0 PART_1 } PMPIDR1; - -// Counter-timer EL0 Access Control Register -__register 32 { 9:9 EL0PTEN, 8:8 EL0VTEN, 1:1 EL0VCTEN, 0:0 EL0PCTEN } CNTEL0ACR; - -// Counter-timer Physical Offset register -__register 64 { } CNTPOFF_EL2; - -// Activity Monitors Count Enable Set Register 0 -__register 64 { } AMCNTENSET0_EL0; - -// Device Configuration Register -__register 32 { 15:0 NUM } ERRDEVID; - -// Interrupt Controller Type Register -__register 32 { 31:27 ESPI_range, 26:26 RSS, 25:25 No1N, 24:24 A3V, 23:19 IDbits, 18:18 DVIS, 17:17 LPIS, 16:16 MBIS, 15:11 num_LPIs, 10:10 SecurityExtn, 8:8 ESPI, 7:5 CPUNumber, 4:0 ITLinesNumber } GICD_TYPER; - -// External Debug Device Affinity register 1 -__register 32 { 31:0 MPIDR_EL1hi } EDDEVAFF1; - -// Interrupt Controller Hyp Control Register -__register 32 { 31:27 EOIcount, 14:14 TDIR, 13:13 TSEI, 12:12 TALL1, 11:11 TALL0, 10:10 TC, 8:8 vSGIEOICount, 7:7 VGrp1DIE, 6:6 VGrp1EIE, 5:5 VGrp0DIE, 4:4 VGrp0EIE, 3:3 NPIE, 2:2 LRENPIE, 1:1 UIE, 0:0 En } ICH_HCR; - -// Instruction Fault Address Register -__register 32 { } IFAR; - -// Domain Access Control Register -__register 32 { } DACR32_EL2; - -// Interrupt Clear-Active Register 0 -__register 32 { } GICR_ICACTIVER0; - -// Memory Attribute Indirection Register (EL2) -__register 64 { } MAIR_EL2; - -// CTI Integration mode Control register -__register 32 { 0:0 IME } CTIITCTRL; - -// Interrupt Controller Interrupt Acknowledge Register 1 -__register 32 { 23:0 INTID } ICC_IAR1_EL1; - -// MPAM Memory Bandwidth Partitioning Identification Register -__register 32 { 28:16 BWPBM_WD, 14:14 WINDWR, 13:13 HAS_PROP, 12:12 HAS_PBM, 11:11 HAS_MAX, 10:10 HAS_MIN, 5:0 BWA_WD } MPAMF_MBW_IDR; - -// Activity Monitors Component Identification Register 3 -__register 32 { 7:0 PRMBL_3 } AMCIDR3; - -// MPAM Implementation Identification Register -__register 32 { 31:20 ProductID, 19:16 Variant, 15:12 Revision, 11:0 Implementer } MPAMF_IIDR; - -// Memory Model Feature Register 2 -__register 32 { 31:28 HWAccFlg, 27:24 WFIStall, 23:20 MemBarr, 19:16 UniTLB, 15:12 HvdTLB, 11:8 L1HvdRng, 7:4 L1HvdBG, 3:0 L1HvdFG } ID_MMFR2; - -// Tag Fault Status Register (EL0). -__register 64 { 1:1 TF1, 0:0 TF0 } TFSRE0_EL1; - -// Error Record Miscellaneous Register 1 -array [0..65534] of __register 64 { } ERRMISC1; - -// Pointer Authentication Key A for Data (bits[63:0]) -__register 64 { } APDAKeyLo_EL1; - -// Interrupt Set-Enable Registers -array [0..31] of __register 32 { } GICD_ISENABLERE; - -// CTI Input Channel to Output Trigger Enable registers -array [0..31] of __register 32 { } CTIOUTEN; - -// Interrupt Controller Binary Point Register 1 -__register 32 { 2:0 BinaryPoint } ICC_BPR1_EL1; - -// Hyp Debug Control Register -__register 32 { 28:28 MTPME, 27:27 TDCC, 26:26 HLP, 23:23 HCCD, 19:19 TTRF, 17:17 HPMD, 11:11 TDRA, 10:10 TDOSA, 9:9 TDA, 8:8 TDE, 7:7 HPME, 6:6 TPM, 5:5 TPMCR, 4:0 HPMN } HDCR; - -// Interrupt Controller Interrupt Group 0 Enable register -__register 32 { 0:0 Enable } ICC_IGRPEN0; - -// External Debug Reserve Control Register -__register 32 { 4:4 CBRRQ, 3:3 CSPA, 2:2 CSE } EDRCR; - -// Counter-timer Virtual Offset register -__register 64 { } CNTVOFF_EL2; - -// MPAM Memory Bandwidth Partitioning Window Width Configuration Register -__register 32 { 23:8 US_INT, 7:0 US_FRAC } MPAMCFG_MBW_WINWD; - -// MPAM Architecture Identification Register -__register 32 { 7:4 ArchMajorRev, 3:0 ArchMinorRev } MPAMF_AIDR; - -// Interrupt Controller Interrupt Group 0 Enable register -__register 32 { 0:0 Enable } ICC_IGRPEN0_EL1; - -// Media and VFP Feature Register 0 -__register 32 { 31:28 FPRound, 27:24 FPShVec, 23:20 FPSqrt, 19:16 FPDivide, 15:12 FPTrap, 11:8 FPDP, 7:4 FPSP, 3:0 SIMDReg } MVFR0; - -// MPAM Cache Storage Usage Monitor Capture Register -__register 32 { 31:31 NRDY, 30:0 VALUE } MSMON_CSU_CAPTURE; - -// Tag Fault Status Register (EL3) -__register 64 { 0:0 TF0 } TFSR_EL3; - -// Multiple tag transfer ID register -__register 64 { 3:0 BS } GMID_EL1; - -// CPU Interface Aliased End Of Interrupt Register -__register 32 { 23:0 INTID } GICC_AEOIR; - -// MPAM Cache Maximum Capacity Partition Configuration Register -__register 32 { 15:0 CMAX } MPAMCFG_CMAX; - -// Interrupt Controller Virtual Control Register -__register 32 { 19:19 ExtRange, 18:18 RSS, 15:15 A3V, 14:14 SEIS, 13:11 IDbits, 10:8 PRIbits, 1:1 EOImode, 0:0 CBPR } ICV_CTLR_EL1; - -// Memory Model Feature Register 0 -__register 32 { 31:28 InnerShr, 27:24 FCSE, 23:20 AuxReg, 19:16 TCM, 15:12 ShareLvl, 11:8 OuterShr, 7:4 PMSA, 3:0 VMSA } ID_MMFR0; - -// Hyp Instruction Fault Address Register -__register 32 { } HIFAR; - -// Performance Monitors Event Type Registers -array [0..30] of __register 32 { 31:31 P, 30:30 U, 29:29 NSK, 28:28 NSU, 27:27 NSH, 25:25 MT, 15:10, 9:0 evtCount } PMEVTYPER; - -// Distributor Control Register -__register 32 { 31:31 RWP, 7:7 E1NWF, 6:6 DS, 4:4 ARE_NS, 4:4 ARE_S, 2:2 EnableGrp1S, 1:1 EnableGrp1NS, 0:0 EnableGrp0, 1:1 EnableGrp1A, 1:1 EnableGrp1, 4:4 ARE } GICD_CTLR; - -// Auxiliary Control Register (EL2) -__register 64 { } ACTLR_EL2; - -// Counter-timer Secure Virtual Timer CompareValue register (EL2) -__register 64 { 63:0 CompareValue } CNTHVS_CVAL_EL2; - -// Performance Monitors Common Event Identification register 2 -__register 32 { } PMCEID2; - -// Auxiliary Fault Status Register 0 (EL2) -__register 32 { } AFSR0_EL2; - -// Reset Vector Base Address Register (if EL3 not implemented) -__register 64 { } RVBAR_EL2; - -// AArch32 Memory Model Feature Register 3 -__register 32 { 31:28 Supersec, 27:24 CMemSz, 23:20 CohWalk, 19:16 PAN, 15:12 MaintBcst, 11:8 BPMaint, 7:4 CMaintSW, 3:0 CMaintVA } ID_MMFR3_EL1; - -// MPAM Virtual PARTID Mapping Register 6 -__register 64 { 63:48 PhyPARTID27, 47:32 PhyPARTID26, 31:16 PhyPARTID25, 15:0 PhyPARTID24 } MPAMVPM6_EL2; - -// AArch64 Debug Feature Register 0 -__register 64 { 51:48 MTPMU, 43:40 TraceFilt, 39:36 DoubleLock, 35:32 PMSVer, 31:28 CTX_CMPs, 23:20 WRPs, 15:12 BRPs, 11:8 PMUVer, 7:4 TraceVer, 3:0 DebugVer } ID_AA64DFR0_EL1; - -// Pseudo-fault Generation Feature Register -array [0..65534] of __register 64 { 30:30 R, 29:29 SYN, 12:12 MV, 11:11 AV, 10:10 PN, 9:9 ER, 8:8 CI, 7:6 CE, 5:5 DE, 4:4 UEO, 3:3 UER, 2:2 UEU, 1:1 UC, 0:0 OF } ERRPFGF; - -// Critical Error Interrupt Configuration Register 1 -__register 32 { 31:0 DATA } ERRCRICR1; - -// Active Priorities Registers -array [0..3] of __register 32 { } GICH_APR; - -// Counter-timer Virtual Timer TimerValue register -__register 32 { 31:0 TimerValue } CNTV_TVAL_EL0; - -// Jazelle OS Control Register -__register 32 { } JOSCR; - -// Activity Monitors Peripheral Identification Register 2 -__register 32 { 7:4 REVISION, 3:3 JEDEC, 2:0 DES_1 } AMPIDR2; - -// AArch32 Instruction Set Attribute Register 4 -__register 32 { 31:28 SWP_frac, 27:24 PSR_M, 23:20 SynchPrim_frac, 19:16 Barrier, 15:12 SMC, 11:8 Writeback, 7:4 WithShifts, 3:0 Unpriv } ID_ISAR4_EL1; - -// External Debug Peripheral Identification Register 0 -__register 32 { 7:0 PART_0 } EDPIDR0; - -// Physical Address Register -__register 64 { 63:56 ATTR, 9:9 NS, 8:7 SH, 0:0 F, 9:9 S, 8:8 PTW, 6:1 FST, 51:48, 47:12 PA } PAR_EL1; - -// Hyp Reset Management Register -__register 32 { 1:1 RR, 0:0 AA64 } HRMR; - -// Interrupt Controller Software Generated Interrupt Group 1 Register -__register 64 { 55:48 Aff3, 47:44 RS, 40:40 IRM, 39:32 Aff2, 27:24 INTID, 23:16 Aff1, 15:0 TargetList } ICC_SGI1R_EL1; - -// Interrupt Controller Running Priority Register -__register 32 { 7:0 Priority } ICC_RPR; - -// Debug Device ID register 0 -__register 32 { 31:28 CIDMask, 27:24 AuxRegs, 23:20 DoubleLock, 19:16 VirtExtns, 15:12 VectorCatch, 11:8 BPAddrMask, 7:4 WPAddrMask, 3:0 PCSample } DBGDEVID; - -// Interrupt Controller Virtual Active Priorities Group 0 Registers -array [0..3] of __register 32 { } ICV_AP0R; - -// Debug Feature Register 1 -__register 32 { 3:0 MTPMU } ID_DFR1; - -// Reset Management Register (EL3) -__register 32 { 1:1 RR, 0:0 AA64 } RMR_EL3; - -// Virtualization Translation Table Base Register -__register 64 { 47:1 BADDR, 0:0 CnP, 63:56, 55:48 VMID } VTTBR_EL2; - -// Multiprocessor Affinity Register -__register 64 { 39:32 Aff3, 30:30 U, 24:24 MT, 23:16 Aff2, 15:8 Aff1, 7:0 Aff0 } MPIDR_EL1; - -// Performance Monitors Machine Identification Register -__register 64 { 7:0 SLOTS } PMMIR_EL1; - -// Interrupt Controller Active Priorities Group 0 Registers -array [0..3] of __register 32 { } ICC_AP0R; - -// CPU Interface Non-secure Active Priorities Registers -array [0..3] of __register 32 { } GICC_NSAPR; - -// Virtual Machine Binary Point Register -__register 32 { 2:0 Binary_Point } GICV_BPR; - -// External Debug Event Status Register -__register 32 { 2:2 SS, 1:1 RC, 0:0 OSUC } EDESR; - -// Debug Watchpoint Value Registers -array [0..15] of __register 32 { 31:2 VA } DBGWVR; - -// OS Lock Access Register -__register 32 { 0:0 OSLK } OSLAR_EL1; - -// Interrupt Controller Interrupt Acknowledge Register 0 -__register 32 { 23:0 INTID } ICC_IAR0; - -// MPAM Memory Bandwidth Maximum Partition Configuration Register -__register 32 { 31:31 HARDLIM, 15:0 MAX } MPAMCFG_MBW_MAX; - -// Performance Monitors Integration mode Control register -__register 32 { 0:0 IME } PMITCTRL; - -// Debug CLAIM Tag Clear register -__register 32 { 7:0 CLAIM } DBGCLAIMCLR_EL1; - -// Debug ID Register -__register 32 { 31:28 WRPs, 27:24 BRPs, 23:20 CTX_CMPs, 19:16 Version, 14:14 nSUHD_imp, 12:12 SE_imp } DBGDIDR; - -// Exception Link Register (EL1) -__register 64 { } ELR_EL1; - -// CPU Interface Control Register -__register 32 { 10:10 EOImodeNS, 8:8 IRQBypDisGrp1, 7:7 FIQBypDisGrp1, 1:1 EnableGrp1, 9:9 EOImodeS, 6:6 IRQBypDisGrp0, 5:5 FIQBypDisGrp0, 4:4 CBPR, 3:3 FIQEn, 0:0 EnableGrp0, 9:9 EOImode } GICC_CTLR; - -// Performance Monitors Control Register -__register 32 { 31:24 IMP, 23:16 IDCODE, 15:11 N, 7:7 LP, 6:6 LC, 5:5 DP, 4:4 X, 3:3 D, 2:2 C, 1:1 P, 0:0 E } PMCR; - -// Random Number -__register 64 { 63:0 RNDR } RNDR; - -// Memory Attribute Indirection Register (EL3) -__register 64 { } MAIR_EL3; - -// Saved Program Status Register (Undefined mode) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 J, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:0 M } SPSR_und; - -// Counter-timer Physical Timer CompareValue register -__register 64 { 63:0 CompareValue } CNTP_CVAL_EL0; - -// Interrupt Controller Virtual Interrupt Acknowledge Register 0 -__register 32 { 23:0 INTID } ICV_IAR0_EL1; - -// Performance Monitors Device Affinity register 1 -__register 32 { 31:0 MPIDR_EL1hi } PMDEVAFF1; - -// Debug OS Lock Access Register -__register 32 { 31:0 OSLA } DBGOSLAR; - -// Stack Pointer Select -__register 64 { 0:0 SP } SPSel; - -// Exception Syndrome Register (EL3) -__register 32 { 31:26 EC, 25:25 IL, 24:0 ISS } ESR_EL3; - -// Interrupt Controller List Registers -array [0..15] of __register 32 { 31:0 vINTID } ICH_LR; - -// Virtual Redistributor LPI Pending Table Base Address Register -__register 64 { 63:63 Valid, 62:62 IDAI, 61:61 PendingLast, 60:60 Dirty, 58:56 OuterCache, 51:16 Physical_Address, 11:10 Shareability, 9:7 InnerCache, 62:62 Doorbell, 59:59 VGrp0En, 58:58 VGrp1En, 15:0 vPEID } GICR_VPENDBASER; - -// Interrupt Set-Pending Registers -array [0..31] of __register 32 { } GICD_ISPENDR; - -// AArch32 Media and VFP Feature Register 1 -__register 32 { 31:28 SIMDFMAC, 27:24 FPHP, 23:20 SIMDHP, 19:16 SIMDSP, 15:12 SIMDInt, 11:8 SIMDLS, 7:4 FPDNaN, 3:0 FPFtZ } MVFR1_EL1; - -// Cache Type Register -__register 32 { 29:29 DIC, 28:28 IDC, 27:24 CWG, 23:20 ERG, 19:16 DminLine, 15:14 L1Ip, 3:0 IminLine } CTR; - -// Virtualization Translation Control Register -__register 32 { 30:30 NSA, 29:29 NSW, 28:28 HWU62, 27:27 HWU61, 26:26 HWU60, 25:25 HWU59, 22:22 HD, 21:21 HA, 19:19 VS, 18:16 PS, 15:14 TG0, 13:12 SH0, 11:10 ORGN0, 9:8 IRGN0, 7:6 SL0, 5:0 T0SZ } VTCR_EL2; - -// Set PARTID and PMG Register -__register 32 { 23:16 PMG, 15:0 PARTID } GITS_PARTIDR; - -// Saved Program Status Register (Supervisor mode) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 J, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:0 M } SPSR_svc; - -// Vector Base Address Register (EL1) -__register 64 { } VBAR_EL1; - -// Auxiliary Fault Status Register 1 (EL3) -__register 32 { } AFSR1_EL3; - -// Performance Monitors Event Count Registers -array [0..30] of __register 64 { } PMEVCNTR_EL0; - -// CTI Output Trigger Acknowledge register -__register 32 { } CTIINTACK; - -// MPAM Features Memory Bandwidth Usage Monitoring ID register -__register 32 { 31:31 HAS_CAPTURE, 30:30 HAS_LONG, 29:29 LWD, 20:16 SCALE, 15:0 NUM_MON } MPAMF_MBWUMON_IDR; - -// Counter-timer Secure Virtual Timer Control register (EL2) -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTHVS_CTL_EL2; - -// Performance Monitors Cycle Count Register -__register 64 { 63:0 CCNT } PMCCNTR; - -// Counter-timer Physical Secure Timer Control register -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTPS_CTL_EL1; - -// ITS SGI Register -__register 64 { 47:32 vPEID, 3:0 vINTID } GITS_SGIR; - -// Selected Error Record Miscellaneous Register 5 -__register 32 { } ERXMISC5; - -// Fault-Handling Interrupt Configuration Register 0 -__register 64 { 55:2 ADDR } ERRFHICR0; - -// External Debug Lock Status Register -__register 32 { 2:2 nTT, 1:1 SLK, 0:0 SLI } EDLSR; - -// Performance Monitors Device Type register -__register 32 { 7:4 SUB, 3:0 MAJOR } PMDEVTYPE; - -// Floating-Point System ID register -__register 32 { 31:24 Implementer, 23:23 SW, 22:16 Subarchitecture, 15:8 PartNum, 7:4 Variant, 3:0 Revision } FPSID; - -// External Debug Feature Register -__register 64 { 43:40 TraceFilt, 31:28 CTX_CMPs, 23:20 WRPs, 15:12 BRPs, 11:8 PMUVer, 7:4 TraceVer } EDDFR; - -// CPU Interface Priority Mask Register -__register 32 { 7:0 Priority } GICC_PMR; - -// Interrupt Routing Registers -array [32..1019] of __register 64 { 39:32 Aff3, 31:31 Interrupt_Routing_Mode, 23:16 Aff2, 15:8 Aff1, 7:0 Aff0 } GICD_IROUTER; - -// CPU Interface Aliased Highest Priority Pending Interrupt Register -__register 32 { 23:0 INTID } GICC_AHPPIR; - -// Saved Program Status Register (Monitor mode) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 J, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:0 M } SPSR_mon; - -// Reset Vector Base Address Register (if EL3 implemented) -__register 64 { } RVBAR_EL3; - -// Debug Authentication Status register -__register 32 { 7:6 SNID, 5:4 SID, 3:2 NSNID, 1:0 NSID } DBGAUTHSTATUS_EL1; - -// Counter-timer Self-Synchronized Physical Count register -__register 64 { } CNTPCTSS_EL0; - -// Peripheral Identification Register 1 -__register 32 { 7:4 DES_0, 3:0 PART_1 } ERRPIDR1; - -// Interrupt Set-Enable Registers -array [0..31] of __register 32 { } GICD_ISENABLER; - -// Interrupt Clear-Active Registers -array [1..2] of __register 32 { } GICR_ICACTIVERE; - -// MPAM Error Control Register -__register 32 { 0:0 INTEN } MPAMF_ECR; - -// Hyp Auxiliary Data Fault Status Register -__register 32 { } HADFSR; - -// Auxiliary Memory Attribute Indirection Register (EL1) -__register 64 { } AMAIR_EL1; - -// TLB Type Register -__register 32 { 0:0 nU } TLBTR; - -// Redistributor Invalidate All Register -__register 64 { 47:32 V } GICR_INVALLR; - -// Interrupt Clear-Pending Registers (extended SPI range) -array [0..31] of __register 32 { } GICD_ICPENDRE; - -// Interrupt Controller End Of Interrupt Register 0 -__register 32 { 23:0 INTID } ICC_EOIR0_EL1; - -// MPAM Features Cache Storage Usage Monitoring ID register -__register 32 { 31:31 HAS_CAPTURE, 15:0 NUM_MON } MPAMF_CSUMON_IDR; - -// Performance Monitors Device Architecture register -__register 32 { 31:21 ARCHITECT, 20:20 PRESENT, 19:16 REVISION, 15:0 ARCHID } PMDEVARCH; - -// AArch32 Memory Model Feature Register 4 -__register 32 { 31:28 EVT, 27:24 CCIDX, 23:20 LSM, 19:16 HPDS, 15:12 CnP, 11:8 XNX, 7:4 AC2, 3:0 SpecSEI } ID_MMFR4_EL1; - -// Interrupt Group Modifier Registers (extended SPI range) -array [0..31] of __register 32 { } GICD_IGRPMODRE; - -// Stack Pointer (EL3) -__register 64 { } SP_EL3; - -// Monitor Debug System Control Register -__register 32 { 31:31 TFO, 30:30 RXfull, 29:29 TXfull, 27:27 RXO, 26:26 TXU, 23:22 INTdis, 21:21 TDA, 19:19 SC2, 15:15 MDE, 14:14 HDE, 13:13 KDE, 12:12 TDCC, 6:6 ERR, 0:0 SS } MDSCR_EL1; - -// Pointer Authentication Key B for Instruction (bits[63:0]) -__register 64 { } APIBKeyLo_EL1; - -// Selected Error Record Miscellaneous Register 0 -__register 32 { } ERXMISC0; - -// AArch32 Memory Model Feature Register 2 -__register 32 { 31:28 HWAccFlg, 27:24 WFIStall, 23:20 MemBarr, 19:16 UniTLB, 15:12 HvdTLB, 11:8 L1HvdRng, 7:4 L1HvdBG, 3:0 L1HvdFG } ID_MMFR2_EL1; - -// Auxiliary Control Register 2 -__register 32 { } ACTLR2; - -// Current Cache Size ID Register 2 -__register 32 { 23:0 NumSets } CCSIDR2_EL1; - -// Interrupt Group Modifier Register 0 -__register 32 { } GICR_IGRPMODR0; - -// Interrupt Controller Highest Priority Pending Interrupt Register 0 -__register 32 { 23:0 INTID } ICC_HPPIR0_EL1; - -// MPAM Virtual PARTID Mapping Register 7 -__register 64 { 63:48 PhyPARTID31, 47:32 PhyPARTID30, 31:16 PhyPARTID29, 15:0 PhyPARTID28 } MPAMVPM7_EL2; - -// Debug Data Transfer Register, Receive -__register 32 { } DBGDTRRXint; - -// MPAM Memory System Monitor Configure Cache Storage Usage Monitor Filter Register -__register 32 { 23:16 PMG, 15:0 PARTID } MSMON_CFG_CSU_FLT; - -// Performance Monitors Selected Event Type Register -__register 32 { } PMXEVTYPER; - -// Cache Level ID Register -__register 32 { 31:30 ICB, 29:27 LoUU, 26:24 LoC, 23:21 LoUIS } CLIDR; - -// Performance Monitors Authentication Status register -__register 32 { 7:6 SNID, 5:4 SID, 3:2 NSNID, 1:0 NSID } PMAUTHSTATUS; - -// MPAM Priority Partitioning Identification Register -__register 32 { 25:20 DSPRI_WD, 17:17 DSPRI_0_IS_LOW, 16:16 HAS_DSPRI, 9:4 INTPRI_WD, 1:1 INTPRI_0_IS_LOW, 0:0 HAS_INTPRI } MPAMF_PRI_IDR; - -// Counter-timer Secure Physical Timer Control Register (EL2) -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTHPS_CTL; - -// Saved Program Status Register (EL2) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 DIT, 12:12 SSBS, 22:22 PAN, 21:21 SS, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 25:25 TCO, 23:23 UAO, 11:10 BTYPE, 9:9 D, 15:10, 26:25 IT, 4:4, 4:4, 3:0, 3:0 M } SPSR_EL2; - -// Interrupt Controller Active Priorities Group 0 Registers -array [0..3] of __register 64 { } ICC_AP0R_EL1; - -// Activity Monitors Component Identification Register 0 -__register 32 { 7:0 PRMBL_0 } AMCIDR0; - -// Tag Check Override -__register 64 { 25:25 TCO } TCO; - -// External Debug Status and Control Register -__register 32 { 31:31 TFO, 30:30 RXfull, 29:29 TXfull, 28:28 ITO, 27:27 RXO, 26:26 TXU, 25:25 PipeAdv, 24:24 ITE, 23:22 INTdis, 21:21 TDA, 20:20 MA, 19:19 SC2, 18:18 NS, 16:16 SDD, 14:14 HDE, 13:10 RW, 9:8 EL, 7:7 A, 6:6 ERR, 5:0 STATUS } EDSCR; - -// Counter-timer Physical Secure Timer CompareValue register -__register 64 { 63:0 CompareValue } CNTPS_CVAL_EL1; - -// AArch32 Instruction Set Attribute Register 3 -__register 32 { 31:28 T32EE, 27:24 TrueNOP, 23:20 T32Copy, 19:16 TabBranch, 15:12 SynchPrim, 11:8 SVC, 7:4 SIMD, 3:0 Saturate } ID_ISAR3_EL1; - -// Set Non-secure SPI Pending Register -__register 32 { 12:0 INTID } GICD_SETSPI_NSR; - -// Set LPI Pending Register -__register 64 { 31:0 pINTID } GICR_SETLPIR; - -// Activity Monitors Control Register -__register 64 { 17:17 CG1RZ, 10:10 HDBG } AMCR_EL0; - -// External Debug Peripheral Identification Register 1 -__register 32 { 7:4 DES_0, 3:0 PART_1 } EDPIDR1; - -// Saved Program Status Register (Abort mode) -__register 32 { 31:31 N, 30:30 Z, 29:29 C, 28:28 V, 27:27 Q, 24:24 J, 23:23 SSBS, 22:22 PAN, 21:21 DIT, 20:20 IL, 19:16 GE, 9:9 E, 8:8 A, 7:7 I, 6:6 F, 5:5 T, 15:10, 26:25 IT, 4:0 M } SPSR_abt; - -// Clear LPI Pending Register -__register 64 { 31:0 pINTID } GICR_CLRLPIR; - -// Interrupt Set-Pending Registers (extended SPI range) -array [0..31] of __register 32 { } GICD_ISPENDRE; - -// External Debug Device ID register 2 -__register 32 { } EDDEVID2; - -// Non-secure Access Control Register -__register 32 { } GICR_NSACR; - -// Counter-timer Physical Count register -__register 64 { } CNTPCT_EL0; - -// Translation Control Register (EL1) -__register 64 { 58:58 TCMA1, 57:57 TCMA0, 56:56 E0PD1, 55:55 E0PD0, 54:54 NFD1, 53:53 NFD0, 52:52 TBID1, 51:51 TBID0, 50:50 HWU162, 49:49 HWU161, 48:48 HWU160, 47:47 HWU159, 46:46 HWU062, 45:45 HWU061, 44:44 HWU060, 43:43 HWU059, 42:42 HPD1, 41:41 HPD0, 40:40 HD, 39:39 HA, 38:38 TBI1, 37:37 TBI0, 36:36 AS, 34:32 IPS, 31:30 TG1, 29:28 SH1, 27:26 ORGN1, 25:24 IRGN1, 23:23 EPD1, 22:22 A1, 21:16 T1SZ, 15:14 TG0, 13:12 SH0, 11:10 ORGN0, 9:8 IRGN0, 7:7 EPD0, 5:0 T0SZ } TCR_EL1; - -// CPU Interface Active Priorities Registers -array [0..3] of __register 32 { } GICC_APR; - -// AArch32 Media and VFP Feature Register 2 -__register 32 { 7:4 FPMisc, 3:0 SIMDMisc } MVFR2_EL1; - -// CPU Interface Binary Point Register -__register 32 { 2:0 Binary_Point } GICC_BPR; - -// Counter-timer Secure Virtual Timer TimerValue Register (EL2) -__register 32 { 31:0 TimerValue } CNTHVS_TVAL; - -// CTI Component Identification Register 1 -__register 32 { 7:4 CLASS, 3:0 PRMBL_1 } CTICIDR1; - -// Current Cache Size ID Register -__register 32 { 12:3 Associativity, 2:0 LineSize, 27:13 NumSets } CCSIDR; - -// Selected Pseudo-fault Generation Control register -__register 64 { } ERXPFGCTL_EL1; - -// CTI Device Affinity register 1 -__register 32 { 31:0 MPIDR_EL1hi } CTIDEVAFF1; - -// Error Reporting Status Register -__register 32 { 3:3 WROD, 2:2 RWOD, 1:1 WRD, 0:0 RRD } GICD_STATUSR; - -// Interrupt Controller Virtual Running Priority Register -__register 32 { 7:0 Priority } ICV_RPR_EL1; - -// Memory Attribute Indirection Register (EL1) -__register 64 { } MAIR_EL1; - -// TCM Type Register -__register 32 { } TCMTR; - -// Counter-timer Non-secure Access Register -__register 32 { } CNTNSAR; - -// Interrupt Controller Binary Point Register 0 -__register 32 { 2:0 BinaryPoint } ICC_BPR0; - -// MPAM Memory System Monitor Configure Memory Bandwidth Usage Monitor Control Register -__register 32 { 31:31 EN, 30:28 CAPT_EVNT, 27:27 CAPT_RESET, 26:26 OFLOW_STATUS, 25:25 OFLOW_INTR, 24:24 OFLOW_FRZ, 23:20 SUBTYPE, 19:19 SCLEN, 17:17 MATCH_PMG, 16:16 MATCH_PARTID, 15:15 OFLOW_STATUS_L, 14:14 OFLOW_INTR_L, 7:0 TYPE } MSMON_CFG_MBWU_CTL; - -// CTI Channel Out Status register -__register 32 { } CTICHOUTSTATUS; - -// Virtualization Translation Table Base Register -__register 64 { 55:48 VMID, 47:1 BADDR, 0:0 CnP } VTTBR; - -// OS Lock Exception Catch Control Register -__register 32 { 31:0 EDECCR } OSECCR_EL1; - -// Interrupt Controller Virtual Binary Point Register 1 -__register 32 { 2:0 BinaryPoint } ICV_BPR1; - -// Performance Monitors Count Enable Clear register -__register 32 { 31:31 C } PMCNTENCLR; - -// Cache Level ID Register -__register 64 { 32:30 ICB, 29:27 LoUU, 26:24 LoC, 23:21 LoUIS } CLIDR_EL1; - -// Selected Error Record Address Register -__register 64 { } ERXADDR_EL1; - -// Virtual Machine Error Reporting Status Register -__register 32 { 3:3 WROD, 2:2 RWOD, 1:1 WRD, 0:0 RRD } GICV_STATUSR; - -// MPAM ID Register (EL1) -__register 64 { 61:61 HAS_SDEFLT, 60:60 HAS_FORCE_NS, 58:58 HAS_TIDR, 39:32 PMG_MAX, 20:18 VPMR_MAX, 17:17 HAS_HCR, 15:0 PARTID_MAX } MPAMIDR_EL1; - -// Debug Breakpoint Control Registers -array [0..15] of __register 64 { 23:20 BT, 19:16 LBN, 15:14 SSC, 13:13 HMC, 8:5 BAS, 2:1 PMC, 0:0 E } DBGBCR_EL1; - -// Counter-timer Physical Timer TimerValue register -__register 32 { 31:0 TimerValue } CNTP_TVAL_EL0; - -// Counter-timer Self-Synchronized Physical Count register -__register 64 { } CNTPCTSS; - -// AArch32 Processor Feature Register 0 -__register 32 { 31:28 RAS, 27:24 DIT, 23:20 AMU, 19:16 CSV2, 15:12 State3, 11:8 State2, 7:4 State1, 3:0 State0 } ID_PFR0_EL1; - -// Error Record Miscellaneous Register 2 -array [0..65534] of __register 64 { } ERRMISC2; - -// EL1 Software Thread ID Register -__register 64 { } TPIDR_EL1; - -// Interrupt Controller Interrupt Acknowledge Register 0 -__register 32 { 23:0 INTID } ICC_IAR0_EL1; - -// Interrupt Controller Interrupt Group 1 Enable register -__register 32 { 0:0 Enable } ICC_IGRPEN1_EL1; - -// EL3 Read/Write Software Context Number -__register 64 { } SCXTNUM_EL3; - -// Virtual Machine Running Priority Register -__register 32 { 7:0 Priority } GICV_RPR; - -// Interrupt Controller System Register Enable register (EL1) -__register 32 { 2:2 DIB, 1:1 DFB, 0:0 SRE } ICC_SRE_EL1; - -// AArch64 Auxiliary Feature Register 1 -__register 64 { } ID_AA64AFR1_EL1; - -// Counter-timer Hyp Physical Timer TimerValue register -__register 32 { 31:0 TimerValue } CNTHP_TVAL; - -// Counter Identification Register -__register 32 { 3:0 CNTSC } CNTID; - -// Auxiliary Feature Register 0 -__register 32 { } ID_AFR0; - -// CTI Device Control register -__register 32 { 1:1 RCE, 0:0 OSUCE } CTIDEVCTL; - -// Interrupt Controller Virtual Active Priorities Group 1 Registers -array [0..3] of __register 32 { } ICV_AP1R; - -// External Debug Context ID Sample Register -__register 32 { 31:0 CONTEXTIDR } EDCIDSR; - -// Debug Watchpoint Fault Address Register -__register 32 { } DBGWFAR; - -// Interrupt Processor Targets Registers -array [0..254] of __register 32 { 31:24 CPU_targets_offset_3B, 23:16 CPU_targets_offset_2B, 15:8 CPU_targets_offset_1B, 7:0 CPU_targets_offset_0B } GICD_ITARGETSR; - -// MPAM PARTID Narrowing ID register -__register 32 { 15:0 INTPARTID_MAX } MPAMF_PARTID_NRW_IDR; - -// Selected Error Record Miscellaneous Register 6 -__register 32 { } ERXMISC6; - -// Hyp System Control Register -__register 32 { 31:31 DSSBS, 30:30 TE, 25:25 EE, 19:19 WXN, 12:12 I, 8:8 SED, 7:7 ITD, 5:5 CP15BEN, 4:4 LSMAOE, 3:3 nTLSMD, 2:2 C, 1:1 A, 0:0 M } HSCTLR; - -// Auxiliary Instruction Fault Status Register -__register 32 { } AIFSR; - -// Revision ID Register -__register 32 { } REVIDR_EL1; - -// External Debug Program Counter Sample Register -__register 64 { 63:63 NS, 62:61 EL } EDPCSR; - -// Performance Monitors Device ID register -__register 32 { 3:0 PCSample } PMDEVID; - -// Performance Monitors Device Affinity register 0 -__register 32 { 31:0 MPIDR_EL1lo } PMDEVAFF0; - -// Virtual Machine Active Priorities Registers -array [0..3] of __register 32 { } GICV_APR; - -// Performance Monitors Software Increment register -__register 32 { } PMSWINC_EL0; - -// Auxiliary Fault Status Register 0 (EL3) -__register 32 { } AFSR0_EL3; - -// Error Recovery Interrupt Configuration Register 1 -__register 32 { 31:0 DATA } ERRERICR1; - -// Error Recovery Interrupt Configuration Register 2 -__register 32 { 7:7 IRQEN, 6:6 NSMSI, 5:4 SH, 3:0 MemAttr } ERRERICR2; - -// Virtual Machine Priority Mask Register -__register 32 { 7:0 Priority } GICV_PMR; - -// Interrupt Controller Virtual Highest Priority Pending Interrupt Register 1 -__register 32 { 23:0 INTID } ICV_HPPIR1_EL1; - -// Activity Monitors Count Enable Clear Register 0 -__register 64 { } AMCNTENCLR0_EL0; - -// Interrupt Clear-Pending Registers -array [1..2] of __register 32 { } GICR_ICPENDRE; - -// Interrupt Set-Enable Registers -array [1..2] of __register 32 { } GICR_ISENABLERE; - -// External Debug Device ID register 1 -__register 32 { 3:0 PCSROffset } EDDEVID1; - -// CTI Application Trigger Clear register -__register 32 { } CTIAPPCLEAR; - -// Interrupt Mask Bits -__register 32 { 9:9 D, 8:8 A, 7:7 I, 6:6 F } DAIF; - -// Debug Device ID register 2 -__register 32 { } DBGDEVID2; - -// Hyp Auxiliary Memory Attribute Indirection Register 0 -__register 32 { } HAMAIR0; - -// Counter-timer Kernel Control register -__register 32 { 17:17 EVNTIS, 9:9 PL0PTEN, 8:8 PL0VTEN, 7:4 EVNTI, 3:3 EVNTDIR, 2:2 EVNTEN, 1:1 PL0VCTEN, 0:0 PL0PCTEN } CNTKCTL; - -// Counter-timer Physical Secure Timer TimerValue register -__register 32 { 31:0 TimerValue } CNTPS_TVAL_EL1; - -// Clear Non-secure SPI Pending Register -__register 32 { 12:0 INTID } GICD_CLRSPI_NSR; - -// Interrupt Controller Virtual Interrupt Group 1 Enable register -__register 32 { 0:0 Enable } ICV_IGRPEN1; - -// Selected Pseudo-fault Generation Feature register -__register 64 { } ERXPFGF_EL1; - -// Deferred Interrupt Status Register -__register 64 { 31:31 A, 24:24 IDS, 12:10 AET, 9:9 EA, 5:0 DFSC, 23:0 ISS } DISR_EL1; - -// Selected Error Record Primary Status Register -__register 32 { } ERXSTATUS; - -// Interrupt Clear-Active Registers -array [0..31] of __register 32 { } GICD_ICACTIVER; - -// MPAM Priority Partition Configuration Register -__register 32 { 31:16 DSPRI, 15:0 INTPRI } MPAMCFG_PRI; - -// Activity Monitors Component Identification Register 1 -__register 32 { 7:4 CLASS, 3:0 PRMBL_1 } AMCIDR1; - -// Revision ID Register -__register 32 { } REVIDR; - -// Counter-timer Virtual Timer CompareValue register -__register 64 { 63:0 CompareValue } CNTV_CVAL_EL0; - -// Counter-timer Secure Physical Timer CompareValue register (EL2) -__register 64 { 63:0 CompareValue } CNTHPS_CVAL_EL2; - -// Architectural Feature Trap Register (EL3) -__register 32 { 31:31 TCPAC, 30:30 TAM, 20:20 TTA, 10:10 TFP, 8:8 EZ } CPTR_EL3; - -// CTI Control register -__register 32 { 0:0 GLBEN } CTICONTROL; - -// Counter-timer Secure Physical Timer Control register (EL2) -__register 32 { 2:2 ISTATUS, 1:1 IMASK, 0:0 ENABLE } CNTHPS_CTL_EL2; - -// AArch32 Memory Model Feature Register 0 -__register 32 { 31:28 InnerShr, 27:24 FCSE, 23:20 AuxReg, 19:16 TCM, 15:12 ShareLvl, 11:8 OuterShr, 7:4 PMSA, 3:0 VMSA } ID_MMFR0_EL1; - -// Interrupt Controller Virtual Interrupt Priority Mask Register -__register 32 { 7:0 Priority } ICV_PMR_EL1; - -// Interrupt Controller Virtual End Of Interrupt Register 0 -__register 32 { 23:0 INTID } ICV_EOIR0_EL1; - -// Translation Table Base Register 0 (EL2) -__register 64 { 63:48 ASID, 47:1 BADDR, 0:0 CnP } TTBR0_EL2; - diff --git a/mra_tools/support/aes.asl b/mra_tools/support/aes.asl deleted file mode 100644 index 68889e14..00000000 --- a/mra_tools/support/aes.asl +++ /dev/null @@ -1,34 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Functions to support AES -// -// The following functions are not defined in the current -// XML release but are necessary to build a working simulator -//////////////////////////////////////////////////////////////// - -bits(128) AESInvMixColumns(bits (128) op) - assert FALSE; - return Zeros(128); - -bits(128) AESInvShiftRows(bits(128) op) - assert FALSE; - return Zeros(128); - -bits(128) AESInvSubBytes(bits(128) op) - assert FALSE; - return Zeros(128); - -bits(128) AESMixColumns(bits (128) op) - assert FALSE; - return Zeros(128); - -bits(128) AESShiftRows(bits(128) op) - assert FALSE; - return Zeros(128); - -bits(128) AESSubBytes(bits(128) op) - assert FALSE; - return Zeros(128); - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// diff --git a/mra_tools/support/barriers.asl b/mra_tools/support/barriers.asl deleted file mode 100644 index 5072abcc..00000000 --- a/mra_tools/support/barriers.asl +++ /dev/null @@ -1,29 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Functions to perform barrier operations -// -// The following functions are not defined in the current -// XML release but are necessary to build a working simulator -//////////////////////////////////////////////////////////////// - -DataMemoryBarrier(MBReqDomain domain, MBReqTypes types) - return; - -DataSynchronizationBarrier(MBReqDomain domain, MBReqTypes types) - return; - -ErrorSynchronizationBarrier(MBReqDomain domain, MBReqTypes types) - return; - -InstructionSynchronizationBarrier() - return; - -ProfilingSynchronizationBarrier() - return; - -SynchronizeContext() - return; - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// - diff --git a/mra_tools/support/debug.asl b/mra_tools/support/debug.asl deleted file mode 100644 index 896d32dc..00000000 --- a/mra_tools/support/debug.asl +++ /dev/null @@ -1,41 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Functions to support debug features -// -// The following functions are not defined in the current -// XML release but are necessary to build a working simulator -//////////////////////////////////////////////////////////////// - -CTI_SetEventLevel(CrossTriggerIn id, signal level) - assert FALSE; - -CTI_SignalEvent(CrossTriggerIn id) - assert FALSE; - -DisableITRAndResumeInstructionPrefetch() - assert FALSE; - -boolean HaltingStep_DidNotStep() - assert FALSE; - return FALSE; - -boolean HaltingStep_SteppedEX() - assert FALSE; - return FALSE; - -ResetExternalDebugRegisters(boolean cold_reset) - assert FALSE; - -boolean SoftwareStep_DidNotStep() - assert FALSE; - return FALSE; - -boolean SoftwareStep_SteppedEX() - assert FALSE; - return FALSE; - -StopInstructionPrefetchAndEnableITR() - assert FALSE; - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// diff --git a/mra_tools/support/feature.asl b/mra_tools/support/feature.asl deleted file mode 100644 index 4a53744f..00000000 --- a/mra_tools/support/feature.asl +++ /dev/null @@ -1,60 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Feature support -//////////////////////////////////////////////////////////////// - -boolean HaveAnyAArch32() - // return boolean IMPLEMENTATION_DEFINED; - return TRUE; - -boolean HighestELUsingAArch32() - if !HaveAnyAArch32() then return FALSE; - // return boolean IMPLEMENTATION_DEFINED; // e.g. CFG32SIGNAL == HIGH - return FALSE; - -boolean HaveEL(bits(2) el) - if el IN {EL1,EL0} then - return TRUE; // EL1 and EL0 must exist - // return boolean IMPLEMENTATION_DEFINED; - return TRUE; - -boolean IsSecureBelowEL3() - if HaveEL(EL3) then - return SCR_GEN[].NS == '0'; - elsif HaveEL(EL2) then - return FALSE; - else - // TRUE if processor is Secure or FALSE if Non-secure; - // return boolean IMPLEMENTATION_DEFINED; - return FALSE; - -boolean HasArchVersion(ArchVersion version) - // return version == ARMv8p0 || boolean IMPLEMENTATION_DEFINED; - return version IN {ARMv8p0, ARMv8p1, ARMv8p2, ARMv8p3, - ARMv8p4, ARMv8p5, ARMv8p6}; - -boolean HaveAArch32EL(bits(2) el) - // Return TRUE if Exception level 'el' supports AArch32 in this implementation - if !HaveEL(el) then - return FALSE; // The Exception level is not implemented - elsif !HaveAnyAArch32() then - return FALSE; // No Exception level can use AArch32 - elsif HighestELUsingAArch32() then - return TRUE; // All Exception levels are using AArch32 - elsif el == HighestEL() then - return FALSE; // The highest Exception level is using AArch64 - elsif el == EL0 then - return TRUE; // EL0 must support using AArch32 if any AArch32 - // return boolean IMPLEMENTATION_DEFINED; - return TRUE; - -boolean Have16bitVMID() - // return HaveEL(EL2) && boolean IMPLEMENTATION_DEFINED; - return HaveEL(EL2); - -boolean HaveFP16Ext() - // return boolean IMPLEMENTATION_DEFINED; - return TRUE; - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// diff --git a/mra_tools/support/fetchdecode.asl b/mra_tools/support/fetchdecode.asl deleted file mode 100644 index 394ccbb0..00000000 --- a/mra_tools/support/fetchdecode.asl +++ /dev/null @@ -1,254 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Functions to support instruction fetch/decode -// -// The following functions are not defined in the current -// XML release but are necessary to build a working simulator -//////////////////////////////////////////////////////////////// - -EndOfInstruction() - __ExceptionTaken(); - - -boolean __Sleeping; - -EnterLowPowerState() - __Sleeping = TRUE; - -ExitLowPowerState() - __Sleeping = FALSE; - -__ResetExecuteState() - __Sleeping = FALSE; - -ExecuteA64(bits(32) instr) - __decode A64 instr; - -ExecuteA32(bits(32) instr) - __decode A32 instr; - -ExecuteT32(bits(16) hw1, bits(16) hw2) - __decode T32 (hw1 : hw2); - -ExecuteT16(bits(16) instr) - __decode T16 instr; - -// Implementation of BranchTo and BranchToAddr modified so that we can -// tell that a branch was taken - this is essential for implementing -// PC advance correctly. - -boolean __BranchTaken; - -BranchTo(bits(N) target, BranchType branch_type) - __BranchTaken = TRUE; // extra line added - Hint_Branch(branch_type); - if N == 32 then - assert UsingAArch32(); - _PC = ZeroExtend(target); - else - assert N == 64 && !UsingAArch32(); - _PC = AArch64.BranchAddr(target[63:0]); - return; - -BranchToAddr(bits(N) target, BranchType branch_type) - __BranchTaken = TRUE; // extra line added - Hint_Branch(branch_type); - if N == 32 then - assert UsingAArch32(); - _PC = ZeroExtend(target); - else - assert N == 64 && !UsingAArch32(); - _PC = target[63:0]; - return; - -enumeration __InstrEnc { __A64, __A32, __T16, __T32 }; - -bits(32) __ThisInstr; -__InstrEnc __ThisInstrEnc; -bits(4) __currentCond; - - -__SetThisInstrDetails(__InstrEnc enc, bits(32) opcode, bits(4) cond) - __ThisInstrEnc = enc; - __ThisInstr = opcode; - __currentCond = cond; - return; - -bits(32) ThisInstr() - return __ThisInstr; - -// Length in bits of instruction -integer ThisInstrLength() - return if __ThisInstrEnc == __T16 then 16 else 32; - -bits(4) AArch32.CurrentCond() - return __currentCond; - -bits(N) ThisInstrAddr() - return _PC[0 +: N]; - -bits(N) NextInstrAddr() - return (_PC + (ThisInstrLength() DIV 8))[N-1:0]; - -(__InstrEnc, bits(32)) __FetchInstr(bits(64) pc) - __InstrEnc enc; - bits(32) instr; - - CheckSoftwareStep(); - - if PSTATE.nRW == '0' then - AArch64.CheckPCAlignment(); - enc = __A64; - instr = AArch64.MemSingle[pc, 4, AccType_IFETCH, TRUE]; - AArch64.CheckIllegalState(); - else - AArch32.CheckPCAlignment(); - if PSTATE.T == '1' then - hw1 = AArch32.MemSingle[pc[31:0], 2, AccType_IFETCH, TRUE]; - isT16 = UInt(hw1[15:11]) < UInt('11101'); - if isT16 then - enc = __T16; - instr = Zeros(16) : hw1; - else - hw2 = AArch32.MemSingle[pc[31:0]+2, 2, AccType_IFETCH, TRUE]; - enc = __T32; - instr = hw1 : hw2; - else - enc = __A32; - instr = AArch32.MemSingle[pc[31:0], 4, AccType_IFETCH, TRUE]; - AArch32.CheckIllegalState(); - - return (enc, instr); - -__DecodeExecute(__InstrEnc enc, bits(32) instr) - case enc of - when __A64 - ExecuteA64(instr); - when __A32 - ExecuteA32(instr); - when __T16 - ExecuteT16(instr[15:0]); - when __T32 - ExecuteT32(instr[31:16], instr[15:0]); - return; - -// Default condition for an instruction with encoding 'enc'. -// This may be overridden for instructions with explicit condition field. -bits(4) __DefaultCond(__InstrEnc enc) - if enc IN {__A64, __A32} || PSTATE.IT[3:0] == Zeros(4) then - cond = 0xE[3:0]; - else - cond = PSTATE.IT[7:4]; - return cond; - -__InstructionExecute() - try - __BranchTaken = FALSE; - bits(64) pc = ThisInstrAddr(); - (enc, instr) = __FetchInstr(pc); - __SetThisInstrDetails(enc, instr, __DefaultCond(enc)); - __DecodeExecute(enc, instr); - - catch exn - // Do not catch UNPREDICTABLE or internal errors - when IsSEE(exn) || IsUNDEFINED(exn) - if UsingAArch32() then - if ConditionHolds(AArch32.CurrentCond()) then - AArch32.UndefinedFault(); - else - AArch64.UndefinedFault(); - - when IsExceptionTaken(exn) - // Do nothing - assert TRUE; // todo: this is a bodge around lack of support for empty statements - - if !__BranchTaken then - _PC = (_PC + (ThisInstrLength() DIV 8))[63:0]; - - boolean itExecuted = __ThisInstrEnc == __T16 && __ThisInstr[15:0] IN '1011 1111 xxxx xxxx' && __ThisInstr[3:0] != '0000'; - if PSTATE.nRW == '1' && PSTATE.T == '1' && !itExecuted then - AArch32.ITAdvance(); - - return; - -//////////////////////////////////////////////////////////////// -// The following functions define the IMPLEMENTATION_DEFINED behaviour -// of this execution -//////////////////////////////////////////////////////////////// - -boolean __IMPDEF_boolean(string x) - if x == "Condition valid for trapped T32" then return TRUE; - elsif x == "Has Dot Product extension" then return TRUE; - elsif x == "Has RAS extension" then return TRUE; - elsif x == "Has SHA512 and SHA3 Crypto instructions" then return TRUE; - elsif x == "Has SM3 and SM4 Crypto instructions" then return TRUE; - elsif x == "Has basic Crypto instructions" then return TRUE; - elsif x == "Have CRC extension" then return TRUE; - elsif x == "Report I-cache maintenance fault in IFSR" then return TRUE; - elsif x == "Reserved Control Space EL0 Trapped" then return TRUE; - elsif x == "Translation fault on misprogrammed contiguous bit" then return TRUE; - elsif x == "UNDEF unallocated CP15 access at NS EL0" then return TRUE; - elsif x == "UNDEF unallocated CP15 access at NS EL0" then return TRUE; - - return FALSE; - -integer __IMPDEF_integer(string x) - if x == "Maximum Physical Address Size" then return 52; - elsif x == "Maximum Virtual Address Size" then return 56; - - return 0; - -bits(N) __IMPDEF_bits(integer N, string x) - if x == "0 or 1" then return Zeros(N); - elsif x == "FPEXC.EN value when TGE==1 and RW==0" then return Zeros(N); - elsif x == "reset vector address" then return Zeros(N); - - return Zeros(N); - -MemoryAttributes __IMPDEF_MemoryAttributes(string x) - return MemoryAttributes UNKNOWN; - -// todo: implement defaults for these behaviours -// IMPLEMENTATION_DEFINED "floating-point trap handling"; -// IMPLEMENTATION_DEFINED "signal slave-generated error"; - -//////////////////////////////////////////////////////////////// -// The following functions are required by my simulator: -// - __TopLevel(): take one atomic step -// - __setPC(): set PC to particular value (used after loading an ELF file) -// - __getPC(): read current value of PC (used to support breakpointing) -// - __conditionPassed: set if executing a conditional instruction -// - __CycleEnd(): deprecated hook called after every instruction execution -// - __ModeString(): generate summary of current mode (used to support tracing) -//////////////////////////////////////////////////////////////// - -__TakeColdReset() - PSTATE.nRW = '0'; // boot into A64 mode - PSTATE.SS = '0'; - __ResetInterruptState(); - __ResetMemoryState(); - __ResetExecuteState(); - AArch64.TakeReset(TRUE); - -__TopLevel() - __InstructionExecute(); - -__setPC(integer x) - _PC = x[63:0]; - return; - -integer __getPC() - return UInt(_PC); - -boolean __conditionPassed; - -__CycleEnd() - return; - -// Function used to generate summary of current state of processor -// (used when generating debug traces) -string __ModeString() - return ""; - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// diff --git a/mra_tools/support/hints.asl b/mra_tools/support/hints.asl deleted file mode 100644 index ef2711db..00000000 --- a/mra_tools/support/hints.asl +++ /dev/null @@ -1,31 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Functions to implement hint instructions -// -// The following functions are not defined in the current -// XML release but are necessary to build a working simulator -//////////////////////////////////////////////////////////////// - -Hint_Branch(BranchType hint) - return; - -Hint_Prefetch(bits(64) address, PrefetchHint hint, integer target, boolean stream) - return; - -Hint_PreloadDataForWrite(bits(32) address) - return; - -Hint_PreloadData(bits(32) address) - return; - -Hint_PreloadDataForWrite(bits(32) address) - return; - -Hint_PreloadInstr(bits(32) address) - return; - -Hint_Yield() - return; - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// diff --git a/mra_tools/support/interrupts.asl b/mra_tools/support/interrupts.asl deleted file mode 100644 index ceaeda73..00000000 --- a/mra_tools/support/interrupts.asl +++ /dev/null @@ -1,55 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Functions to support interrupts and System Errors -// -// The following functions are not defined in the current -// XML release but are necessary to build a working simulator -//////////////////////////////////////////////////////////////// - -boolean __PendingPhysicalSError; -boolean __PendingInterrupt; - -__ResetInterruptState() - __PendingPhysicalSError = FALSE; - __PendingInterrupt = FALSE; - -boolean InterruptPending() - return __PendingInterrupt; - -SendEvent() - assert FALSE; - -SetInterruptRequestLevel(InterruptID id, signal level) - assert FALSE; - -AArch32.SErrorSyndrome AArch32.PhysicalSErrorSyndrome() - assert FALSE; - AArch32.SErrorSyndrome r; - r.AET = Zeros(2); - r.ExT = Zeros(1); - return r; - -bits(25) AArch64.PhysicalSErrorSyndrome(boolean implicit_esb) - assert FALSE; - return Zeros(25); - -__SetPendingPhysicalSError() - __PendingPhysicalSError = TRUE; - return; - -ClearPendingPhysicalSError() - __PendingPhysicalSError = FALSE; - return; - -boolean SErrorPending() - // todo: can there be a pending virtual SError? - return __PendingPhysicalSError; - -TakeUnmaskedPhysicalSErrorInterrupts(boolean iesb_req) - assert FALSE; - -TakeUnmaskedSErrorInterrupts() - assert FALSE; - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// diff --git a/mra_tools/support/memory.asl b/mra_tools/support/memory.asl deleted file mode 100644 index 648fa9bd..00000000 --- a/mra_tools/support/memory.asl +++ /dev/null @@ -1,109 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Functions to support exclusive memory accesses -// -// The following functions are not defined in the current -// XML release but are necessary to build a working simulator -//////////////////////////////////////////////////////////////// - -__RAM(52) __Memory; - -boolean __ExclusiveLocal; - -__ResetMemoryState() - __InitRAM(52, 1, __Memory, Zeros(8)); // zero memory on reset - __ExclusiveLocal = FALSE; - -__ELFWriteMemory(bits(64) address, bits(8) val) - __WriteRAM(52, 1, __Memory, address[0 +: 52], val); - return; - -bits(8*size) _Mem[AddressDescriptor desc, integer size, AccessDescriptor accdesc] - assert size IN {1, 2, 4, 8, 16}; - bits(52) address = desc.paddress.address; - assert address == Align(address, size); - return __ReadRAM(52, size, __Memory, address); - -_Mem[AddressDescriptor desc, integer size, AccessDescriptor accdesc] = bits(8*size) value - assert size IN {1, 2, 4, 8, 16}; - bits(52) address = desc.paddress.address; - assert address == Align(address, size); - - if address == 0x13000000[51:0] then // TUBE - if UInt(value) == 0x4 then - print("Program exited by writing ^D to TUBE\n"); - __abort(); - else - putchar(UInt(value[7:0])); - else - __WriteRAM(52, size, __Memory, address, value); - return; - -ClearExclusiveLocal(integer processorid) - __ExclusiveLocal = FALSE; - return; - -MarkExclusiveLocal(FullAddress paddress, integer processorid, integer size) - __ExclusiveLocal = FALSE; - -boolean IsExclusiveLocal(FullAddress paddress, integer processorid, integer size) - return __ExclusiveLocal; - - -boolean AArch32.IsExclusiveVA(bits(32) address, integer processorid, integer size) - assert FALSE; - return FALSE; - -AArch32.MarkExclusiveVA(bits(32) address, integer processorid, integer size) - assert FALSE; - -boolean AArch64.IsExclusiveVA(bits(64) address, integer processorid, integer size) - assert FALSE; - return FALSE; - -AArch64.MarkExclusiveVA(bits(64) address, integer processorid, integer size) - assert FALSE; - -ClearExclusiveByAddress(FullAddress paddress, integer processorid, integer size) - assert TRUE; // todo - -bit ExclusiveMonitorsStatus() - assert FALSE; - return '0'; // '0' indicates success - -boolean IsExclusiveGlobal(FullAddress paddress, integer processorid, integer size) - assert FALSE; - return FALSE; - -MarkExclusiveGlobal(FullAddress paddress, integer processorid, integer size) - assert FALSE; - -integer ProcessorID() - return 0; - -bits(4) _MemTag[AddressDescriptor desc] - assert FALSE; - return Zeros(4); - -_MemTag[AddressDescriptor desc] = bits(4) value - assert FALSE; - return; - -boolean IsNonTagCheckedInstruction() - assert FALSE; - return FALSE; - -SetNotTagCheckedInstruction(boolean unchecked) - assert FALSE; - return; - -bits(4) _ChooseRandomNonExcludedTag(bits(16) exclude) - assert FALSE; - return Zeros(4); - -(bits(64), integer) ImpDefTagArrayStartAndCount(bits(64) address) - assert FALSE; - return (Zeros(64), 0); - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// diff --git a/mra_tools/support/stubs.asl b/mra_tools/support/stubs.asl deleted file mode 100644 index 2a6bd7e9..00000000 --- a/mra_tools/support/stubs.asl +++ /dev/null @@ -1,113 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Miscellaneous stub functions -// -// The following functions are not defined in the current -// XML release. -//////////////////////////////////////////////////////////////// - -AArch32.ResetControlRegisters(boolean cold_reset) - assert FALSE; - -AArch32.ResetSystemRegisters(boolean cold_reset) - assert FALSE; - -AArch64.ResetControlRegisters(boolean cold_reset) - return; - -AArch64.ResetSystemRegisters(boolean cold_reset) - return; - -ResetExternalDebugRegisters(boolean cold_reset) - return; - - -bits(64) AArch32.SysRegRead64(integer cp_num, bits(32) instr) - assert FALSE; - return Zeros(64); - -boolean AArch32.SysRegReadCanWriteAPSR(integer cp_num, bits(32) instr) - assert FALSE; - return FALSE; - -bits(32) AArch32.SysRegRead(integer cp_num, bits(32) instr) - assert FALSE; - return Zeros(32); - -bits(64) AArch32.SysRegRead64(integer cp_num, bits(32) instr) - assert FALSE; - return Zeros(64); - -AArch32.SysRegWrite(integer cp_num, bits(32) instr, bits(32) val) - assert FALSE; - -AArch32.SysRegWrite64(integer cp_num, bits(32) instr, bits(64) val) - assert FALSE; - -AArch32.SysRegWrite64(integer cp_num, bits(32) instr, bits(64) val) - assert FALSE; - -(boolean, bits(2)) AArch64.CheckAdvSIMDFPSystemRegisterTraps(bits(2) op0, bits(3) op1, bits(4) crn, bits(4) crm, bits(3) op2, bit read) - assert FALSE; - return (FALSE, '00'); - -(boolean, bits(2)) AArch64.CheckAdvSIMDFPSystemRegisterTraps(bits(2) op0, bits(3) op1, bits(4) crn, bits(4) crm, bits(3) op2, bit read) - assert FALSE; - return (FALSE, '00'); - -(boolean, bits(2)) AArch64.CheckSystemRegisterTraps(bits(2) op0, bits(3) op1, bits(4) crn, bits(4) crm, bits(3) op2, bit read) - assert FALSE; - return (FALSE, '00'); - -boolean AArch64.CheckUnallocatedSystemAccess(bits(2) op0, bits(3) op1, bits(4) crn, bits(4) crm, bits(3) op2, bit read) - assert FALSE; - return FALSE; - -bits(64) AArch64.SysInstrWithResult(integer op0, integer op1, integer crn, integer crm, integer op2) - assert FALSE; - return Zeros(64); - -AArch64.SysInstr(integer op0, integer op1, integer crn, integer crm, integer op2, bits(64) val) - assert FALSE; - -bits(64) AArch64.SysInstrWithResult(integer op0, integer op1, integer crn, integer crm, integer op2) - assert FALSE; - return Zeros(64); - -AArch64.SysRegWrite(integer op0, integer op1, integer crn, integer crm, integer op2, bits(64) val) - assert FALSE; - -bits(64) System_Get(integer op0, integer op1, integer crn, integer crm, integer op2) - assert FALSE; - return Zeros(64); - -boolean CP14DebugInstrDecode(bits(32) instr) - assert FALSE; - return FALSE; - -boolean CP14JazelleInstrDecode(bits(32) instr) - assert FALSE; - return FALSE; - -boolean CP14TraceInstrDecode(bits(32) instr) - assert FALSE; - return FALSE; - -boolean CP15InstrDecode(bits(32) instr) - assert FALSE; - return FALSE; - -bits(11) LSInstructionSyndrome() - assert FALSE; - return Zeros(11); - -boolean RemapRegsHaveResetValues() - assert FALSE; - return FALSE; - -UndefinedFault() - assert FALSE; - return; - -//////////////////////////////////////////////////////////////// -// End -//////////////////////////////////////////////////////////////// diff --git a/mra_tools/types.asl b/mra_tools/types.asl deleted file mode 100644 index f2e82cbb..00000000 --- a/mra_tools/types.asl +++ /dev/null @@ -1,35 +0,0 @@ -type CPACRType = typeof(CPACR_EL1); -type CNTKCTLType = typeof(CNTKCTL_EL1); -type ESRType = typeof(ESR_EL1); -type FPCRType = typeof(FPCR); -type MAIRType = typeof(MAIR_EL1); -type SCRType = typeof(SCR_EL3); -type SCTLRType = typeof(SCTLR_EL1); - -// The following appear to be missing from the XML -// The following is not necessarily correct - but it lets us keep going -__register 32 { 31:31 EAE, 5:5 PD1, 4:4 PD0, 2:0 N, 29:28 SH1, 27:26 ORGN1, 25:24 IRGN1, 23:23 EPD1, 22:22 A1, 18:16 T1SZ, 13:12 SH0, 11:10 ORGN0, 9:8 IRGN0, 7:7 EPD0, 6:6 T2E, 2:0 T0SZ } TTBCR_S; -__register 32 { 0+:24 PC, 29+:2 EL, 31 NS } EDPCSRhi; - -bits(64) AArch64.SysRegRead(integer op0, integer op1, integer crn, integer crm, integer op2); -AArch64.SysRegWrite(integer op0, integer op1, integer crn, integer crm, integer op2, bits(64) val); -TraceSynchronizationBarrier(); -UndefinedFault(); -ReservedEncoding(); - -boolean IRQPending(); -boolean FIQPending(); - -constant integer LOG2_TAG_GRANULE=4; -constant integer TAG_GRANULE=2 ^ LOG2_TAG_GRANULE; -// These declarations have to be manually inserted into arch.asl after extraction. -// Insert them before the declaration of MemTag. -// bits(4) _MemTag[AddressDescriptor desc]; -// _MemTag[AddressDescriptor desc] = bits(4) value; -boolean IsNonTagCheckedInstruction(); -SetNotTagCheckedInstruction(boolean unchecked); -bits(4) _ChooseRandomNonExcludedTag(bits(16) exclude); -(bits(64), integer) ImpDefTagArrayStartAndCount(bits(64) address); - -signal HIDEN; -signal HNIDEN; diff --git a/coverage.sh b/scripts/coverage.sh similarity index 73% rename from coverage.sh rename to scripts/coverage.sh index 8036c20e..39ccc1b7 100755 --- a/coverage.sh +++ b/scripts/coverage.sh @@ -7,9 +7,7 @@ INSTRUCTION_GROUPS+=' aarch64_vector_arithmetic_unary(?!.*_(fp|float))' INSTRUCTION_GROUPS+=' aarch64_vector_arithmetic_binary(?!.*_(fp|float|complex|r?sqrt|bf|recp))' INSTRUCTION_GROUPS+=' aarch64_memory_.+_general.*' INSTRUCTION_GROUPS+=' aarch64_memory_atomicops_.*' -ASL_FILES="prelude.asl ./mra_tools/arch/regs.asl ./mra_tools/types.asl ./mra_tools/arch/arch.asl ./mra_tools/arch/arch_instrs.asl ./mra_tools/arch/arch_decode.asl ./mra_tools/support/aes.asl ./mra_tools/support/barriers.asl ./mra_tools/support/debug.asl ./mra_tools/support/feature.asl ./mra_tools/support/hints.asl ./mra_tools/support/interrupts.asl ./mra_tools/support/memory.asl ./mra_tools/support/stubs.asl ./mra_tools/support/fetchdecode.asl" -ASL_FILES+=" tests/override.asl" -ASL_FILES+=" tests/override.prj" +ASL_FILES="cpus/armv8.6.cpu" COVERAGE_DIR="./tests/coverage" COVERAGE_TEMP=$(mktemp -d) diff --git a/scripts/stash.sh b/scripts/stash.sh new file mode 100755 index 00000000..d40fc556 --- /dev/null +++ b/scripts/stash.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Expects to be run from asl-interpreter directory + +TARGET="cpus/armv8.6.cpu" + +echo "Extracting MRA specs" +rm -rf mra_tools +git clone https://github.com/alastairreid/mra_tools.git +cd mra_tools && mkdir -p v8.6 && cd v8.6 +wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-architecture/2019-12/SysReg_xml_v86A-2019-12.tar.gz +wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-architecture/2019-12/A64_ISA_xml_v86A-2019-12.tar.gz +wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-architecture/2019-12/AArch32_ISA_xml_v86A-2019-12.tar.gz +tar zxf A64_ISA_xml_v86A-2019-12.tar.gz +tar zxf AArch32_ISA_xml_v86A-2019-12.tar.gz +tar zxf SysReg_xml_v86A-2019-12.tar.gz +cd .. +make all + +echo "Marshalling to $TARGET" +cd .. +ASL_FILES="prelude.asl" +ASL_FILES+=" mra_tools/arch/regs.asl" +ASL_FILES+=" mra_tools/types.asl" +ASL_FILES+=" mra_tools/arch/arch.asl" +ASL_FILES+=" mra_tools/arch/arch_instrs.asl" +ASL_FILES+=" mra_tools/arch/arch_decode.asl" +ASL_FILES+=" mra_tools/support/aes.asl" +ASL_FILES+=" mra_tools/support/barriers.asl" +ASL_FILES+=" mra_tools/support/debug.asl" +ASL_FILES+=" mra_tools/support/feature.asl" +ASL_FILES+=" mra_tools/support/hints.asl" +ASL_FILES+=" mra_tools/support/interrupts.asl" +ASL_FILES+=" mra_tools/support/memory.asl" +ASL_FILES+=" mra_tools/support/stubs.asl" +ASL_FILES+=" mra_tools/support/fetchdecode.asl" +ASL_FILES+=" tests/override.asl" +ASL_FILES+=" tests/override.prj" +echo ":stash $TARGET" | dune exec asli $ASL_FILES