Advertisement
Guest User

recPABSW and recPABSH

a guest
Mar 9th, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.88 KB | None | 0 0
  1. void recPABSW() //needs clamping
  2. {
  3.     if( !_Rd_ ) return;
  4.  
  5.     EE::Profiler.EmitOp(eeOpcode::PABSW);
  6.  
  7.     int info = eeRecompileCodeXMM( XMMINFO_READT|XMMINFO_WRITED );
  8.     int t0reg = _allocTempXMMreg(XMMT_INT, -1);
  9.     if( x86caps.hasSupplementalStreamingSIMD3Extensions ) {
  10.         xPABS.D(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); //0x80000000 -> 0x80000000
  11.         xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_D));
  12.         xPSRA.D(xRegisterSSE(t0reg), 31); //0x80000000 is the only possible negative number resulting from pabs
  13.     }
  14.     else {
  15.         xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T));
  16.         xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T));
  17.         xPSRA.D(xRegisterSSE(t0reg), 31);
  18.         xPXOR(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg));
  19.         xPSUB.D(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); //0x80000000 -> 0x80000000
  20.         xPCMP.GTD(xRegisterSSE(t0reg), xRegisterSSE(EEREC_D));
  21.     }
  22.     xPXOR(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); //0x80000000 -> 0x7fffffff
  23.     _freeXMMreg(t0reg);
  24.     _clearNeededXMMregs();
  25. }
  26.  
  27. void recPABSH()
  28. {
  29.     if( !_Rd_ ) return;
  30.  
  31.     EE::Profiler.EmitOp(eeOpcode::PABSH);
  32.  
  33.     int info = eeRecompileCodeXMM( XMMINFO_READT|XMMINFO_WRITED );
  34.     int t0reg = _allocTempXMMreg(XMMT_INT, -1);
  35.     if( x86caps.hasSupplementalStreamingSIMD3Extensions ) {
  36.         xPABS.W(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T)); //0x8000 -> 0x8000
  37.         xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_D));
  38.         xPSRA.W(xRegisterSSE(t0reg), 15); //0x8000 is the only possible negative number resulting from pabs
  39.         xPXOR(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); //0x8000 -> 0x7fff
  40.     }
  41.     else {
  42.         xMOVDQA(xRegisterSSE(t0reg), xRegisterSSE(EEREC_T));
  43.         xMOVDQA(xRegisterSSE(EEREC_D), xRegisterSSE(EEREC_T));
  44.         xPSRA.W(xRegisterSSE(t0reg), 15);
  45.         xPXOR(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg));
  46.         xPSUB.SW(xRegisterSSE(EEREC_D), xRegisterSSE(t0reg)); //0x8000 -> 0x7fff
  47.     }
  48.     _freeXMMreg(t0reg);
  49.     _clearNeededXMMregs();
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement