x86mmsecond.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. in_x86_movss
  2. ,in_x86_movaps
  3. ,in_x86_movups
  4. : //out r0:xmm;r1:ptr32;
  5. begin
  6. case inlinenumber of
  7. in_x86_movups: begin op:=A_movups end;
  8. in_x86_movaps: begin op:=A_movaps end;
  9. in_x86_movss: begin op:=A_movss; end;
  10. else
  11. Internalerror(2020010201);
  12. end;
  13. GetParameters(1);
  14. for i := 1 to 1 do secondpass(paraarray[i]);
  15. location_make_ref(paraarray[1].location);
  16. location_reset(location,LOC_MMREGISTER,OS_M128);
  17. location.register:=cg.getmmregister(current_asmdata.CurrAsmList, OS_M128);
  18. current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(op,S_NO,paraarray[1].location.reference,location.register));
  19. end;
  20. in_x86_movss_to_mem
  21. ,in_x86_movaps_to_mem
  22. ,in_x86_movups_to_mem
  23. : //r0:ptr32;r1:xmm;
  24. begin
  25. case inlinenumber of
  26. in_x86_movups_to_mem: begin op:=A_movups end;
  27. in_x86_movaps_to_mem: begin op:=A_movaps end;
  28. in_x86_movss_to_mem: begin op:=A_movss; end;
  29. else
  30. Internalerror(2020010201);
  31. end;
  32. GetParameters(2);
  33. for i := 1 to 2 do secondpass(paraarray[i]);
  34. location_make_ref(paraarray[1].location);
  35. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[2].location, true);
  36. current_asmdata.CurrAsmList.concat(taicpu.op_reg_ref(op,S_NO,paraarray[2].location.register,paraarray[1].location.reference));
  37. end;
  38. in_x86_movss_to_val
  39. : //out r0:f32;r1:xmm;
  40. begin
  41. case inlinenumber of
  42. in_x86_movss_to_val: begin op:=A_movss; end;
  43. else
  44. Internalerror(2020010201);
  45. end;
  46. GetParameters(1);
  47. for i := 1 to 1 do secondpass(paraarray[i]);
  48. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, true);
  49. location_reset(location,LOC_MMREGISTER,OS_M128);
  50. location.register:=cg.getmmregister(current_asmdata.CurrAsmList, OS_M128);
  51. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[1].location.register,location.register));
  52. end;
  53. in_x86_movss_from_val
  54. : //out r0:xmm;r1:f32;
  55. begin
  56. case inlinenumber of
  57. in_x86_movss_from_val: begin op:=A_movss; end;
  58. else
  59. Internalerror(2020010201);
  60. end;
  61. GetParameters(1);
  62. for i := 1 to 1 do secondpass(paraarray[i]);
  63. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, true);
  64. location_reset(location,LOC_MMREGISTER,OS_M128);
  65. location.register:=cg.getmmregister(current_asmdata.CurrAsmList, OS_M128);
  66. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[1].location.register,location.register));
  67. end;
  68. in_x86_movlps
  69. ,in_x86_movhps
  70. : //var r0:xmm;r1:ptr32;
  71. begin
  72. case inlinenumber of
  73. in_x86_movhps: begin op:=A_movhps end;
  74. in_x86_movlps: begin op:=A_movlps; end;
  75. else
  76. Internalerror(2020010201);
  77. end;
  78. GetParameters(2);
  79. for i := 1 to 2 do secondpass(paraarray[i]);
  80. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, false);
  81. location_make_ref(paraarray[2].location);
  82. location:=paraarray[1].location;
  83. current_asmdata.CurrAsmList.concat(taicpu.op_ref_reg(op,S_NO,paraarray[2].location.reference,paraarray[1].location.register));
  84. end;
  85. in_x86_movlhps
  86. ,in_x86_movhlps
  87. ,in_x86_addss
  88. ,in_x86_subss
  89. ,in_x86_mulss
  90. ,in_x86_divss
  91. ,in_x86_rcpss
  92. ,in_x86_sqrtss
  93. ,in_x86_maxss
  94. ,in_x86_minss
  95. ,in_x86_rsqrtss
  96. ,in_x86_addps
  97. ,in_x86_subps
  98. ,in_x86_mulps
  99. ,in_x86_divps
  100. ,in_x86_rcpps
  101. ,in_x86_sqrtps
  102. ,in_x86_maxps
  103. ,in_x86_minps
  104. ,in_x86_rsqrtps
  105. ,in_x86_andps
  106. ,in_x86_orps
  107. ,in_x86_xorps
  108. ,in_x86_andnps
  109. ,in_x86_unpckhps
  110. ,in_x86_unpcklps
  111. ,in_x86_pmulhuw
  112. ,in_x86_psadbw
  113. ,in_x86_pavgb
  114. ,in_x86_pavgw
  115. ,in_x86_pmaxub
  116. ,in_x86_pminub
  117. ,in_x86_pmaxsw
  118. ,in_x86_pminsw
  119. : //var r0:xmm;r1:xmm;
  120. begin
  121. case inlinenumber of
  122. in_x86_pminsw: begin op:=A_pminsw end;
  123. in_x86_pmaxsw: begin op:=A_pmaxsw end;
  124. in_x86_pminub: begin op:=A_pminub end;
  125. in_x86_pmaxub: begin op:=A_pmaxub end;
  126. in_x86_pavgw: begin op:=A_pavgw end;
  127. in_x86_pavgb: begin op:=A_pavgb end;
  128. in_x86_psadbw: begin op:=A_psadbw end;
  129. in_x86_pmulhuw: begin op:=A_pmulhuw end;
  130. in_x86_unpcklps: begin op:=A_unpcklps end;
  131. in_x86_unpckhps: begin op:=A_unpckhps end;
  132. in_x86_andnps: begin op:=A_andnps end;
  133. in_x86_xorps: begin op:=A_xorps end;
  134. in_x86_orps: begin op:=A_orps end;
  135. in_x86_andps: begin op:=A_andps end;
  136. in_x86_rsqrtps: begin op:=A_rsqrtps end;
  137. in_x86_minps: begin op:=A_minps end;
  138. in_x86_maxps: begin op:=A_maxps end;
  139. in_x86_sqrtps: begin op:=A_sqrtps end;
  140. in_x86_rcpps: begin op:=A_rcpps end;
  141. in_x86_divps: begin op:=A_divps end;
  142. in_x86_mulps: begin op:=A_mulps end;
  143. in_x86_subps: begin op:=A_subps end;
  144. in_x86_addps: begin op:=A_addps end;
  145. in_x86_rsqrtss: begin op:=A_rsqrtss end;
  146. in_x86_minss: begin op:=A_minss end;
  147. in_x86_maxss: begin op:=A_maxss end;
  148. in_x86_sqrtss: begin op:=A_sqrtss end;
  149. in_x86_rcpss: begin op:=A_rcpss end;
  150. in_x86_divss: begin op:=A_divss end;
  151. in_x86_mulss: begin op:=A_mulss end;
  152. in_x86_subss: begin op:=A_subss end;
  153. in_x86_addss: begin op:=A_addss end;
  154. in_x86_movhlps: begin op:=A_movhlps end;
  155. in_x86_movlhps: begin op:=A_movlhps; end;
  156. else
  157. Internalerror(2020010201);
  158. end;
  159. GetParameters(2);
  160. for i := 1 to 2 do secondpass(paraarray[i]);
  161. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, false);
  162. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[2].location, true);
  163. location:=paraarray[1].location;
  164. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[2].location.register,paraarray[1].location.register));
  165. end;
  166. in_x86_cmpss
  167. ,in_x86_cmpps
  168. ,in_x86_shufps
  169. : //var r0:xmm;r1:xmm;imm:i32;
  170. begin
  171. case inlinenumber of
  172. in_x86_shufps: begin op:=A_shufps end;
  173. in_x86_cmpps: begin op:=A_cmpps end;
  174. in_x86_cmpss: begin op:=A_cmpss; end;
  175. else
  176. Internalerror(2020010201);
  177. end;
  178. GetParameters(3);
  179. for i := 1 to 3 do secondpass(paraarray[i]);
  180. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, false);
  181. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[2].location, true);
  182. location:=paraarray[1].location;
  183. current_asmdata.CurrAsmList.concat(taicpu.op_const_reg_reg(op,S_NO,GetConstInt(paraarray[3]),paraarray[2].location.register,paraarray[1].location.register));
  184. end;
  185. in_x86_cvtsi2ss
  186. : //var r0:xmm;r1:r32;
  187. begin
  188. case inlinenumber of
  189. in_x86_cvtsi2ss: begin op:=A_cvtsi2ss; end;
  190. else
  191. Internalerror(2020010201);
  192. end;
  193. GetParameters(2);
  194. for i := 1 to 2 do secondpass(paraarray[i]);
  195. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, false);
  196. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  197. location:=paraarray[1].location;
  198. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[2].location.register,paraarray[1].location.register));
  199. end;
  200. in_x86_cvtss2si
  201. ,in_x86_cvttss2si
  202. : //out r0:r32;r1:xmm;
  203. begin
  204. case inlinenumber of
  205. in_x86_cvttss2si: begin op:=A_cvttss2si end;
  206. in_x86_cvtss2si: begin op:=A_cvtss2si; end;
  207. else
  208. Internalerror(2020010201);
  209. end;
  210. GetParameters(1);
  211. for i := 1 to 1 do secondpass(paraarray[i]);
  212. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, true);
  213. location_reset(location,LOC_REGISTER,OS_32);
  214. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  215. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[1].location.register,location.register));
  216. end;
  217. in_x86_cvtpi2ps
  218. : //var r0:xmm;r1:mm;
  219. begin
  220. case inlinenumber of
  221. in_x86_cvtpi2ps: begin op:=A_cvtpi2ps; end;
  222. else
  223. Internalerror(2020010201);
  224. end;
  225. GetParameters(2);
  226. for i := 1 to 2 do secondpass(paraarray[i]);
  227. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, false);
  228. location_force_mmxreg(current_asmdata.CurrAsmList, paraarray[2].location, true);
  229. location:=paraarray[1].location;
  230. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[2].location.register,paraarray[1].location.register));
  231. end;
  232. in_x86_cvtps2pi
  233. ,in_x86_cvttps2pi
  234. : //out r0:mm;r1:xmm;
  235. begin
  236. case inlinenumber of
  237. in_x86_cvttps2pi: begin op:=A_cvttps2pi end;
  238. in_x86_cvtps2pi: begin op:=A_cvtps2pi; end;
  239. else
  240. Internalerror(2020010201);
  241. end;
  242. GetParameters(1);
  243. for i := 1 to 1 do secondpass(paraarray[i]);
  244. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, true);
  245. location_reset(location,LOC_MMXREGISTER,OS_M64);
  246. location.register:=tcgx86(cg).getmmxregister(current_asmdata.CurrAsmList);
  247. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[1].location.register,location.register));
  248. end;
  249. in_x86_pmulhuw_mmx
  250. ,in_x86_psadbw_mmx
  251. ,in_x86_pavgb_mmx
  252. ,in_x86_pavgw_mmx
  253. ,in_x86_pmaxub_mmx
  254. ,in_x86_pminub_mmx
  255. ,in_x86_pmaxsw_mmx
  256. ,in_x86_pminsw_mmx
  257. : //var r0:mm;r1:mm;
  258. begin
  259. case inlinenumber of
  260. in_x86_pminsw_mmx: begin op:=A_pminsw end;
  261. in_x86_pmaxsw_mmx: begin op:=A_pmaxsw end;
  262. in_x86_pminub_mmx: begin op:=A_pminub end;
  263. in_x86_pmaxub_mmx: begin op:=A_pmaxub end;
  264. in_x86_pavgw_mmx: begin op:=A_pavgw end;
  265. in_x86_pavgb_mmx: begin op:=A_pavgb end;
  266. in_x86_psadbw_mmx: begin op:=A_psadbw end;
  267. in_x86_pmulhuw_mmx: begin op:=A_pmulhuw; end;
  268. else
  269. Internalerror(2020010201);
  270. end;
  271. GetParameters(2);
  272. for i := 1 to 2 do secondpass(paraarray[i]);
  273. location_force_mmxreg(current_asmdata.CurrAsmList, paraarray[1].location, false);
  274. location_force_mmxreg(current_asmdata.CurrAsmList, paraarray[2].location, true);
  275. location:=paraarray[1].location;
  276. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[2].location.register,paraarray[1].location.register));
  277. end;
  278. in_x86_pextrw_mmx
  279. : //out r0:r32;r1:mm;imm:i32;
  280. begin
  281. case inlinenumber of
  282. in_x86_pextrw_mmx: begin op:=A_pextrw; end;
  283. else
  284. Internalerror(2020010201);
  285. end;
  286. GetParameters(2);
  287. for i := 1 to 2 do secondpass(paraarray[i]);
  288. location_force_mmxreg(current_asmdata.CurrAsmList, paraarray[1].location, true);
  289. location_reset(location,LOC_REGISTER,OS_32);
  290. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  291. current_asmdata.CurrAsmList.concat(taicpu.op_const_reg_reg(op,S_NO,GetConstInt(paraarray[2]),paraarray[1].location.register,location.register));
  292. end;
  293. in_x86_pinsrw_mmx
  294. : //var r0:mm;r1:r32;imm:i32;
  295. begin
  296. case inlinenumber of
  297. in_x86_pinsrw_mmx: begin op:=A_pinsrw; end;
  298. else
  299. Internalerror(2020010201);
  300. end;
  301. GetParameters(3);
  302. for i := 1 to 3 do secondpass(paraarray[i]);
  303. location_force_mmxreg(current_asmdata.CurrAsmList, paraarray[1].location, false);
  304. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  305. location:=paraarray[1].location;
  306. current_asmdata.CurrAsmList.concat(taicpu.op_const_reg_reg(op,S_NO,GetConstInt(paraarray[3]),paraarray[2].location.register,paraarray[1].location.register));
  307. end;
  308. in_x86_pmovmskb
  309. : //out r0:r32;r1:mm;
  310. begin
  311. case inlinenumber of
  312. in_x86_pmovmskb: begin op:=A_pmovmskb; end;
  313. else
  314. Internalerror(2020010201);
  315. end;
  316. GetParameters(1);
  317. for i := 1 to 1 do secondpass(paraarray[i]);
  318. location_force_mmxreg(current_asmdata.CurrAsmList, paraarray[1].location, true);
  319. location_reset(location,LOC_REGISTER,OS_32);
  320. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  321. current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,S_NO,paraarray[1].location.register,location.register));
  322. end;
  323. in_x86_pshufw
  324. : //out r0:mm;r1:mm;imm:i32;
  325. begin
  326. case inlinenumber of
  327. in_x86_pshufw: begin op:=A_pshufw; end;
  328. else
  329. Internalerror(2020010201);
  330. end;
  331. GetParameters(2);
  332. for i := 1 to 2 do secondpass(paraarray[i]);
  333. location_force_mmxreg(current_asmdata.CurrAsmList, paraarray[1].location, true);
  334. location_reset(location,LOC_MMXREGISTER,OS_M64);
  335. location.register:=tcgx86(cg).getmmxregister(current_asmdata.CurrAsmList);
  336. current_asmdata.CurrAsmList.concat(taicpu.op_const_reg_reg(op,S_NO,GetConstInt(paraarray[2]),paraarray[1].location.register,location.register));
  337. end;
  338. in_x86_pextrw
  339. : //out r0:r32;r1:xmm;imm:i32;
  340. begin
  341. case inlinenumber of
  342. in_x86_pextrw: begin op:=A_pextrw; end;
  343. else
  344. Internalerror(2020010201);
  345. end;
  346. GetParameters(2);
  347. for i := 1 to 2 do secondpass(paraarray[i]);
  348. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, true);
  349. location_reset(location,LOC_REGISTER,OS_32);
  350. location.register:=cg.getintregister(current_asmdata.CurrAsmList, OS_32);
  351. current_asmdata.CurrAsmList.concat(taicpu.op_const_reg_reg(op,S_NO,GetConstInt(paraarray[2]),paraarray[1].location.register,location.register));
  352. end;
  353. in_x86_pinsrw
  354. : //var r0:xmm;r1:r32;imm:i32;
  355. begin
  356. case inlinenumber of
  357. in_x86_pinsrw: begin op:=A_pinsrw; end;
  358. else
  359. Internalerror(2020010201);
  360. end;
  361. GetParameters(3);
  362. for i := 1 to 3 do secondpass(paraarray[i]);
  363. location_force_mmreg(current_asmdata.CurrAsmList, paraarray[1].location, false);
  364. hlcg.location_force_reg(current_asmdata.CurrAsmList, paraarray[2].location, paraarray[2].resultdef,u32inttype,true);
  365. location:=paraarray[1].location;
  366. current_asmdata.CurrAsmList.concat(taicpu.op_const_reg_reg(op,S_NO,GetConstInt(paraarray[3]),paraarray[2].location.register,paraarray[1].location.register));
  367. end;