| #define XBYAK_NO_OP_NAMES |
| #include <xbyak/xbyak.h> |
| /* |
| dump of vc |
| |
| 0000000000350000 F3 0F C2 05 77 00 00 00 00 cmpeqss xmm0,dword ptr [350080h] |
| 0000000000350009 F7 05 6D 00 00 00 21 00 00 00 test dword ptr [350080h],21h |
| 0000000000350013 0F BA 25 65 00 00 00 03 bt dword ptr [350080h],3 |
| 000000000035001B C4 E3 79 0D 05 5B 00 00 00 03 vblendpd xmm0,xmm0,xmmword ptr [350080h],3 |
| 0000000000350025 C4 E3 79 0F 05 51 00 00 00 04 vpalignr xmm0,xmm0,xmmword ptr [350080h],4 |
| 000000000035002F C4 E3 7D 19 1D 47 00 00 00 0C vextractf128 xmmword ptr [350080h],ymm3,0Ch |
| 0000000000350039 C4 E3 75 46 05 3D 00 00 00 0D vperm2i128 ymm0,ymm1,ymmword ptr [350080h],0Dh |
| 0000000000350043 C4 E3 79 1D 15 33 00 00 00 2C vcvtps2ph mmword ptr [350080h],xmm2,2Ch |
| 000000000035004D C7 05 2D 00 00 00 34 12 00 00 mov dword ptr [350084h],1234h |
| 0000000000350057 C1 25 22 00 00 00 03 shl dword ptr [350080h],3 |
| 000000000035005E D1 2D 1C 00 00 00 shr dword ptr [350080h],1 |
| 0000000000350064 48 0F A4 05 13 00 00 00 03 shld qword ptr [350080h],rax,3 |
| 000000000035006D 48 6B 05 0B 00 00 00 15 imul rax,qword ptr [350080h],15h |
| 0000000000350075 C4 E3 FB F0 05 01 00 00 00 15 rorx rax,qword ptr [350080h],15h |
| 000000000035007F C3 ret |
| 0000000000350080 F0 DE BC 9A 78 56 34 12 |
| */ |
| struct Code : Xbyak::CodeGenerator { |
| Code() |
| { |
| Xbyak::Label label; |
| cmpss(xmm0, ptr[rip + label], 0); |
| test(dword[rip + label], 33); |
| bt(dword[rip + label ], 3); |
| vblendpd(xmm0, dword[rip + label], 3); |
| vpalignr(xmm0, qword[rip + label], 4); |
| vextractf128(dword[rip + label], ymm3, 12); |
| vperm2i128(ymm0, ymm1, qword[rip + label], 13); |
| vcvtps2ph(ptr[rip + label], xmm2, 44); |
| mov(dword[rip + label], 0x1234); |
| shl(dword[rip + label], 3); |
| shr(dword[rip + label], 1); |
| shld(qword[rip + label], rax, 3); |
| imul(rax, qword[rip + label], 21); |
| rorx(rax, qword[rip + label], 21); |
| ret(); |
| L(label); |
| dq(0x123456789abcdef0ull); |
| }; |
| }; |
| |
| void dump(const unsigned char *p, size_t n) |
| { |
| for (int i = 0; i < n; i++) { |
| printf("%02x ", p[i]); |
| if ((i % 16) == 15) putchar('\n'); |
| } |
| putchar('\n'); |
| } |
| |
| int main() |
| { |
| Code code; |
| void (*f)() = code.getCode<void (*)()>(); |
| dump(code.getCode(), code.getSize()); |
| f(); |
| } |