am33-2.igen 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285
  1. // data cache pre-fetch:
  2. // 1111 1001 1010 0110 Rm.. 0000; dcpf (Rm)
  3. 8.0xf9+8.0xa6+4.RN2,4.0000:D1a:::dcpf
  4. "dcpf"
  5. *am33_2
  6. {
  7. int srcreg;
  8. PC = cia;
  9. srcreg = translate_rreg (SD_, RN2);
  10. load_word (State.regs[srcreg]);
  11. }
  12. // 1111 1001 1010 0111 0000 0000; dcpf (sp)
  13. 8.0xf9+8.0xa7+8.0x00:D1b:::dcpf
  14. "dcpf"
  15. *am33_2
  16. {
  17. PC = cia;
  18. load_word (SP);
  19. }
  20. // 1111 1011 1010 0110 Ri.. Rm.. 0000 0000; dcpf (Ri,Rm)
  21. 8.0xfb+8.0xa6+4.RN2,4.RN0+8.0x00:D2a:::dcpf
  22. "dcpf"
  23. *am33_2
  24. {
  25. int srci, srcm;
  26. PC = cia;
  27. srci = translate_rreg (SD_, RN2);
  28. srcm = translate_rreg (SD_, RN0);
  29. load_word (State.regs[srci] + State.regs[srcm]);
  30. }
  31. // 1111 1011 1010 0111 Rm.. 0000 IMM8; dcpf (d8,Rm)
  32. 8.0xfb+8.0xa7+4.RN2,4.0000+8.IMM8:D2b:::dcpf
  33. "dcpf"
  34. *am33_2
  35. {
  36. int srcreg;
  37. PC = cia;
  38. srcreg = translate_rreg (SD_, RN2);
  39. load_word (State.regs[srcreg] + EXTEND8 (IMM8));
  40. }
  41. // 1111 1101 1010 0111 Rm.. 0000 IMM24; dcpf (d24,Rm)
  42. 8.0xfd+8.0xa7+4.RN2,4.0000+8.IMM24A+8.IMM24B+8.IMM24C:D4a:::dcpf
  43. "dcpf"
  44. *am33_2
  45. {
  46. int srcreg;
  47. PC = cia;
  48. srcreg = translate_rreg (SD_, RN2);
  49. load_word (State.regs[srcreg] + EXTEND24 (FETCH24 (IMM24A,
  50. IMM24B, IMM24C)));
  51. }
  52. // 1111 1110 0100 0110 Rm.. 0000 IMM32; dcpf (d32,Rm)
  53. 8.0xfe+8.0x46+4.RN2,4.0000+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5a:::dcpf
  54. "dcpf"
  55. *am33_2
  56. {
  57. int srcreg;
  58. PC = cia;
  59. srcreg = translate_rreg (SD_, RN2);
  60. load_word (State.regs[srcreg]
  61. + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
  62. }
  63. // bit operations with imm8,(abs16) addressing mode:
  64. // 1111 1110 1000 0010 ABS16 IMM8; btst imm8,(abs16)
  65. 8.0xfe+8.0x82+8.IMM16A+8.IMM16B+8.IMM8:D3:::btst
  66. "btst"
  67. *am33_2
  68. {
  69. PC = cia;
  70. genericBtst (IMM8, FETCH16 (IMM16A, IMM16B));
  71. }
  72. // 1111 1110 1000 0000 ABS16 IMM8; bset imm8,(abs16)
  73. 8.0xfe+8.0x80+8.IMM16A+8.IMM16B+8.IMM8:D3:::bset
  74. "bset"
  75. *am33_2
  76. {
  77. uint32_t temp;
  78. int z;
  79. PC = cia;
  80. temp = load_byte (FETCH16 (IMM16A, IMM16B));
  81. z = (temp & IMM8) == 0;
  82. temp |= IMM8;
  83. store_byte (FETCH16 (IMM16A, IMM16B), temp);
  84. PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
  85. PSW |= (z ? PSW_Z : 0);
  86. }
  87. // 1111 1110 1000 0001 ABS16 IMM8; bclr imm8,(abs16)
  88. 8.0xfe+8.0x81+8.IMM16A+8.IMM16B+8.IMM8:D3:::bclr
  89. "bclr"
  90. *am33_2
  91. {
  92. uint32_t temp;
  93. int z;
  94. PC = cia;
  95. temp = load_byte (FETCH16 (IMM16A, IMM16B));
  96. z = (temp & IMM8) == 0;
  97. temp = temp & ~(IMM8);
  98. store_byte (FETCH16 (IMM16A, IMM16B), temp);
  99. PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
  100. PSW |= (z ? PSW_Z : 0);
  101. }
  102. // single precision fmov:
  103. // 1111 1001 0010 000X Rm.. Sn..; fmov (Rm),FSn
  104. 8.0xf9+4.2,3.0,1.X+4.Rm,4.Sn:D1a:::fmov
  105. "fmov"
  106. *am33_2
  107. {
  108. PC = cia;
  109. if (FPU_DISABLED)
  110. fpu_disabled_exception (SD, CPU, cia);
  111. else
  112. {
  113. int reg = translate_rreg (SD_, Rm);
  114. XS2FS (X,Sn) = load_word (State.regs[reg]);
  115. }
  116. }
  117. // 1111 1001 0010 001X Rm.. Sn..; fmov (Rm+),FSn
  118. 8.0xf9+4.2,3.1,1.X+4.Rm,4.Sn:D1b:::fmov
  119. "fmov"
  120. *am33_2
  121. {
  122. PC = cia;
  123. if (FPU_DISABLED)
  124. fpu_disabled_exception (SD, CPU, cia);
  125. else
  126. {
  127. int reg = translate_rreg (SD_, Rm);
  128. XS2FS (X,Sn) = load_word (State.regs[reg]);
  129. State.regs[reg] += 4;
  130. }
  131. }
  132. // 1111 1001 0010 010X ---- Sn..; fmov (SP),FSn
  133. 8.0xf9+4.2,3.2,1.X+4.0,4.Sn:D1c:::fmov
  134. "fmov"
  135. *am33_2
  136. {
  137. PC = cia;
  138. if (FPU_DISABLED)
  139. fpu_disabled_exception (SD, CPU, cia);
  140. else
  141. {
  142. int reg = REG_SP;
  143. XS2FS (X,Sn) = load_word (State.regs[reg]);
  144. }
  145. }
  146. // 1111 1001 0010 011X Rm.. Sn..; fmov Rm,FSn
  147. 8.0xf9+4.2,3.3,1.X+4.Rm,4.Sn:D1d:::fmov
  148. "fmov"
  149. *am33_2
  150. {
  151. PC = cia;
  152. if (FPU_DISABLED)
  153. fpu_disabled_exception (SD, CPU, cia);
  154. else
  155. {
  156. int reg = translate_rreg (SD_, Rm);
  157. XS2FS (X,Sn) = State.regs[reg];
  158. }
  159. }
  160. // 1111 1001 0011 00Y0 Sm.. Rn..; fmov FSm,(Rn)
  161. 8.0xf9+4.3,2.0,1.Y,1.0+4.Sm,4.Rn:D1e:::fmov
  162. "fmov"
  163. *am33_2
  164. {
  165. PC = cia;
  166. if (FPU_DISABLED)
  167. fpu_disabled_exception (SD, CPU, cia);
  168. else
  169. {
  170. int reg = translate_rreg (SD_, Rn);
  171. store_word (State.regs[reg], XS2FS (Y,Sm));
  172. }
  173. }
  174. // 1111 1001 0011 00Y1 Sm.. Rn..; fmov FSm,(Rn+)
  175. 8.0xf9+4.3,2.0,1.Y,1.1+4.Sm,4.Rn:D1f:::fmov
  176. "fmov"
  177. *am33_2
  178. {
  179. PC = cia;
  180. if (FPU_DISABLED)
  181. fpu_disabled_exception (SD, CPU, cia);
  182. else
  183. {
  184. int reg = translate_rreg (SD_, Rn);
  185. store_word (State.regs[reg], XS2FS (Y,Sm));
  186. State.regs[reg] += 4;
  187. }
  188. }
  189. // 1111 1001 0011 01Y0 Sm.. ----; fmov FSm,(SP)
  190. 8.0xf9+4.3,2.1,1.Y,1.0+4.Sm,4.0:D1g:::fmov
  191. "fmov"
  192. *am33_2
  193. {
  194. PC = cia;
  195. if (FPU_DISABLED)
  196. fpu_disabled_exception (SD, CPU, cia);
  197. else
  198. {
  199. int reg = REG_SP;
  200. store_word (State.regs[reg], XS2FS (Y,Sm));
  201. }
  202. }
  203. // 1111 1001 0011 01Y1 Sm.. Rn..; fmov FSm,Rn
  204. 8.0xf9+4.3,2.1,1.Y,1.1+4.Sm,4.Rn:D1h:::fmov
  205. "fmov"
  206. *am33_2
  207. {
  208. PC = cia;
  209. if (FPU_DISABLED)
  210. fpu_disabled_exception (SD, CPU, cia);
  211. else
  212. {
  213. int reg = translate_rreg (SD_, Rn);
  214. State.regs[reg] = XS2FS (Y,Sm);
  215. }
  216. }
  217. // 1111 1001 0100 00YX Sm.. Sn..; fmov FSm,FSn
  218. 8.0xf9+4.4,2.0,1.Y,1.X+4.Sm,4.Sn:D1i:::fmov
  219. "fmov"
  220. *am33_2
  221. {
  222. PC = cia;
  223. if (FPU_DISABLED)
  224. fpu_disabled_exception (SD, CPU, cia);
  225. else
  226. XS2FS (X,Sn) = XS2FS (Y,Sm);
  227. }
  228. // 1111 1011 0010 000X Rm.. Sn.. d8; fmov (d8,Rm),FSn
  229. 8.0xfb+4.2,3.0,1.X+4.Rm,4.Sn+8.IMM8:D2a:::fmov
  230. "fmov"
  231. *am33_2
  232. {
  233. PC = cia;
  234. if (FPU_DISABLED)
  235. fpu_disabled_exception (SD, CPU, cia);
  236. else
  237. {
  238. int reg = translate_rreg (SD_, Rm);
  239. XS2FS (X, Sn) = load_word (State.regs[reg] + EXTEND8 (IMM8));
  240. }
  241. }
  242. // 1111 1011 0010 001X Rm.. Sn.. d8; fmov (Rm+,imm8),FSn
  243. 8.0xfb+4.2,3.1,1.X+4.Rm,4.Sn+8.IMM8:D2b:::fmov
  244. "fmov"
  245. *am33_2
  246. {
  247. PC = cia;
  248. if (FPU_DISABLED)
  249. fpu_disabled_exception (SD, CPU, cia);
  250. else
  251. {
  252. int reg = translate_rreg (SD_, Rm);
  253. XS2FS (X, Sn) = load_word (State.regs[reg] + EXTEND8 (IMM8));
  254. State.regs[reg] += 4;
  255. }
  256. }
  257. // 1111 1011 0010 010X ---- Sn.. d8; fmov (d8,SP),FSn
  258. 8.0xfb+4.2,3.2,1.X+4.0,4.Sn+8.IMM8:D2c:::fmov
  259. "fmov"
  260. *am33_2
  261. {
  262. PC = cia;
  263. if (FPU_DISABLED)
  264. fpu_disabled_exception (SD, CPU, cia);
  265. else
  266. {
  267. int reg = REG_SP;
  268. XS2FS (X, Sn) = load_word (State.regs[reg] + IMM8);
  269. }
  270. }
  271. // 1111 1011 0010 0111 Ri.. Rm.. Sn.. --Z-; fmov (Ri,Rm),FSn
  272. 8.0xfb+8.0x27+4.Ri,4.Rm+4.Sn,2.0,1.Z,1.0:D2d:::fmov
  273. "fmov"
  274. *am33_2
  275. {
  276. PC = cia;
  277. if (FPU_DISABLED)
  278. fpu_disabled_exception (SD, CPU, cia);
  279. else
  280. {
  281. int ri = translate_rreg (SD_, Ri);
  282. int rm = translate_rreg (SD_, Rm);
  283. XS2FS (Z, Sn) = load_word (State.regs[ri] + State.regs[rm]);
  284. }
  285. }
  286. // 1111 1011 0011 00Y0 Sm.. Rn.. d8; fmov FSm,(d8,Rn)
  287. 8.0xfb+4.3,2.0,1.Y,1.0+4.Sm,4.Rn+8.IMM8:D2e:::fmov
  288. "fmov"
  289. *am33_2
  290. {
  291. PC = cia;
  292. if (FPU_DISABLED)
  293. fpu_disabled_exception (SD, CPU, cia);
  294. else
  295. {
  296. int reg = translate_rreg (SD_, Rn);
  297. store_word (State.regs[reg] + EXTEND8 (IMM8), XS2FS (Y, Sm));
  298. }
  299. }
  300. // 1111 1011 0011 00Y1 Sm.. Rn.. d8; fmov FSm,(Rn+,d8)
  301. 8.0xfb+4.3,2.0,1.Y,1.1+4.Sm,4.Rn+8.IMM8:D2f:::fmov
  302. "fmov"
  303. *am33_2
  304. {
  305. PC = cia;
  306. if (FPU_DISABLED)
  307. fpu_disabled_exception (SD, CPU, cia);
  308. else
  309. {
  310. int reg = translate_rreg (SD_, Rn);
  311. store_word (State.regs[reg] + EXTEND8 (IMM8), XS2FS (Y, Sm));
  312. State.regs[reg] += 4;
  313. }
  314. }
  315. // 1111 1011 0011 01Y0 Sm.. ---- d8; fmov FSm,(d8,SP)
  316. 8.0xfb+4.3,2.1,1.Y,1.0+4.Sm,4.0+8.IMM8:D2g:::fmov
  317. "fmov"
  318. *am33_2
  319. {
  320. PC = cia;
  321. if (FPU_DISABLED)
  322. fpu_disabled_exception (SD, CPU, cia);
  323. else
  324. {
  325. int reg = REG_SP;
  326. store_word (State.regs[reg] + IMM8, XS2FS (Y, Sm));
  327. }
  328. }
  329. // 1111 1011 0011 0111 Ri.. Rm.. Sm.. --Z-; fmov FSm,(Ri,Rm)
  330. 8.0xfb+8.0x37+4.Ri,4.Rm+4.Sm,2.0,1.Z,1.0:D2h:::fmov
  331. "fmov"
  332. *am33_2
  333. {
  334. PC = cia;
  335. if (FPU_DISABLED)
  336. fpu_disabled_exception (SD, CPU, cia);
  337. else
  338. {
  339. int ri = translate_rreg (SD_, Ri);
  340. int rm = translate_rreg (SD_, Rm);
  341. store_word (State.regs[ri] + State.regs[rm], XS2FS (Z, Sm));
  342. }
  343. }
  344. // 1111 1101 0010 000X Rm.. Sn.. d24; fmov (d24,Rm),FSn
  345. 8.0xfd+4.2,3.0,1.X+4.Rm,4.Sn+8.IMM24A+8.IMM24B+8.IMM24C:D4a:::fmov
  346. "fmov"
  347. *am33_2
  348. {
  349. PC = cia;
  350. if (FPU_DISABLED)
  351. fpu_disabled_exception (SD, CPU, cia);
  352. else
  353. {
  354. int reg = translate_rreg (SD_, Rm);
  355. XS2FS (X, Sn) = load_word (State.regs[reg]
  356. + EXTEND24 (FETCH24 (IMM24A,
  357. IMM24B, IMM24C)));
  358. }
  359. }
  360. // 1111 1101 0010 001X Rm.. Sn.. d24; fmov (Rm+,imm24),FSn
  361. 8.0xfd+4.2,3.1,1.X+4.Rm,4.Sn+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::fmov
  362. "fmov"
  363. *am33_2
  364. {
  365. PC = cia;
  366. if (FPU_DISABLED)
  367. fpu_disabled_exception (SD, CPU, cia);
  368. else
  369. {
  370. int reg = translate_rreg (SD_, Rm);
  371. XS2FS (X, Sn) = load_word (State.regs[reg]
  372. + EXTEND24 (FETCH24 (IMM24A,
  373. IMM24B, IMM24C)));
  374. State.regs[reg] += 4;
  375. }
  376. }
  377. // 1111 1101 0010 010X ---- Sn.. d24; fmov (d24,SP),FSn
  378. 8.0xfd+4.2,3.2,1.X+4.0,4.Sn+8.IMM24A+8.IMM24B+8.IMM24C:D4c:::fmov
  379. "fmov"
  380. *am33_2
  381. {
  382. PC = cia;
  383. if (FPU_DISABLED)
  384. fpu_disabled_exception (SD, CPU, cia);
  385. else
  386. {
  387. int reg = REG_SP;
  388. XS2FS (X, Sn) = load_word (State.regs[reg] + FETCH24 (IMM24A,
  389. IMM24B, IMM24C));
  390. }
  391. }
  392. // 1111 1101 0011 00Y0 Sm.. Rn.. d24; fmov FSm,(d24,Rn)
  393. 8.0xfd+4.3,2.0,1.Y,1.0+4.Sm,4.Rn+8.IMM24A+8.IMM24B+8.IMM24C:D4e:::fmov
  394. "fmov"
  395. *am33_2
  396. {
  397. PC = cia;
  398. if (FPU_DISABLED)
  399. fpu_disabled_exception (SD, CPU, cia);
  400. else
  401. {
  402. int reg = translate_rreg (SD_, Rn);
  403. store_word (State.regs[reg]
  404. + EXTEND24 (FETCH24 (IMM24A,
  405. IMM24B, IMM24C)), XS2FS (Y, Sm));
  406. }
  407. }
  408. // 1111 1101 0011 00Y1 Sm.. Rn.. d24; fmov FSm,(Rn+,d24)
  409. 8.0xfd+4.3,2.0,1.Y,1.1+4.Sm,4.Rn+8.IMM24A+8.IMM24B+8.IMM24C:D4f:::fmov
  410. "fmov"
  411. *am33_2
  412. {
  413. PC = cia;
  414. if (FPU_DISABLED)
  415. fpu_disabled_exception (SD, CPU, cia);
  416. else
  417. {
  418. int reg = translate_rreg (SD_, Rn);
  419. store_word (State.regs[reg]
  420. + EXTEND24 (FETCH24 (IMM24A,
  421. IMM24B, IMM24C)), XS2FS (Y, Sm));
  422. State.regs[reg] += 4;
  423. }
  424. }
  425. // 1111 1101 0011 01Y0 Sm.. ---- d24; fmov FSm,(d24,SP)
  426. 8.0xfd+4.3,2.1,1.Y,1.0+4.Sm,4.0+8.IMM24A+8.IMM24B+8.IMM24C:D4g:::fmov
  427. "fmov"
  428. *am33_2
  429. {
  430. PC = cia;
  431. if (FPU_DISABLED)
  432. fpu_disabled_exception (SD, CPU, cia);
  433. else
  434. {
  435. int reg = REG_SP;
  436. store_word (State.regs[reg]
  437. + FETCH24 (IMM24A,
  438. IMM24B, IMM24C), XS2FS (Y, Sm));
  439. }
  440. }
  441. // 1111 1110 0010 000X Rm.. Sn.. d32; fmov (d32,Rm),FSn
  442. 8.0xfe+4.2,3.0,1.X+4.Rm,4.Sn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5a:::fmov
  443. "fmov"
  444. *am33_2
  445. {
  446. PC = cia;
  447. if (FPU_DISABLED)
  448. fpu_disabled_exception (SD, CPU, cia);
  449. else
  450. {
  451. int reg = translate_rreg (SD_, Rm);
  452. XS2FS (X, Sn) = load_word (State.regs[reg]
  453. + EXTEND32 (FETCH32 (IMM32A, IMM32B,
  454. IMM32C, IMM32D)));
  455. }
  456. }
  457. // 1111 1110 0010 001X Rm.. Sn.. d32; fmov (Rm+,imm32),FSn
  458. 8.0xfe+4.2,3.1,1.X+4.Rm,4.Sn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::fmov
  459. "fmov"
  460. *am33_2
  461. {
  462. PC = cia;
  463. if (FPU_DISABLED)
  464. fpu_disabled_exception (SD, CPU, cia);
  465. else
  466. {
  467. int reg = translate_rreg (SD_, Rm);
  468. XS2FS (X, Sn) = load_word (State.regs[reg]
  469. + EXTEND32 (FETCH32 (IMM32A, IMM32B,
  470. IMM32C, IMM32D)));
  471. State.regs[reg] += 4;
  472. }
  473. }
  474. // 1111 1110 0010 010X ---- Sn.. d32; fmov (d32,SP),FSn
  475. 8.0xfe+4.2,3.2,1.X+4.0,4.Sn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::fmov
  476. "fmov"
  477. *am33_2
  478. {
  479. PC = cia;
  480. if (FPU_DISABLED)
  481. fpu_disabled_exception (SD, CPU, cia);
  482. else
  483. {
  484. int reg = REG_SP;
  485. XS2FS (X, Sn) = load_word (State.regs[reg]
  486. + FETCH32 (IMM32A, IMM32B,
  487. IMM32C, IMM32D));
  488. }
  489. }
  490. // 1111 1110 0010 011X ---- Sn.. d32; fmov imm32,FSn
  491. 8.0xfe+4.2,3.3,1.X+4.0,4.Sn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::fmov
  492. "fmov"
  493. *am33_2
  494. {
  495. PC = cia;
  496. if (FPU_DISABLED)
  497. fpu_disabled_exception (SD, CPU, cia);
  498. else
  499. XS2FS (X, Sn) = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
  500. }
  501. // 1111 1110 0011 00Y0 Sm.. Rn.. d32; fmov FSm,(d32,Rn)
  502. 8.0xfe+4.3,2.0,1.Y,1.0+4.Sm,4.Rn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::fmov
  503. "fmov"
  504. *am33_2
  505. {
  506. PC = cia;
  507. if (FPU_DISABLED)
  508. fpu_disabled_exception (SD, CPU, cia);
  509. else
  510. {
  511. int reg = translate_rreg (SD_, Rn);
  512. store_word (State.regs[reg]
  513. + EXTEND32 (FETCH32 (IMM32A, IMM32B,
  514. IMM32C, IMM32D)), XS2FS (Y, Sm));
  515. }
  516. }
  517. // 1111 1110 0011 00Y1 Sm.. Rn.. d32; fmov FSm,(Rn+,d32)
  518. 8.0xfe+4.3,2.0,1.Y,1.1+4.Sm,4.Rn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::fmov
  519. "fmov"
  520. *am33_2
  521. {
  522. PC = cia;
  523. if (FPU_DISABLED)
  524. fpu_disabled_exception (SD, CPU, cia);
  525. else
  526. {
  527. int reg = translate_rreg (SD_, Rn);
  528. store_word (State.regs[reg]
  529. + EXTEND32 (FETCH32 (IMM32A, IMM32B,
  530. IMM32C, IMM32D)), XS2FS (Y, Sm));
  531. State.regs[reg] += 4;
  532. }
  533. }
  534. // 1111 1110 0011 01Y0 Sm.. ---- d32; fmov FSm,(d32,SP)
  535. 8.0xfe+4.3,2.1,1.Y,1.0+4.Sm,4.0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5g:::fmov
  536. "fmov"
  537. *am33_2
  538. {
  539. PC = cia;
  540. if (FPU_DISABLED)
  541. fpu_disabled_exception (SD, CPU, cia);
  542. else
  543. {
  544. int reg = REG_SP;
  545. store_word (State.regs[reg]
  546. + FETCH32 (IMM32A, IMM32B,
  547. IMM32C, IMM32D), XS2FS (Y, Sm));
  548. }
  549. }
  550. // double precision fmov:
  551. // 1111 1001 1010 000X Rm.. fn.-; fmov (Rm),FDn
  552. 8.0xf9+4.0xa,3.0,1.X+4.Rm,3.fn,1.0:D1j:::fmov
  553. "fmov"
  554. *am33_2
  555. {
  556. PC = cia;
  557. if (FPU_DISABLED)
  558. fpu_disabled_exception (SD, CPU, cia);
  559. else
  560. {
  561. int reg = translate_rreg (SD_, Rm);
  562. Xf2FD (X,fn) = load_dword (State.regs[reg]);
  563. }
  564. }
  565. // 1111 1001 1010 001X Rm.. fn.-; fmov (Rm+),FDn
  566. 8.0xf9+4.0xa,3.1,1.X+4.Rm,3.fn,1.0:D1k:::fmov
  567. "fmov"
  568. *am33_2
  569. {
  570. PC = cia;
  571. if (FPU_DISABLED)
  572. fpu_disabled_exception (SD, CPU, cia);
  573. else
  574. {
  575. int reg = translate_rreg (SD_, Rm);
  576. Xf2FD (X,fn) = load_dword (State.regs[reg]);
  577. State.regs[reg] += 8;
  578. }
  579. }
  580. // 1111 1001 1010 010X ---- fn.-; fmov (SP),FDn
  581. 8.0xf9+4.0xa,3.2,1.X+4.0,3.fn,1.0:D1l:::fmov
  582. "fmov"
  583. *am33_2
  584. {
  585. PC = cia;
  586. if (FPU_DISABLED)
  587. fpu_disabled_exception (SD, CPU, cia);
  588. else
  589. {
  590. int reg = REG_SP;
  591. Xf2FD (X,fn) = load_dword (State.regs[reg]);
  592. }
  593. }
  594. // 1111 1001 1011 00Y0 fm.- Rn..; fmov FDm,(Rn)
  595. 8.0xf9+4.0xb,2.0,1.Y,1.0+3.fm,1.0,4.Rn:D1m:::fmov
  596. "fmov"
  597. *am33_2
  598. {
  599. PC = cia;
  600. if (FPU_DISABLED)
  601. fpu_disabled_exception (SD, CPU, cia);
  602. else
  603. {
  604. int reg = translate_rreg (SD_, Rn);
  605. store_dword (State.regs[reg], Xf2FD (Y,fm));
  606. }
  607. }
  608. // 1111 1001 1011 00Y1 fm.- Rn..; fmov FDm,(Rn+)
  609. 8.0xf9+4.0xb,2.0,1.Y,1.1+3.fm,1.0,4.Rn:D1n:::fmov
  610. "fmov"
  611. *am33_2
  612. {
  613. PC = cia;
  614. if (FPU_DISABLED)
  615. fpu_disabled_exception (SD, CPU, cia);
  616. else
  617. {
  618. int reg = translate_rreg (SD_, Rn);
  619. store_dword (State.regs[reg], Xf2FD (Y,fm));
  620. State.regs[reg] += 8;
  621. }
  622. }
  623. // 1111 1001 1011 01Y0 fm.- ----; fmov FDm,(SP)
  624. 8.0xf9+4.0xb,2.1,1.Y,1.0+3.fm,1.0,4.0:D1o:::fmov
  625. "fmov"
  626. *am33_2
  627. {
  628. PC = cia;
  629. if (FPU_DISABLED)
  630. fpu_disabled_exception (SD, CPU, cia);
  631. else
  632. {
  633. int reg = REG_SP;
  634. store_dword (State.regs[reg], Xf2FD (Y,fm));
  635. }
  636. }
  637. // 1111 1001 1100 00YX fm.- fn.-; fmov FDm,FDn
  638. 8.0xf9+4.0xc,2.0,1.Y,1.X+3.fm,1.0,3.fn,1.0:D1p:::fmov
  639. "fmov"
  640. *am33_2
  641. {
  642. PC = cia;
  643. if (FPU_DISABLED)
  644. fpu_disabled_exception (SD, CPU, cia);
  645. else
  646. fpu_unimp_exception (SD, CPU, cia);
  647. }
  648. // 1111 1011 0100 0111 Ri.. Rm.. fn.- --Z-; fmov (Ri,Rm),FDn
  649. 8.0xfb+8.0x47+4.Ri,4.Rm+3.fn,1.0,2.0,1.Z,1.0:D2i:::fmov
  650. "fmov"
  651. *am33_2
  652. {
  653. PC = cia;
  654. if (FPU_DISABLED)
  655. fpu_disabled_exception (SD, CPU, cia);
  656. else
  657. {
  658. int ri = translate_rreg (SD_, Ri);
  659. int rm = translate_rreg (SD_, Rm);
  660. Xf2FD (Z,fn) = load_dword (State.regs[ri] + State.regs[rm]);
  661. }
  662. }
  663. // 1111 1011 0101 0111 Ri.. Rn.. fm.- --Z-; fmov FDm,(Ri,Rn)
  664. 8.0xfb+8.0x57+4.Ri,4.Rn+3.fm,1.0,2.0,1.Z,1.0:D2j:::fmov
  665. "fmov"
  666. *am33_2
  667. {
  668. PC = cia;
  669. if (FPU_DISABLED)
  670. fpu_disabled_exception (SD, CPU, cia);
  671. else
  672. {
  673. int ri = translate_rreg (SD_, Ri);
  674. int rn = translate_rreg (SD_, Rn);
  675. store_dword (State.regs[ri] + State.regs[rn], Xf2FD (Z,fm));
  676. }
  677. }
  678. // 1111 1011 1010 000X Rm.. fn.- d8; fmov (d8,Rm),FDn
  679. 8.0xfb+4.0xa,3.0,1.X+4.Rm,4.fn+8.IMM8:D2k:::fmov
  680. "fmov"
  681. *am33_2
  682. {
  683. PC = cia;
  684. if (FPU_DISABLED)
  685. fpu_disabled_exception (SD, CPU, cia);
  686. else
  687. {
  688. int reg = translate_rreg (SD_, Rm);
  689. Xf2FD (X, fn) = load_dword (State.regs[reg] + EXTEND8 (IMM8));
  690. }
  691. }
  692. // 1111 1011 1010 001X Rm.. fn.- d8; fmov (Rm+,imm8),FDn
  693. 8.0xfb+4.0xa,3.1,1.X+4.Rm,4.fn+8.IMM8:D2l:::fmov
  694. "fmov"
  695. *am33_2
  696. {
  697. PC = cia;
  698. if (FPU_DISABLED)
  699. fpu_disabled_exception (SD, CPU, cia);
  700. else
  701. {
  702. int reg = translate_rreg (SD_, Rm);
  703. Xf2FD (X, fn) = load_dword (State.regs[reg] + EXTEND8 (IMM8));
  704. State.regs[reg] += 8;
  705. }
  706. }
  707. // 1111 1011 1010 010X ---- fn.- d8; fmov (d8,SP),FDn
  708. 8.0xfb+4.0xa,3.2,1.X+4.0,4.fn+8.IMM8:D2m:::fmov
  709. "fmov"
  710. *am33_2
  711. {
  712. PC = cia;
  713. if (FPU_DISABLED)
  714. fpu_disabled_exception (SD, CPU, cia);
  715. else
  716. {
  717. int reg = REG_SP;
  718. Xf2FD (X, fn) = load_dword (State.regs[reg] + IMM8);
  719. }
  720. }
  721. // 1111 1011 1011 00Y0 fm.- Rn.. d8; fmov FDm,(d8,Rn)
  722. 8.0xfb+4.0xb,2.0,1.Y,1.0+4.fm,4.Rn+8.IMM8:D2n:::fmov
  723. "fmov"
  724. *am33_2
  725. {
  726. PC = cia;
  727. if (FPU_DISABLED)
  728. fpu_disabled_exception (SD, CPU, cia);
  729. else
  730. {
  731. int reg = translate_rreg (SD_, Rn);
  732. store_dword (State.regs[reg] + EXTEND8 (IMM8), Xf2FD (Y, fm));
  733. }
  734. }
  735. // 1111 1011 1011 00Y1 fm.- Rn.. d8; fmov FDm,(Rn+,d8)
  736. 8.0xfb+4.0xb,2.0,1.Y,1.1+4.fm,4.Rn+8.IMM8:D2o:::fmov
  737. "fmov"
  738. *am33_2
  739. {
  740. PC = cia;
  741. if (FPU_DISABLED)
  742. fpu_disabled_exception (SD, CPU, cia);
  743. else
  744. {
  745. int reg = translate_rreg (SD_, Rn);
  746. store_dword (State.regs[reg] + EXTEND8 (IMM8), Xf2FD (Y, fm));
  747. State.regs[reg] += 8;
  748. }
  749. }
  750. // 1111 1011 1011 01Y0 fm.- ---- d8; fmov FDm,(d8,SP)
  751. 8.0xfb+4.0xb,2.1,1.Y,1.0+4.fm,4.0+8.IMM8:D2p:::fmov
  752. "fmov"
  753. *am33_2
  754. {
  755. PC = cia;
  756. if (FPU_DISABLED)
  757. fpu_disabled_exception (SD, CPU, cia);
  758. else
  759. {
  760. int reg = REG_SP;
  761. store_dword (State.regs[reg] + IMM8, Xf2FD (Y, fm));
  762. }
  763. }
  764. // 1111 1101 1010 000X Rm.. fn.- d24; fmov (d24,Rm),FDn
  765. 8.0xfd+4.0xa,3.0,1.X+4.Rm,4.fn+8.IMM24A+8.IMM24B+8.IMM24C:D4k:::fmov
  766. "fmov"
  767. *am33_2
  768. {
  769. PC = cia;
  770. if (FPU_DISABLED)
  771. fpu_disabled_exception (SD, CPU, cia);
  772. else
  773. {
  774. int reg = translate_rreg (SD_, Rm);
  775. Xf2FD (X, fn) = load_dword (State.regs[reg]
  776. + EXTEND24 (FETCH24 (IMM24A,
  777. IMM24B, IMM24C)));
  778. }
  779. }
  780. // 1111 1101 1010 001X Rm.. fn.- d24; fmov (Rm+,imm24),FDn
  781. 8.0xfd+4.0xa,3.1,1.X+4.Rm,4.fn+8.IMM24A+8.IMM24B+8.IMM24C:D4l:::fmov
  782. "fmov"
  783. *am33_2
  784. {
  785. PC = cia;
  786. if (FPU_DISABLED)
  787. fpu_disabled_exception (SD, CPU, cia);
  788. else
  789. {
  790. int reg = translate_rreg (SD_, Rm);
  791. Xf2FD (X, fn) = load_dword (State.regs[reg]
  792. + EXTEND24 (FETCH24 (IMM24A,
  793. IMM24B, IMM24C)));
  794. State.regs[reg] += 8;
  795. }
  796. }
  797. // 1111 1101 1010 010X ---- fn.- d24; fmov (d24,SP),FDn
  798. 8.0xfd+4.0xa,3.2,1.X+4.0,4.fn+8.IMM24A+8.IMM24B+8.IMM24C:D4m:::fmov
  799. "fmov"
  800. *am33_2
  801. {
  802. PC = cia;
  803. if (FPU_DISABLED)
  804. fpu_disabled_exception (SD, CPU, cia);
  805. else
  806. {
  807. int reg = REG_SP;
  808. Xf2FD (X, fn) = load_dword (State.regs[reg]
  809. + FETCH24 (IMM24A,
  810. IMM24B, IMM24C));
  811. }
  812. }
  813. // 1111 1101 1011 00Y0 fm.- Rn.. d24; fmov FDm,(d24,Rn)
  814. 8.0xfd+4.0xb,2.0,1.Y,1.0+4.fm,4.Rn+8.IMM24A+8.IMM24B+8.IMM24C:D4n:::fmov
  815. "fmov"
  816. *am33_2
  817. {
  818. PC = cia;
  819. if (FPU_DISABLED)
  820. fpu_disabled_exception (SD, CPU, cia);
  821. else
  822. {
  823. int reg = translate_rreg (SD_, Rn);
  824. store_dword (State.regs[reg]
  825. + EXTEND24 (FETCH24 (IMM24A,
  826. IMM24B, IMM24C)), Xf2FD (Y, fm));
  827. }
  828. }
  829. // 1111 1101 1011 00Y1 fm.- Rn.. d24; fmov FDm,(Rn+,d24)
  830. 8.0xfd+4.0xb,2.0,1.Y,1.1+4.fm,4.Rn+8.IMM24A+8.IMM24B+8.IMM24C:D4o:::fmov
  831. "fmov"
  832. *am33_2
  833. {
  834. PC = cia;
  835. if (FPU_DISABLED)
  836. fpu_disabled_exception (SD, CPU, cia);
  837. else
  838. {
  839. int reg = translate_rreg (SD_, Rn);
  840. store_dword (State.regs[reg]
  841. + EXTEND24 (FETCH24 (IMM24A,
  842. IMM24B, IMM24C)), Xf2FD (Y, fm));
  843. State.regs[reg] += 8;
  844. }
  845. }
  846. // 1111 1101 1011 01Y0 fm.- ---- d24; fmov FDm,(d24,SP)
  847. 8.0xfd+4.0xb,2.1,1.Y,1.0+4.fm,4.0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::fmov
  848. "fmov"
  849. *am33_2
  850. {
  851. PC = cia;
  852. if (FPU_DISABLED)
  853. fpu_disabled_exception (SD, CPU, cia);
  854. else
  855. {
  856. int reg = REG_SP;
  857. store_dword (State.regs[reg] + FETCH24 (IMM24A,
  858. IMM24B, IMM24C), Xf2FD (Y, fm));
  859. }
  860. }
  861. // 1111 1110 1010 000X Rm.. fn.- d32; fmov (d32,Rm),FDn
  862. 8.0xfe+4.0xa,3.0,1.X+4.Rm,4.fn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5k:::fmov
  863. "fmov"
  864. *am33_2
  865. {
  866. PC = cia;
  867. if (FPU_DISABLED)
  868. fpu_disabled_exception (SD, CPU, cia);
  869. else
  870. {
  871. int reg = translate_rreg (SD_, Rm);
  872. Xf2FD (X, fn) = load_dword (State.regs[reg]
  873. + EXTEND32 (FETCH32 (IMM32A, IMM32B,
  874. IMM32C, IMM32D)));
  875. }
  876. }
  877. // 1111 1110 1010 001X Rm.. fn.- d32; fmov (Rm+,imm32),FDn
  878. 8.0xfe+4.0xa,3.1,1.X+4.Rm,4.fn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5l:::fmov
  879. "fmov"
  880. *am33_2
  881. {
  882. PC = cia;
  883. if (FPU_DISABLED)
  884. fpu_disabled_exception (SD, CPU, cia);
  885. else
  886. {
  887. int reg = translate_rreg (SD_, Rm);
  888. Xf2FD (X, fn) = load_dword (State.regs[reg]
  889. + EXTEND32 (FETCH32 (IMM32A, IMM32B,
  890. IMM32C, IMM32D)));
  891. State.regs[reg] += 8;
  892. }
  893. }
  894. // 1111 1110 1010 010X ---- fn.- d32; fmov (d32,SP),FDn
  895. 8.0xfe+4.0xa,3.2,1.X+4.0,4.fn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5m:::fmov
  896. "fmov"
  897. *am33_2
  898. {
  899. PC = cia;
  900. if (FPU_DISABLED)
  901. fpu_disabled_exception (SD, CPU, cia);
  902. else
  903. {
  904. int reg = REG_SP;
  905. Xf2FD (X, fn) = load_dword (State.regs[reg]
  906. + FETCH32 (IMM32A, IMM32B,
  907. IMM32C, IMM32D));
  908. }
  909. }
  910. // 1111 1110 1011 00Y0 fm.- Rn.. d32; fmov FDm,(d32,Rn)
  911. 8.0xfe+4.0xb,2.0,1.Y,1.0+4.fm,4.Rn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5n:::fmov
  912. "fmov"
  913. *am33_2
  914. {
  915. PC = cia;
  916. if (FPU_DISABLED)
  917. fpu_disabled_exception (SD, CPU, cia);
  918. else
  919. {
  920. int reg = translate_rreg (SD_, Rn);
  921. store_dword (State.regs[reg]
  922. + EXTEND32 (FETCH32 (IMM32A, IMM32B,
  923. IMM32C, IMM32D)), Xf2FD (Y, fm));
  924. }
  925. }
  926. // 1111 1110 1011 00Y1 fm.- Rn.. d32; fmov FDm,(Rn+,d32)
  927. 8.0xfe+4.0xb,2.0,1.Y,1.1+4.fm,4.Rn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5o:::fmov
  928. "fmov"
  929. *am33_2
  930. {
  931. PC = cia;
  932. if (FPU_DISABLED)
  933. fpu_disabled_exception (SD, CPU, cia);
  934. else
  935. {
  936. int reg = translate_rreg (SD_, Rn);
  937. store_dword (State.regs[reg]
  938. + EXTEND32 (FETCH32 (IMM32A, IMM32B,
  939. IMM32C, IMM32D)), Xf2FD (Y, fm));
  940. State.regs[reg] += 8;
  941. }
  942. }
  943. // 1111 1110 1011 01Y0 fm.- ---- d32; fmov FDm,(d32,SP)
  944. 8.0xfe+4.0xb,2.1,1.Y,1.0+4.fm,4.0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5p:::fmov
  945. "fmov"
  946. *am33_2
  947. {
  948. PC = cia;
  949. if (FPU_DISABLED)
  950. fpu_disabled_exception (SD, CPU, cia);
  951. else
  952. {
  953. int reg = REG_SP;
  954. store_dword (State.regs[reg]
  955. + FETCH32 (IMM32A, IMM32B,
  956. IMM32C, IMM32D), Xf2FD (Y, fm));
  957. }
  958. }
  959. // FPCR fmov:
  960. // 1111 1001 1011 0101 Rm.. ----; fmov Rm,FPCR
  961. 8.0xf9+8.0xb5+4.Rm,4.0:D1q:::fmov
  962. "fmov"
  963. *am33_2
  964. {
  965. PC = cia;
  966. if (FPU_DISABLED)
  967. fpu_disabled_exception (SD, CPU, cia);
  968. else
  969. {
  970. int reg = translate_rreg (SD_, Rm);
  971. uint32_t val = State.regs[reg];
  972. FPCR = (val & (EC_MASK | EE_MASK | FCC_MASK))
  973. | ((FPCR & ~val) & EF_MASK);
  974. }
  975. }
  976. // 1111 1001 1011 0111 ---- Rn..; fmov FPCR,Rn
  977. 8.0xf9+8.0xb7+4.0,4.Rn:D1r:::fmov
  978. "fmov"
  979. *am33_2
  980. {
  981. PC = cia;
  982. if (FPU_DISABLED)
  983. fpu_disabled_exception (SD, CPU, cia);
  984. else
  985. {
  986. int reg = translate_rreg (SD_, Rn);
  987. State.regs[reg] = FPCR & FPCR_MASK;
  988. }
  989. }
  990. // 1111 1101 1011 0101 imm32; fmov imm32,FPCR
  991. 8.0xfd+8.0xb5+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::fmov
  992. "fmov"
  993. *am33_2
  994. {
  995. PC = cia;
  996. if (FPU_DISABLED)
  997. fpu_disabled_exception (SD, CPU, cia);
  998. else
  999. {
  1000. uint32_t val = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
  1001. FPCR = (val & (EC_MASK | EE_MASK | FCC_MASK))
  1002. | ((FPCR & ~val) & EF_MASK);
  1003. }
  1004. }
  1005. // fabs:
  1006. // 1111 1001 0100 010X ---- Sn..; fabs FSn
  1007. 8.0xf9+4.4,3.2,1.X+4.0,4.Sn:D1a:::fabs
  1008. "fabs"
  1009. *am33_2
  1010. {
  1011. PC = cia;
  1012. if (FPU_DISABLED)
  1013. fpu_disabled_exception (SD, CPU, cia);
  1014. else
  1015. {
  1016. sim_fpu in, out;
  1017. FS2FPU (XS2FS (X,Sn), in);
  1018. sim_fpu_abs (&out, &in);
  1019. FPU2FS (out, XS2FS (X,Sn));
  1020. }
  1021. }
  1022. // 1111 1001 1100 010X ---- Sn..; fabs FDn
  1023. 8.0xf9+4.0xc,3.2,1.X+4.0,3.fn,1.0:D1b:::fabs
  1024. "fabs"
  1025. *am33_2
  1026. {
  1027. PC = cia;
  1028. if (FPU_DISABLED)
  1029. fpu_disabled_exception (SD, CPU, cia);
  1030. else
  1031. fpu_unimp_exception (SD, CPU, cia);
  1032. }
  1033. // 1111 1011 0100 0100 Sm.. ---- Sn.. X-Z-; fabs FSm,FSn
  1034. 8.0xfb+8.0x44+4.Sm,4.0+4.Sn,1.X,1.0,1.Z,1.0:D2a:::fabs
  1035. "fabs"
  1036. *am33_2
  1037. {
  1038. PC = cia;
  1039. if (FPU_DISABLED)
  1040. fpu_disabled_exception (SD, CPU, cia);
  1041. else
  1042. {
  1043. sim_fpu in, out;
  1044. FS2FPU (XS2FS (X,Sm), in);
  1045. sim_fpu_abs (&out, &in);
  1046. FPU2FS (out, XS2FS (Z,Sn));
  1047. }
  1048. }
  1049. // 1111 1011 1100 0100 fm.- ---- fn.- X-Z-; fabs FDm,FDn
  1050. 8.0xfb+8.0xc4+3.fm,1.0,4.0+3.fn,1.0,1.X,1.0,1.Z,1.0:D2b:::fabs
  1051. "fabs"
  1052. *am33_2
  1053. {
  1054. PC = cia;
  1055. if (FPU_DISABLED)
  1056. fpu_disabled_exception (SD, CPU, cia);
  1057. else
  1058. fpu_unimp_exception (SD, CPU, cia);
  1059. }
  1060. // 1111 1001 0100 011X ---- Sn..; fneg FSn
  1061. 8.0xf9+4.4,3.3,1.X+4.0,4.Sn:D1a:::fneg
  1062. "fneg"
  1063. *am33_2
  1064. {
  1065. PC = cia;
  1066. if (FPU_DISABLED)
  1067. fpu_disabled_exception (SD, CPU, cia);
  1068. else
  1069. {
  1070. sim_fpu in, out;
  1071. FS2FPU (XS2FS (X,Sn), in);
  1072. sim_fpu_neg (&out, &in);
  1073. FPU2FS (out, XS2FS (X,Sn));
  1074. }
  1075. }
  1076. // 1111 1001 1100 011X ---- Sn..; fneg FDn
  1077. 8.0xf9+4.0xc,3.3,1.X+4.0,3.fn,1.0:D1b:::fneg
  1078. "fneg"
  1079. *am33_2
  1080. {
  1081. PC = cia;
  1082. if (FPU_DISABLED)
  1083. fpu_disabled_exception (SD, CPU, cia);
  1084. else
  1085. fpu_unimp_exception (SD, CPU, cia);
  1086. }
  1087. // 1111 1011 0100 0110 Sm.. ---- Sn.. X-Z-; fneg FSm,FSn
  1088. 8.0xfb+8.0x46+4.Sm,4.0+4.Sn,1.X,1.0,1.Z,1.0:D2a:::fneg
  1089. "fneg"
  1090. *am33_2
  1091. {
  1092. PC = cia;
  1093. if (FPU_DISABLED)
  1094. fpu_disabled_exception (SD, CPU, cia);
  1095. else
  1096. {
  1097. sim_fpu in, out;
  1098. FS2FPU (XS2FS (X,Sm), in);
  1099. sim_fpu_neg (&out, &in);
  1100. FPU2FS (out, XS2FS (Z,Sn));
  1101. }
  1102. }
  1103. // 1111 1011 1100 0110 fm.- ---- fn.- X-Z-; fneg FDm,FDn
  1104. 8.0xfb+8.0xc6+3.fm,1.0,4.0+3.fn,1.0,1.X,1.0,1.Z,1.0:D2b:::fneg
  1105. "fneg"
  1106. *am33_2
  1107. {
  1108. PC = cia;
  1109. if (FPU_DISABLED)
  1110. fpu_disabled_exception (SD, CPU, cia);
  1111. else
  1112. fpu_unimp_exception (SD, CPU, cia);
  1113. }
  1114. // 1111 1001 0101 000X ---- Sn..; frsqrt FSn
  1115. 8.0xf9+4.5,3.0,1.X+4.0,4.Sn:D1a:::frsqrt
  1116. "frsqrt"
  1117. *am33_2
  1118. {
  1119. PC = cia;
  1120. if (FPU_DISABLED)
  1121. fpu_disabled_exception (SD, CPU, cia);
  1122. else
  1123. fpu_rsqrt (SD, CPU, cia, &XS2FS (X,Sn), &XS2FS (X,Sn), FP_SINGLE);
  1124. }
  1125. // 1111 1001 1101 000X ---- fn.-; frsqrt FDn
  1126. 8.0xf9+4.0xd,3.0,1.X+4.0,3.fn,1.0:D1b:::frsqrt
  1127. "frsqrt"
  1128. *am33_2
  1129. {
  1130. PC = cia;
  1131. if (FPU_DISABLED)
  1132. fpu_disabled_exception (SD, CPU, cia);
  1133. else
  1134. fpu_unimp_exception (SD, CPU, cia);
  1135. }
  1136. // 1111 1011 0101 0000 Sm.. ---- Sn.. X-Z-; frsqrt FSm,FSn
  1137. 8.0xfb+8.0x50+4.Sm,4.0+4.Sn,1.X,1.0,1.Z,1.0:D2a:::frsqrt
  1138. "frsqrt"
  1139. *am33_2
  1140. {
  1141. PC = cia;
  1142. if (FPU_DISABLED)
  1143. fpu_disabled_exception (SD, CPU, cia);
  1144. else
  1145. fpu_rsqrt (SD, CPU, cia, &XS2FS (X,Sm), &XS2FS (Z,Sn), FP_SINGLE);
  1146. }
  1147. // 1111 1011 1101 0000 fm.- ---- fn.- X-Z-; frsqrt FDm,FDn
  1148. 8.0xfb+8.0xd0+3.fm,1.0,4.0+3.fn,1.0,1.X,1.0,1.Z,1.0:D2b:::frsqrt
  1149. "frsqrt"
  1150. *am33_2
  1151. {
  1152. PC = cia;
  1153. if (FPU_DISABLED)
  1154. fpu_disabled_exception (SD, CPU, cia);
  1155. else
  1156. fpu_unimp_exception (SD, CPU, cia);
  1157. }
  1158. // 1111 1001 0101 001X ---- Sn..; fsqrt FSn
  1159. 8.0xf9+4.5,3.1,1.X+4.0,4.Sn:D1a:::fsqrt
  1160. "fsqrt"
  1161. *am33_2
  1162. {
  1163. PC = cia;
  1164. if (FPU_DISABLED)
  1165. fpu_disabled_exception (SD, CPU, cia);
  1166. else
  1167. fpu_unimp_exception (SD, CPU, cia);
  1168. }
  1169. // 1111 1001 1101 001X ---- fn.-; fsqrt FDn
  1170. 8.0xf9+4.0xd,3.1,1.X+4.0,3.fn,1.0:D1b:::fsqrt
  1171. "fsqrt"
  1172. *am33_2
  1173. {
  1174. PC = cia;
  1175. if (FPU_DISABLED)
  1176. fpu_disabled_exception (SD, CPU, cia);
  1177. else
  1178. fpu_unimp_exception (SD, CPU, cia);
  1179. }
  1180. // 1111 1011 0101 0100 Sm.. ---- Sn.. X-Z-; fsqrt FSm,FSn
  1181. 8.0xfb+8.0x54+4.Sm,4.0+4.Sn,1.X,1.0,1.Z,1.0:D2a:::fsqrt
  1182. "fsqrt"
  1183. *am33_2
  1184. {
  1185. PC = cia;
  1186. if (FPU_DISABLED)
  1187. fpu_disabled_exception (SD, CPU, cia);
  1188. else
  1189. fpu_unimp_exception (SD, CPU, cia);
  1190. }
  1191. // 1111 1011 1101 0100 fm.- ---- fn.- X-Z-; fsqrt FDm,FDn
  1192. 8.0xfb+8.0xd4+3.fm,1.0,4.0+3.fn,1.0,1.X,1.0,1.Z,1.0:D2b:::fsqrt
  1193. "fsqrt"
  1194. *am33_2
  1195. {
  1196. PC = cia;
  1197. if (FPU_DISABLED)
  1198. fpu_disabled_exception (SD, CPU, cia);
  1199. else
  1200. fpu_unimp_exception (SD, CPU, cia);
  1201. }
  1202. // 1111 1001 0101 01YX Sm.. Sn..; fcmp FSm, FSn
  1203. 8.0xf9+4.5,2.1,1.Y,1.X+4.Sm,4.Sn:D1a:::fcmp
  1204. "fcmp"
  1205. *am33_2
  1206. {
  1207. PC = cia;
  1208. if (FPU_DISABLED)
  1209. fpu_disabled_exception (SD, CPU, cia);
  1210. else
  1211. fpu_cmp (SD, CPU, cia, &XS2FS (X,Sn), &XS2FS (Y,Sm), FP_SINGLE);
  1212. }
  1213. // 1111 1001 1101 01YX fm.- fn.-; fcmp FDm, FDn
  1214. 8.0xf9+4.0xd,2.1,1.Y,1.X+3.fm,1.0,3.fn,1.0:D1b:::fcmp
  1215. "fcmp"
  1216. *am33_2
  1217. {
  1218. PC = cia;
  1219. if (FPU_DISABLED)
  1220. fpu_disabled_exception (SD, CPU, cia);
  1221. else
  1222. fpu_unimp_exception (SD, CPU, cia);
  1223. }
  1224. // 1111 1110 0011 01Y1 Sm.. ---- IMM32; fcmp imm32, FSm
  1225. 8.0xfe+4.3,2.1,1.Y,1.1+4.Sm,4.0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::fcmp
  1226. "fcmp"
  1227. *am33_2
  1228. {
  1229. PC = cia;
  1230. if (FPU_DISABLED)
  1231. fpu_disabled_exception (SD, CPU, cia);
  1232. else
  1233. {
  1234. uint32_t imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
  1235. fpu_cmp (SD, CPU, cia, &XS2FS (Y,Sm), &imm, FP_SINGLE);
  1236. }
  1237. }
  1238. // 1111 1001 0110 00YX Sm.. Sn..; fadd FSm, FSn
  1239. 8.0xf9+4.6,2.0,1.Y,1.X+4.Sm,4.Sn:D1a:::fadd
  1240. "fadd"
  1241. *am33_2
  1242. {
  1243. PC = cia;
  1244. if (FPU_DISABLED)
  1245. fpu_disabled_exception (SD, CPU, cia);
  1246. else
  1247. fpu_add (SD, CPU, cia,
  1248. &XS2FS (Y,Sm), &XS2FS (X,Sn), &XS2FS (X,Sn), FP_SINGLE);
  1249. }
  1250. // 1111 1001 1110 00YX fm.- fn.-; fadd FDm, FDn
  1251. 8.0xf9+4.0xe,2.0,1.Y,1.X+3.fm,1.0,3.fn,1.0:D1b:::fadd
  1252. "fadd"
  1253. *am33_2
  1254. {
  1255. PC = cia;
  1256. if (FPU_DISABLED)
  1257. fpu_disabled_exception (SD, CPU, cia);
  1258. else
  1259. fpu_unimp_exception (SD, CPU, cia);
  1260. }
  1261. // 1111 1011 0110 0000 Sm1. Sm2. Sn.. XYZ-; fadd FSm1, FSm2, FSn
  1262. 8.0xfb+8.0x60+4.Sm1,4.Sm2+4.Sn,1.X,1.Y,1.Z,1.0:D2a:::fadd
  1263. "fadd"
  1264. *am33_2
  1265. {
  1266. PC = cia;
  1267. if (FPU_DISABLED)
  1268. fpu_disabled_exception (SD, CPU, cia);
  1269. else
  1270. fpu_add (SD, CPU, cia,
  1271. &XS2FS (X,Sm1), &XS2FS (Y,Sm2), &XS2FS (Z,Sn), FP_SINGLE);
  1272. }
  1273. // 1111 1011 1110 0000 fm1- fm2- fn.- XYZ-; fadd FDm1, FDm2, FDn
  1274. 8.0xfb+8.0xe0+3.fm1,1.0,3.fm2,1.0+3.fn,1.0,1.X,1.Y,1.Z,1.0:D2b:::fadd
  1275. "fadd"
  1276. *am33_2
  1277. {
  1278. PC = cia;
  1279. if (FPU_DISABLED)
  1280. fpu_disabled_exception (SD, CPU, cia);
  1281. else
  1282. fpu_unimp_exception (SD, CPU, cia);
  1283. }
  1284. // 1111 1110 0110 00YX Sm.. Sn.. IMM32; fadd imm32, FSm, FSn
  1285. 8.0xfe+4.6,2.0,1.Y,1.X+4.Sm,4.Sn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::fadd
  1286. "fadd"
  1287. *am33_2
  1288. {
  1289. PC = cia;
  1290. if (FPU_DISABLED)
  1291. fpu_disabled_exception (SD, CPU, cia);
  1292. else
  1293. {
  1294. uint32_t imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
  1295. fpu_add (SD, CPU, cia,
  1296. &XS2FS (Y,Sm), &imm, &XS2FS (X,Sn), FP_SINGLE);
  1297. }
  1298. }
  1299. // 1111 1001 0110 01YX Sm.. Sn..; fsub FSm, FSn
  1300. 8.0xf9+4.6,2.1,1.Y,1.X+4.Sm,4.Sn:D1a:::fsub
  1301. "fsub"
  1302. *am33_2
  1303. {
  1304. PC = cia;
  1305. if (FPU_DISABLED)
  1306. fpu_disabled_exception (SD, CPU, cia);
  1307. else
  1308. fpu_sub (SD, CPU, cia,
  1309. &XS2FS (X,Sn), &XS2FS (Y,Sm), &XS2FS (X,Sn), FP_SINGLE);
  1310. }
  1311. // 1111 1001 1110 01YX fm.- fn.-; fsub FDm, FDn
  1312. 8.0xf9+4.0xe,2.1,1.Y,1.X+3.fm,1.0,3.fn,1.0:D1b:::fsub
  1313. "fsub"
  1314. *am33_2
  1315. {
  1316. PC = cia;
  1317. if (FPU_DISABLED)
  1318. fpu_disabled_exception (SD, CPU, cia);
  1319. else
  1320. fpu_unimp_exception (SD, CPU, cia);
  1321. }
  1322. // 1111 1011 0110 0100 Sm1. Sm2. Sn.. XYZ-; fsub FSm1, FSm2, FSn
  1323. 8.0xfb+8.0x64+4.Sm1,4.Sm2+4.Sn,1.X,1.Y,1.Z,1.0:D2a:::fsub
  1324. "fsub"
  1325. *am33_2
  1326. {
  1327. PC = cia;
  1328. if (FPU_DISABLED)
  1329. fpu_disabled_exception (SD, CPU, cia);
  1330. else
  1331. fpu_sub (SD, CPU, cia,
  1332. &XS2FS (Y,Sm2), &XS2FS (X,Sm1), &XS2FS (Z,Sn), FP_SINGLE);
  1333. }
  1334. // 1111 1011 1110 0100 fm1- fm2- fn.- XYZ-; fsub FDm1, FDm2, FDn
  1335. 8.0xfb+8.0xe4+3.fm1,1.0,3.fm2,1.0+3.fn,1.0,1.X,1.Y,1.Z,1.0:D2b:::fsub
  1336. "fsub"
  1337. *am33_2
  1338. {
  1339. PC = cia;
  1340. if (FPU_DISABLED)
  1341. fpu_disabled_exception (SD, CPU, cia);
  1342. else
  1343. fpu_unimp_exception (SD, CPU, cia);
  1344. }
  1345. // 1111 1110 0110 01YX Sm.. Sn.. IMM32; fsub imm32, FSm, FSn
  1346. 8.0xfe+4.6,2.1,1.Y,1.X+4.Sm,4.Sn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::fsub
  1347. "fsub"
  1348. *am33_2
  1349. {
  1350. PC = cia;
  1351. if (FPU_DISABLED)
  1352. fpu_disabled_exception (SD, CPU, cia);
  1353. else
  1354. {
  1355. uint32_t imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
  1356. fpu_sub (SD, CPU, cia,
  1357. &XS2FS (Y,Sm), &imm, &XS2FS (X,Sn), FP_SINGLE);
  1358. }
  1359. }
  1360. // 1111 1001 0111 00YX Sm.. Sn..; fmul FSm, FSn
  1361. 8.0xf9+4.7,2.0,1.Y,1.X+4.Sm,4.Sn:D1a:::fmul
  1362. "fmul"
  1363. *am33_2
  1364. {
  1365. PC = cia;
  1366. if (FPU_DISABLED)
  1367. fpu_disabled_exception (SD, CPU, cia);
  1368. else
  1369. fpu_mul (SD, CPU, cia,
  1370. &XS2FS (Y,Sm), &XS2FS (X,Sn), &XS2FS (X,Sn), FP_SINGLE);
  1371. }
  1372. // 1111 1001 1111 00YX fm.- fn.-; fmul FDm, FDn
  1373. 8.0xf9+4.0xf,2.0,1.Y,1.X+3.fm,1.0,3.fn,1.0:D1b:::fmul
  1374. "fmul"
  1375. *am33_2
  1376. {
  1377. PC = cia;
  1378. if (FPU_DISABLED)
  1379. fpu_disabled_exception (SD, CPU, cia);
  1380. else
  1381. fpu_unimp_exception (SD, CPU, cia);
  1382. }
  1383. // 1111 1011 0111 0000 Sm1. Sm2. Sn.. XYZ-; fmul FSm1, FSm2, FSn
  1384. 8.0xfb+8.0x70+4.Sm1,4.Sm2+4.Sn,1.X,1.Y,1.Z,1.0:D2a:::fmul
  1385. "fmul"
  1386. *am33_2
  1387. {
  1388. PC = cia;
  1389. if (FPU_DISABLED)
  1390. fpu_disabled_exception (SD, CPU, cia);
  1391. else
  1392. fpu_mul (SD, CPU, cia,
  1393. &XS2FS (X,Sm1), &XS2FS (Y,Sm2), &XS2FS (Z,Sn), FP_SINGLE);
  1394. }
  1395. // 1111 1011 1111 0000 fm1- fm2- fn.- XYZ-; fmul FDm1, FDm2, FDn
  1396. 8.0xfb+8.0xf0+3.fm1,1.0,3.fm2,1.0+3.fn,1.0,1.X,1.Y,1.Z,1.0:D2b:::fmul
  1397. "fmul"
  1398. *am33_2
  1399. {
  1400. PC = cia;
  1401. if (FPU_DISABLED)
  1402. fpu_disabled_exception (SD, CPU, cia);
  1403. else
  1404. fpu_unimp_exception (SD, CPU, cia);
  1405. }
  1406. // 1111 1110 0111 00YX Sm.. Sn.. IMM32; fmul imm32, FSm, FSn
  1407. 8.0xfe+4.7,2.0,1.Y,1.X+4.Sm,4.Sn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::fmul
  1408. "fmul"
  1409. *am33_2
  1410. {
  1411. PC = cia;
  1412. if (FPU_DISABLED)
  1413. fpu_disabled_exception (SD, CPU, cia);
  1414. else
  1415. {
  1416. uint32_t imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
  1417. fpu_mul (SD, CPU, cia,
  1418. &imm, &XS2FS (Y,Sm), &XS2FS (X,Sn), FP_SINGLE);
  1419. }
  1420. }
  1421. // 1111 1001 0111 01YX Sm.. Sn..; fdiv FSm, FSn
  1422. 8.0xf9+4.7,2.1,1.Y,1.X+4.Sm,4.Sn:D1a:::fdiv
  1423. "fdiv"
  1424. *am33_2
  1425. {
  1426. PC = cia;
  1427. if (FPU_DISABLED)
  1428. fpu_disabled_exception (SD, CPU, cia);
  1429. else
  1430. fpu_div (SD, CPU, cia,
  1431. &XS2FS (X,Sn), &XS2FS (Y,Sm), &XS2FS (X,Sn), FP_SINGLE);
  1432. }
  1433. // 1111 1001 1111 01YX fm.- fn.-; fdiv FDm, FDn
  1434. 8.0xf9+4.0xf,2.1,1.Y,1.X+3.fm,1.0,3.fn,1.0:D1b:::fdiv
  1435. "fdiv"
  1436. *am33_2
  1437. {
  1438. PC = cia;
  1439. if (FPU_DISABLED)
  1440. fpu_disabled_exception (SD, CPU, cia);
  1441. else
  1442. fpu_unimp_exception (SD, CPU, cia);
  1443. }
  1444. // 1111 1011 0111 0100 Sm1. Sm2. Sn.. XYZ-; fdiv FSm1, FSm2, FSn
  1445. 8.0xfb+8.0x74+4.Sm1,4.Sm2+4.Sn,1.X,1.Y,1.Z,1.0:D2a:::fdiv
  1446. "fdiv"
  1447. *am33_2
  1448. {
  1449. PC = cia;
  1450. if (FPU_DISABLED)
  1451. fpu_disabled_exception (SD, CPU, cia);
  1452. else
  1453. fpu_div (SD, CPU, cia,
  1454. &XS2FS (Y,Sm2), &XS2FS (X,Sm1), &XS2FS (Z,Sn), FP_SINGLE);
  1455. }
  1456. // 1111 1011 1111 0100 fm1- fm2- fn.- XYZ-; fdiv FDm1, FDm2, FDn
  1457. 8.0xfb+8.0xf4+3.fm1,1.0,3.fm2,1.0+3.fn,1.0,1.X,1.Y,1.Z,1.0:D2b:::fdiv
  1458. "fdiv"
  1459. *am33_2
  1460. {
  1461. PC = cia;
  1462. if (FPU_DISABLED)
  1463. fpu_disabled_exception (SD, CPU, cia);
  1464. else
  1465. fpu_unimp_exception (SD, CPU, cia);
  1466. }
  1467. // 1111 1110 0111 01YX Sm.. Sn.. IMM32; fdiv imm32, FSm, FSn
  1468. 8.0xfe+4.7,2.1,1.Y,1.X+4.Sm,4.Sn+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::fdiv
  1469. "fdiv"
  1470. *am33_2
  1471. {
  1472. PC = cia;
  1473. if (FPU_DISABLED)
  1474. fpu_disabled_exception (SD, CPU, cia);
  1475. else
  1476. {
  1477. uint32_t imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
  1478. fpu_div (SD, CPU, cia,
  1479. &XS2FS (Y,Sm), &imm, &XS2FS (X,Sn), FP_SINGLE);
  1480. }
  1481. }
  1482. // 1111 1011 1000 00Sn Sm1. Sm2. Sm3. XYZA; fmadd FSm1, FSm2, FSm3, FSn
  1483. 8.0xfb+4.8,2.0,2.Sn+4.Sm1,4.Sm2+4.Sm3,1.X,1.Y,1.Z,1.A:D2:::fmadd
  1484. "fmadd"
  1485. *am33_2
  1486. {
  1487. PC = cia;
  1488. if (FPU_DISABLED)
  1489. fpu_disabled_exception (SD, CPU, cia);
  1490. else
  1491. fpu_fmadd (SD, CPU, cia,
  1492. &XS2FS (X,Sm1), &XS2FS (Y,Sm2), &XS2FS (Z,Sm3),
  1493. &AS2FS (A,Sn), FP_SINGLE);
  1494. }
  1495. // 1111 1011 1000 01Sn Sm1. Sm2. Sm3. XYZA; fmsub FSm1, FSm2, FSm3, FSn
  1496. 8.0xfb+4.8,2.1,2.Sn+4.Sm1,4.Sm2+4.Sm3,1.X,1.Y,1.Z,1.A:D2:::fmsub
  1497. "fmsub"
  1498. *am33_2
  1499. {
  1500. PC = cia;
  1501. if (FPU_DISABLED)
  1502. fpu_disabled_exception (SD, CPU, cia);
  1503. else
  1504. fpu_fmsub (SD, CPU, cia,
  1505. &XS2FS (X,Sm1), &XS2FS (Y,Sm2), &XS2FS (Z,Sm3),
  1506. &AS2FS (A,Sn), FP_SINGLE);
  1507. }
  1508. // 1111 1011 1001 00Sn Sm1. Sm2. Sm3. XYZA; fnmadd FSm1, FSm2, FSm3, FSn
  1509. 8.0xfb+4.9,2.0,2.Sn+4.Sm1,4.Sm2+4.Sm3,1.X,1.Y,1.Z,1.A:D2:::fnmadd
  1510. "fnmadd"
  1511. *am33_2
  1512. {
  1513. PC = cia;
  1514. if (FPU_DISABLED)
  1515. fpu_disabled_exception (SD, CPU, cia);
  1516. else
  1517. fpu_fnmadd (SD, CPU, cia,
  1518. &XS2FS (X,Sm1), &XS2FS (Y,Sm2), &XS2FS (Z,Sm3),
  1519. &AS2FS (A,Sn), FP_SINGLE);
  1520. }
  1521. // 1111 1011 1001 01Sn Sm1. Sm2. Sm3. XYZA; fnmsub FSm1, FSm2, FSm3, FSn
  1522. 8.0xfb+4.9,2.1,2.Sn+4.Sm1,4.Sm2+4.Sm3,1.X,1.Y,1.Z,1.A:D2:::fnmsub
  1523. "fnmsub"
  1524. *am33_2
  1525. {
  1526. PC = cia;
  1527. if (FPU_DISABLED)
  1528. fpu_disabled_exception (SD, CPU, cia);
  1529. else
  1530. fpu_fnmsub (SD, CPU, cia,
  1531. &XS2FS (X,Sm1), &XS2FS (Y,Sm2), &XS2FS (Z,Sm3),
  1532. &AS2FS (A,Sn), FP_SINGLE);
  1533. }
  1534. // conversion:
  1535. // 1111 1011 0100 0000 Sm.. ---- Sn.. X-Z-; ftoi FSm,FSn
  1536. 8.0xfb+8.0x40+4.Sm,4.0+4.Sn,1.X,1.0,1.Z,1.0:D2:::ftoi
  1537. "ftoi"
  1538. *am33_2
  1539. {
  1540. PC = cia;
  1541. if (FPU_DISABLED)
  1542. fpu_disabled_exception (SD, CPU, cia);
  1543. else
  1544. fpu_unimp_exception (SD, CPU, cia);
  1545. }
  1546. // 1111 1011 0100 0010 Sm.. ---- Sn.. X-Z-; itof FSm,FSn
  1547. 8.0xfb+8.0x42+4.Sm,4.0+4.Sn,1.X,1.0,1.Z,1.0:D2:::itof
  1548. "itof"
  1549. *am33_2
  1550. {
  1551. PC = cia;
  1552. if (FPU_DISABLED)
  1553. fpu_disabled_exception (SD, CPU, cia);
  1554. else
  1555. fpu_unimp_exception (SD, CPU, cia);
  1556. }
  1557. // 1111 1011 0101 0010 Sm.. ---- fn.- X-Z-; ftod FSm,FDn
  1558. 8.0xfb+8.0x52+4.Sm,4.0+3.fn,1.0,1.X,1.0,1.Z,1.0:D2:::ftod
  1559. "ftod"
  1560. *am33_2
  1561. {
  1562. PC = cia;
  1563. if (FPU_DISABLED)
  1564. fpu_disabled_exception (SD, CPU, cia);
  1565. else
  1566. fpu_unimp_exception (SD, CPU, cia);
  1567. }
  1568. // 1111 1011 0101 0110 fm.- ---- Sn.. X-Z-; dtof FDm,FSn
  1569. 8.0xfb+8.0x56+3.fm,1.0,4.0+4.Sn,1.X,1.0,1.Z,1.0:D2:::dtof
  1570. "dtof"
  1571. *am33_2
  1572. {
  1573. PC = cia;
  1574. if (FPU_DISABLED)
  1575. fpu_disabled_exception (SD, CPU, cia);
  1576. else
  1577. fpu_unimp_exception (SD, CPU, cia);
  1578. }
  1579. // branching:
  1580. // 1111 1000 1101 0000 d8; fbeq (d8,PC) (d8 is sign-extended)
  1581. 8.0xf8+8.0xd0+8.D8:D1:::fbeq
  1582. "fbeq"
  1583. *am33_2
  1584. {
  1585. PC = cia;
  1586. if (FPU_DISABLED)
  1587. fpu_disabled_exception (SD, CPU, cia);
  1588. else if ((FPCR & FCC_E))
  1589. {
  1590. State.regs[REG_PC] += EXTEND8 (D8);
  1591. nia = PC;
  1592. }
  1593. }
  1594. // 1111 1000 1101 0001 d8; fbne (d8,PC) (d8 is sign-extended)
  1595. 8.0xf8+8.0xd1+8.D8:D1:::fbne
  1596. "fbne"
  1597. *am33_2
  1598. {
  1599. PC = cia;
  1600. if (FPU_DISABLED)
  1601. fpu_disabled_exception (SD, CPU, cia);
  1602. else if ((FPCR & (FCC_U | FCC_L | FCC_G)))
  1603. {
  1604. State.regs[REG_PC] += EXTEND8 (D8);
  1605. nia = PC;
  1606. }
  1607. }
  1608. // 1111 1000 1101 0010 d8; fbgt (d8,PC) (d8 is sign-extended)
  1609. 8.0xf8+8.0xd2+8.D8:D1:::fbgt
  1610. "fbgt"
  1611. *am33_2
  1612. {
  1613. PC = cia;
  1614. if (FPU_DISABLED)
  1615. fpu_disabled_exception (SD, CPU, cia);
  1616. else if ((FPCR & FCC_G))
  1617. {
  1618. State.regs[REG_PC] += EXTEND8 (D8);
  1619. nia = PC;
  1620. }
  1621. }
  1622. // 1111 1000 1101 0011 d8; fbge (d8,PC) (d8 is sign-extended)
  1623. 8.0xf8+8.0xd3+8.D8:D1:::fbge
  1624. "fbge"
  1625. *am33_2
  1626. {
  1627. PC = cia;
  1628. if (FPU_DISABLED)
  1629. fpu_disabled_exception (SD, CPU, cia);
  1630. else if ((FPCR & (FCC_G | FCC_E)))
  1631. {
  1632. State.regs[REG_PC] += EXTEND8 (D8);
  1633. nia = PC;
  1634. }
  1635. }
  1636. // 1111 1000 1101 0100 d8; fblt (d8,PC) (d8 is sign-extended)
  1637. 8.0xf8+8.0xd4+8.D8:D1:::fblt
  1638. "fblt"
  1639. *am33_2
  1640. {
  1641. PC = cia;
  1642. if (FPU_DISABLED)
  1643. fpu_disabled_exception (SD, CPU, cia);
  1644. else if ((FPCR & FCC_L))
  1645. {
  1646. State.regs[REG_PC] += EXTEND8 (D8);
  1647. nia = PC;
  1648. }
  1649. }
  1650. // 1111 1000 1101 0101 d8; fble (d8,PC) (d8 is sign-extended)
  1651. 8.0xf8+8.0xd5+8.D8:D1:::fble
  1652. "fble"
  1653. *am33_2
  1654. {
  1655. PC = cia;
  1656. if (FPU_DISABLED)
  1657. fpu_disabled_exception (SD, CPU, cia);
  1658. else if ((FPCR & (FCC_L | FCC_E)))
  1659. {
  1660. State.regs[REG_PC] += EXTEND8 (D8);
  1661. nia = PC;
  1662. }
  1663. }
  1664. // 1111 1000 1101 0110 d8; fbuo (d8,PC) (d8 is sign-extended)
  1665. 8.0xf8+8.0xd6+8.D8:D1:::fbuo
  1666. "fbuo"
  1667. *am33_2
  1668. {
  1669. PC = cia;
  1670. if (FPU_DISABLED)
  1671. fpu_disabled_exception (SD, CPU, cia);
  1672. else if ((FPCR & FCC_U))
  1673. {
  1674. State.regs[REG_PC] += EXTEND8 (D8);
  1675. nia = PC;
  1676. }
  1677. }
  1678. // 1111 1000 1101 0111 d8; fblg (d8,PC) (d8 is sign-extended)
  1679. 8.0xf8+8.0xd7+8.D8:D1:::fblg
  1680. "fblg"
  1681. *am33_2
  1682. {
  1683. PC = cia;
  1684. if (FPU_DISABLED)
  1685. fpu_disabled_exception (SD, CPU, cia);
  1686. else if ((FPCR & (FCC_L | FCC_G)))
  1687. {
  1688. State.regs[REG_PC] += EXTEND8 (D8);
  1689. nia = PC;
  1690. }
  1691. }
  1692. // 1111 1000 1101 1000 d8; fbleg (d8,PC) (d8 is sign-extended)
  1693. 8.0xf8+8.0xd8+8.D8:D1:::fbleg
  1694. "fbleg"
  1695. *am33_2
  1696. {
  1697. PC = cia;
  1698. if (FPU_DISABLED)
  1699. fpu_disabled_exception (SD, CPU, cia);
  1700. else if ((FPCR & (FCC_L | FCC_E | FCC_G)))
  1701. {
  1702. State.regs[REG_PC] += EXTEND8 (D8);
  1703. nia = PC;
  1704. }
  1705. }
  1706. // 1111 1000 1101 1001 d8; fbug (d8,PC) (d8 is sign-extended)
  1707. 8.0xf8+8.0xd9+8.D8:D1:::fbug
  1708. "fbug"
  1709. *am33_2
  1710. {
  1711. PC = cia;
  1712. if (FPU_DISABLED)
  1713. fpu_disabled_exception (SD, CPU, cia);
  1714. else if ((FPCR & (FCC_U | FCC_G)))
  1715. {
  1716. State.regs[REG_PC] += EXTEND8 (D8);
  1717. nia = PC;
  1718. }
  1719. }
  1720. // 1111 1000 1101 1010 d8; fbuge (d8,PC) (d8 is sign-extended)
  1721. 8.0xf8+8.0xda+8.D8:D1:::fbuge
  1722. "fbuge"
  1723. *am33_2
  1724. {
  1725. PC = cia;
  1726. if (FPU_DISABLED)
  1727. fpu_disabled_exception (SD, CPU, cia);
  1728. else if ((FPCR & (FCC_U | FCC_G | FCC_E)))
  1729. {
  1730. State.regs[REG_PC] += EXTEND8 (D8);
  1731. nia = PC;
  1732. }
  1733. }
  1734. // 1111 1000 1101 1011 d8; fbul (d8,PC) (d8 is sign-extended)
  1735. 8.0xf8+8.0xdb+8.D8:D1:::fbul
  1736. "fbul"
  1737. *am33_2
  1738. {
  1739. PC = cia;
  1740. if (FPU_DISABLED)
  1741. fpu_disabled_exception (SD, CPU, cia);
  1742. else if ((FPCR & (FCC_U | FCC_L)))
  1743. {
  1744. State.regs[REG_PC] += EXTEND8 (D8);
  1745. nia = PC;
  1746. }
  1747. }
  1748. // 1111 1000 1101 1100 d8; fbule (d8,PC) (d8 is sign-extended)
  1749. 8.0xf8+8.0xdc+8.D8:D1:::fbule
  1750. "fbule"
  1751. *am33_2
  1752. {
  1753. PC = cia;
  1754. if (FPU_DISABLED)
  1755. fpu_disabled_exception (SD, CPU, cia);
  1756. else if ((FPCR & (FCC_U | FCC_L | FCC_E)))
  1757. {
  1758. State.regs[REG_PC] += EXTEND8 (D8);
  1759. nia = PC;
  1760. }
  1761. }
  1762. // 1111 1000 1101 1101 d8; fbue (d8,PC) (d8 is sign-extended)
  1763. 8.0xf8+8.0xdd+8.D8:D1:::fbue
  1764. "fbue"
  1765. *am33_2
  1766. {
  1767. PC = cia;
  1768. if (FPU_DISABLED)
  1769. fpu_disabled_exception (SD, CPU, cia);
  1770. else if ((FPCR & (FCC_U | FCC_E)))
  1771. {
  1772. State.regs[REG_PC] += EXTEND8 (D8);
  1773. nia = PC;
  1774. }
  1775. }
  1776. // 1111 0000 1101 0000; fleq
  1777. 8.0xf0+8.0xd0:D0:::fleq
  1778. "fleq"
  1779. *am33_2
  1780. {
  1781. PC = cia;
  1782. if (FPU_DISABLED)
  1783. fpu_disabled_exception (SD, CPU, cia);
  1784. else if ((FPCR & FCC_E))
  1785. {
  1786. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1787. nia = PC;
  1788. }
  1789. }
  1790. // 1111 0000 1101 0001; flne
  1791. 8.0xf0+8.0xd1:D0:::flne
  1792. "flne"
  1793. *am33_2
  1794. {
  1795. PC = cia;
  1796. if (FPU_DISABLED)
  1797. fpu_disabled_exception (SD, CPU, cia);
  1798. else if ((FPCR & (FCC_U | FCC_L | FCC_G)))
  1799. {
  1800. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1801. nia = PC;
  1802. }
  1803. }
  1804. // 1111 0000 1101 0010; flgt
  1805. 8.0xf0+8.0xd2:D0:::flgt
  1806. "flgt"
  1807. *am33_2
  1808. {
  1809. PC = cia;
  1810. if (FPU_DISABLED)
  1811. fpu_disabled_exception (SD, CPU, cia);
  1812. else if ((FPCR & FCC_G))
  1813. {
  1814. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1815. nia = PC;
  1816. }
  1817. }
  1818. // 1111 0000 1101 0011; flge
  1819. 8.0xf0+8.0xd3:D0:::flge
  1820. "flge"
  1821. *am33_2
  1822. {
  1823. PC = cia;
  1824. if (FPU_DISABLED)
  1825. fpu_disabled_exception (SD, CPU, cia);
  1826. else if ((FPCR & (FCC_G | FCC_E)))
  1827. {
  1828. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1829. nia = PC;
  1830. }
  1831. }
  1832. // 1111 0000 1101 0100; fllt
  1833. 8.0xf0+8.0xd4:D0:::fllt
  1834. "fllt"
  1835. *am33_2
  1836. {
  1837. PC = cia;
  1838. if (FPU_DISABLED)
  1839. fpu_disabled_exception (SD, CPU, cia);
  1840. else if ((FPCR & FCC_L))
  1841. {
  1842. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1843. nia = PC;
  1844. }
  1845. }
  1846. // 1111 0000 1101 0101; flle
  1847. 8.0xf0+8.0xd5:D0:::flle
  1848. "flle"
  1849. *am33_2
  1850. {
  1851. PC = cia;
  1852. if (FPU_DISABLED)
  1853. fpu_disabled_exception (SD, CPU, cia);
  1854. else if ((FPCR & (FCC_L | FCC_E)))
  1855. {
  1856. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1857. nia = PC;
  1858. }
  1859. }
  1860. // 1111 0000 1101 0110; fluo
  1861. 8.0xf0+8.0xd6:D0:::fluo
  1862. "fluo"
  1863. *am33_2
  1864. {
  1865. PC = cia;
  1866. if (FPU_DISABLED)
  1867. fpu_disabled_exception (SD, CPU, cia);
  1868. else if ((FPCR & FCC_U))
  1869. {
  1870. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1871. nia = PC;
  1872. }
  1873. }
  1874. // 1111 0000 1101 0111; fllg
  1875. 8.0xf0+8.0xd7:D0:::fllg
  1876. "fllg"
  1877. *am33_2
  1878. {
  1879. PC = cia;
  1880. if (FPU_DISABLED)
  1881. fpu_disabled_exception (SD, CPU, cia);
  1882. else if ((FPCR & (FCC_L | FCC_G)))
  1883. {
  1884. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1885. nia = PC;
  1886. }
  1887. }
  1888. // 1111 0000 1101 1000; flleg
  1889. 8.0xf0+8.0xd8:D0:::flleg
  1890. "flleg"
  1891. *am33_2
  1892. {
  1893. PC = cia;
  1894. if (FPU_DISABLED)
  1895. fpu_disabled_exception (SD, CPU, cia);
  1896. else if ((FPCR & (FCC_L | FCC_E | FCC_G)))
  1897. {
  1898. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1899. nia = PC;
  1900. }
  1901. }
  1902. // 1111 0000 1101 1001; flug
  1903. 8.0xf0+8.0xd9:D0:::flug
  1904. "flug"
  1905. *am33_2
  1906. {
  1907. PC = cia;
  1908. if (FPU_DISABLED)
  1909. fpu_disabled_exception (SD, CPU, cia);
  1910. else if ((FPCR & (FCC_U | FCC_G)))
  1911. {
  1912. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1913. nia = PC;
  1914. }
  1915. }
  1916. // 1111 0000 1101 1010; fluge
  1917. 8.0xf0+8.0xda:D0:::fluge
  1918. "fluge"
  1919. *am33_2
  1920. {
  1921. PC = cia;
  1922. if (FPU_DISABLED)
  1923. fpu_disabled_exception (SD, CPU, cia);
  1924. else if ((FPCR & (FCC_U | FCC_G | FCC_E)))
  1925. {
  1926. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1927. nia = PC;
  1928. }
  1929. }
  1930. // 1111 0000 1101 1011; flul
  1931. 8.0xf0+8.0xdb:D0:::flul
  1932. "flul"
  1933. *am33_2
  1934. {
  1935. PC = cia;
  1936. if (FPU_DISABLED)
  1937. fpu_disabled_exception (SD, CPU, cia);
  1938. else if ((FPCR & (FCC_U | FCC_L)))
  1939. {
  1940. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1941. nia = PC;
  1942. }
  1943. }
  1944. // 1111 0000 1101 1100; flule
  1945. 8.0xf0+8.0xdc:D0:::flule
  1946. "flule"
  1947. *am33_2
  1948. {
  1949. PC = cia;
  1950. if (FPU_DISABLED)
  1951. fpu_disabled_exception (SD, CPU, cia);
  1952. else if ((FPCR & (FCC_U | FCC_L | FCC_E)))
  1953. {
  1954. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1955. nia = PC;
  1956. }
  1957. }
  1958. // 1111 0000 1101 1101; flue
  1959. 8.0xf0+8.0xdd:D0:::flue
  1960. "flue"
  1961. *am33_2
  1962. {
  1963. PC = cia;
  1964. if (FPU_DISABLED)
  1965. fpu_disabled_exception (SD, CPU, cia);
  1966. else if ((FPCR & (FCC_U | FCC_E)))
  1967. {
  1968. State.regs[REG_PC] = State.regs[REG_LAR] - 4;
  1969. nia = PC;
  1970. }
  1971. }