x86second.inc 13 KB

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