2
0

armsecond.inc 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. {
  2. Do not edit file manually!
  3. File is created automatically from armintr.dat by mkarminl.
  4. }
  5. in_arm_nop
  6. ,in_arm_yield
  7. ,in_arm_wfi
  8. ,in_arm_wfe
  9. ,in_arm_sev
  10. ,in_arm_clrex
  11. : //
  12. begin
  13. case inlinenumber of
  14. in_arm_clrex: begin op:=A_clrex; pf:=PF_None; end;
  15. in_arm_sev: begin op:=A_sev; pf:=PF_None; end;
  16. in_arm_wfe: begin op:=A_wfe; pf:=PF_None; end;
  17. in_arm_wfi: begin op:=A_wfi; pf:=PF_None; end;
  18. in_arm_yield: begin op:=A_yield; pf:=PF_None; end;
  19. in_arm_nop: begin op:=A_nop; pf:=PF_None; end;
  20. end;
  21. GetParameters(0);
  22. for i := 1 to 0 do secondpass(paraarray[i]);
  23. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_none(op),pf));
  24. end;
  25. in_arm_setend
  26. : //endian:i32;
  27. begin
  28. case inlinenumber of
  29. in_arm_setend: begin op:=A_setend; pf:=PF_None; end;
  30. end;
  31. GetParameters(1);
  32. for i := 1 to 1 do secondpass(paraarray[i]);
  33. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_const(op,GetConstInt(paraarray[1])),pf));
  34. end;
  35. in_arm_ldrex
  36. ,in_arm_ldrexb
  37. ,in_arm_ldrexh
  38. : //out rt:r32;ref:ptr32;
  39. begin
  40. case inlinenumber of
  41. in_arm_ldrexh: begin op:=A_ldrexh; pf:=PF_None; end;
  42. in_arm_ldrexb: begin op:=A_ldrexb; pf:=PF_None; end;
  43. in_arm_ldrex: begin op:=A_ldrex; pf:=PF_None; end;
  44. end;
  45. GetParameters(1);
  46. for i := 1 to 1 do secondpass(paraarray[i]);
  47. location_make_ref(paraarray[1].location);
  48. location_reset(location,LOC_REGISTER,OS_32);
  49. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  50. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_ref(op,location.register,paraarray[1].location.reference),pf));
  51. end;
  52. in_arm_strex
  53. ,in_arm_strexb
  54. ,in_arm_strexh
  55. : //out rd:r32;rt:r32;ref:ptr32;
  56. begin
  57. case inlinenumber of
  58. in_arm_strexh: begin op:=A_strexh; pf:=PF_None; end;
  59. in_arm_strexb: begin op:=A_strexb; pf:=PF_None; end;
  60. in_arm_strex: begin op:=A_strex; pf:=PF_None; end;
  61. end;
  62. GetParameters(2);
  63. for i := 1 to 2 do secondpass(paraarray[i]);
  64. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  65. location_make_ref(paraarray[2].location);
  66. location_reset(location,LOC_REGISTER,OS_32);
  67. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  68. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_ref(op,location.register,paraarray[1].location.register,paraarray[2].location.reference),pf));
  69. end;
  70. in_arm_bfi
  71. : //var rd:r32;rn:r32;lsb:i32;msb:i32;
  72. begin
  73. case inlinenumber of
  74. in_arm_bfi: begin op:=A_bfi; pf:=PF_None; end;
  75. end;
  76. GetParameters(4);
  77. for i := 1 to 4 do secondpass(paraarray[i]);
  78. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,false);
  79. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  80. location:=paraarray[1].location;
  81. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_const_const(op,paraarray[1].location.register,paraarray[2].location.register,GetConstInt(paraarray[3]),GetConstInt(paraarray[4])),pf));
  82. end;
  83. in_arm_bfc
  84. : //var rd:r32;lsb:i32;msb:i32;
  85. begin
  86. case inlinenumber of
  87. in_arm_bfc: begin op:=A_bfc; pf:=PF_None; end;
  88. end;
  89. GetParameters(3);
  90. for i := 1 to 3 do secondpass(paraarray[i]);
  91. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,false);
  92. location:=paraarray[1].location;
  93. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_const_const(op,paraarray[1].location.register,GetConstInt(paraarray[2]),GetConstInt(paraarray[3])),pf));
  94. end;
  95. in_arm_smmul
  96. ,in_arm_smuad
  97. ,in_arm_smuadx
  98. ,in_arm_smulbb
  99. ,in_arm_smulbt
  100. ,in_arm_smultb
  101. ,in_arm_smultt
  102. ,in_arm_smulwb
  103. ,in_arm_smulwt
  104. ,in_arm_smusd
  105. ,in_arm_smusdx
  106. ,in_arm_pkhbt
  107. ,in_arm_pkhtb
  108. : //out rd:r32;rn:r32;rm:r32;
  109. begin
  110. case inlinenumber of
  111. in_arm_pkhtb: begin op:=A_pkhtb; pf:=PF_None; end;
  112. in_arm_pkhbt: begin op:=A_pkhbt; pf:=PF_None; end;
  113. in_arm_smusdx: begin op:=A_smusd; pf:=PF_x; end;
  114. in_arm_smusd: begin op:=A_smusd; pf:=PF_None; end;
  115. in_arm_smulwt: begin op:=A_smulwt; pf:=PF_None; end;
  116. in_arm_smulwb: begin op:=A_smulwb; pf:=PF_None; end;
  117. in_arm_smultt: begin op:=A_smultt; pf:=PF_None; end;
  118. in_arm_smultb: begin op:=A_smultb; pf:=PF_None; end;
  119. in_arm_smulbt: begin op:=A_smulbt; pf:=PF_None; end;
  120. in_arm_smulbb: begin op:=A_smulbb; pf:=PF_None; end;
  121. in_arm_smuadx: begin op:=A_smuad; pf:=PF_x; end;
  122. in_arm_smuad: begin op:=A_smuad; pf:=PF_None; end;
  123. in_arm_smmul: begin op:=A_smmul; pf:=PF_None; end;
  124. end;
  125. GetParameters(2);
  126. for i := 1 to 2 do secondpass(paraarray[i]);
  127. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  128. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  129. location_reset(location,LOC_REGISTER,OS_32);
  130. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  131. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg(op,location.register,paraarray[1].location.register,paraarray[2].location.register),pf));
  132. end;
  133. in_arm_mla
  134. ,in_arm_mls
  135. ,in_arm_smlabb
  136. ,in_arm_smlabt
  137. ,in_arm_smlatb
  138. ,in_arm_smlatt
  139. ,in_arm_smlad
  140. ,in_arm_smladx
  141. ,in_arm_smlawb
  142. ,in_arm_smlawt
  143. ,in_arm_smlsd
  144. ,in_arm_smlsdx
  145. ,in_arm_smmla
  146. ,in_arm_smmlar
  147. ,in_arm_smmls
  148. ,in_arm_smmlsr
  149. ,in_arm_usada8
  150. : //out rd:r32;rn:r32;rm:r32;ra:r32;
  151. begin
  152. case inlinenumber of
  153. in_arm_usada8: begin op:=A_usada8; pf:=PF_None; end;
  154. in_arm_smmlsr: begin op:=A_smmls; pf:=PF_r; end;
  155. in_arm_smmls: begin op:=A_smmls; pf:=PF_None; end;
  156. in_arm_smmlar: begin op:=A_smmla; pf:=PF_r; end;
  157. in_arm_smmla: begin op:=A_smmla; pf:=PF_None; end;
  158. in_arm_smlsdx: begin op:=A_smlsd; pf:=PF_x; end;
  159. in_arm_smlsd: begin op:=A_smlsd; pf:=PF_None; end;
  160. in_arm_smlawt: begin op:=A_smlawt; pf:=PF_None; end;
  161. in_arm_smlawb: begin op:=A_smlawb; pf:=PF_None; end;
  162. in_arm_smladx: begin op:=A_smlad; pf:=PF_x; end;
  163. in_arm_smlad: begin op:=A_smlad; pf:=PF_None; end;
  164. in_arm_smlatt: begin op:=A_smlatt; pf:=PF_None; end;
  165. in_arm_smlatb: begin op:=A_smlatb; pf:=PF_None; end;
  166. in_arm_smlabt: begin op:=A_smlabt; pf:=PF_None; end;
  167. in_arm_smlabb: begin op:=A_smlabb; pf:=PF_None; end;
  168. in_arm_mls: begin op:=A_mls; pf:=PF_None; end;
  169. in_arm_mla: begin op:=A_mla; pf:=PF_None; end;
  170. end;
  171. GetParameters(3);
  172. for i := 1 to 3 do secondpass(paraarray[i]);
  173. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  174. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  175. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[3].location, paraarray[3].resultdef,u32inttype,true);
  176. location_reset(location,LOC_REGISTER,OS_32);
  177. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  178. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg_reg(op,location.register,paraarray[1].location.register,paraarray[2].location.register,paraarray[3].location.register),pf));
  179. end;
  180. in_arm_smull
  181. : //out ro:rs64;rn:r32;rm:r32;
  182. begin
  183. case inlinenumber of
  184. in_arm_smull: begin op:=A_smull; pf:=PF_None; end;
  185. end;
  186. GetParameters(2);
  187. for i := 1 to 2 do secondpass(paraarray[i]);
  188. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  189. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  190. location_reset(location,LOC_REGISTER,OS_S64);
  191. location.register64.reglo:=cg.getintregister(current_asmdata.CurrAsmList, OS_32); location.register64.reghi:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  192. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg_reg(op,location.register64.reglo,location.register64.reghi,paraarray[1].location.register,paraarray[2].location.register),pf));
  193. end;
  194. in_arm_umull
  195. : //out ro:r64;rn:r32;rm:r32;
  196. begin
  197. case inlinenumber of
  198. in_arm_umull: begin op:=A_umull; pf:=PF_None; end;
  199. end;
  200. GetParameters(2);
  201. for i := 1 to 2 do secondpass(paraarray[i]);
  202. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  203. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  204. location_reset(location,LOC_REGISTER,OS_64);
  205. location.register64.reglo:=cg.getintregister(current_asmdata.CurrAsmList, OS_32); location.register64.reghi:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  206. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg_reg(op,location.register64.reglo,location.register64.reghi,paraarray[1].location.register,paraarray[2].location.register),pf));
  207. end;
  208. in_arm_smlal
  209. ,in_arm_smlalbb
  210. ,in_arm_smlalbt
  211. ,in_arm_smlaltb
  212. ,in_arm_smlaltt
  213. ,in_arm_smlald
  214. ,in_arm_smlaldx
  215. ,in_arm_smlsldx
  216. ,in_arm_umlal
  217. : //var rd:r64;rn:r32;rm:r32;
  218. begin
  219. case inlinenumber of
  220. in_arm_umlal: begin op:=A_umlal; pf:=PF_None; end;
  221. in_arm_smlsldx: begin op:=A_smlsld; pf:=PF_x; end;
  222. in_arm_smlaldx: begin op:=A_smlald; pf:=PF_x; end;
  223. in_arm_smlald: begin op:=A_smlald; pf:=PF_None; end;
  224. in_arm_smlaltt: begin op:=A_smlaltt; pf:=PF_None; end;
  225. in_arm_smlaltb: begin op:=A_smlaltb; pf:=PF_None; end;
  226. in_arm_smlalbt: begin op:=A_smlalbt; pf:=PF_None; end;
  227. in_arm_smlalbb: begin op:=A_smlalbb; pf:=PF_None; end;
  228. in_arm_smlal: begin op:=A_smlal; pf:=PF_None; end;
  229. end;
  230. GetParameters(3);
  231. for i := 1 to 3 do secondpass(paraarray[i]);
  232. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u64inttype,false);
  233. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  234. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[3].location, paraarray[3].resultdef,u32inttype,true);
  235. location:=paraarray[1].location;
  236. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg_reg(op,paraarray[1].location.register64.reglo,paraarray[1].location.register64.reghi,paraarray[2].location.register,paraarray[3].location.register),pf));
  237. end;
  238. in_arm_umaal
  239. : //out rl-rh:r64;rl:r32;rh:r32;rn:r32;rm:r32;
  240. begin
  241. case inlinenumber of
  242. in_arm_umaal: begin op:=A_umaal; pf:=PF_None; end;
  243. end;
  244. GetParameters(4);
  245. for i := 1 to 4 do secondpass(paraarray[i]);
  246. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  247. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  248. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[3].location, paraarray[3].resultdef,u32inttype,true);
  249. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[4].location, paraarray[4].resultdef,u32inttype,true);
  250. location_reset(location,LOC_REGISTER,OS_64);
  251. location.register64.reglo:=paraarray[1].location.register;
  252. location.register64.reghi:=paraarray[2].location.register;
  253. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg_reg(op,paraarray[1].location.register,paraarray[2].location.register,paraarray[3].location.register,paraarray[4].location.register),pf));
  254. end;
  255. in_arm_pkhbt_shift
  256. : //out rd:r32;rn:r32;rm:r32;ls:lsl5;
  257. begin
  258. case inlinenumber of
  259. in_arm_pkhbt_shift: begin op:=A_pkhbt; pf:=PF_None; end;
  260. end;
  261. GetParameters(3);
  262. for i := 1 to 3 do secondpass(paraarray[i]);
  263. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  264. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  265. location_reset(location,LOC_REGISTER,OS_32);
  266. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  267. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg_shifterop(op,location.register,paraarray[1].location.register,paraarray[2].location.register,GetShifterOp(sm_lsl,paraarray[3])),pf));
  268. end;
  269. in_arm_pkhtb_shift
  270. : //out rd:r32;rn:r32;rm:r32;rs:asr5;
  271. begin
  272. case inlinenumber of
  273. in_arm_pkhtb_shift: begin op:=A_pkhtb; pf:=PF_None; end;
  274. end;
  275. GetParameters(3);
  276. for i := 1 to 3 do secondpass(paraarray[i]);
  277. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  278. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  279. location_reset(location,LOC_REGISTER,OS_32);
  280. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  281. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg_shifterop(op,location.register,paraarray[1].location.register,paraarray[2].location.register,GetShifterOp(sm_asr,paraarray[3])),pf));
  282. end;
  283. in_arm_qadd
  284. ,in_arm_qadd16
  285. ,in_arm_qadd8
  286. ,in_arm_qasx
  287. ,in_arm_qdadd
  288. ,in_arm_qdsub
  289. ,in_arm_qsax
  290. ,in_arm_qsub
  291. ,in_arm_qsub16
  292. ,in_arm_qsub8
  293. ,in_arm_sadd16
  294. ,in_arm_sadd8
  295. ,in_arm_sasx
  296. ,in_arm_shadd16
  297. ,in_arm_shadd8
  298. ,in_arm_shasx
  299. ,in_arm_shsax
  300. ,in_arm_shsub16
  301. ,in_arm_shsub8
  302. ,in_arm_ssax
  303. ,in_arm_ssub16
  304. ,in_arm_ssub8
  305. ,in_arm_uadd16
  306. ,in_arm_uadd8
  307. ,in_arm_uasx
  308. ,in_arm_uhadd16
  309. ,in_arm_uhadd8
  310. ,in_arm_uhasx
  311. ,in_arm_uhsax
  312. ,in_arm_uhsub16
  313. ,in_arm_uhsub8
  314. ,in_arm_uqadd16
  315. ,in_arm_uqadd8
  316. ,in_arm_uqasx
  317. ,in_arm_uqsax
  318. ,in_arm_uqsub16
  319. ,in_arm_uqsub8
  320. ,in_arm_usax
  321. ,in_arm_usub16
  322. ,in_arm_usub8
  323. ,in_arm_usad8
  324. ,in_arm_sxtab
  325. ,in_arm_sxtab16
  326. ,in_arm_sxtah
  327. ,in_arm_uxtab
  328. ,in_arm_uxtab16
  329. ,in_arm_uxtah
  330. : //out rd:r32;rm:r32;rn:r32;
  331. begin
  332. case inlinenumber of
  333. in_arm_uxtah: begin op:=A_uxtah; pf:=PF_None; end;
  334. in_arm_uxtab16: begin op:=A_uxtab16; pf:=PF_None; end;
  335. in_arm_uxtab: begin op:=A_uxtab; pf:=PF_None; end;
  336. in_arm_sxtah: begin op:=A_sxtah; pf:=PF_None; end;
  337. in_arm_sxtab16: begin op:=A_sxtab16; pf:=PF_None; end;
  338. in_arm_sxtab: begin op:=A_sxtab; pf:=PF_None; end;
  339. in_arm_usad8: begin op:=A_usad8; pf:=PF_None; end;
  340. in_arm_usub8: begin op:=A_usub8; pf:=PF_None; end;
  341. in_arm_usub16: begin op:=A_usub16; pf:=PF_None; end;
  342. in_arm_usax: begin op:=A_usax; pf:=PF_None; end;
  343. in_arm_uqsub8: begin op:=A_uqsub8; pf:=PF_None; end;
  344. in_arm_uqsub16: begin op:=A_uqsub16; pf:=PF_None; end;
  345. in_arm_uqsax: begin op:=A_uqsax; pf:=PF_None; end;
  346. in_arm_uqasx: begin op:=A_uqasx; pf:=PF_None; end;
  347. in_arm_uqadd8: begin op:=A_uqadd8; pf:=PF_None; end;
  348. in_arm_uqadd16: begin op:=A_uqadd16; pf:=PF_None; end;
  349. in_arm_uhsub8: begin op:=A_uhsub8; pf:=PF_None; end;
  350. in_arm_uhsub16: begin op:=A_uhsub16; pf:=PF_None; end;
  351. in_arm_uhsax: begin op:=A_uhsax; pf:=PF_None; end;
  352. in_arm_uhasx: begin op:=A_uhasx; pf:=PF_None; end;
  353. in_arm_uhadd8: begin op:=A_uhadd8; pf:=PF_None; end;
  354. in_arm_uhadd16: begin op:=A_uhadd16; pf:=PF_None; end;
  355. in_arm_uasx: begin op:=A_uasx; pf:=PF_None; end;
  356. in_arm_uadd8: begin op:=A_uadd8; pf:=PF_None; end;
  357. in_arm_uadd16: begin op:=A_uadd16; pf:=PF_None; end;
  358. in_arm_ssub8: begin op:=A_ssub8; pf:=PF_None; end;
  359. in_arm_ssub16: begin op:=A_ssub16; pf:=PF_None; end;
  360. in_arm_ssax: begin op:=A_ssax; pf:=PF_None; end;
  361. in_arm_shsub8: begin op:=A_shsub8; pf:=PF_None; end;
  362. in_arm_shsub16: begin op:=A_shsub16; pf:=PF_None; end;
  363. in_arm_shsax: begin op:=A_shsax; pf:=PF_None; end;
  364. in_arm_shasx: begin op:=A_shasx; pf:=PF_None; end;
  365. in_arm_shadd8: begin op:=A_shadd8; pf:=PF_None; end;
  366. in_arm_shadd16: begin op:=A_shadd16; pf:=PF_None; end;
  367. in_arm_sasx: begin op:=A_sasx; pf:=PF_None; end;
  368. in_arm_sadd8: begin op:=A_sadd8; pf:=PF_None; end;
  369. in_arm_sadd16: begin op:=A_sadd16; pf:=PF_None; end;
  370. in_arm_qsub8: begin op:=A_qsub8; pf:=PF_None; end;
  371. in_arm_qsub16: begin op:=A_qsub16; pf:=PF_None; end;
  372. in_arm_qsub: begin op:=A_qsub; pf:=PF_None; end;
  373. in_arm_qsax: begin op:=A_qsax; pf:=PF_None; end;
  374. in_arm_qdsub: begin op:=A_qdsub; pf:=PF_None; end;
  375. in_arm_qdadd: begin op:=A_qdadd; pf:=PF_None; end;
  376. in_arm_qasx: begin op:=A_qasx; pf:=PF_None; end;
  377. in_arm_qadd8: begin op:=A_qadd8; pf:=PF_None; end;
  378. in_arm_qadd16: begin op:=A_qadd16; pf:=PF_None; end;
  379. in_arm_qadd: begin op:=A_qadd; pf:=PF_None; end;
  380. end;
  381. GetParameters(2);
  382. for i := 1 to 2 do secondpass(paraarray[i]);
  383. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  384. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  385. location_reset(location,LOC_REGISTER,OS_32);
  386. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  387. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg(op,location.register,paraarray[1].location.register,paraarray[2].location.register),pf));
  388. end;
  389. in_arm_sxtab_ror
  390. ,in_arm_sxtab16_ror
  391. ,in_arm_sxtah_ror
  392. ,in_arm_uxtab_ror
  393. ,in_arm_uxtab16_ror
  394. ,in_arm_uxtah_ror
  395. : //out rd:r32;rm:r32;rn:r32;ror:ror3;
  396. begin
  397. case inlinenumber of
  398. in_arm_uxtah_ror: begin op:=A_uxtah; pf:=PF_None; end;
  399. in_arm_uxtab16_ror: begin op:=A_uxtab16; pf:=PF_None; end;
  400. in_arm_uxtab_ror: begin op:=A_uxtab; pf:=PF_None; end;
  401. in_arm_sxtah_ror: begin op:=A_sxtah; pf:=PF_None; end;
  402. in_arm_sxtab16_ror: begin op:=A_sxtab16; pf:=PF_None; end;
  403. in_arm_sxtab_ror: begin op:=A_sxtab; pf:=PF_None; end;
  404. end;
  405. GetParameters(3);
  406. for i := 1 to 3 do secondpass(paraarray[i]);
  407. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  408. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  409. location_reset(location,LOC_REGISTER,OS_32);
  410. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  411. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_reg_shifterop(op,location.register,paraarray[1].location.register,paraarray[2].location.register,GetShifterOp(sm_ror,paraarray[3])),pf));
  412. end;
  413. in_arm_sxtb
  414. ,in_arm_sxtb16
  415. ,in_arm_sxth
  416. ,in_arm_uxtb
  417. ,in_arm_uxtb16
  418. ,in_arm_uxth
  419. ,in_arm_clz
  420. ,in_arm_rbit
  421. ,in_arm_rev
  422. ,in_arm_rev16
  423. ,in_arm_revsh
  424. : //out rd:r32;rm:r32;
  425. begin
  426. case inlinenumber of
  427. in_arm_revsh: begin op:=A_revsh; pf:=PF_None; end;
  428. in_arm_rev16: begin op:=A_rev16; pf:=PF_None; end;
  429. in_arm_rev: begin op:=A_rev; pf:=PF_None; end;
  430. in_arm_rbit: begin op:=A_rbit; pf:=PF_None; end;
  431. in_arm_clz: begin op:=A_clz; pf:=PF_None; end;
  432. in_arm_uxth: begin op:=A_uxth; pf:=PF_None; end;
  433. in_arm_uxtb16: begin op:=A_uxtb16; pf:=PF_None; end;
  434. in_arm_uxtb: begin op:=A_uxtb; pf:=PF_None; end;
  435. in_arm_sxth: begin op:=A_sxth; pf:=PF_None; end;
  436. in_arm_sxtb16: begin op:=A_sxtb16; pf:=PF_None; end;
  437. in_arm_sxtb: begin op:=A_sxtb; pf:=PF_None; end;
  438. end;
  439. GetParameters(1);
  440. for i := 1 to 1 do secondpass(paraarray[i]);
  441. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  442. location_reset(location,LOC_REGISTER,OS_32);
  443. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  444. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg(op,location.register,paraarray[1].location.register),pf));
  445. end;
  446. in_arm_sxtb_ror
  447. ,in_arm_sxtb16_ror
  448. ,in_arm_sxth_ror
  449. ,in_arm_uxtb_ror
  450. ,in_arm_uxtb16_ror
  451. ,in_arm_uxth_ror
  452. : //out rd:r32;rm:r32;ror:ror3;
  453. begin
  454. case inlinenumber of
  455. in_arm_uxth_ror: begin op:=A_uxth; pf:=PF_None; end;
  456. in_arm_uxtb16_ror: begin op:=A_uxtb16; pf:=PF_None; end;
  457. in_arm_uxtb_ror: begin op:=A_uxtb; pf:=PF_None; end;
  458. in_arm_sxth_ror: begin op:=A_sxth; pf:=PF_None; end;
  459. in_arm_sxtb16_ror: begin op:=A_sxtb16; pf:=PF_None; end;
  460. in_arm_sxtb_ror: begin op:=A_sxtb; pf:=PF_None; end;
  461. end;
  462. GetParameters(2);
  463. for i := 1 to 2 do secondpass(paraarray[i]);
  464. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  465. location_reset(location,LOC_REGISTER,OS_32);
  466. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  467. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_shifterop(op,location.register,paraarray[1].location.register,GetShifterOp(sm_ror,paraarray[2])),pf));
  468. end;
  469. in_arm_sbfx
  470. ,in_arm_ubfx
  471. : //out rd:r32;rn:r32;lsb:i32;width:i32;
  472. begin
  473. case inlinenumber of
  474. in_arm_ubfx: begin op:=A_ubfx; pf:=PF_None; end;
  475. in_arm_sbfx: begin op:=A_sbfx; pf:=PF_None; end;
  476. end;
  477. GetParameters(3);
  478. for i := 1 to 3 do secondpass(paraarray[i]);
  479. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[1].location, paraarray[1].resultdef,u32inttype,true);
  480. location_reset(location,LOC_REGISTER,OS_32);
  481. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  482. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg_const_const(op,location.register,paraarray[1].location.register,GetConstInt(paraarray[2]),GetConstInt(paraarray[3])),pf));
  483. end;
  484. in_arm_ssat
  485. ,in_arm_usat
  486. ,in_arm_ssat16
  487. ,in_arm_usat16
  488. : //out rd:r32;sat:i32;rn:r32;
  489. begin
  490. case inlinenumber of
  491. in_arm_usat16: begin op:=A_usat16; pf:=PF_None; end;
  492. in_arm_ssat16: begin op:=A_ssat16; pf:=PF_None; end;
  493. in_arm_usat: begin op:=A_usat; pf:=PF_None; end;
  494. in_arm_ssat: begin op:=A_ssat; pf:=PF_None; end;
  495. end;
  496. GetParameters(2);
  497. for i := 1 to 2 do secondpass(paraarray[i]);
  498. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  499. location_reset(location,LOC_REGISTER,OS_32);
  500. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  501. current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_const_reg(op,location.register,GetConstInt(paraarray[1]),paraarray[2].location.register),pf));
  502. end;