📄 dynamicarmcode.h
字号:
inline void WstrdPreAdvance(E_WMMX_REGISTER src, E_REGISTER dst, int offs){ I2C(WSTRD_PRE, src, dst, offs); }
inline void Wand(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WAND, dst, src1, src2); }
inline void Wandn(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WANDN, dst, src1, src2); }
inline void Wor(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WOR, dst, src1, src2); }
inline void Wxor(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WXOR, dst, src1, src2); }
//----------------------------
// Extract a 64-bit value from the two 64-bit Source registers, and place the result in 'dst'; instruction uses a 3-bit value stored in the specified general register to specify the byte offset of the value to extract.
inline void Walignr(int ri, E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(!ri ? WALIGNR0 : ri==1 ? WALIGNR1 : ri==2 ? WALIGNR2 : WALIGNR3, dst, src1, src2); }
//----------------------------
inline void Waddb(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDB, dst, src1, src2); }
inline void Waddh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDH, dst, src1, src2); }
inline void Waddw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDW, dst, src1, src2); }
inline void Waddbus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDBUS, dst, src1, src2); }
inline void Waddhus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDHUS, dst, src1, src2); }
inline void Waddwus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDWUS, dst, src1, src2); }
inline void Waddbss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDBSS, dst, src1, src2); }
inline void Waddhss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDHSS, dst, src1, src2); }
inline void Waddwss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WADDWSS, dst, src1, src2); }
inline void Wsubb(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBB, dst, src1, src2); }
inline void Wsubh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBH, dst, src1, src2); }
inline void Wsubw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBW, dst, src1, src2); }
inline void Wsubbus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBBUS, dst, src1, src2); }
inline void Wsubhus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBHUS, dst, src1, src2); }
inline void Wsubwus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBWUS, dst, src1, src2); }
inline void Wsubbss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBBSS, dst, src1, src2); }
inline void Wsubhss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBHSS, dst, src1, src2); }
inline void Wsubwss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WSUBWSS, dst, src1, src2); }
//----------------------------
// Perform a 2-pixel average of wRn and wRm on unsigned vectors of 8- or 16-bit data with optional rounding of +1 and places the result in the 'dst'.
inline void Wavg2b(bool round, E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(round ? WAVG2BR : WAVG2B, dst, src1, src2); }
inline void Wavg2h(bool round, E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(round ? WAVG2HR : WAVG2H, dst, src1, src2); }
//----------------------------
// Perform vector rotate-right / shift-arithmetic-right / logical-shift-left / logical-shift-right
// of src by sh for vectors of 16-, 32-, or 64-bit data and places the result in 'dst'.
// Version with G uses general-purpose register.
inline void Wrorh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WRORH, dst, src, sh); }
inline void Wrorw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WRORW, dst, src, sh); }
inline void Wrord(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WRORD, dst, src, sh); }
inline void Wrorhg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WRORHG, dst, src, sh); }
inline void Wrorwg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WRORWG, dst, src, sh); }
inline void Wrordg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WRORDG, dst, src, sh); }
inline void Wsrah(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSRAH, dst, src, sh); }
inline void Wsraw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSRAW, dst, src, sh); }
inline void Wsrad(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSRAD, dst, src, sh); }
inline void Wsrahg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSRAHG, dst, src, sh); }
inline void Wsrawg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSRAWG, dst, src, sh); }
inline void Wsradg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSRADG, dst, src, sh); }
inline void Wsllh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSLLH, dst, src, sh); }
inline void Wsllw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSLLW, dst, src, sh); }
inline void Wslld(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSLLD, dst, src, sh); }
inline void Wsllhg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSLLHG, dst, src, sh); }
inline void Wsllwg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSLLWG, dst, src, sh); }
inline void Wslldg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSLLDG, dst, src, sh); }
inline void Wsrlh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSRLH, dst, src, sh); }
inline void Wsrlw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSRLW, dst, src, sh); }
inline void Wsrld(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_REGISTER sh){ I3(WSRLD, dst, src, sh); }
inline void Wsrlhg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSRLHG, dst, src, sh); }
inline void Wsrlwg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSRLWG, dst, src, sh); }
inline void Wsrldg(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, E_WMMX_GENERAL_REGISTER sh){ I3(WSRLDG, dst, src, sh); }
//----------------------------
// Select (shuffle) 16-bit data values in dst register from 16-bit fields in src register specified by the 8-bit immediate value.
// The 8-bit constant specifies 2 bits per half-word, which specify index in source register (0-3) from where data are taken.
inline void Wshufh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src, byte c){ I2C(WSHUFH, dst, src, c); }
//----------------------------
// Performs a vector multiplication of src1 and src2 on vectors of 16-bit data only.
// M-qualifier indicates that the higher 16 bits of the result are to be stored in dst.
// L-qualifier indicates that the lower 16 bits of the result are to be stored in dst.
// Can be performed on signed or unsigned data.
inline void Wmulul(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WMULUL, dst, src1, src2); }
inline void Wmulum(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WMULUM, dst, src1, src2); }
inline void Wmulsl(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WMULSL, dst, src1, src2); }
inline void Wmulsm(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WMULSM, dst, src1, src2); }
//----------------------------
// Unpacks 8-bit, 16-bit, or 32-bit data from the higher/lower half of src, and either zero or signed extend each field, and place the result into dst.
inline void Wunpckehub(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKEHUB, dst, src); }
inline void Wunpckehuh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKEHUH, dst, src); }
inline void Wunpckehuw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKEHUW, dst, src); }
inline void Wunpckehsb(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKEHSB, dst, src); }
inline void Wunpckehsh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKEHSH, dst, src); }
inline void Wunpckehsw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKEHSW, dst, src); }
inline void Wunpckelub(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKELUB, dst, src); }
inline void Wunpckeluh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKELUH, dst, src); }
inline void Wunpckeluw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKELUW, dst, src); }
inline void Wunpckelsb(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKELSB, dst, src); }
inline void Wunpckelsh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKELSH, dst, src); }
inline void Wunpckelsw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src){ I2(WUNPCKELSW, dst, src); }
//----------------------------
// Interleave and merge eight bytes, four 16-bit halfwords, words, or two 32-bit words.
// Unpacks either 8-bit, 16-bit, or 32 bit data from the higher/lower half of src1, interleaves with the higher/lower half of src2, and place the result into dst.
inline void Wunpckihb(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WUNPCKIHB, dst, src1, src2); }
inline void Wunpckihh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WUNPCKIHH, dst, src1, src2); }
inline void Wunpckihw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WUNPCKIHW, dst, src1, src2); }
inline void Wunpckilb(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WUNPCKILB, dst, src1, src2); }
inline void Wunpckilh(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WUNPCKILH, dst, src1, src2); }
inline void Wunpckilw(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WUNPCKILW, dst, src1, src2); }
//----------------------------
// Pack data from src1 and src2 into dst, with src1 packed into the lower half, and src2 into the upper half, for vectors of 16-, 32-, or 64-bit data,
// and saturate the results and place in the dst.
// Packing can be performed with signed saturation or unsigned saturation.
inline void Wpackhus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WPACKHUS, dst, src1, src2); }
inline void Wpackwus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WPACKWUS, dst, src1, src2); }
inline void Wpackdus(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WPACKDUS, dst, src1, src2); }
inline void Wpackhss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WPACKHSS, dst, src1, src2); }
inline void Wpackwss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WPACKWSS, dst, src1, src2); }
inline void Wpackdss(E_WMMX_REGISTER dst, E_WMMX_REGISTER src1, E_WMMX_REGISTER src2){ I3(WPACKDSS, dst, src1, src2); }
//----------------------------
/*
WACCB
WACCH
WACCW
WALIGNI
WAVG2B
WAVG2H
WAVG2BR
WAVG2HR
WCMPEQB
WCMPEQH
WCMPEQW
WCMPGTUB
WCMPGTUH
WCMPGTUW
WCMPGTSB
WCMPGTSH
WCMPGTSW
WLDRB_PRESUB
WLDRH_PRESUB
WLDRW_PRESUB
WLDRD_PRESUB
WSTRB_PRESUB
WSTRH_PRESUB
WSTRW_PRESUB
WSTRD_PRESUB
WLDRB_POSTSUB
WLDRH_POSTSUB
WLDRW_POSTSUB
WLDRD_POSTSUB
WSTRB_POSTSUB
WSTRH_POSTSUB
WSTRW_POSTSUB
WSTRD_POSTSUB
WMACU
WMACS
WMACUZ
WMACSZ
WMADDU
WMADDS
WMAXUB
WMAXUH
WMAXUW
WMAXSB
WMAXSH
WMAXSW
WMINUB
WMINUH
WMINUW
WMINSB
WMINSH
WMINSW
WSADB
WSADBZ
WSADH
WSADHZ
*/
//----------------------------
// Instruction modifications for next instruction:
virtual void Byte() = 0; //instruction operates on byte
virtual void Half() = 0; // '' word
virtual void SByte() = 0; // '' signed char
virtual void SHalf() = 0; // '' signed short
virtual void Cond(E_CONDITION) = 0; //conditional instruction
virtual void Set() = 0; //set flags from result
virtual void MoveBack() = 0; //move next instruction back while register dependency allows it
//----------------------------
// Create label and optionally put to code.
// Labels not put to code during creation are forward-references, and must be put by using PutLabel.
virtual void *Label(bool put = true) = 0;
//----------------------------
// Put label to code.
virtual void PutLabel(void *label) = 0;
//----------------------------
// Declare constant data stored in code. Returned is label for referencing. Use PutLabel to actually instantiate data (at end of function).
virtual void *DeclareData(void *data, dword data_size) = 0;
inline void *DeclareData(dword data){ return DeclareData(&data, 4); }
virtual void StoreLabelAddress(void *label) = 0;
//----------------------------
// Build code.
virtual void CodeBuild() = 0;
//----------------------------
// Get pointer to function compiled code.
virtual void *Code(dword fnc_index = 0) const = 0;
//----------------------------
enum{
CPU_WIRELESS_MMX = 1,
CPU_ARM5T = 2,
};
static dword GetCpuCaps();
//----------------------------
// Create instance of this class.
static C_dyn_code *Create();
};
//----------------------------
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -