armsecond.inc 22 KB

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