Advertisement
Guest User

ppcfloat fix 0.1.2.20

a guest
Feb 20th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.61 KB | None | 0 0
  1. void ppc_toggle_fpscr_fex(){
  2. bool fex_result = ((ppc_state.ppc_fpscr & 0x20000000) & (ppc_state.ppc_fpscr & 0x80));
  3. fex_result |= ((ppc_state.ppc_fpscr & 0x10000000) & (ppc_state.ppc_fpscr & 0x40));
  4. fex_result |= ((ppc_state.ppc_fpscr & 0x8000000) & (ppc_state.ppc_fpscr & 0x20));
  5. fex_result |= ((ppc_state.ppc_fpscr & 0x4000000) & (ppc_state.ppc_fpscr & 0x10));
  6. fex_result |= ((ppc_state.ppc_fpscr & 0x2000000) & (ppc_state.ppc_fpscr & 0x8));
  7. ppc_state.ppc_fpscr |= (fex_result << 30);
  8. }
  9.  
  10. bool ppc_confirm_inf_nan(uint32_t chosen_reg_1, uint32_t chosen_reg_2, bool is_single, uint32_t op){
  11. uint64_t input_a = ppc_state.ppc_fpr[chosen_reg_1].int64_r;
  12. uint64_t input_b = ppc_state.ppc_fpr[chosen_reg_2].int64_r;
  13.  
  14. }
  15.  
  16. void ppc_grab_regsfpsab(bool int_rep) {
  17. reg_s = (ppc_cur_instruction >> 21) & 31;
  18. reg_a = (ppc_cur_instruction >> 16) & 31;
  19. reg_b = (ppc_cur_instruction >> 11) & 31;
  20. if (int_rep) {
  21. ppc_result64_d = ppc_state.ppc_fpr[reg_s].int64_r;
  22. ppc_result64_a = ppc_state.ppc_fpr[reg_a].int64_r;
  23. ppc_result64_b = ppc_state.ppc_fpr[reg_b].int64_r;
  24. }
  25. else {
  26. ppc_dblresult64_d = fp_return_double(reg_s);
  27. ppc_dblresult64_a = fp_return_double(reg_a);
  28. ppc_dblresult64_c = fp_return_double(reg_c);
  29. }
  30. }
  31.  
  32. void ppc_fadd() {
  33. ppc_grab_regsfpdabc(false);
  34.  
  35. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 58)) {
  36. ppc_dblresult64_d = ppc_dblresult64_a + ppc_dblresult64_b;
  37. ppc_store_dfpresult(false);
  38. }
  39. }
  40.  
  41. void ppc_fadddot() {
  42. ppc_grab_regsfpdabc(false);
  43.  
  44. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 58)) {
  45. ppc_dblresult64_d = ppc_dblresult64_a + ppc_dblresult64_b;
  46. ppc_store_dfpresult(false);
  47. }
  48. ppc_changecrf1();
  49. }
  50.  
  51. void ppc_fsub() {
  52. ppc_grab_regsfpdab(false);
  53.  
  54. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 56)) {
  55. ppc_dblresult64_d = ppc_dblresult64_a - ppc_dblresult64_b;
  56. ppc_store_dfpresult(false);
  57. }
  58. }
  59.  
  60. void ppc_fsubdot() {
  61. ppc_grab_regsfpdab(false);
  62.  
  63. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 56)) {
  64. ppc_dblresult64_d = ppc_dblresult64_a - ppc_dblresult64_b;
  65. ppc_store_dfpresult(false);
  66. }
  67. ppc_changecrf1();
  68. }
  69.  
  70. void ppc_fdiv() {
  71. ppc_grab_regsfpdab(false);
  72.  
  73. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 36)) {
  74. ppc_dblresult64_d = ppc_dblresult64_a / ppc_dblresult64_b;
  75. ppc_store_dfpresult(false);
  76. }
  77. }
  78.  
  79. void ppc_fdivdot() {
  80. ppc_grab_regsfpdab(false);
  81.  
  82. if (!ppc_confirm_inf_nan(ppc_result64_a, ppc_result64_b, false, 36)) {
  83. ppc_dblresult64_d = ppc_dblresult64_a / ppc_dblresult64_b;
  84. ppc_store_dfpresult(false);
  85. }
  86. ppc_changecrf1();
  87. }
  88.  
  89. void ppc_fmult() {
  90. ppc_grab_regsfpdac(false);
  91.  
  92. if (!ppc_confirm_inf_nan(ppc_result64_a, ppc_result64_b, false, 50)) {
  93. ppc_dblresult64_d = ppc_dblresult64_a * ppc_dblresult64_b;
  94. ppc_store_dfpresult(false);
  95. }
  96. }
  97.  
  98. void ppc_fmultdot() {
  99. ppc_grab_regsfpdac(false);
  100.  
  101. if (!ppc_confirm_inf_nan(ppc_result64_a, ppc_result64_b, false, 50)) {
  102. ppc_dblresult64_d = ppc_dblresult64_a * ppc_dblresult64_b;
  103. ppc_store_dfpresult(false);
  104. }
  105.  
  106. ppc_changecrf1();
  107. }
  108.  
  109. void ppc_fmadd() {
  110. ppc_grab_regsfpdabc(false);
  111.  
  112. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  113. ppc_dblresult64_d = (ppc_dblresult64_a * ppc_dblresult64_c);
  114. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 58)) {
  115. ppc_dblresult64_d += ppc_dblresult64_b;
  116. }
  117. }
  118.  
  119. ppc_store_dfpresult(false);
  120. }
  121.  
  122. void ppc_fmadddot() {
  123. ppc_grab_regsfpdabc(false);
  124.  
  125. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  126. ppc_dblresult64_d = (ppc_dblresult64_a * ppc_dblresult64_c);
  127. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 58)) {
  128. ppc_dblresult64_d += ppc_dblresult64_b;
  129. }
  130. }
  131.  
  132. ppc_store_dfpresult(false);
  133. ppc_changecrf1();
  134. }
  135.  
  136. void ppc_fmsub() {
  137. ppc_grab_regsfpdabc(false);
  138.  
  139. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  140. ppc_dblresult64_d = (ppc_dblresult64_a * ppc_dblresult64_c);
  141. if (!ppc_confirm_inf_nan(reg_d, reg_b, false, 56)) {
  142. ppc_dblresult64_d -= ppc_dblresult64_b;
  143. }
  144. }
  145.  
  146. ppc_store_dfpresult(false);
  147. }
  148.  
  149. void ppc_fmsubdot() {
  150. ppc_grab_regsfpdabc(false);
  151.  
  152. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  153. ppc_dblresult64_d = (ppc_dblresult64_a * ppc_dblresult64_c);
  154. if (!ppc_confirm_inf_nan(reg_d, reg_b, false, 56)) {
  155. ppc_dblresult64_d -= ppc_dblresult64_b;
  156. }
  157. }
  158.  
  159. ppc_store_dfpresult(false);
  160. ppc_changecrf1();
  161. }
  162.  
  163. void ppc_fnmadd() {
  164. ppc_grab_regsfpdabc(false);
  165.  
  166. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  167. ppc_dblresult64_d = (ppc_dblresult64_a * ppc_dblresult64_c);
  168. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 58)) {
  169. ppc_dblresult64_d += ppc_dblresult64_b;
  170. }
  171. }
  172.  
  173. ppc_dblresult64_d = -ppc_dblresult64_d;
  174. ppc_store_dfpresult(false);
  175. }
  176.  
  177. void ppc_fnmadddot() {
  178. ppc_grab_regsfpdabc(false);
  179.  
  180. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  181. ppc_dblresult64_d = (ppc_dblresult64_a * ppc_dblresult64_c);
  182. if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 58)) {
  183. ppc_dblresult64_d += ppc_dblresult64_b;
  184. }
  185. }
  186.  
  187. ppc_dblresult64_d = -ppc_dblresult64_d;
  188.  
  189. ppc_store_dfpresult(false);
  190. ppc_changecrf1();
  191. }
  192.  
  193. void ppc_fnmsub() {
  194. ppc_grab_regsfpdabc(false);
  195.  
  196. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  197. ppc_dblresult64_d = (ppc_dblresult64_a * ppc_dblresult64_c);
  198. if (!ppc_confirm_inf_nan(reg_d, reg_b, false, 56)) {
  199. ppc_dblresult64_d -= ppc_dblresult64_b;
  200. }
  201. }
  202. ppc_dblresult64_d = -ppc_dblresult64_d;
  203.  
  204. ppc_store_dfpresult(false);
  205. }
  206.  
  207. void ppc_fnmsubdot() {
  208. ppc_grab_regsfpdabc(false);
  209.  
  210. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  211. ppc_dblresult64_d = (ppc_dblresult64_a * ppc_dblresult64_c);
  212. if (!ppc_confirm_inf_nan(reg_d, reg_b, false, 56)) {
  213. ppc_dblresult64_d -= ppc_dblresult64_b;
  214. }
  215. }
  216. ppc_dblresult64_d = -ppc_dblresult64_d;
  217.  
  218. ppc_store_dfpresult(false);
  219. ppc_changecrf1();
  220. }
  221.  
  222.  
  223. void ppc_fmadds() {
  224. ppc_grab_regsfpdabc(false);
  225.  
  226. float intermediate;
  227.  
  228. if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
  229. intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c;
  230. if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
  231. intermediate += (float)ppc_dblresult64_b;
  232. }
  233. }
  234.  
  235. ppc_dblresult64_d = static_cast<double>(intermediate);
  236.  
  237. ppc_store_dfpresult(false);
  238. }
  239.  
  240. void ppc_fmaddsdot() {
  241. ppc_grab_regsfpdabc(false);
  242.  
  243. float intermediate;
  244.  
  245. if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
  246. intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c;
  247. if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
  248. intermediate += (float)ppc_dblresult64_b;
  249. }
  250. }
  251.  
  252. ppc_dblresult64_d = static_cast<double>(intermediate);
  253.  
  254. ppc_store_dfpresult(false);
  255. ppc_changecrf1();
  256. }
  257.  
  258. void ppc_fmsubs() {
  259. ppc_grab_regsfpdabc(false);
  260.  
  261. float intermediate;
  262.  
  263. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  264. intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c;
  265. if (!ppc_confirm_inf_nan(reg_d, reg_b, false, 56)) {
  266. intermediate -= (float)ppc_dblresult64_b;
  267. }
  268. }
  269.  
  270. ppc_dblresult64_d = static_cast<double>(intermediate);
  271.  
  272. ppc_store_dfpresult(false);
  273. }
  274.  
  275. void ppc_fmsubsdot() {
  276. ppc_grab_regsfpdabc(false);
  277.  
  278. float intermediate;
  279.  
  280. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  281. intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c;
  282. if (!ppc_confirm_inf_nan(reg_d, reg_b, false, 56)) {
  283. intermediate -= (float)ppc_dblresult64_b;
  284. }
  285. }
  286.  
  287. ppc_dblresult64_d = static_cast<double>(intermediate);
  288.  
  289. ppc_store_dfpresult(false);
  290. ppc_changecrf1();
  291. }
  292.  
  293. void ppc_fnmadds() {
  294. ppc_grab_regsfpdabc(false);
  295.  
  296. float intermediate;
  297.  
  298. if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
  299. intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c;
  300. if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
  301. intermediate += (float)ppc_dblresult64_b;
  302. }
  303. }
  304. intermediate = -intermediate;
  305. ppc_dblresult64_d = static_cast<double>(intermediate);
  306.  
  307. ppc_store_dfpresult(false);
  308. }
  309.  
  310. void ppc_fnmaddsdot() {
  311. ppc_grab_regsfpdabc(false);
  312.  
  313. float intermediate;
  314.  
  315. if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
  316. intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c;
  317. if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
  318. intermediate += (float)ppc_dblresult64_b;
  319. }
  320. }
  321. intermediate = -intermediate;
  322. ppc_dblresult64_d = static_cast<double>(intermediate);
  323.  
  324. ppc_store_dfpresult(false);
  325. ppc_changecrf1();
  326. }
  327.  
  328. void ppc_fnmsubs() {
  329. ppc_grab_regsfpdabc(false);
  330.  
  331. float intermediate;
  332.  
  333. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  334. intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c;
  335. if (!ppc_confirm_inf_nan(reg_d, reg_b, false, 56)) {
  336. intermediate -= (float)ppc_dblresult64_b;
  337. }
  338. }
  339. intermediate = -intermediate;
  340. ppc_dblresult64_d = static_cast<double>(intermediate);
  341.  
  342. ppc_store_dfpresult(false);
  343. }
  344.  
  345. void ppc_fnmsubsdot() {
  346. ppc_grab_regsfpdabc(false);
  347.  
  348. float intermediate;
  349.  
  350. if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
  351. intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c;
  352. if (!ppc_confirm_inf_nan(reg_d, reg_b, false, 56)) {
  353. intermediate -= (float)ppc_dblresult64_b;
  354. }
  355. }
  356. intermediate = -intermediate;
  357. ppc_dblresult64_d = static_cast<double>(intermediate);
  358.  
  359. ppc_store_dfpresult(false);
  360. ppc_changecrf1();
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement