/ externals / xbyak / test / rip-label-imm.cpp
rip-label-imm.cpp
 1  #define XBYAK_NO_OP_NAMES
 2  #include <xbyak/xbyak.h>
 3  /*
 4  dump of vc
 5  
 6  00000000003A0000 F3 0F C2 05 F1 00 00 00 00 cmpeqss     xmm0,dword ptr [3A00FAh]
 7  00000000003A0009 F7 05 E7 00 00 00 21 00 00 00 test        dword ptr [3A00FAh],21h
 8  00000000003A0013 0F BA 25 DF 00 00 00 03 bt          dword ptr [3A00FAh],3
 9  00000000003A001B C4 E3 79 0D 05 D5 00 00 00 03 vblendpd    xmm0,xmm0,xmmword ptr [3A00FAh],3
10  00000000003A0025 C4 E3 79 0F 05 CB 00 00 00 04 vpalignr    xmm0,xmm0,xmmword ptr [3A00FAh],4
11  00000000003A002F C4 E3 7D 19 1D C1 00 00 00 0C vextractf128 xmmword ptr [3A00FAh],ymm3,0Ch
12  00000000003A0039 C4 E3 75 46 05 B7 00 00 00 0D vperm2i128  ymm0,ymm1,ymmword ptr [3A00FAh],0Dh
13  00000000003A0043 C4 E3 79 1D 15 AD 00 00 00 2C vcvtps2ph   mmword ptr [3A00FAh],xmm2,2Ch
14  00000000003A004D C7 05 A3 00 00 00 34 12 00 00 mov         dword ptr [3A00FAh],1234h
15  00000000003A0057 C1 25 9C 00 00 00 03 shl         dword ptr [3A00FAh],3
16  00000000003A005E D1 2D 96 00 00 00    shr         dword ptr [3A00FAh],1
17  00000000003A0064 48 0F A4 05 8D 00 00 00 03 shld        qword ptr [3A00FAh],rax,3
18  00000000003A006D 48 6B 05 85 00 00 00 15 imul        rax,qword ptr [3A00FAh],15h
19  00000000003A0075 C4 E3 FB F0 05 7B 00 00 00 15 rorx        rax,qword ptr [3A00FAh],15h
20  00000000003A007F F7 05 71 00 00 00 05 00 00 00 test        dword ptr [3A00FAh],5
21  00000000003A0089 66 48 0F 3A 16 05 66 00 00 00 03 pextrq      qword ptr [3A00FAh],xmm0,3
22  00000000003A0094 66 48 0F 3A 22 15 5B 00 00 00 05 pinsrq      xmm2,qword ptr [3A00FAh],5
23  00000000003A009F 66 0F 3A 15 0D 51 00 00 00 04 pextrw      word ptr [3A00FAh],xmm1,4
24  00000000003A00A9 81 15 47 00 00 00 45 23 01 00 adc         dword ptr [3A00FAh],12345h
25  00000000003A00B3 0F BA 25 3F 00 00 00 34 bt          dword ptr [3A00FAh],34h
26  00000000003A00BB 66 0F BA 3D 36 00 00 00 34 btc         word ptr [3A00FAh],34h
27  00000000003A00C4 0F BA 35 2E 00 00 00 34 btr         dword ptr [3A00FAh],34h
28  00000000003A00CC C1 15 27 00 00 00 04 rcl         dword ptr [3A00FAh],4
29  00000000003A00D3 48 0F A4 05 1E 00 00 00 04 shld        qword ptr [3A00FAh],rax,4
30  00000000003A00DC 0F 3A 0F 05 15 00 00 00 04 palignr     mm0,mmword ptr [3A00FAh],4
31  00000000003A00E5 66 0F 3A DF 1D 0B 00 00 00 04 aeskeygenassist xmm3,xmmword ptr [3A00FAh],4
32  00000000003A00EF C4 E3 79 60 15 01 00 00 00 07 vpcmpestrm  xmm2,xmmword ptr [3A00FAh],7
33  00000000003A00F9 C3                   ret
34  00000000003A00FA F0 DE BC 9A 78 56 34 12
35  */
36  struct Code : Xbyak::CodeGenerator {
37  	Code()
38  	{
39  		Xbyak::Label label;
40  		cmpss(xmm0, ptr[rip + label], 0);
41  		test(dword[rip + label], 33);
42  		bt(dword[rip + label ], 3);
43  		vblendpd(xmm0, xmm0, dword[rip + label], 3);
44  		vpalignr(xmm0, xmm0, qword[rip + label], 4);
45  		vextractf128(dword[rip + label], ymm3, 12);
46  		vperm2i128(ymm0, ymm1, qword[rip + label], 13);
47  		vcvtps2ph(ptr[rip + label], xmm2, 44);
48  		mov(dword[rip + label], 0x1234);
49  		shl(dword[rip + label], 3);
50  		shr(dword[rip + label], 1);
51  		shld(qword[rip + label], rax, 3);
52  		imul(rax, qword[rip + label], 21);
53  		rorx(rax, qword[rip + label], 21);
54  		test(dword[rip + label], 5);
55  		pextrq(ptr[rip + label], xmm0, 3);
56  		pinsrq(xmm2, ptr[rip + label], 5);
57  		pextrw(ptr[rip + label], xmm1, 4);
58  		adc(dword[rip + label], 0x12345);
59  		bt(byte[rip + label], 0x34);
60  		btc(word[rip + label], 0x34);
61  		btr(dword[rip + label], 0x34);
62  		rcl(dword[rip + label], 4);
63  		shld(qword[rip + label], rax, 4);
64  		palignr(mm0, ptr[rip + label], 4);
65  		aeskeygenassist(xmm3, ptr[rip + label], 4);
66  		vpcmpestrm(xmm2, ptr[rip + label], 7);
67  		ret();
68  	L(label);
69  		dq(0x123456789abcdef0ull);
70  	};
71  };
72  
73  void dump(const unsigned char *p, size_t n)
74  {
75  	for (int i = 0; i < n; i++) {
76  		printf("%02x ", p[i]);
77  		if ((i % 16) == 15) putchar('\n');
78  	}
79  	putchar('\n');
80  }
81  
82  int main()
83  {
84  	Code code;
85  	void (*f)() = code.getCode<void (*)()>();
86  	dump(code.getCode(), code.getSize());
87  	f();
88  }