|
|
1.1 ! root 1: /* ! 2: * compiler/compemu_midfunc_arm.cpp - Native MIDFUNCS for IA-32 and AMD64 ! 3: * ! 4: * Copyright (c) 2014 Jens Heitmann of ARAnyM dev team (see AUTHORS) ! 5: * ! 6: * Inspired by Christian Bauer's Basilisk II ! 7: * ! 8: * Original 68040 JIT compiler for UAE, copyright 2000-2002 Bernd Meyer ! 9: * ! 10: * Adaptation for Basilisk II and improvements, copyright 2000-2002 ! 11: * Gwenole Beauchesne ! 12: * ! 13: * Basilisk II (C) 1997-2002 Christian Bauer ! 14: * ! 15: * This program is free software; you can redistribute it and/or modify ! 16: * it under the terms of the GNU General Public License as published by ! 17: * the Free Software Foundation; either version 2 of the License, or ! 18: * (at your option) any later version. ! 19: * ! 20: * This program is distributed in the hope that it will be useful, ! 21: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 22: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 23: * GNU General Public License for more details. ! 24: * ! 25: * You should have received a copy of the GNU General Public License ! 26: * along with this program; if not, write to the Free Software ! 27: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! 28: * ! 29: * Note: ! 30: * File is included by compemu_support.cpp ! 31: * ! 32: */ ! 33: ! 34: /******************************************************************** ! 35: * CPU functions exposed to gencomp. Both CREATE and EMIT time * ! 36: ********************************************************************/ ! 37: ! 38: ! 39: /* ! 40: * RULES FOR HANDLING REGISTERS: ! 41: * ! 42: * * In the function headers, order the parameters ! 43: * - 1st registers written to ! 44: * - 2nd read/modify/write registers ! 45: * - 3rd registers read from ! 46: * * Before calling raw_*, you must call readreg, writereg or rmw for ! 47: * each register ! 48: * * The order for this is ! 49: * - 1st call remove_offset for all registers written to with size<4 ! 50: * - 2nd call readreg for all registers read without offset ! 51: * - 3rd call rmw for all rmw registers ! 52: * - 4th call readreg_offset for all registers that can handle offsets ! 53: * - 5th call get_offset for all the registers from the previous step ! 54: * - 6th call writereg for all written-to registers ! 55: * - 7th call raw_* ! 56: * - 8th unlock2 all registers that were locked ! 57: */ ! 58: ! 59: MIDFUNC(0,live_flags,(void)) ! 60: { ! 61: live.flags_on_stack=TRASH; ! 62: live.flags_in_flags=VALID; ! 63: live.flags_are_important=1; ! 64: } ! 65: MENDFUNC(0,live_flags,(void)) ! 66: ! 67: MIDFUNC(0,dont_care_flags,(void)) ! 68: { ! 69: live.flags_are_important=0; ! 70: } ! 71: MENDFUNC(0,dont_care_flags,(void)) ! 72: ! 73: MIDFUNC(0,duplicate_carry,(void)) ! 74: { ! 75: evict(FLAGX); ! 76: make_flags_live_internal(); ! 77: #ifdef UAE ! 78: COMPCALL(setcc_m)((uintptr)live.state[FLAGX].mem + 1, NATIVE_CC_CS); ! 79: #else ! 80: COMPCALL(setcc_m)((uintptr)live.state[FLAGX].mem, NATIVE_CC_CS); ! 81: #endif ! 82: log_vwrite(FLAGX); ! 83: } ! 84: MENDFUNC(0,duplicate_carry,(void)) ! 85: ! 86: MIDFUNC(0,restore_carry,(void)) ! 87: { ! 88: if (!have_rat_stall) { /* Not a P6 core, i.e. no partial stalls */ ! 89: #ifdef UAE ! 90: bt_l_ri_noclobber(FLAGX, 8); ! 91: #else ! 92: bt_l_ri_noclobber(FLAGX, 0); ! 93: #endif ! 94: } ! 95: else { /* Avoid the stall the above creates. ! 96: This is slow on non-P6, though. ! 97: */ ! 98: #ifdef UAE ! 99: COMPCALL(rol_w_ri(FLAGX, 8)); ! 100: #else ! 101: COMPCALL(rol_b_ri(FLAGX, 8)); ! 102: #endif ! 103: isclean(FLAGX); ! 104: } ! 105: } ! 106: MENDFUNC(0,restore_carry,(void)) ! 107: ! 108: MIDFUNC(0,start_needflags,(void)) ! 109: { ! 110: needflags=1; ! 111: } ! 112: MENDFUNC(0,start_needflags,(void)) ! 113: ! 114: MIDFUNC(0,end_needflags,(void)) ! 115: { ! 116: needflags=0; ! 117: } ! 118: MENDFUNC(0,end_needflags,(void)) ! 119: ! 120: MIDFUNC(0,make_flags_live,(void)) ! 121: { ! 122: make_flags_live_internal(); ! 123: } ! 124: MENDFUNC(0,make_flags_live,(void)) ! 125: ! 126: MIDFUNC(1,fflags_into_flags,(W2 tmp)) ! 127: { ! 128: clobber_flags(); ! 129: fflags_into_flags_internal(tmp); ! 130: } ! 131: MENDFUNC(1,fflags_into_flags,(W2 tmp)) ! 132: ! 133: MIDFUNC(2,bt_l_ri,(RR4 r, IMM i)) /* This is defined as only affecting C */ ! 134: { ! 135: int size=4; ! 136: if (i<16) ! 137: size=2; ! 138: CLOBBER_BT; ! 139: r=readreg(r,size); ! 140: raw_bt_l_ri(r,i); ! 141: unlock2(r); ! 142: } ! 143: MENDFUNC(2,bt_l_ri,(RR4 r, IMM i)) /* This is defined as only affecting C */ ! 144: ! 145: MIDFUNC(2,bt_l_rr,(RR4 r, RR4 b)) /* This is defined as only affecting C */ ! 146: { ! 147: CLOBBER_BT; ! 148: r=readreg(r,4); ! 149: b=readreg(b,4); ! 150: raw_bt_l_rr(r,b); ! 151: unlock2(r); ! 152: unlock2(b); ! 153: } ! 154: MENDFUNC(2,bt_l_rr,(RR4 r, RR4 b)) /* This is defined as only affecting C */ ! 155: ! 156: MIDFUNC(2,btc_l_ri,(RW4 r, IMM i)) ! 157: { ! 158: int size=4; ! 159: if (i<16) ! 160: size=2; ! 161: CLOBBER_BT; ! 162: r=rmw(r,size,size); ! 163: raw_btc_l_ri(r,i); ! 164: unlock2(r); ! 165: } ! 166: MENDFUNC(2,btc_l_ri,(RW4 r, IMM i)) ! 167: ! 168: MIDFUNC(2,btc_l_rr,(RW4 r, RR4 b)) ! 169: { ! 170: CLOBBER_BT; ! 171: b=readreg(b,4); ! 172: r=rmw(r,4,4); ! 173: raw_btc_l_rr(r,b); ! 174: unlock2(r); ! 175: unlock2(b); ! 176: } ! 177: MENDFUNC(2,btc_l_rr,(RW4 r, RR4 b)) ! 178: ! 179: MIDFUNC(2,btr_l_ri,(RW4 r, IMM i)) ! 180: { ! 181: int size=4; ! 182: if (i<16) ! 183: size=2; ! 184: CLOBBER_BT; ! 185: r=rmw(r,size,size); ! 186: raw_btr_l_ri(r,i); ! 187: unlock2(r); ! 188: } ! 189: MENDFUNC(2,btr_l_ri,(RW4 r, IMM i)) ! 190: ! 191: MIDFUNC(2,btr_l_rr,(RW4 r, RR4 b)) ! 192: { ! 193: CLOBBER_BT; ! 194: b=readreg(b,4); ! 195: r=rmw(r,4,4); ! 196: raw_btr_l_rr(r,b); ! 197: unlock2(r); ! 198: unlock2(b); ! 199: } ! 200: MENDFUNC(2,btr_l_rr,(RW4 r, RR4 b)) ! 201: ! 202: MIDFUNC(2,bts_l_ri,(RW4 r, IMM i)) ! 203: { ! 204: int size=4; ! 205: if (i<16) ! 206: size=2; ! 207: CLOBBER_BT; ! 208: r=rmw(r,size,size); ! 209: raw_bts_l_ri(r,i); ! 210: unlock2(r); ! 211: } ! 212: MENDFUNC(2,bts_l_ri,(RW4 r, IMM i)) ! 213: ! 214: MIDFUNC(2,bts_l_rr,(RW4 r, RR4 b)) ! 215: { ! 216: CLOBBER_BT; ! 217: b=readreg(b,4); ! 218: r=rmw(r,4,4); ! 219: raw_bts_l_rr(r,b); ! 220: unlock2(r); ! 221: unlock2(b); ! 222: } ! 223: MENDFUNC(2,bts_l_rr,(RW4 r, RR4 b)) ! 224: ! 225: MIDFUNC(2,mov_l_rm,(W4 d, IMM s)) ! 226: { ! 227: CLOBBER_MOV; ! 228: d=writereg(d,4); ! 229: raw_mov_l_rm(d,s); ! 230: unlock2(d); ! 231: } ! 232: MENDFUNC(2,mov_l_rm,(W4 d, IMM s)) ! 233: ! 234: MIDFUNC(1,call_r,(RR4 r)) /* Clobbering is implicit */ ! 235: { ! 236: r=readreg(r,4); ! 237: raw_dec_sp(STACK_SHADOW_SPACE); ! 238: raw_call_r(r); ! 239: raw_inc_sp(STACK_SHADOW_SPACE); ! 240: unlock2(r); ! 241: } ! 242: MENDFUNC(1,call_r,(RR4 r)) /* Clobbering is implicit */ ! 243: ! 244: MIDFUNC(2,sub_l_mi,(IMM d, IMM s)) ! 245: { ! 246: CLOBBER_SUB; ! 247: raw_sub_l_mi(d,s) ; ! 248: } ! 249: MENDFUNC(2,sub_l_mi,(IMM d, IMM s)) ! 250: ! 251: MIDFUNC(2,mov_l_mi,(IMM d, IMM s)) ! 252: { ! 253: CLOBBER_MOV; ! 254: raw_mov_l_mi(d,s) ; ! 255: } ! 256: MENDFUNC(2,mov_l_mi,(IMM d, IMM s)) ! 257: ! 258: MIDFUNC(2,mov_w_mi,(IMM d, IMM s)) ! 259: { ! 260: CLOBBER_MOV; ! 261: raw_mov_w_mi(d,s) ; ! 262: } ! 263: MENDFUNC(2,mov_w_mi,(IMM d, IMM s)) ! 264: ! 265: MIDFUNC(2,mov_b_mi,(IMM d, IMM s)) ! 266: { ! 267: CLOBBER_MOV; ! 268: raw_mov_b_mi(d,s) ; ! 269: } ! 270: MENDFUNC(2,mov_b_mi,(IMM d, IMM s)) ! 271: ! 272: MIDFUNC(2,rol_b_ri,(RW1 r, IMM i)) ! 273: { ! 274: if (!i && !needflags) ! 275: return; ! 276: CLOBBER_ROL; ! 277: r=rmw(r,1,1); ! 278: raw_rol_b_ri(r,i); ! 279: unlock2(r); ! 280: } ! 281: MENDFUNC(2,rol_b_ri,(RW1 r, IMM i)) ! 282: ! 283: MIDFUNC(2,rol_w_ri,(RW2 r, IMM i)) ! 284: { ! 285: if (!i && !needflags) ! 286: return; ! 287: CLOBBER_ROL; ! 288: r=rmw(r,2,2); ! 289: raw_rol_w_ri(r,i); ! 290: unlock2(r); ! 291: } ! 292: MENDFUNC(2,rol_w_ri,(RW2 r, IMM i)) ! 293: ! 294: MIDFUNC(2,rol_l_ri,(RW4 r, IMM i)) ! 295: { ! 296: if (!i && !needflags) ! 297: return; ! 298: CLOBBER_ROL; ! 299: r=rmw(r,4,4); ! 300: raw_rol_l_ri(r,i); ! 301: unlock2(r); ! 302: } ! 303: MENDFUNC(2,rol_l_ri,(RW4 r, IMM i)) ! 304: ! 305: MIDFUNC(2,rol_l_rr,(RW4 d, RR1 r)) ! 306: { ! 307: if (isconst(r)) { ! 308: COMPCALL(rol_l_ri)(d,(uae_u8)live.state[r].val); ! 309: return; ! 310: } ! 311: CLOBBER_ROL; ! 312: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 313: d=rmw(d,4,4); ! 314: Dif (r!=1) { ! 315: jit_abort("Illegal register %d in raw_rol_b",r); ! 316: } ! 317: raw_rol_l_rr(d,r) ; ! 318: unlock2(r); ! 319: unlock2(d); ! 320: } ! 321: MENDFUNC(2,rol_l_rr,(RW4 d, RR1 r)) ! 322: ! 323: MIDFUNC(2,rol_w_rr,(RW2 d, RR1 r)) ! 324: { /* Can only do this with r==1, i.e. cl */ ! 325: ! 326: if (isconst(r)) { ! 327: COMPCALL(rol_w_ri)(d,(uae_u8)live.state[r].val); ! 328: return; ! 329: } ! 330: CLOBBER_ROL; ! 331: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 332: d=rmw(d,2,2); ! 333: Dif (r!=1) { ! 334: jit_abort("Illegal register %d in raw_rol_b",r); ! 335: } ! 336: raw_rol_w_rr(d,r) ; ! 337: unlock2(r); ! 338: unlock2(d); ! 339: } ! 340: MENDFUNC(2,rol_w_rr,(RW2 d, RR1 r)) ! 341: ! 342: MIDFUNC(2,rol_b_rr,(RW1 d, RR1 r)) ! 343: { /* Can only do this with r==1, i.e. cl */ ! 344: ! 345: if (isconst(r)) { ! 346: COMPCALL(rol_b_ri)(d,(uae_u8)live.state[r].val); ! 347: return; ! 348: } ! 349: ! 350: CLOBBER_ROL; ! 351: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 352: d=rmw(d,1,1); ! 353: Dif (r!=1) { ! 354: jit_abort("Illegal register %d in raw_rol_b",r); ! 355: } ! 356: raw_rol_b_rr(d,r) ; ! 357: unlock2(r); ! 358: unlock2(d); ! 359: } ! 360: MENDFUNC(2,rol_b_rr,(RW1 d, RR1 r)) ! 361: ! 362: ! 363: MIDFUNC(2,shll_l_rr,(RW4 d, RR1 r)) ! 364: { ! 365: if (isconst(r)) { ! 366: COMPCALL(shll_l_ri)(d,(uae_u8)live.state[r].val); ! 367: return; ! 368: } ! 369: CLOBBER_SHLL; ! 370: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 371: d=rmw(d,4,4); ! 372: Dif (r!=1) { ! 373: jit_abort("Illegal register %d in raw_rol_b",r); ! 374: } ! 375: raw_shll_l_rr(d,r) ; ! 376: unlock2(r); ! 377: unlock2(d); ! 378: } ! 379: MENDFUNC(2,shll_l_rr,(RW4 d, RR1 r)) ! 380: ! 381: MIDFUNC(2,shll_w_rr,(RW2 d, RR1 r)) ! 382: { /* Can only do this with r==1, i.e. cl */ ! 383: ! 384: if (isconst(r)) { ! 385: COMPCALL(shll_w_ri)(d,(uae_u8)live.state[r].val); ! 386: return; ! 387: } ! 388: CLOBBER_SHLL; ! 389: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 390: d=rmw(d,2,2); ! 391: Dif (r!=1) { ! 392: jit_abort("Illegal register %d in raw_shll_b",r); ! 393: } ! 394: raw_shll_w_rr(d,r) ; ! 395: unlock2(r); ! 396: unlock2(d); ! 397: } ! 398: MENDFUNC(2,shll_w_rr,(RW2 d, RR1 r)) ! 399: ! 400: MIDFUNC(2,shll_b_rr,(RW1 d, RR1 r)) ! 401: { /* Can only do this with r==1, i.e. cl */ ! 402: ! 403: if (isconst(r)) { ! 404: COMPCALL(shll_b_ri)(d,(uae_u8)live.state[r].val); ! 405: return; ! 406: } ! 407: ! 408: CLOBBER_SHLL; ! 409: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 410: d=rmw(d,1,1); ! 411: Dif (r!=1) { ! 412: jit_abort("Illegal register %d in raw_shll_b",r); ! 413: } ! 414: raw_shll_b_rr(d,r) ; ! 415: unlock2(r); ! 416: unlock2(d); ! 417: } ! 418: MENDFUNC(2,shll_b_rr,(RW1 d, RR1 r)) ! 419: ! 420: ! 421: MIDFUNC(2,ror_b_ri,(RR1 r, IMM i)) ! 422: { ! 423: if (!i && !needflags) ! 424: return; ! 425: CLOBBER_ROR; ! 426: r=rmw(r,1,1); ! 427: raw_ror_b_ri(r,i); ! 428: unlock2(r); ! 429: } ! 430: MENDFUNC(2,ror_b_ri,(RR1 r, IMM i)) ! 431: ! 432: MIDFUNC(2,ror_w_ri,(RR2 r, IMM i)) ! 433: { ! 434: if (!i && !needflags) ! 435: return; ! 436: CLOBBER_ROR; ! 437: r=rmw(r,2,2); ! 438: raw_ror_w_ri(r,i); ! 439: unlock2(r); ! 440: } ! 441: MENDFUNC(2,ror_w_ri,(RR2 r, IMM i)) ! 442: ! 443: MIDFUNC(2,ror_l_ri,(RR4 r, IMM i)) ! 444: { ! 445: if (!i && !needflags) ! 446: return; ! 447: CLOBBER_ROR; ! 448: r=rmw(r,4,4); ! 449: raw_ror_l_ri(r,i); ! 450: unlock2(r); ! 451: } ! 452: MENDFUNC(2,ror_l_ri,(RR4 r, IMM i)) ! 453: ! 454: MIDFUNC(2,ror_l_rr,(RR4 d, RR1 r)) ! 455: { ! 456: if (isconst(r)) { ! 457: COMPCALL(ror_l_ri)(d,(uae_u8)live.state[r].val); ! 458: return; ! 459: } ! 460: CLOBBER_ROR; ! 461: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 462: d=rmw(d,4,4); ! 463: raw_ror_l_rr(d,r) ; ! 464: unlock2(r); ! 465: unlock2(d); ! 466: } ! 467: MENDFUNC(2,ror_l_rr,(RR4 d, RR1 r)) ! 468: ! 469: MIDFUNC(2,ror_w_rr,(RR2 d, RR1 r)) ! 470: { ! 471: if (isconst(r)) { ! 472: COMPCALL(ror_w_ri)(d,(uae_u8)live.state[r].val); ! 473: return; ! 474: } ! 475: CLOBBER_ROR; ! 476: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 477: d=rmw(d,2,2); ! 478: raw_ror_w_rr(d,r) ; ! 479: unlock2(r); ! 480: unlock2(d); ! 481: } ! 482: MENDFUNC(2,ror_w_rr,(RR2 d, RR1 r)) ! 483: ! 484: MIDFUNC(2,ror_b_rr,(RR1 d, RR1 r)) ! 485: { ! 486: if (isconst(r)) { ! 487: COMPCALL(ror_b_ri)(d,(uae_u8)live.state[r].val); ! 488: return; ! 489: } ! 490: ! 491: CLOBBER_ROR; ! 492: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 493: d=rmw(d,1,1); ! 494: raw_ror_b_rr(d,r) ; ! 495: unlock2(r); ! 496: unlock2(d); ! 497: } ! 498: MENDFUNC(2,ror_b_rr,(RR1 d, RR1 r)) ! 499: ! 500: MIDFUNC(2,shrl_l_rr,(RW4 d, RR1 r)) ! 501: { ! 502: if (isconst(r)) { ! 503: COMPCALL(shrl_l_ri)(d,(uae_u8)live.state[r].val); ! 504: return; ! 505: } ! 506: CLOBBER_SHRL; ! 507: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 508: d=rmw(d,4,4); ! 509: Dif (r!=1) { ! 510: jit_abort("Illegal register %d in raw_rol_b",r); ! 511: } ! 512: raw_shrl_l_rr(d,r) ; ! 513: unlock2(r); ! 514: unlock2(d); ! 515: } ! 516: MENDFUNC(2,shrl_l_rr,(RW4 d, RR1 r)) ! 517: ! 518: MIDFUNC(2,shrl_w_rr,(RW2 d, RR1 r)) ! 519: { /* Can only do this with r==1, i.e. cl */ ! 520: ! 521: if (isconst(r)) { ! 522: COMPCALL(shrl_w_ri)(d,(uae_u8)live.state[r].val); ! 523: return; ! 524: } ! 525: CLOBBER_SHRL; ! 526: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 527: d=rmw(d,2,2); ! 528: Dif (r!=1) { ! 529: jit_abort("Illegal register %d in raw_shrl_b",r); ! 530: } ! 531: raw_shrl_w_rr(d,r) ; ! 532: unlock2(r); ! 533: unlock2(d); ! 534: } ! 535: MENDFUNC(2,shrl_w_rr,(RW2 d, RR1 r)) ! 536: ! 537: MIDFUNC(2,shrl_b_rr,(RW1 d, RR1 r)) ! 538: { /* Can only do this with r==1, i.e. cl */ ! 539: ! 540: if (isconst(r)) { ! 541: COMPCALL(shrl_b_ri)(d,(uae_u8)live.state[r].val); ! 542: return; ! 543: } ! 544: ! 545: CLOBBER_SHRL; ! 546: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 547: d=rmw(d,1,1); ! 548: Dif (r!=1) { ! 549: jit_abort("Illegal register %d in raw_shrl_b",r); ! 550: } ! 551: raw_shrl_b_rr(d,r) ; ! 552: unlock2(r); ! 553: unlock2(d); ! 554: } ! 555: MENDFUNC(2,shrl_b_rr,(RW1 d, RR1 r)) ! 556: ! 557: ! 558: ! 559: MIDFUNC(2,shll_l_ri,(RW4 r, IMM i)) ! 560: { ! 561: if (!i && !needflags) ! 562: return; ! 563: if (isconst(r) && !needflags) { ! 564: live.state[r].val<<=i; ! 565: return; ! 566: } ! 567: CLOBBER_SHLL; ! 568: r=rmw(r,4,4); ! 569: raw_shll_l_ri(r,i); ! 570: unlock2(r); ! 571: } ! 572: MENDFUNC(2,shll_l_ri,(RW4 r, IMM i)) ! 573: ! 574: MIDFUNC(2,shll_w_ri,(RW2 r, IMM i)) ! 575: { ! 576: if (!i && !needflags) ! 577: return; ! 578: CLOBBER_SHLL; ! 579: r=rmw(r,2,2); ! 580: raw_shll_w_ri(r,i); ! 581: unlock2(r); ! 582: } ! 583: MENDFUNC(2,shll_w_ri,(RW2 r, IMM i)) ! 584: ! 585: MIDFUNC(2,shll_b_ri,(RW1 r, IMM i)) ! 586: { ! 587: if (!i && !needflags) ! 588: return; ! 589: CLOBBER_SHLL; ! 590: r=rmw(r,1,1); ! 591: raw_shll_b_ri(r,i); ! 592: unlock2(r); ! 593: } ! 594: MENDFUNC(2,shll_b_ri,(RW1 r, IMM i)) ! 595: ! 596: MIDFUNC(2,shrl_l_ri,(RW4 r, IMM i)) ! 597: { ! 598: if (!i && !needflags) ! 599: return; ! 600: if (isconst(r) && !needflags) { ! 601: live.state[r].val>>=i; ! 602: return; ! 603: } ! 604: CLOBBER_SHRL; ! 605: r=rmw(r,4,4); ! 606: raw_shrl_l_ri(r,i); ! 607: unlock2(r); ! 608: } ! 609: MENDFUNC(2,shrl_l_ri,(RW4 r, IMM i)) ! 610: ! 611: MIDFUNC(2,shrl_w_ri,(RW2 r, IMM i)) ! 612: { ! 613: if (!i && !needflags) ! 614: return; ! 615: CLOBBER_SHRL; ! 616: r=rmw(r,2,2); ! 617: raw_shrl_w_ri(r,i); ! 618: unlock2(r); ! 619: } ! 620: MENDFUNC(2,shrl_w_ri,(RW2 r, IMM i)) ! 621: ! 622: MIDFUNC(2,shrl_b_ri,(RW1 r, IMM i)) ! 623: { ! 624: if (!i && !needflags) ! 625: return; ! 626: CLOBBER_SHRL; ! 627: r=rmw(r,1,1); ! 628: raw_shrl_b_ri(r,i); ! 629: unlock2(r); ! 630: } ! 631: MENDFUNC(2,shrl_b_ri,(RW1 r, IMM i)) ! 632: ! 633: MIDFUNC(2,shra_l_ri,(RW4 r, IMM i)) ! 634: { ! 635: if (!i && !needflags) ! 636: return; ! 637: CLOBBER_SHRA; ! 638: r=rmw(r,4,4); ! 639: raw_shra_l_ri(r,i); ! 640: unlock2(r); ! 641: } ! 642: MENDFUNC(2,shra_l_ri,(RW4 r, IMM i)) ! 643: ! 644: MIDFUNC(2,shra_w_ri,(RW2 r, IMM i)) ! 645: { ! 646: if (!i && !needflags) ! 647: return; ! 648: CLOBBER_SHRA; ! 649: r=rmw(r,2,2); ! 650: raw_shra_w_ri(r,i); ! 651: unlock2(r); ! 652: } ! 653: MENDFUNC(2,shra_w_ri,(RW2 r, IMM i)) ! 654: ! 655: MIDFUNC(2,shra_b_ri,(RW1 r, IMM i)) ! 656: { ! 657: if (!i && !needflags) ! 658: return; ! 659: CLOBBER_SHRA; ! 660: r=rmw(r,1,1); ! 661: raw_shra_b_ri(r,i); ! 662: unlock2(r); ! 663: } ! 664: MENDFUNC(2,shra_b_ri,(RW1 r, IMM i)) ! 665: ! 666: MIDFUNC(2,shra_l_rr,(RW4 d, RR1 r)) ! 667: { ! 668: if (isconst(r)) { ! 669: COMPCALL(shra_l_ri)(d,(uae_u8)live.state[r].val); ! 670: return; ! 671: } ! 672: CLOBBER_SHRA; ! 673: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 674: d=rmw(d,4,4); ! 675: Dif (r!=1) { ! 676: jit_abort("Illegal register %d in raw_rol_b",r); ! 677: } ! 678: raw_shra_l_rr(d,r) ; ! 679: unlock2(r); ! 680: unlock2(d); ! 681: } ! 682: MENDFUNC(2,shra_l_rr,(RW4 d, RR1 r)) ! 683: ! 684: MIDFUNC(2,shra_w_rr,(RW2 d, RR1 r)) ! 685: { /* Can only do this with r==1, i.e. cl */ ! 686: ! 687: if (isconst(r)) { ! 688: COMPCALL(shra_w_ri)(d,(uae_u8)live.state[r].val); ! 689: return; ! 690: } ! 691: CLOBBER_SHRA; ! 692: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 693: d=rmw(d,2,2); ! 694: Dif (r!=1) { ! 695: jit_abort("Illegal register %d in raw_shra_b",r); ! 696: } ! 697: raw_shra_w_rr(d,r) ; ! 698: unlock2(r); ! 699: unlock2(d); ! 700: } ! 701: MENDFUNC(2,shra_w_rr,(RW2 d, RR1 r)) ! 702: ! 703: MIDFUNC(2,shra_b_rr,(RW1 d, RR1 r)) ! 704: { /* Can only do this with r==1, i.e. cl */ ! 705: ! 706: if (isconst(r)) { ! 707: COMPCALL(shra_b_ri)(d,(uae_u8)live.state[r].val); ! 708: return; ! 709: } ! 710: ! 711: CLOBBER_SHRA; ! 712: r=readreg_specific(r,1,SHIFTCOUNT_NREG); ! 713: d=rmw(d,1,1); ! 714: Dif (r!=1) { ! 715: jit_abort("Illegal register %d in raw_shra_b",r); ! 716: } ! 717: raw_shra_b_rr(d,r) ; ! 718: unlock2(r); ! 719: unlock2(d); ! 720: } ! 721: MENDFUNC(2,shra_b_rr,(RW1 d, RR1 r)) ! 722: ! 723: ! 724: MIDFUNC(2,setcc,(W1 d, IMM cc)) ! 725: { ! 726: CLOBBER_SETCC; ! 727: d=writereg(d,1); ! 728: raw_setcc(d,cc); ! 729: unlock2(d); ! 730: } ! 731: MENDFUNC(2,setcc,(W1 d, IMM cc)) ! 732: ! 733: MIDFUNC(2,setcc_m,(IMM d, IMM cc)) ! 734: { ! 735: CLOBBER_SETCC; ! 736: raw_setcc_m(d,cc); ! 737: } ! 738: MENDFUNC(2,setcc_m,(IMM d, IMM cc)) ! 739: ! 740: MIDFUNC(3,cmov_l_rr,(RW4 d, RR4 s, IMM cc)) ! 741: { ! 742: if (d==s) ! 743: return; ! 744: CLOBBER_CMOV; ! 745: s=readreg(s,4); ! 746: d=rmw(d,4,4); ! 747: raw_cmov_l_rr(d,s,cc); ! 748: unlock2(s); ! 749: unlock2(d); ! 750: } ! 751: MENDFUNC(3,cmov_l_rr,(RW4 d, RR4 s, IMM cc)) ! 752: ! 753: MIDFUNC(3,cmov_l_rm,(RW4 d, IMM s, IMM cc)) ! 754: { ! 755: CLOBBER_CMOV; ! 756: d=rmw(d,4,4); ! 757: raw_cmov_l_rm(d,s,cc); ! 758: unlock2(d); ! 759: } ! 760: MENDFUNC(3,cmov_l_rm,(RW4 d, IMM s, IMM cc)) ! 761: ! 762: #ifdef UAE ! 763: /* FIXME: UAE version looks correct */ ! 764: MIDFUNC(2,bsf_l_rr,(W4 d, RR4 s)) ! 765: #else ! 766: MIDFUNC(2,bsf_l_rr,(W4 d, W4 s)) ! 767: #endif ! 768: { ! 769: CLOBBER_BSF; ! 770: s=readreg(s,4); ! 771: d=writereg(d,4); ! 772: raw_bsf_l_rr(d,s); ! 773: unlock2(s); ! 774: unlock2(d); ! 775: } ! 776: #ifdef UAE ! 777: /* FIXME: UAE version looks correct */ ! 778: MENDFUNC(2,bsf_l_rr,(W4 d, RR4 s)) ! 779: #else ! 780: MENDFUNC(2,bsf_l_rr,(W4 d, W4 s)) ! 781: #endif ! 782: ! 783: /* Set the Z flag depending on the value in s. Note that the ! 784: value has to be 0 or -1 (or, more precisely, for non-zero ! 785: values, bit 14 must be set)! */ ! 786: MIDFUNC(2,simulate_bsf,(W4 tmp, RW4 s)) ! 787: { ! 788: CLOBBER_BSF; ! 789: s=rmw_specific(s,4,4,FLAG_NREG3); ! 790: tmp=writereg(tmp,4); ! 791: raw_flags_set_zero(s, tmp); ! 792: unlock2(tmp); ! 793: unlock2(s); ! 794: } ! 795: MENDFUNC(2,simulate_bsf,(W4 tmp, RW4 s)) ! 796: ! 797: MIDFUNC(2,imul_32_32,(RW4 d, RR4 s)) ! 798: { ! 799: CLOBBER_MUL; ! 800: s=readreg(s,4); ! 801: d=rmw(d,4,4); ! 802: raw_imul_32_32(d,s); ! 803: unlock2(s); ! 804: unlock2(d); ! 805: } ! 806: MENDFUNC(2,imul_32_32,(RW4 d, RR4 s)) ! 807: ! 808: MIDFUNC(2,imul_64_32,(RW4 d, RW4 s)) ! 809: { ! 810: CLOBBER_MUL; ! 811: s=rmw_specific(s,4,4,MUL_NREG2); ! 812: d=rmw_specific(d,4,4,MUL_NREG1); ! 813: raw_imul_64_32(d,s); ! 814: unlock2(s); ! 815: unlock2(d); ! 816: } ! 817: MENDFUNC(2,imul_64_32,(RW4 d, RW4 s)) ! 818: ! 819: MIDFUNC(2,mul_64_32,(RW4 d, RW4 s)) ! 820: { ! 821: CLOBBER_MUL; ! 822: s=rmw_specific(s,4,4,MUL_NREG2); ! 823: d=rmw_specific(d,4,4,MUL_NREG1); ! 824: raw_mul_64_32(d,s); ! 825: unlock2(s); ! 826: unlock2(d); ! 827: } ! 828: MENDFUNC(2,mul_64_32,(RW4 d, RW4 s)) ! 829: ! 830: MIDFUNC(2,mul_32_32,(RW4 d, RR4 s)) ! 831: { ! 832: CLOBBER_MUL; ! 833: s=readreg(s,4); ! 834: d=rmw(d,4,4); ! 835: raw_mul_32_32(d,s); ! 836: unlock2(s); ! 837: unlock2(d); ! 838: } ! 839: MENDFUNC(2,mul_32_32,(RW4 d, RR4 s)) ! 840: ! 841: #if SIZEOF_VOID_P == 8 ! 842: MIDFUNC(2,sign_extend_32_rr,(W4 d, RR2 s)) ! 843: { ! 844: int isrmw; ! 845: ! 846: if (isconst(s)) { ! 847: set_const(d,(uae_s32)live.state[s].val); ! 848: return; ! 849: } ! 850: ! 851: CLOBBER_SE32; ! 852: isrmw=(s==d); ! 853: if (!isrmw) { ! 854: s=readreg(s,4); ! 855: d=writereg(d,4); ! 856: } ! 857: else { /* If we try to lock this twice, with different sizes, we ! 858: are int trouble! */ ! 859: s=d=rmw(s,4,4); ! 860: } ! 861: raw_sign_extend_32_rr(d,s); ! 862: if (!isrmw) { ! 863: unlock2(d); ! 864: unlock2(s); ! 865: } ! 866: else { ! 867: unlock2(s); ! 868: } ! 869: } ! 870: MENDFUNC(2,sign_extend_32_rr,(W4 d, RR2 s)) ! 871: #endif ! 872: ! 873: MIDFUNC(2,sign_extend_16_rr,(W4 d, RR2 s)) ! 874: { ! 875: int isrmw; ! 876: ! 877: if (isconst(s)) { ! 878: set_const(d,(uae_s32)(uae_s16)live.state[s].val); ! 879: return; ! 880: } ! 881: ! 882: CLOBBER_SE16; ! 883: isrmw=(s==d); ! 884: if (!isrmw) { ! 885: s=readreg(s,2); ! 886: d=writereg(d,4); ! 887: } ! 888: else { /* If we try to lock this twice, with different sizes, we ! 889: are int trouble! */ ! 890: s=d=rmw(s,4,2); ! 891: } ! 892: raw_sign_extend_16_rr(d,s); ! 893: if (!isrmw) { ! 894: unlock2(d); ! 895: unlock2(s); ! 896: } ! 897: else { ! 898: unlock2(s); ! 899: } ! 900: } ! 901: MENDFUNC(2,sign_extend_16_rr,(W4 d, RR2 s)) ! 902: ! 903: MIDFUNC(2,sign_extend_8_rr,(W4 d, RR1 s)) ! 904: { ! 905: int isrmw; ! 906: ! 907: if (isconst(s)) { ! 908: set_const(d,(uae_s32)(uae_s8)live.state[s].val); ! 909: return; ! 910: } ! 911: ! 912: isrmw=(s==d); ! 913: CLOBBER_SE8; ! 914: if (!isrmw) { ! 915: s=readreg(s,1); ! 916: d=writereg(d,4); ! 917: } ! 918: else { /* If we try to lock this twice, with different sizes, we ! 919: are int trouble! */ ! 920: s=d=rmw(s,4,1); ! 921: } ! 922: ! 923: raw_sign_extend_8_rr(d,s); ! 924: ! 925: if (!isrmw) { ! 926: unlock2(d); ! 927: unlock2(s); ! 928: } ! 929: else { ! 930: unlock2(s); ! 931: } ! 932: } ! 933: MENDFUNC(2,sign_extend_8_rr,(W4 d, RR1 s)) ! 934: ! 935: ! 936: MIDFUNC(2,zero_extend_16_rr,(W4 d, RR2 s)) ! 937: { ! 938: int isrmw; ! 939: ! 940: if (isconst(s)) { ! 941: set_const(d,(uae_u32)(uae_u16)live.state[s].val); ! 942: return; ! 943: } ! 944: ! 945: isrmw=(s==d); ! 946: CLOBBER_ZE16; ! 947: if (!isrmw) { ! 948: s=readreg(s,2); ! 949: d=writereg(d,4); ! 950: } ! 951: else { /* If we try to lock this twice, with different sizes, we ! 952: are int trouble! */ ! 953: s=d=rmw(s,4,2); ! 954: } ! 955: raw_zero_extend_16_rr(d,s); ! 956: if (!isrmw) { ! 957: unlock2(d); ! 958: unlock2(s); ! 959: } ! 960: else { ! 961: unlock2(s); ! 962: } ! 963: } ! 964: MENDFUNC(2,zero_extend_16_rr,(W4 d, RR2 s)) ! 965: ! 966: MIDFUNC(2,zero_extend_8_rr,(W4 d, RR1 s)) ! 967: { ! 968: int isrmw; ! 969: if (isconst(s)) { ! 970: set_const(d,(uae_u32)(uae_u8)live.state[s].val); ! 971: return; ! 972: } ! 973: ! 974: isrmw=(s==d); ! 975: CLOBBER_ZE8; ! 976: if (!isrmw) { ! 977: s=readreg(s,1); ! 978: d=writereg(d,4); ! 979: } ! 980: else { /* If we try to lock this twice, with different sizes, we ! 981: are int trouble! */ ! 982: s=d=rmw(s,4,1); ! 983: } ! 984: ! 985: raw_zero_extend_8_rr(d,s); ! 986: ! 987: if (!isrmw) { ! 988: unlock2(d); ! 989: unlock2(s); ! 990: } ! 991: else { ! 992: unlock2(s); ! 993: } ! 994: } ! 995: MENDFUNC(2,zero_extend_8_rr,(W4 d, RR1 s)) ! 996: ! 997: MIDFUNC(2,mov_b_rr,(W1 d, RR1 s)) ! 998: { ! 999: if (d==s) ! 1000: return; ! 1001: if (isconst(s)) { ! 1002: COMPCALL(mov_b_ri)(d,(uae_u8)live.state[s].val); ! 1003: return; ! 1004: } ! 1005: ! 1006: CLOBBER_MOV; ! 1007: s=readreg(s,1); ! 1008: d=writereg(d,1); ! 1009: raw_mov_b_rr(d,s); ! 1010: unlock2(d); ! 1011: unlock2(s); ! 1012: } ! 1013: MENDFUNC(2,mov_b_rr,(W1 d, RR1 s)) ! 1014: ! 1015: MIDFUNC(2,mov_w_rr,(W2 d, RR2 s)) ! 1016: { ! 1017: if (d==s) ! 1018: return; ! 1019: if (isconst(s)) { ! 1020: COMPCALL(mov_w_ri)(d,(uae_u16)live.state[s].val); ! 1021: return; ! 1022: } ! 1023: ! 1024: CLOBBER_MOV; ! 1025: s=readreg(s,2); ! 1026: d=writereg(d,2); ! 1027: raw_mov_w_rr(d,s); ! 1028: unlock2(d); ! 1029: unlock2(s); ! 1030: } ! 1031: MENDFUNC(2,mov_w_rr,(W2 d, RR2 s)) ! 1032: ! 1033: MIDFUNC(4,mov_l_rrm_indexed,(W4 d,RR4 baser, RR4 index, IMM factor)) ! 1034: { ! 1035: CLOBBER_MOV; ! 1036: baser=readreg(baser,4); ! 1037: index=readreg(index,4); ! 1038: d=writereg(d,4); ! 1039: ! 1040: raw_mov_l_rrm_indexed(d,baser,index,factor); ! 1041: unlock2(d); ! 1042: unlock2(baser); ! 1043: unlock2(index); ! 1044: } ! 1045: MENDFUNC(4,mov_l_rrm_indexed,(W4 d,RR4 baser, RR4 index, IMM factor)) ! 1046: ! 1047: MIDFUNC(4,mov_w_rrm_indexed,(W2 d, RR4 baser, RR4 index, IMM factor)) ! 1048: { ! 1049: CLOBBER_MOV; ! 1050: baser=readreg(baser,4); ! 1051: index=readreg(index,4); ! 1052: d=writereg(d,2); ! 1053: ! 1054: raw_mov_w_rrm_indexed(d,baser,index,factor); ! 1055: unlock2(d); ! 1056: unlock2(baser); ! 1057: unlock2(index); ! 1058: } ! 1059: MENDFUNC(4,mov_w_rrm_indexed,(W2 d, RR4 baser, RR4 index, IMM factor)) ! 1060: ! 1061: MIDFUNC(4,mov_b_rrm_indexed,(W1 d, RR4 baser, RR4 index, IMM factor)) ! 1062: { ! 1063: CLOBBER_MOV; ! 1064: baser=readreg(baser,4); ! 1065: index=readreg(index,4); ! 1066: d=writereg(d,1); ! 1067: ! 1068: raw_mov_b_rrm_indexed(d,baser,index,factor); ! 1069: ! 1070: unlock2(d); ! 1071: unlock2(baser); ! 1072: unlock2(index); ! 1073: } ! 1074: MENDFUNC(4,mov_b_rrm_indexed,(W1 d, RR4 baser, RR4 index, IMM factor)) ! 1075: ! 1076: ! 1077: MIDFUNC(4,mov_l_mrr_indexed,(RR4 baser, RR4 index, IMM factor, RR4 s)) ! 1078: { ! 1079: CLOBBER_MOV; ! 1080: baser=readreg(baser,4); ! 1081: index=readreg(index,4); ! 1082: s=readreg(s,4); ! 1083: ! 1084: Dif (baser==s || index==s) ! 1085: jit_abort("mov_l_mrr_indexed"); ! 1086: ! 1087: ! 1088: raw_mov_l_mrr_indexed(baser,index,factor,s); ! 1089: unlock2(s); ! 1090: unlock2(baser); ! 1091: unlock2(index); ! 1092: } ! 1093: MENDFUNC(4,mov_l_mrr_indexed,(RR4 baser, RR4 index, IMM factor, RR4 s)) ! 1094: ! 1095: MIDFUNC(4,mov_w_mrr_indexed,(RR4 baser, RR4 index, IMM factor, RR2 s)) ! 1096: { ! 1097: CLOBBER_MOV; ! 1098: baser=readreg(baser,4); ! 1099: index=readreg(index,4); ! 1100: s=readreg(s,2); ! 1101: ! 1102: raw_mov_w_mrr_indexed(baser,index,factor,s); ! 1103: unlock2(s); ! 1104: unlock2(baser); ! 1105: unlock2(index); ! 1106: } ! 1107: MENDFUNC(4,mov_w_mrr_indexed,(RR4 baser, RR4 index, IMM factor, RR2 s)) ! 1108: ! 1109: MIDFUNC(4,mov_b_mrr_indexed,(RR4 baser, RR4 index, IMM factor, RR1 s)) ! 1110: { ! 1111: CLOBBER_MOV; ! 1112: s=readreg(s,1); ! 1113: baser=readreg(baser,4); ! 1114: index=readreg(index,4); ! 1115: ! 1116: raw_mov_b_mrr_indexed(baser,index,factor,s); ! 1117: unlock2(s); ! 1118: unlock2(baser); ! 1119: unlock2(index); ! 1120: } ! 1121: MENDFUNC(4,mov_b_mrr_indexed,(RR4 baser, RR4 index, IMM factor, RR1 s)) ! 1122: ! 1123: ! 1124: MIDFUNC(5,mov_l_bmrr_indexed,(IMM base, RR4 baser, RR4 index, IMM factor, RR4 s)) ! 1125: { ! 1126: int basereg=baser; ! 1127: int indexreg=index; ! 1128: ! 1129: CLOBBER_MOV; ! 1130: s=readreg(s,4); ! 1131: baser=readreg_offset(baser,4); ! 1132: index=readreg_offset(index,4); ! 1133: ! 1134: base+=get_offset(basereg); ! 1135: base+=factor*get_offset(indexreg); ! 1136: ! 1137: raw_mov_l_bmrr_indexed(base,baser,index,factor,s); ! 1138: unlock2(s); ! 1139: unlock2(baser); ! 1140: unlock2(index); ! 1141: } ! 1142: MENDFUNC(5,mov_l_bmrr_indexed,(IMM base, RR4 baser, RR4 index, IMM factor, RR4 s)) ! 1143: ! 1144: MIDFUNC(5,mov_w_bmrr_indexed,(IMM base, RR4 baser, RR4 index, IMM factor, RR2 s)) ! 1145: { ! 1146: int basereg=baser; ! 1147: int indexreg=index; ! 1148: ! 1149: CLOBBER_MOV; ! 1150: s=readreg(s,2); ! 1151: baser=readreg_offset(baser,4); ! 1152: index=readreg_offset(index,4); ! 1153: ! 1154: base+=get_offset(basereg); ! 1155: base+=factor*get_offset(indexreg); ! 1156: ! 1157: raw_mov_w_bmrr_indexed(base,baser,index,factor,s); ! 1158: unlock2(s); ! 1159: unlock2(baser); ! 1160: unlock2(index); ! 1161: } ! 1162: MENDFUNC(5,mov_w_bmrr_indexed,(IMM base, RR4 baser, RR4 index, IMM factor, RR2 s)) ! 1163: ! 1164: MIDFUNC(5,mov_b_bmrr_indexed,(IMM base, RR4 baser, RR4 index, IMM factor, RR1 s)) ! 1165: { ! 1166: int basereg=baser; ! 1167: int indexreg=index; ! 1168: ! 1169: CLOBBER_MOV; ! 1170: s=readreg(s,1); ! 1171: baser=readreg_offset(baser,4); ! 1172: index=readreg_offset(index,4); ! 1173: ! 1174: base+=get_offset(basereg); ! 1175: base+=factor*get_offset(indexreg); ! 1176: ! 1177: raw_mov_b_bmrr_indexed(base,baser,index,factor,s); ! 1178: unlock2(s); ! 1179: unlock2(baser); ! 1180: unlock2(index); ! 1181: } ! 1182: MENDFUNC(5,mov_b_bmrr_indexed,(IMM base, RR4 baser, RR4 index, IMM factor, RR1 s)) ! 1183: ! 1184: ! 1185: ! 1186: /* Read a long from base+baser+factor*index */ ! 1187: MIDFUNC(5,mov_l_brrm_indexed,(W4 d, IMM base, RR4 baser, RR4 index, IMM factor)) ! 1188: { ! 1189: int basereg=baser; ! 1190: int indexreg=index; ! 1191: ! 1192: CLOBBER_MOV; ! 1193: baser=readreg_offset(baser,4); ! 1194: index=readreg_offset(index,4); ! 1195: base+=get_offset(basereg); ! 1196: base+=factor*get_offset(indexreg); ! 1197: d=writereg(d,4); ! 1198: raw_mov_l_brrm_indexed(d,base,baser,index,factor); ! 1199: unlock2(d); ! 1200: unlock2(baser); ! 1201: unlock2(index); ! 1202: } ! 1203: MENDFUNC(5,mov_l_brrm_indexed,(W4 d, IMM base, RR4 baser, RR4 index, IMM factor)) ! 1204: ! 1205: ! 1206: MIDFUNC(5,mov_w_brrm_indexed,(W2 d, IMM base, RR4 baser, RR4 index, IMM factor)) ! 1207: { ! 1208: int basereg=baser; ! 1209: int indexreg=index; ! 1210: ! 1211: CLOBBER_MOV; ! 1212: remove_offset(d,-1); ! 1213: baser=readreg_offset(baser,4); ! 1214: index=readreg_offset(index,4); ! 1215: base+=get_offset(basereg); ! 1216: base+=factor*get_offset(indexreg); ! 1217: d=writereg(d,2); ! 1218: raw_mov_w_brrm_indexed(d,base,baser,index,factor); ! 1219: unlock2(d); ! 1220: unlock2(baser); ! 1221: unlock2(index); ! 1222: } ! 1223: MENDFUNC(5,mov_w_brrm_indexed,(W2 d, IMM base, RR4 baser, RR4 index, IMM factor)) ! 1224: ! 1225: ! 1226: MIDFUNC(5,mov_b_brrm_indexed,(W1 d, IMM base, RR4 baser, RR4 index, IMM factor)) ! 1227: { ! 1228: int basereg=baser; ! 1229: int indexreg=index; ! 1230: ! 1231: CLOBBER_MOV; ! 1232: remove_offset(d,-1); ! 1233: baser=readreg_offset(baser,4); ! 1234: index=readreg_offset(index,4); ! 1235: base+=get_offset(basereg); ! 1236: base+=factor*get_offset(indexreg); ! 1237: d=writereg(d,1); ! 1238: raw_mov_b_brrm_indexed(d,base,baser,index,factor); ! 1239: unlock2(d); ! 1240: unlock2(baser); ! 1241: unlock2(index); ! 1242: } ! 1243: MENDFUNC(5,mov_b_brrm_indexed,(W1 d, IMM base, RR4 baser, RR4 index, IMM factor)) ! 1244: ! 1245: /* Read a long from base+factor*index */ ! 1246: MIDFUNC(4,mov_l_rm_indexed,(W4 d, IMM base, RR4 index, IMM factor)) ! 1247: { ! 1248: int indexreg=index; ! 1249: ! 1250: if (isconst(index)) { ! 1251: COMPCALL(mov_l_rm)(d,base+factor*live.state[index].val); ! 1252: return; ! 1253: } ! 1254: ! 1255: CLOBBER_MOV; ! 1256: index=readreg_offset(index,4); ! 1257: base+=get_offset(indexreg)*factor; ! 1258: d=writereg(d,4); ! 1259: ! 1260: raw_mov_l_rm_indexed(d,base,index,factor); ! 1261: unlock2(index); ! 1262: unlock2(d); ! 1263: } ! 1264: MENDFUNC(4,mov_l_rm_indexed,(W4 d, IMM base, RR4 index, IMM factor)) ! 1265: ! 1266: /* read the long at the address contained in s+offset and store in d */ ! 1267: MIDFUNC(3,mov_l_rR,(W4 d, RR4 s, IMM offset)) ! 1268: { ! 1269: if (isconst(s)) { ! 1270: COMPCALL(mov_l_rm)(d,live.state[s].val+offset); ! 1271: return; ! 1272: } ! 1273: CLOBBER_MOV; ! 1274: s=readreg(s,4); ! 1275: d=writereg(d,4); ! 1276: ! 1277: raw_mov_l_rR(d,s,offset); ! 1278: unlock2(d); ! 1279: unlock2(s); ! 1280: } ! 1281: MENDFUNC(3,mov_l_rR,(W4 d, RR4 s, IMM offset)) ! 1282: ! 1283: /* read the word at the address contained in s+offset and store in d */ ! 1284: MIDFUNC(3,mov_w_rR,(W2 d, RR4 s, IMM offset)) ! 1285: { ! 1286: if (isconst(s)) { ! 1287: COMPCALL(mov_w_rm)(d,live.state[s].val+offset); ! 1288: return; ! 1289: } ! 1290: CLOBBER_MOV; ! 1291: s=readreg(s,4); ! 1292: d=writereg(d,2); ! 1293: ! 1294: raw_mov_w_rR(d,s,offset); ! 1295: unlock2(d); ! 1296: unlock2(s); ! 1297: } ! 1298: MENDFUNC(3,mov_w_rR,(W2 d, RR4 s, IMM offset)) ! 1299: ! 1300: /* read the word at the address contained in s+offset and store in d */ ! 1301: MIDFUNC(3,mov_b_rR,(W1 d, RR4 s, IMM offset)) ! 1302: { ! 1303: if (isconst(s)) { ! 1304: COMPCALL(mov_b_rm)(d,live.state[s].val+offset); ! 1305: return; ! 1306: } ! 1307: CLOBBER_MOV; ! 1308: s=readreg(s,4); ! 1309: d=writereg(d,1); ! 1310: ! 1311: raw_mov_b_rR(d,s,offset); ! 1312: unlock2(d); ! 1313: unlock2(s); ! 1314: } ! 1315: MENDFUNC(3,mov_b_rR,(W1 d, RR4 s, IMM offset)) ! 1316: ! 1317: /* read the long at the address contained in s+offset and store in d */ ! 1318: MIDFUNC(3,mov_l_brR,(W4 d, RR4 s, IMM offset)) ! 1319: { ! 1320: int sreg=s; ! 1321: if (isconst(s)) { ! 1322: COMPCALL(mov_l_rm)(d,live.state[s].val+offset); ! 1323: return; ! 1324: } ! 1325: CLOBBER_MOV; ! 1326: s=readreg_offset(s,4); ! 1327: offset+=get_offset(sreg); ! 1328: d=writereg(d,4); ! 1329: ! 1330: raw_mov_l_brR(d,s,offset); ! 1331: unlock2(d); ! 1332: unlock2(s); ! 1333: } ! 1334: MENDFUNC(3,mov_l_brR,(W4 d, RR4 s, IMM offset)) ! 1335: ! 1336: /* read the word at the address contained in s+offset and store in d */ ! 1337: MIDFUNC(3,mov_w_brR,(W2 d, RR4 s, IMM offset)) ! 1338: { ! 1339: int sreg=s; ! 1340: if (isconst(s)) { ! 1341: COMPCALL(mov_w_rm)(d,live.state[s].val+offset); ! 1342: return; ! 1343: } ! 1344: CLOBBER_MOV; ! 1345: remove_offset(d,-1); ! 1346: s=readreg_offset(s,4); ! 1347: offset+=get_offset(sreg); ! 1348: d=writereg(d,2); ! 1349: ! 1350: raw_mov_w_brR(d,s,offset); ! 1351: unlock2(d); ! 1352: unlock2(s); ! 1353: } ! 1354: MENDFUNC(3,mov_w_brR,(W2 d, RR4 s, IMM offset)) ! 1355: ! 1356: /* read the word at the address contained in s+offset and store in d */ ! 1357: MIDFUNC(3,mov_b_brR,(W1 d, RR4 s, IMM offset)) ! 1358: { ! 1359: int sreg=s; ! 1360: if (isconst(s)) { ! 1361: COMPCALL(mov_b_rm)(d,live.state[s].val+offset); ! 1362: return; ! 1363: } ! 1364: CLOBBER_MOV; ! 1365: remove_offset(d,-1); ! 1366: s=readreg_offset(s,4); ! 1367: offset+=get_offset(sreg); ! 1368: d=writereg(d,1); ! 1369: ! 1370: raw_mov_b_brR(d,s,offset); ! 1371: unlock2(d); ! 1372: unlock2(s); ! 1373: } ! 1374: MENDFUNC(3,mov_b_brR,(W1 d, RR4 s, IMM offset)) ! 1375: ! 1376: MIDFUNC(3,mov_l_Ri,(RR4 d, IMM i, IMM offset)) ! 1377: { ! 1378: int dreg=d; ! 1379: if (isconst(d)) { ! 1380: COMPCALL(mov_l_mi)(live.state[d].val+offset,i); ! 1381: return; ! 1382: } ! 1383: ! 1384: CLOBBER_MOV; ! 1385: d=readreg_offset(d,4); ! 1386: offset+=get_offset(dreg); ! 1387: raw_mov_l_Ri(d,i,offset); ! 1388: unlock2(d); ! 1389: } ! 1390: MENDFUNC(3,mov_l_Ri,(RR4 d, IMM i, IMM offset)) ! 1391: ! 1392: MIDFUNC(3,mov_w_Ri,(RR4 d, IMM i, IMM offset)) ! 1393: { ! 1394: int dreg=d; ! 1395: if (isconst(d)) { ! 1396: COMPCALL(mov_w_mi)(live.state[d].val+offset,i); ! 1397: return; ! 1398: } ! 1399: ! 1400: CLOBBER_MOV; ! 1401: d=readreg_offset(d,4); ! 1402: offset+=get_offset(dreg); ! 1403: raw_mov_w_Ri(d,i,offset); ! 1404: unlock2(d); ! 1405: } ! 1406: MENDFUNC(3,mov_w_Ri,(RR4 d, IMM i, IMM offset)) ! 1407: ! 1408: MIDFUNC(3,mov_b_Ri,(RR4 d, IMM i, IMM offset)) ! 1409: { ! 1410: int dreg=d; ! 1411: if (isconst(d)) { ! 1412: COMPCALL(mov_b_mi)(live.state[d].val+offset,i); ! 1413: return; ! 1414: } ! 1415: ! 1416: CLOBBER_MOV; ! 1417: d=readreg_offset(d,4); ! 1418: offset+=get_offset(dreg); ! 1419: raw_mov_b_Ri(d,i,offset); ! 1420: unlock2(d); ! 1421: } ! 1422: MENDFUNC(3,mov_b_Ri,(RR4 d, IMM i, IMM offset)) ! 1423: ! 1424: /* Warning! OFFSET is byte sized only! */ ! 1425: MIDFUNC(3,mov_l_Rr,(RR4 d, RR4 s, IMM offset)) ! 1426: { ! 1427: if (isconst(d)) { ! 1428: COMPCALL(mov_l_mr)(live.state[d].val+offset,s); ! 1429: return; ! 1430: } ! 1431: if (isconst(s)) { ! 1432: COMPCALL(mov_l_Ri)(d,live.state[s].val,offset); ! 1433: return; ! 1434: } ! 1435: ! 1436: CLOBBER_MOV; ! 1437: s=readreg(s,4); ! 1438: d=readreg(d,4); ! 1439: ! 1440: raw_mov_l_Rr(d,s,offset); ! 1441: unlock2(d); ! 1442: unlock2(s); ! 1443: } ! 1444: MENDFUNC(3,mov_l_Rr,(RR4 d, RR4 s, IMM offset)) ! 1445: ! 1446: MIDFUNC(3,mov_w_Rr,(RR4 d, RR2 s, IMM offset)) ! 1447: { ! 1448: if (isconst(d)) { ! 1449: COMPCALL(mov_w_mr)(live.state[d].val+offset,s); ! 1450: return; ! 1451: } ! 1452: if (isconst(s)) { ! 1453: COMPCALL(mov_w_Ri)(d,(uae_u16)live.state[s].val,offset); ! 1454: return; ! 1455: } ! 1456: ! 1457: CLOBBER_MOV; ! 1458: s=readreg(s,2); ! 1459: d=readreg(d,4); ! 1460: raw_mov_w_Rr(d,s,offset); ! 1461: unlock2(d); ! 1462: unlock2(s); ! 1463: } ! 1464: MENDFUNC(3,mov_w_Rr,(RR4 d, RR2 s, IMM offset)) ! 1465: ! 1466: MIDFUNC(3,mov_b_Rr,(RR4 d, RR1 s, IMM offset)) ! 1467: { ! 1468: if (isconst(d)) { ! 1469: COMPCALL(mov_b_mr)(live.state[d].val+offset,s); ! 1470: return; ! 1471: } ! 1472: if (isconst(s)) { ! 1473: COMPCALL(mov_b_Ri)(d,(uae_u8)live.state[s].val,offset); ! 1474: return; ! 1475: } ! 1476: ! 1477: CLOBBER_MOV; ! 1478: s=readreg(s,1); ! 1479: d=readreg(d,4); ! 1480: raw_mov_b_Rr(d,s,offset); ! 1481: unlock2(d); ! 1482: unlock2(s); ! 1483: } ! 1484: MENDFUNC(3,mov_b_Rr,(RR4 d, RR1 s, IMM offset)) ! 1485: ! 1486: MIDFUNC(3,lea_l_brr,(W4 d, RR4 s, IMM offset)) ! 1487: { ! 1488: if (isconst(s)) { ! 1489: COMPCALL(mov_l_ri)(d,live.state[s].val+offset); ! 1490: return; ! 1491: } ! 1492: #if USE_OFFSET ! 1493: if (d==s) { ! 1494: add_offset(d,offset); ! 1495: return; ! 1496: } ! 1497: #endif ! 1498: CLOBBER_LEA; ! 1499: s=readreg(s,4); ! 1500: d=writereg(d,4); ! 1501: raw_lea_l_brr(d,s,offset); ! 1502: unlock2(d); ! 1503: unlock2(s); ! 1504: } ! 1505: MENDFUNC(3,lea_l_brr,(W4 d, RR4 s, IMM offset)) ! 1506: ! 1507: MIDFUNC(5,lea_l_brr_indexed,(W4 d, RR4 s, RR4 index, IMM factor, IMM offset)) ! 1508: { ! 1509: if (!offset) { ! 1510: COMPCALL(lea_l_rr_indexed)(d,s,index,factor); ! 1511: return; ! 1512: } ! 1513: CLOBBER_LEA; ! 1514: s=readreg(s,4); ! 1515: index=readreg(index,4); ! 1516: d=writereg(d,4); ! 1517: ! 1518: raw_lea_l_brr_indexed(d,s,index,factor,offset); ! 1519: unlock2(d); ! 1520: unlock2(index); ! 1521: unlock2(s); ! 1522: } ! 1523: MENDFUNC(5,lea_l_brr_indexed,(W4 d, RR4 s, RR4 index, IMM factor, IMM offset)) ! 1524: ! 1525: MIDFUNC(4,lea_l_rr_indexed,(W4 d, RR4 s, RR4 index, IMM factor)) ! 1526: { ! 1527: CLOBBER_LEA; ! 1528: s=readreg(s,4); ! 1529: index=readreg(index,4); ! 1530: d=writereg(d,4); ! 1531: ! 1532: raw_lea_l_rr_indexed(d,s,index,factor); ! 1533: unlock2(d); ! 1534: unlock2(index); ! 1535: unlock2(s); ! 1536: } ! 1537: MENDFUNC(4,lea_l_rr_indexed,(W4 d, RR4 s, RR4 index, IMM factor)) ! 1538: ! 1539: /* write d to the long at the address contained in s+offset */ ! 1540: MIDFUNC(3,mov_l_bRr,(RR4 d, RR4 s, IMM offset)) ! 1541: { ! 1542: int dreg=d; ! 1543: if (isconst(d)) { ! 1544: COMPCALL(mov_l_mr)(live.state[d].val+offset,s); ! 1545: return; ! 1546: } ! 1547: ! 1548: CLOBBER_MOV; ! 1549: s=readreg(s,4); ! 1550: d=readreg_offset(d,4); ! 1551: offset+=get_offset(dreg); ! 1552: ! 1553: raw_mov_l_bRr(d,s,offset); ! 1554: unlock2(d); ! 1555: unlock2(s); ! 1556: } ! 1557: MENDFUNC(3,mov_l_bRr,(RR4 d, RR4 s, IMM offset)) ! 1558: ! 1559: /* write the word at the address contained in s+offset and store in d */ ! 1560: MIDFUNC(3,mov_w_bRr,(RR4 d, RR2 s, IMM offset)) ! 1561: { ! 1562: int dreg=d; ! 1563: ! 1564: if (isconst(d)) { ! 1565: COMPCALL(mov_w_mr)(live.state[d].val+offset,s); ! 1566: return; ! 1567: } ! 1568: ! 1569: CLOBBER_MOV; ! 1570: s=readreg(s,2); ! 1571: d=readreg_offset(d,4); ! 1572: offset+=get_offset(dreg); ! 1573: raw_mov_w_bRr(d,s,offset); ! 1574: unlock2(d); ! 1575: unlock2(s); ! 1576: } ! 1577: MENDFUNC(3,mov_w_bRr,(RR4 d, RR2 s, IMM offset)) ! 1578: ! 1579: MIDFUNC(3,mov_b_bRr,(RR4 d, RR1 s, IMM offset)) ! 1580: { ! 1581: int dreg=d; ! 1582: if (isconst(d)) { ! 1583: COMPCALL(mov_b_mr)(live.state[d].val+offset,s); ! 1584: return; ! 1585: } ! 1586: ! 1587: CLOBBER_MOV; ! 1588: s=readreg(s,1); ! 1589: d=readreg_offset(d,4); ! 1590: offset+=get_offset(dreg); ! 1591: raw_mov_b_bRr(d,s,offset); ! 1592: unlock2(d); ! 1593: unlock2(s); ! 1594: } ! 1595: MENDFUNC(3,mov_b_bRr,(RR4 d, RR1 s, IMM offset)) ! 1596: ! 1597: MIDFUNC(1,mid_bswap_32,(RW4 r)) ! 1598: { ! 1599: ! 1600: if (isconst(r)) { ! 1601: uae_u32 oldv=live.state[r].val; ! 1602: live.state[r].val=reverse32(oldv); ! 1603: return; ! 1604: } ! 1605: ! 1606: CLOBBER_SW32; ! 1607: r=rmw(r,4,4); ! 1608: raw_bswap_32(r); ! 1609: unlock2(r); ! 1610: } ! 1611: MENDFUNC(1,mid_bswap_32,(RW4 r)) ! 1612: ! 1613: MIDFUNC(1,mid_bswap_16,(RW2 r)) ! 1614: { ! 1615: if (isconst(r)) { ! 1616: uae_u32 oldv=live.state[r].val; ! 1617: live.state[r].val=((oldv>>8)&0xff) | ((oldv<<8)&0xff00) | ! 1618: (oldv&0xffff0000); ! 1619: return; ! 1620: } ! 1621: ! 1622: CLOBBER_SW16; ! 1623: r=rmw(r,2,2); ! 1624: ! 1625: raw_bswap_16(r); ! 1626: unlock2(r); ! 1627: } ! 1628: MENDFUNC(1,mid_bswap_16,(RW2 r)) ! 1629: ! 1630: ! 1631: ! 1632: MIDFUNC(2,mov_l_rr,(W4 d, RR4 s)) ! 1633: { ! 1634: int olds; ! 1635: ! 1636: if (d==s) { /* How pointless! */ ! 1637: return; ! 1638: } ! 1639: if (isconst(s)) { ! 1640: COMPCALL(mov_l_ri)(d,live.state[s].val); ! 1641: return; ! 1642: } ! 1643: olds=s; ! 1644: disassociate(d); ! 1645: s=readreg_offset(s,4); ! 1646: live.state[d].realreg=s; ! 1647: live.state[d].realind=live.nat[s].nholds; ! 1648: live.state[d].val=live.state[olds].val; ! 1649: live.state[d].validsize=4; ! 1650: live.state[d].dirtysize=4; ! 1651: set_status(d,DIRTY); ! 1652: ! 1653: live.nat[s].holds[live.nat[s].nholds]=d; ! 1654: live.nat[s].nholds++; ! 1655: log_clobberreg(d); ! 1656: jit_log2("Added %d to nreg %d(%d), now holds %d regs", d,s,live.state[d].realind,live.nat[s].nholds); ! 1657: unlock2(s); ! 1658: } ! 1659: MENDFUNC(2,mov_l_rr,(W4 d, RR4 s)) ! 1660: ! 1661: MIDFUNC(2,mov_l_mr,(IMM d, RR4 s)) ! 1662: { ! 1663: if (isconst(s)) { ! 1664: COMPCALL(mov_l_mi)(d,live.state[s].val); ! 1665: return; ! 1666: } ! 1667: CLOBBER_MOV; ! 1668: s=readreg(s,4); ! 1669: ! 1670: raw_mov_l_mr(d,s); ! 1671: unlock2(s); ! 1672: } ! 1673: MENDFUNC(2,mov_l_mr,(IMM d, RR4 s)) ! 1674: ! 1675: ! 1676: MIDFUNC(2,mov_w_mr,(IMM d, RR2 s)) ! 1677: { ! 1678: if (isconst(s)) { ! 1679: COMPCALL(mov_w_mi)(d,(uae_u16)live.state[s].val); ! 1680: return; ! 1681: } ! 1682: CLOBBER_MOV; ! 1683: s=readreg(s,2); ! 1684: ! 1685: raw_mov_w_mr(d,s); ! 1686: unlock2(s); ! 1687: } ! 1688: MENDFUNC(2,mov_w_mr,(IMM d, RR2 s)) ! 1689: ! 1690: MIDFUNC(2,mov_w_rm,(W2 d, IMM s)) ! 1691: { ! 1692: CLOBBER_MOV; ! 1693: d=writereg(d,2); ! 1694: ! 1695: raw_mov_w_rm(d,s); ! 1696: unlock2(d); ! 1697: } ! 1698: MENDFUNC(2,mov_w_rm,(W2 d, IMM s)) ! 1699: ! 1700: MIDFUNC(2,mov_b_mr,(IMM d, RR1 s)) ! 1701: { ! 1702: if (isconst(s)) { ! 1703: COMPCALL(mov_b_mi)(d,(uae_u8)live.state[s].val); ! 1704: return; ! 1705: } ! 1706: ! 1707: CLOBBER_MOV; ! 1708: s=readreg(s,1); ! 1709: ! 1710: raw_mov_b_mr(d,s); ! 1711: unlock2(s); ! 1712: } ! 1713: MENDFUNC(2,mov_b_mr,(IMM d, RR1 s)) ! 1714: ! 1715: MIDFUNC(2,mov_b_rm,(W1 d, IMM s)) ! 1716: { ! 1717: CLOBBER_MOV; ! 1718: d=writereg(d,1); ! 1719: ! 1720: raw_mov_b_rm(d,s); ! 1721: unlock2(d); ! 1722: } ! 1723: MENDFUNC(2,mov_b_rm,(W1 d, IMM s)) ! 1724: ! 1725: MIDFUNC(2,mov_l_ri,(W4 d, IMM s)) ! 1726: { ! 1727: set_const(d,s); ! 1728: return; ! 1729: } ! 1730: MENDFUNC(2,mov_l_ri,(W4 d, IMM s)) ! 1731: ! 1732: MIDFUNC(2,mov_w_ri,(W2 d, IMM s)) ! 1733: { ! 1734: CLOBBER_MOV; ! 1735: d=writereg(d,2); ! 1736: ! 1737: raw_mov_w_ri(d,s); ! 1738: unlock2(d); ! 1739: } ! 1740: MENDFUNC(2,mov_w_ri,(W2 d, IMM s)) ! 1741: ! 1742: MIDFUNC(2,mov_b_ri,(W1 d, IMM s)) ! 1743: { ! 1744: CLOBBER_MOV; ! 1745: d=writereg(d,1); ! 1746: ! 1747: raw_mov_b_ri(d,s); ! 1748: unlock2(d); ! 1749: } ! 1750: MENDFUNC(2,mov_b_ri,(W1 d, IMM s)) ! 1751: ! 1752: MIDFUNC(2,add_l_mi,(IMM d, IMM s)) ! 1753: { ! 1754: CLOBBER_ADD; ! 1755: raw_add_l_mi(d,s) ; ! 1756: } ! 1757: MENDFUNC(2,add_l_mi,(IMM d, IMM s)) ! 1758: ! 1759: MIDFUNC(2,add_w_mi,(IMM d, IMM s)) ! 1760: { ! 1761: CLOBBER_ADD; ! 1762: raw_add_w_mi(d,s) ; ! 1763: } ! 1764: MENDFUNC(2,add_w_mi,(IMM d, IMM s)) ! 1765: ! 1766: MIDFUNC(2,add_b_mi,(IMM d, IMM s)) ! 1767: { ! 1768: CLOBBER_ADD; ! 1769: raw_add_b_mi(d,s) ; ! 1770: } ! 1771: MENDFUNC(2,add_b_mi,(IMM d, IMM s)) ! 1772: ! 1773: MIDFUNC(2,test_l_ri,(RR4 d, IMM i)) ! 1774: { ! 1775: CLOBBER_TEST; ! 1776: d=readreg(d,4); ! 1777: ! 1778: raw_test_l_ri(d,i); ! 1779: unlock2(d); ! 1780: } ! 1781: MENDFUNC(2,test_l_ri,(RR4 d, IMM i)) ! 1782: ! 1783: MIDFUNC(2,test_l_rr,(RR4 d, RR4 s)) ! 1784: { ! 1785: CLOBBER_TEST; ! 1786: d=readreg(d,4); ! 1787: s=readreg(s,4); ! 1788: ! 1789: raw_test_l_rr(d,s);; ! 1790: unlock2(d); ! 1791: unlock2(s); ! 1792: } ! 1793: MENDFUNC(2,test_l_rr,(RR4 d, RR4 s)) ! 1794: ! 1795: MIDFUNC(2,test_w_rr,(RR2 d, RR2 s)) ! 1796: { ! 1797: CLOBBER_TEST; ! 1798: d=readreg(d,2); ! 1799: s=readreg(s,2); ! 1800: ! 1801: raw_test_w_rr(d,s); ! 1802: unlock2(d); ! 1803: unlock2(s); ! 1804: } ! 1805: MENDFUNC(2,test_w_rr,(RR2 d, RR2 s)) ! 1806: ! 1807: MIDFUNC(2,test_b_rr,(RR1 d, RR1 s)) ! 1808: { ! 1809: CLOBBER_TEST; ! 1810: d=readreg(d,1); ! 1811: s=readreg(s,1); ! 1812: ! 1813: raw_test_b_rr(d,s); ! 1814: unlock2(d); ! 1815: unlock2(s); ! 1816: } ! 1817: MENDFUNC(2,test_b_rr,(RR1 d, RR1 s)) ! 1818: ! 1819: ! 1820: MIDFUNC(2,and_l_ri,(RW4 d, IMM i)) ! 1821: { ! 1822: if (isconst (d) && ! needflags) { ! 1823: live.state[d].val &= i; ! 1824: return; ! 1825: } ! 1826: ! 1827: CLOBBER_AND; ! 1828: d=rmw(d,4,4); ! 1829: ! 1830: raw_and_l_ri(d,i); ! 1831: unlock2(d); ! 1832: } ! 1833: MENDFUNC(2,and_l_ri,(RW4 d, IMM i)) ! 1834: ! 1835: MIDFUNC(2,and_l,(RW4 d, RR4 s)) ! 1836: { ! 1837: CLOBBER_AND; ! 1838: s=readreg(s,4); ! 1839: d=rmw(d,4,4); ! 1840: ! 1841: raw_and_l(d,s); ! 1842: unlock2(d); ! 1843: unlock2(s); ! 1844: } ! 1845: MENDFUNC(2,and_l,(RW4 d, RR4 s)) ! 1846: ! 1847: MIDFUNC(2,and_w,(RW2 d, RR2 s)) ! 1848: { ! 1849: CLOBBER_AND; ! 1850: s=readreg(s,2); ! 1851: d=rmw(d,2,2); ! 1852: ! 1853: raw_and_w(d,s); ! 1854: unlock2(d); ! 1855: unlock2(s); ! 1856: } ! 1857: MENDFUNC(2,and_w,(RW2 d, RR2 s)) ! 1858: ! 1859: MIDFUNC(2,and_b,(RW1 d, RR1 s)) ! 1860: { ! 1861: CLOBBER_AND; ! 1862: s=readreg(s,1); ! 1863: d=rmw(d,1,1); ! 1864: ! 1865: raw_and_b(d,s); ! 1866: unlock2(d); ! 1867: unlock2(s); ! 1868: } ! 1869: MENDFUNC(2,and_b,(RW1 d, RR1 s)) ! 1870: ! 1871: // gb-- used for making an fpcr value in compemu_fpp.cpp ! 1872: MIDFUNC(2,or_l_rm,(RW4 d, IMM s)) ! 1873: { ! 1874: CLOBBER_OR; ! 1875: d=rmw(d,4,4); ! 1876: ! 1877: raw_or_l_rm(d,s); ! 1878: unlock2(d); ! 1879: } ! 1880: MENDFUNC(2,or_l_rm,(RW4 d, IMM s)) ! 1881: ! 1882: MIDFUNC(2,or_l_ri,(RW4 d, IMM i)) ! 1883: { ! 1884: if (isconst(d) && !needflags) { ! 1885: live.state[d].val|=i; ! 1886: return; ! 1887: } ! 1888: CLOBBER_OR; ! 1889: d=rmw(d,4,4); ! 1890: ! 1891: raw_or_l_ri(d,i); ! 1892: unlock2(d); ! 1893: } ! 1894: MENDFUNC(2,or_l_ri,(RW4 d, IMM i)) ! 1895: ! 1896: MIDFUNC(2,or_l,(RW4 d, RR4 s)) ! 1897: { ! 1898: if (isconst(d) && isconst(s) && !needflags) { ! 1899: live.state[d].val|=live.state[s].val; ! 1900: return; ! 1901: } ! 1902: CLOBBER_OR; ! 1903: s=readreg(s,4); ! 1904: d=rmw(d,4,4); ! 1905: ! 1906: raw_or_l(d,s); ! 1907: unlock2(d); ! 1908: unlock2(s); ! 1909: } ! 1910: MENDFUNC(2,or_l,(RW4 d, RR4 s)) ! 1911: ! 1912: MIDFUNC(2,or_w,(RW2 d, RR2 s)) ! 1913: { ! 1914: CLOBBER_OR; ! 1915: s=readreg(s,2); ! 1916: d=rmw(d,2,2); ! 1917: ! 1918: raw_or_w(d,s); ! 1919: unlock2(d); ! 1920: unlock2(s); ! 1921: } ! 1922: MENDFUNC(2,or_w,(RW2 d, RR2 s)) ! 1923: ! 1924: MIDFUNC(2,or_b,(RW1 d, RR1 s)) ! 1925: { ! 1926: CLOBBER_OR; ! 1927: s=readreg(s,1); ! 1928: d=rmw(d,1,1); ! 1929: ! 1930: raw_or_b(d,s); ! 1931: unlock2(d); ! 1932: unlock2(s); ! 1933: } ! 1934: MENDFUNC(2,or_b,(RW1 d, RR1 s)) ! 1935: ! 1936: MIDFUNC(2,adc_l,(RW4 d, RR4 s)) ! 1937: { ! 1938: CLOBBER_ADC; ! 1939: s=readreg(s,4); ! 1940: d=rmw(d,4,4); ! 1941: ! 1942: raw_adc_l(d,s); ! 1943: ! 1944: unlock2(d); ! 1945: unlock2(s); ! 1946: } ! 1947: MENDFUNC(2,adc_l,(RW4 d, RR4 s)) ! 1948: ! 1949: MIDFUNC(2,adc_w,(RW2 d, RR2 s)) ! 1950: { ! 1951: CLOBBER_ADC; ! 1952: s=readreg(s,2); ! 1953: d=rmw(d,2,2); ! 1954: ! 1955: raw_adc_w(d,s); ! 1956: unlock2(d); ! 1957: unlock2(s); ! 1958: } ! 1959: MENDFUNC(2,adc_w,(RW2 d, RR2 s)) ! 1960: ! 1961: MIDFUNC(2,adc_b,(RW1 d, RR1 s)) ! 1962: { ! 1963: CLOBBER_ADC; ! 1964: s=readreg(s,1); ! 1965: d=rmw(d,1,1); ! 1966: ! 1967: raw_adc_b(d,s); ! 1968: unlock2(d); ! 1969: unlock2(s); ! 1970: } ! 1971: MENDFUNC(2,adc_b,(RW1 d, RR1 s)) ! 1972: ! 1973: MIDFUNC(2,add_l,(RW4 d, RR4 s)) ! 1974: { ! 1975: if (isconst(s)) { ! 1976: COMPCALL(add_l_ri)(d,live.state[s].val); ! 1977: return; ! 1978: } ! 1979: ! 1980: CLOBBER_ADD; ! 1981: s=readreg(s,4); ! 1982: d=rmw(d,4,4); ! 1983: ! 1984: raw_add_l(d,s); ! 1985: ! 1986: unlock2(d); ! 1987: unlock2(s); ! 1988: } ! 1989: MENDFUNC(2,add_l,(RW4 d, RR4 s)) ! 1990: ! 1991: MIDFUNC(2,add_w,(RW2 d, RR2 s)) ! 1992: { ! 1993: if (isconst(s)) { ! 1994: COMPCALL(add_w_ri)(d,(uae_u16)live.state[s].val); ! 1995: return; ! 1996: } ! 1997: ! 1998: CLOBBER_ADD; ! 1999: s=readreg(s,2); ! 2000: d=rmw(d,2,2); ! 2001: ! 2002: raw_add_w(d,s); ! 2003: unlock2(d); ! 2004: unlock2(s); ! 2005: } ! 2006: MENDFUNC(2,add_w,(RW2 d, RR2 s)) ! 2007: ! 2008: MIDFUNC(2,add_b,(RW1 d, RR1 s)) ! 2009: { ! 2010: if (isconst(s)) { ! 2011: COMPCALL(add_b_ri)(d,(uae_u8)live.state[s].val); ! 2012: return; ! 2013: } ! 2014: ! 2015: CLOBBER_ADD; ! 2016: s=readreg(s,1); ! 2017: d=rmw(d,1,1); ! 2018: ! 2019: raw_add_b(d,s); ! 2020: unlock2(d); ! 2021: unlock2(s); ! 2022: } ! 2023: MENDFUNC(2,add_b,(RW1 d, RR1 s)) ! 2024: ! 2025: MIDFUNC(2,sub_l_ri,(RW4 d, IMM i)) ! 2026: { ! 2027: if (!i && !needflags) ! 2028: return; ! 2029: if (isconst(d) && !needflags) { ! 2030: live.state[d].val-=i; ! 2031: return; ! 2032: } ! 2033: #if USE_OFFSET ! 2034: if (!needflags) { ! 2035: add_offset(d,-i); ! 2036: return; ! 2037: } ! 2038: #endif ! 2039: ! 2040: CLOBBER_SUB; ! 2041: d=rmw(d,4,4); ! 2042: ! 2043: raw_sub_l_ri(d,i); ! 2044: unlock2(d); ! 2045: } ! 2046: MENDFUNC(2,sub_l_ri,(RW4 d, IMM i)) ! 2047: ! 2048: MIDFUNC(2,sub_w_ri,(RW2 d, IMM i)) ! 2049: { ! 2050: if (!i && !needflags) ! 2051: return; ! 2052: ! 2053: CLOBBER_SUB; ! 2054: d=rmw(d,2,2); ! 2055: ! 2056: raw_sub_w_ri(d,i); ! 2057: unlock2(d); ! 2058: } ! 2059: MENDFUNC(2,sub_w_ri,(RW2 d, IMM i)) ! 2060: ! 2061: MIDFUNC(2,sub_b_ri,(RW1 d, IMM i)) ! 2062: { ! 2063: if (!i && !needflags) ! 2064: return; ! 2065: ! 2066: CLOBBER_SUB; ! 2067: d=rmw(d,1,1); ! 2068: ! 2069: raw_sub_b_ri(d,i); ! 2070: ! 2071: unlock2(d); ! 2072: } ! 2073: MENDFUNC(2,sub_b_ri,(RW1 d, IMM i)) ! 2074: ! 2075: MIDFUNC(2,add_l_ri,(RW4 d, IMM i)) ! 2076: { ! 2077: if (!i && !needflags) ! 2078: return; ! 2079: if (isconst(d) && !needflags) { ! 2080: live.state[d].val+=i; ! 2081: return; ! 2082: } ! 2083: #if USE_OFFSET ! 2084: if (!needflags) { ! 2085: add_offset(d,i); ! 2086: return; ! 2087: } ! 2088: #endif ! 2089: CLOBBER_ADD; ! 2090: d=rmw(d,4,4); ! 2091: raw_add_l_ri(d,i); ! 2092: unlock2(d); ! 2093: } ! 2094: MENDFUNC(2,add_l_ri,(RW4 d, IMM i)) ! 2095: ! 2096: MIDFUNC(2,add_w_ri,(RW2 d, IMM i)) ! 2097: { ! 2098: if (!i && !needflags) ! 2099: return; ! 2100: ! 2101: CLOBBER_ADD; ! 2102: d=rmw(d,2,2); ! 2103: ! 2104: raw_add_w_ri(d,i); ! 2105: unlock2(d); ! 2106: } ! 2107: MENDFUNC(2,add_w_ri,(RW2 d, IMM i)) ! 2108: ! 2109: MIDFUNC(2,add_b_ri,(RW1 d, IMM i)) ! 2110: { ! 2111: if (!i && !needflags) ! 2112: return; ! 2113: ! 2114: CLOBBER_ADD; ! 2115: d=rmw(d,1,1); ! 2116: ! 2117: raw_add_b_ri(d,i); ! 2118: ! 2119: unlock2(d); ! 2120: } ! 2121: MENDFUNC(2,add_b_ri,(RW1 d, IMM i)) ! 2122: ! 2123: MIDFUNC(2,sbb_l,(RW4 d, RR4 s)) ! 2124: { ! 2125: CLOBBER_SBB; ! 2126: s=readreg(s,4); ! 2127: d=rmw(d,4,4); ! 2128: ! 2129: raw_sbb_l(d,s); ! 2130: unlock2(d); ! 2131: unlock2(s); ! 2132: } ! 2133: MENDFUNC(2,sbb_l,(RW4 d, RR4 s)) ! 2134: ! 2135: MIDFUNC(2,sbb_w,(RW2 d, RR2 s)) ! 2136: { ! 2137: CLOBBER_SBB; ! 2138: s=readreg(s,2); ! 2139: d=rmw(d,2,2); ! 2140: ! 2141: raw_sbb_w(d,s); ! 2142: unlock2(d); ! 2143: unlock2(s); ! 2144: } ! 2145: MENDFUNC(2,sbb_w,(RW2 d, RR2 s)) ! 2146: ! 2147: MIDFUNC(2,sbb_b,(RW1 d, RR1 s)) ! 2148: { ! 2149: CLOBBER_SBB; ! 2150: s=readreg(s,1); ! 2151: d=rmw(d,1,1); ! 2152: ! 2153: raw_sbb_b(d,s); ! 2154: unlock2(d); ! 2155: unlock2(s); ! 2156: } ! 2157: MENDFUNC(2,sbb_b,(RW1 d, RR1 s)) ! 2158: ! 2159: MIDFUNC(2,sub_l,(RW4 d, RR4 s)) ! 2160: { ! 2161: if (isconst(s)) { ! 2162: COMPCALL(sub_l_ri)(d,live.state[s].val); ! 2163: return; ! 2164: } ! 2165: ! 2166: CLOBBER_SUB; ! 2167: s=readreg(s,4); ! 2168: d=rmw(d,4,4); ! 2169: ! 2170: raw_sub_l(d,s); ! 2171: unlock2(d); ! 2172: unlock2(s); ! 2173: } ! 2174: MENDFUNC(2,sub_l,(RW4 d, RR4 s)) ! 2175: ! 2176: MIDFUNC(2,sub_w,(RW2 d, RR2 s)) ! 2177: { ! 2178: if (isconst(s)) { ! 2179: COMPCALL(sub_w_ri)(d,(uae_u16)live.state[s].val); ! 2180: return; ! 2181: } ! 2182: ! 2183: CLOBBER_SUB; ! 2184: s=readreg(s,2); ! 2185: d=rmw(d,2,2); ! 2186: ! 2187: raw_sub_w(d,s); ! 2188: unlock2(d); ! 2189: unlock2(s); ! 2190: } ! 2191: MENDFUNC(2,sub_w,(RW2 d, RR2 s)) ! 2192: ! 2193: MIDFUNC(2,sub_b,(RW1 d, RR1 s)) ! 2194: { ! 2195: if (isconst(s)) { ! 2196: COMPCALL(sub_b_ri)(d,(uae_u8)live.state[s].val); ! 2197: return; ! 2198: } ! 2199: ! 2200: CLOBBER_SUB; ! 2201: s=readreg(s,1); ! 2202: d=rmw(d,1,1); ! 2203: ! 2204: raw_sub_b(d,s); ! 2205: unlock2(d); ! 2206: unlock2(s); ! 2207: } ! 2208: MENDFUNC(2,sub_b,(RW1 d, RR1 s)) ! 2209: ! 2210: MIDFUNC(2,cmp_l,(RR4 d, RR4 s)) ! 2211: { ! 2212: CLOBBER_CMP; ! 2213: s=readreg(s,4); ! 2214: d=readreg(d,4); ! 2215: ! 2216: raw_cmp_l(d,s); ! 2217: unlock2(d); ! 2218: unlock2(s); ! 2219: } ! 2220: MENDFUNC(2,cmp_l,(RR4 d, RR4 s)) ! 2221: ! 2222: MIDFUNC(2,cmp_l_ri,(RR4 r, IMM i)) ! 2223: { ! 2224: CLOBBER_CMP; ! 2225: r=readreg(r,4); ! 2226: ! 2227: raw_cmp_l_ri(r,i); ! 2228: unlock2(r); ! 2229: } ! 2230: MENDFUNC(2,cmp_l_ri,(RR4 r, IMM i)) ! 2231: ! 2232: MIDFUNC(2,cmp_w,(RR2 d, RR2 s)) ! 2233: { ! 2234: CLOBBER_CMP; ! 2235: s=readreg(s,2); ! 2236: d=readreg(d,2); ! 2237: ! 2238: raw_cmp_w(d,s); ! 2239: unlock2(d); ! 2240: unlock2(s); ! 2241: } ! 2242: MENDFUNC(2,cmp_w,(RR2 d, RR2 s)) ! 2243: ! 2244: MIDFUNC(2,cmp_b,(RR1 d, RR1 s)) ! 2245: { ! 2246: CLOBBER_CMP; ! 2247: s=readreg(s,1); ! 2248: d=readreg(d,1); ! 2249: ! 2250: raw_cmp_b(d,s); ! 2251: unlock2(d); ! 2252: unlock2(s); ! 2253: } ! 2254: MENDFUNC(2,cmp_b,(RR1 d, RR1 s)) ! 2255: ! 2256: ! 2257: MIDFUNC(2,xor_l,(RW4 d, RR4 s)) ! 2258: { ! 2259: CLOBBER_XOR; ! 2260: s=readreg(s,4); ! 2261: d=rmw(d,4,4); ! 2262: ! 2263: raw_xor_l(d,s); ! 2264: unlock2(d); ! 2265: unlock2(s); ! 2266: } ! 2267: MENDFUNC(2,xor_l,(RW4 d, RR4 s)) ! 2268: ! 2269: MIDFUNC(2,xor_w,(RW2 d, RR2 s)) ! 2270: { ! 2271: CLOBBER_XOR; ! 2272: s=readreg(s,2); ! 2273: d=rmw(d,2,2); ! 2274: ! 2275: raw_xor_w(d,s); ! 2276: unlock2(d); ! 2277: unlock2(s); ! 2278: } ! 2279: MENDFUNC(2,xor_w,(RW2 d, RR2 s)) ! 2280: ! 2281: MIDFUNC(2,xor_b,(RW1 d, RR1 s)) ! 2282: { ! 2283: CLOBBER_XOR; ! 2284: s=readreg(s,1); ! 2285: d=rmw(d,1,1); ! 2286: ! 2287: raw_xor_b(d,s); ! 2288: unlock2(d); ! 2289: unlock2(s); ! 2290: } ! 2291: MENDFUNC(2,xor_b,(RW1 d, RR1 s)) ! 2292: ! 2293: MIDFUNC(5,call_r_11,(W4 out1, RR4 r, RR4 in1, IMM osize, IMM isize)) ! 2294: { ! 2295: clobber_flags(); ! 2296: remove_all_offsets(); ! 2297: if (osize==4) { ! 2298: if (out1!=in1 && out1!=r) { ! 2299: COMPCALL(forget_about)(out1); ! 2300: } ! 2301: } ! 2302: else { ! 2303: tomem_c(out1); ! 2304: } ! 2305: ! 2306: in1=readreg_specific(in1,isize,REG_PAR1); ! 2307: r=readreg(r,4); ! 2308: prepare_for_call_1(); /* This should ensure that there won't be ! 2309: any need for swapping nregs in prepare_for_call_2 ! 2310: */ ! 2311: #if USE_NORMAL_CALLING_CONVENTION ! 2312: raw_push_l_r(in1); ! 2313: #endif ! 2314: unlock2(in1); ! 2315: unlock2(r); ! 2316: ! 2317: prepare_for_call_2(); ! 2318: raw_dec_sp(STACK_SHADOW_SPACE); ! 2319: raw_call_r(r); ! 2320: raw_inc_sp(STACK_SHADOW_SPACE); ! 2321: ! 2322: #if USE_NORMAL_CALLING_CONVENTION ! 2323: raw_inc_sp(4); ! 2324: #endif ! 2325: ! 2326: ! 2327: live.nat[REG_RESULT].holds[0]=out1; ! 2328: live.nat[REG_RESULT].nholds=1; ! 2329: live.nat[REG_RESULT].touched=touchcnt++; ! 2330: ! 2331: live.state[out1].realreg=REG_RESULT; ! 2332: live.state[out1].realind=0; ! 2333: live.state[out1].val=0; ! 2334: live.state[out1].validsize=osize; ! 2335: live.state[out1].dirtysize=osize; ! 2336: set_status(out1,DIRTY); ! 2337: } ! 2338: MENDFUNC(5,call_r_11,(W4 out1, RR4 r, RR4 in1, IMM osize, IMM isize)) ! 2339: ! 2340: MIDFUNC(5,call_r_02,(RR4 r, RR4 in1, RR4 in2, IMM isize1, IMM isize2)) ! 2341: { ! 2342: clobber_flags(); ! 2343: remove_all_offsets(); ! 2344: in1=readreg_specific(in1,isize1,REG_PAR1); ! 2345: in2=readreg_specific(in2,isize2,REG_PAR2); ! 2346: r=readreg(r,4); ! 2347: prepare_for_call_1(); /* This should ensure that there won't be ! 2348: any need for swapping nregs in prepare_for_call_2 ! 2349: */ ! 2350: #if USE_NORMAL_CALLING_CONVENTION ! 2351: raw_push_l_r(in2); ! 2352: raw_push_l_r(in1); ! 2353: #endif ! 2354: unlock2(r); ! 2355: unlock2(in1); ! 2356: unlock2(in2); ! 2357: prepare_for_call_2(); ! 2358: raw_dec_sp(STACK_SHADOW_SPACE); ! 2359: raw_call_r(r); ! 2360: raw_inc_sp(STACK_SHADOW_SPACE); ! 2361: #if USE_NORMAL_CALLING_CONVENTION ! 2362: raw_inc_sp(8); ! 2363: #endif ! 2364: } ! 2365: MENDFUNC(5,call_r_02,(RR4 r, RR4 in1, RR4 in2, IMM isize1, IMM isize2)) ! 2366: ! 2367: /* forget_about() takes a mid-layer register */ ! 2368: MIDFUNC(1,forget_about,(W4 r)) ! 2369: { ! 2370: if (isinreg(r)) ! 2371: disassociate(r); ! 2372: live.state[r].val=0; ! 2373: set_status(r,UNDEF); ! 2374: } ! 2375: MENDFUNC(1,forget_about,(W4 r)) ! 2376: ! 2377: MIDFUNC(0,nop,(void)) ! 2378: { ! 2379: raw_nop(); ! 2380: } ! 2381: MENDFUNC(0,nop,(void)) ! 2382: ! 2383: MIDFUNC(1,f_forget_about,(FW r)) ! 2384: { ! 2385: if (f_isinreg(r)) ! 2386: f_disassociate(r); ! 2387: live.fate[r].status=UNDEF; ! 2388: } ! 2389: MENDFUNC(1,f_forget_about,(FW r)) ! 2390: ! 2391: MIDFUNC(1,fmov_pi,(FW r)) ! 2392: { ! 2393: r=f_writereg(r); ! 2394: raw_fmov_pi(r); ! 2395: f_unlock(r); ! 2396: } ! 2397: MENDFUNC(1,fmov_pi,(FW r)) ! 2398: ! 2399: MIDFUNC(1,fmov_log10_2,(FW r)) ! 2400: { ! 2401: r=f_writereg(r); ! 2402: raw_fmov_log10_2(r); ! 2403: f_unlock(r); ! 2404: } ! 2405: MENDFUNC(1,fmov_log10_2,(FW r)) ! 2406: ! 2407: MIDFUNC(1,fmov_log2_e,(FW r)) ! 2408: { ! 2409: r=f_writereg(r); ! 2410: raw_fmov_log2_e(r); ! 2411: f_unlock(r); ! 2412: } ! 2413: MENDFUNC(1,fmov_log2_e,(FW r)) ! 2414: ! 2415: MIDFUNC(1,fmov_loge_2,(FW r)) ! 2416: { ! 2417: r=f_writereg(r); ! 2418: raw_fmov_loge_2(r); ! 2419: f_unlock(r); ! 2420: } ! 2421: MENDFUNC(1,fmov_loge_2,(FW r)) ! 2422: ! 2423: MIDFUNC(1,fmov_1,(FW r)) ! 2424: { ! 2425: r=f_writereg(r); ! 2426: raw_fmov_1(r); ! 2427: f_unlock(r); ! 2428: } ! 2429: MENDFUNC(1,fmov_1,(FW r)) ! 2430: ! 2431: MIDFUNC(1,fmov_0,(FW r)) ! 2432: { ! 2433: r=f_writereg(r); ! 2434: raw_fmov_0(r); ! 2435: f_unlock(r); ! 2436: } ! 2437: MENDFUNC(1,fmov_0,(FW r)) ! 2438: ! 2439: MIDFUNC(2,fmov_rm,(FW r, MEMR m)) ! 2440: { ! 2441: r=f_writereg(r); ! 2442: raw_fmov_rm(r,m); ! 2443: f_unlock(r); ! 2444: } ! 2445: MENDFUNC(2,fmov_rm,(FW r, MEMR m)) ! 2446: ! 2447: MIDFUNC(2,fmovi_rm,(FW r, MEMR m)) ! 2448: { ! 2449: r=f_writereg(r); ! 2450: raw_fmovi_rm(r,m); ! 2451: f_unlock(r); ! 2452: } ! 2453: MENDFUNC(2,fmovi_rm,(FW r, MEMR m)) ! 2454: ! 2455: MIDFUNC(3,fmovi_mrb,(MEMW m, FR r, double *bounds)) ! 2456: { ! 2457: r=f_readreg(r); ! 2458: raw_fmovi_mrb(m,r,bounds); ! 2459: f_unlock(r); ! 2460: } ! 2461: MENDFUNC(3,fmovi_mrb,(MEMW m, FR r, double *bounds)) ! 2462: ! 2463: MIDFUNC(2,fmovs_rm,(FW r, MEMR m)) ! 2464: { ! 2465: r=f_writereg(r); ! 2466: raw_fmovs_rm(r,m); ! 2467: f_unlock(r); ! 2468: } ! 2469: MENDFUNC(2,fmovs_rm,(FW r, MEMR m)) ! 2470: ! 2471: MIDFUNC(2,fmovs_mr,(MEMW m, FR r)) ! 2472: { ! 2473: r=f_readreg(r); ! 2474: raw_fmovs_mr(m,r); ! 2475: f_unlock(r); ! 2476: } ! 2477: MENDFUNC(2,fmovs_mr,(MEMW m, FR r)) ! 2478: ! 2479: MIDFUNC(1,fcuts_r,(FRW r)) ! 2480: { ! 2481: r=f_rmw(r); ! 2482: raw_fcuts_r(r); ! 2483: f_unlock(r); ! 2484: } ! 2485: MENDFUNC(1,fcuts_r,(FRW r)) ! 2486: ! 2487: MIDFUNC(1,fcut_r,(FRW r)) ! 2488: { ! 2489: r=f_rmw(r); ! 2490: raw_fcut_r(r); ! 2491: f_unlock(r); ! 2492: } ! 2493: MENDFUNC(1,fcut_r,(FRW r)) ! 2494: ! 2495: MIDFUNC(2,fmov_ext_mr,(MEMW m, FR r)) ! 2496: { ! 2497: r=f_readreg(r); ! 2498: raw_fmov_ext_mr(m,r); ! 2499: f_unlock(r); ! 2500: } ! 2501: MENDFUNC(2,fmov_ext_mr,(MEMW m, FR r)) ! 2502: ! 2503: MIDFUNC(2,fmov_mr,(MEMW m, FR r)) ! 2504: { ! 2505: r=f_readreg(r); ! 2506: raw_fmov_mr(m,r); ! 2507: f_unlock(r); ! 2508: } ! 2509: MENDFUNC(2,fmov_mr,(MEMW m, FR r)) ! 2510: ! 2511: MIDFUNC(2,fmov_ext_rm,(FW r, MEMR m)) ! 2512: { ! 2513: r=f_writereg(r); ! 2514: raw_fmov_ext_rm(r,m); ! 2515: f_unlock(r); ! 2516: } ! 2517: MENDFUNC(2,fmov_ext_rm,(FW r, MEMR m)) ! 2518: ! 2519: MIDFUNC(2,fmov_rr,(FW d, FR s)) ! 2520: { ! 2521: if (d==s) { /* How pointless! */ ! 2522: return; ! 2523: } ! 2524: #if USE_F_ALIAS ! 2525: f_disassociate(d); ! 2526: s=f_readreg(s); ! 2527: live.fate[d].realreg=s; ! 2528: live.fate[d].realind=live.fat[s].nholds; ! 2529: live.fate[d].status=DIRTY; ! 2530: live.fat[s].holds[live.fat[s].nholds]=d; ! 2531: live.fat[s].nholds++; ! 2532: f_unlock(s); ! 2533: #else ! 2534: s=f_readreg(s); ! 2535: d=f_writereg(d); ! 2536: raw_fmov_rr(d,s); ! 2537: f_unlock(s); ! 2538: f_unlock(d); ! 2539: #endif ! 2540: } ! 2541: MENDFUNC(2,fmov_rr,(FW d, FR s)) ! 2542: ! 2543: MIDFUNC(2,fldcw_m_indexed,(RR4 index, IMM base)) ! 2544: { ! 2545: index=readreg(index,4); ! 2546: ! 2547: raw_fldcw_m_indexed(index,base); ! 2548: unlock2(index); ! 2549: } ! 2550: MENDFUNC(2,fldcw_m_indexed,(RR4 index, IMM base)) ! 2551: ! 2552: MIDFUNC(1,ftst_r,(FR r)) ! 2553: { ! 2554: r=f_readreg(r); ! 2555: raw_ftst_r(r); ! 2556: f_unlock(r); ! 2557: } ! 2558: MENDFUNC(1,ftst_r,(FR r)) ! 2559: ! 2560: MIDFUNC(0,dont_care_fflags,(void)) ! 2561: { ! 2562: f_disassociate(FP_RESULT); ! 2563: } ! 2564: MENDFUNC(0,dont_care_fflags,(void)) ! 2565: ! 2566: MIDFUNC(2,fsqrt_rr,(FW d, FR s)) ! 2567: { ! 2568: s=f_readreg(s); ! 2569: d=f_writereg(d); ! 2570: raw_fsqrt_rr(d,s); ! 2571: f_unlock(s); ! 2572: f_unlock(d); ! 2573: } ! 2574: MENDFUNC(2,fsqrt_rr,(FW d, FR s)) ! 2575: ! 2576: MIDFUNC(2,fabs_rr,(FW d, FR s)) ! 2577: { ! 2578: s=f_readreg(s); ! 2579: d=f_writereg(d); ! 2580: raw_fabs_rr(d,s); ! 2581: f_unlock(s); ! 2582: f_unlock(d); ! 2583: } ! 2584: MENDFUNC(2,fabs_rr,(FW d, FR s)) ! 2585: ! 2586: MIDFUNC(2,fgetexp_rr,(FW d, FR s)) ! 2587: { ! 2588: s=f_readreg(s); ! 2589: d=f_writereg(d); ! 2590: raw_fgetexp_rr(d,s); ! 2591: f_unlock(s); ! 2592: f_unlock(d); ! 2593: } ! 2594: MENDFUNC(2,fgetexp_rr,(FW d, FR s)) ! 2595: ! 2596: MIDFUNC(2,fgetman_rr,(FW d, FR s)) ! 2597: { ! 2598: s=f_readreg(s); ! 2599: d=f_writereg(d); ! 2600: raw_fgetman_rr(d,s); ! 2601: f_unlock(s); ! 2602: f_unlock(d); ! 2603: } ! 2604: MENDFUNC(2,fgetman_rr,(FW d, FR s)) ! 2605: ! 2606: MIDFUNC(2,fsin_rr,(FW d, FR s)) ! 2607: { ! 2608: s=f_readreg(s); ! 2609: d=f_writereg(d); ! 2610: raw_fsin_rr(d,s); ! 2611: f_unlock(s); ! 2612: f_unlock(d); ! 2613: } ! 2614: MENDFUNC(2,fsin_rr,(FW d, FR s)) ! 2615: ! 2616: MIDFUNC(2,fcos_rr,(FW d, FR s)) ! 2617: { ! 2618: s=f_readreg(s); ! 2619: d=f_writereg(d); ! 2620: raw_fcos_rr(d,s); ! 2621: f_unlock(s); ! 2622: f_unlock(d); ! 2623: } ! 2624: MENDFUNC(2,fcos_rr,(FW d, FR s)) ! 2625: ! 2626: MIDFUNC(2,ftan_rr,(FW d, FR s)) ! 2627: { ! 2628: s=f_readreg(s); ! 2629: d=f_writereg(d); ! 2630: raw_ftan_rr(d,s); ! 2631: f_unlock(s); ! 2632: f_unlock(d); ! 2633: } ! 2634: MENDFUNC(2,ftan_rr,(FW d, FR s)) ! 2635: ! 2636: MIDFUNC(3,fsincos_rr,(FW d, FW c, FR s)) ! 2637: { ! 2638: s=f_readreg(s); /* s for source */ ! 2639: d=f_writereg(d); /* d for sine */ ! 2640: c=f_writereg(c); /* c for cosine */ ! 2641: raw_fsincos_rr(d,c,s); ! 2642: f_unlock(s); ! 2643: f_unlock(d); ! 2644: f_unlock(c); ! 2645: } ! 2646: MENDFUNC(3,fsincos_rr,(FW d, FW c, FR s)) ! 2647: ! 2648: MIDFUNC(2,fscale_rr,(FRW d, FR s)) ! 2649: { ! 2650: s=f_readreg(s); ! 2651: d=f_rmw(d); ! 2652: raw_fscale_rr(d,s); ! 2653: f_unlock(s); ! 2654: f_unlock(d); ! 2655: } ! 2656: MENDFUNC(2,fscale_rr,(FRW d, FR s)) ! 2657: ! 2658: MIDFUNC(2,ftwotox_rr,(FW d, FR s)) ! 2659: { ! 2660: s=f_readreg(s); ! 2661: d=f_writereg(d); ! 2662: raw_ftwotox_rr(d,s); ! 2663: f_unlock(s); ! 2664: f_unlock(d); ! 2665: } ! 2666: MENDFUNC(2,ftwotox_rr,(FW d, FR s)) ! 2667: ! 2668: MIDFUNC(2,fetox_rr,(FW d, FR s)) ! 2669: { ! 2670: s=f_readreg(s); ! 2671: d=f_writereg(d); ! 2672: raw_fetox_rr(d,s); ! 2673: f_unlock(s); ! 2674: f_unlock(d); ! 2675: } ! 2676: MENDFUNC(2,fetox_rr,(FW d, FR s)) ! 2677: ! 2678: MIDFUNC(2,frndint_rr,(FW d, FR s)) ! 2679: { ! 2680: s=f_readreg(s); ! 2681: d=f_writereg(d); ! 2682: raw_frndint_rr(d,s); ! 2683: f_unlock(s); ! 2684: f_unlock(d); ! 2685: } ! 2686: MENDFUNC(2,frndint_rr,(FW d, FR s)) ! 2687: ! 2688: MIDFUNC(2,fetoxM1_rr,(FW d, FR s)) ! 2689: { ! 2690: s=f_readreg(s); ! 2691: d=f_writereg(d); ! 2692: raw_fetoxM1_rr(d,s); ! 2693: f_unlock(s); ! 2694: f_unlock(d); ! 2695: } ! 2696: MENDFUNC(2,fetoxM1_rr,(FW d, FR s)) ! 2697: ! 2698: MIDFUNC(2,ftentox_rr,(FW d, FR s)) ! 2699: { ! 2700: s=f_readreg(s); ! 2701: d=f_writereg(d); ! 2702: raw_ftentox_rr(d,s); ! 2703: f_unlock(s); ! 2704: f_unlock(d); ! 2705: } ! 2706: MENDFUNC(2,ftentox_rr,(FW d, FR s)) ! 2707: ! 2708: MIDFUNC(2,flog2_rr,(FW d, FR s)) ! 2709: { ! 2710: s=f_readreg(s); ! 2711: d=f_writereg(d); ! 2712: raw_flog2_rr(d,s); ! 2713: f_unlock(s); ! 2714: f_unlock(d); ! 2715: } ! 2716: MENDFUNC(2,flog2_rr,(FW d, FR s)) ! 2717: ! 2718: MIDFUNC(2,flogN_rr,(FW d, FR s)) ! 2719: { ! 2720: s=f_readreg(s); ! 2721: d=f_writereg(d); ! 2722: raw_flogN_rr(d,s); ! 2723: f_unlock(s); ! 2724: f_unlock(d); ! 2725: } ! 2726: MENDFUNC(2,flogN_rr,(FW d, FR s)) ! 2727: ! 2728: MIDFUNC(2,flogNP1_rr,(FW d, FR s)) ! 2729: { ! 2730: s=f_readreg(s); ! 2731: d=f_writereg(d); ! 2732: raw_flogNP1_rr(d,s); ! 2733: f_unlock(s); ! 2734: f_unlock(d); ! 2735: } ! 2736: MENDFUNC(2,flogNP1_rr,(FW d, FR s)) ! 2737: ! 2738: MIDFUNC(2,flog10_rr,(FW d, FR s)) ! 2739: { ! 2740: s=f_readreg(s); ! 2741: d=f_writereg(d); ! 2742: raw_flog10_rr(d,s); ! 2743: f_unlock(s); ! 2744: f_unlock(d); ! 2745: } ! 2746: MENDFUNC(2,flog10_rr,(FW d, FR s)) ! 2747: ! 2748: MIDFUNC(2,fasin_rr,(FW d, FR s)) ! 2749: { ! 2750: s=f_readreg(s); ! 2751: d=f_writereg(d); ! 2752: raw_fasin_rr(d,s); ! 2753: f_unlock(s); ! 2754: f_unlock(d); ! 2755: } ! 2756: MENDFUNC(2,fasin_rr,(FW d, FR s)) ! 2757: ! 2758: MIDFUNC(2,facos_rr,(FW d, FR s)) ! 2759: { ! 2760: s=f_readreg(s); ! 2761: d=f_writereg(d); ! 2762: raw_facos_rr(d,s); ! 2763: f_unlock(s); ! 2764: f_unlock(d); ! 2765: } ! 2766: MENDFUNC(2,facos_rr,(FW d, FR s)) ! 2767: ! 2768: MIDFUNC(2,fatan_rr,(FW d, FR s)) ! 2769: { ! 2770: s=f_readreg(s); ! 2771: d=f_writereg(d); ! 2772: raw_fatan_rr(d,s); ! 2773: f_unlock(s); ! 2774: f_unlock(d); ! 2775: } ! 2776: MENDFUNC(2,fatan_rr,(FW d, FR s)) ! 2777: ! 2778: MIDFUNC(2,fatanh_rr,(FW d, FR s)) ! 2779: { ! 2780: s=f_readreg(s); ! 2781: d=f_writereg(d); ! 2782: raw_fatanh_rr(d,s); ! 2783: f_unlock(s); ! 2784: f_unlock(d); ! 2785: } ! 2786: MENDFUNC(2,fatanh_rr,(FW d, FR s)) ! 2787: ! 2788: MIDFUNC(2,fsinh_rr,(FW d, FR s)) ! 2789: { ! 2790: s=f_readreg(s); ! 2791: d=f_writereg(d); ! 2792: raw_fsinh_rr(d,s); ! 2793: f_unlock(s); ! 2794: f_unlock(d); ! 2795: } ! 2796: MENDFUNC(2,fsinh_rr,(FW d, FR s)) ! 2797: ! 2798: MIDFUNC(2,fcosh_rr,(FW d, FR s)) ! 2799: { ! 2800: s=f_readreg(s); ! 2801: d=f_writereg(d); ! 2802: raw_fcosh_rr(d,s); ! 2803: f_unlock(s); ! 2804: f_unlock(d); ! 2805: } ! 2806: MENDFUNC(2,fcosh_rr,(FW d, FR s)) ! 2807: ! 2808: MIDFUNC(2,ftanh_rr,(FW d, FR s)) ! 2809: { ! 2810: s=f_readreg(s); ! 2811: d=f_writereg(d); ! 2812: raw_ftanh_rr(d,s); ! 2813: f_unlock(s); ! 2814: f_unlock(d); ! 2815: } ! 2816: MENDFUNC(2,ftanh_rr,(FW d, FR s)) ! 2817: ! 2818: MIDFUNC(2,fneg_rr,(FW d, FR s)) ! 2819: { ! 2820: s=f_readreg(s); ! 2821: d=f_writereg(d); ! 2822: raw_fneg_rr(d,s); ! 2823: f_unlock(s); ! 2824: f_unlock(d); ! 2825: } ! 2826: MENDFUNC(2,fneg_rr,(FW d, FR s)) ! 2827: ! 2828: MIDFUNC(2,fadd_rr,(FRW d, FR s)) ! 2829: { ! 2830: s=f_readreg(s); ! 2831: d=f_rmw(d); ! 2832: raw_fadd_rr(d,s); ! 2833: f_unlock(s); ! 2834: f_unlock(d); ! 2835: } ! 2836: MENDFUNC(2,fadd_rr,(FRW d, FR s)) ! 2837: ! 2838: MIDFUNC(2,fsub_rr,(FRW d, FR s)) ! 2839: { ! 2840: s=f_readreg(s); ! 2841: d=f_rmw(d); ! 2842: raw_fsub_rr(d,s); ! 2843: f_unlock(s); ! 2844: f_unlock(d); ! 2845: } ! 2846: MENDFUNC(2,fsub_rr,(FRW d, FR s)) ! 2847: ! 2848: MIDFUNC(2,fcmp_rr,(FR d, FR s)) ! 2849: { ! 2850: d=f_readreg(d); ! 2851: s=f_readreg(s); ! 2852: raw_fcmp_rr(d,s); ! 2853: f_unlock(s); ! 2854: f_unlock(d); ! 2855: } ! 2856: MENDFUNC(2,fcmp_rr,(FR d, FR s)) ! 2857: ! 2858: MIDFUNC(2,fdiv_rr,(FRW d, FR s)) ! 2859: { ! 2860: s=f_readreg(s); ! 2861: d=f_rmw(d); ! 2862: raw_fdiv_rr(d,s); ! 2863: f_unlock(s); ! 2864: f_unlock(d); ! 2865: } ! 2866: MENDFUNC(2,fdiv_rr,(FRW d, FR s)) ! 2867: ! 2868: MIDFUNC(2,frem_rr,(FRW d, FR s)) ! 2869: { ! 2870: s=f_readreg(s); ! 2871: d=f_rmw(d); ! 2872: raw_frem_rr(d,s); ! 2873: f_unlock(s); ! 2874: f_unlock(d); ! 2875: } ! 2876: MENDFUNC(2,frem_rr,(FRW d, FR s)) ! 2877: ! 2878: MIDFUNC(2,frem1_rr,(FRW d, FR s)) ! 2879: { ! 2880: s=f_readreg(s); ! 2881: d=f_rmw(d); ! 2882: raw_frem1_rr(d,s); ! 2883: f_unlock(s); ! 2884: f_unlock(d); ! 2885: } ! 2886: MENDFUNC(2,frem1_rr,(FRW d, FR s)) ! 2887: ! 2888: MIDFUNC(2,fmul_rr,(FRW d, FR s)) ! 2889: { ! 2890: s=f_readreg(s); ! 2891: d=f_rmw(d); ! 2892: raw_fmul_rr(d,s); ! 2893: f_unlock(s); ! 2894: f_unlock(d); ! 2895: } ! 2896: MENDFUNC(2,fmul_rr,(FRW d, FR s)) ! 2897: ! 2898: #ifdef __GNUC__ ! 2899: ! 2900: static inline void mfence(void) ! 2901: { ! 2902: #ifdef CPU_i386 ! 2903: if (!cpuinfo.x86_has_xmm2) ! 2904: __asm__ __volatile__("lock; addl $0,0(%%esp)":::"memory"); ! 2905: else ! 2906: #endif ! 2907: __asm__ __volatile__("mfence":::"memory"); ! 2908: } ! 2909: ! 2910: static inline void clflush(volatile void *__p) ! 2911: { ! 2912: __asm__ __volatile__("clflush %0" : "+m" (*(volatile char *)__p)); ! 2913: } ! 2914: ! 2915: static inline void flush_cpu_icache(void *start, void *stop) ! 2916: { ! 2917: mfence(); ! 2918: if (cpuinfo.x86_clflush_size != 0) ! 2919: { ! 2920: volatile char *vaddr = (volatile char *)(((uintptr)start / cpuinfo.x86_clflush_size) * cpuinfo.x86_clflush_size); ! 2921: volatile char *vend = (volatile char *)((((uintptr)stop + cpuinfo.x86_clflush_size - 1) / cpuinfo.x86_clflush_size) * cpuinfo.x86_clflush_size); ! 2922: while (vaddr < vend) ! 2923: { ! 2924: clflush(vaddr); ! 2925: vaddr += cpuinfo.x86_clflush_size; ! 2926: } ! 2927: } ! 2928: mfence(); ! 2929: } ! 2930: ! 2931: #else ! 2932: ! 2933: static inline void flush_cpu_icache(void *start, void *stop) ! 2934: { ! 2935: UNUSED(start); ! 2936: UNUSED(stop); ! 2937: } ! 2938: ! 2939: #endif ! 2940: ! 2941: static inline void write_jmp_target(uae_u32 *jmpaddr, cpuop_func* a) { ! 2942: uintptr rel = (uintptr) a - ((uintptr) jmpaddr + 4); ! 2943: *(jmpaddr) = (uae_u32) rel; ! 2944: flush_cpu_icache((void *) jmpaddr, (void *) &jmpaddr[1]); ! 2945: } ! 2946: ! 2947: static inline void emit_jmp_target(uae_u32 a) { ! 2948: emit_long(a-((uintptr)target+4)); ! 2949: } ! 2950:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.