completely wrong. Chebychev (Remez), Padé, and maybe Taylor.
[fmap.git] / x86_64_sse2_x87 / fasm / examples / x86 / include / ext / bmi1.inc
blobc8d5eddad47ad5b13c89c7e22697d4f04720e9ab
1 \r
2 include 'avx.inc'\r
3 \r
4 macro andn? dest*,src*,src2*\r
5         x86.parse_operand @dest,dest\r
6         x86.parse_operand @src,src\r
7         x86.parse_operand @src2,src2\r
8         if @dest.type = 'reg' & @src.type = 'reg' & (@src2.type = 'mem' | @src2.type = 'reg')\r
9                 if @dest.size < 4\r
10                         err 'invalid operand size'\r
11                 else if @src.size <> @dest.size | @src2.size and not @dest.size\r
12                         err 'operand sizes do not match'\r
13                 end if\r
14                 if @dest.size = 8\r
15                         if x86.mode < 64\r
16                                 err 'instruction requires long mode'\r
17                         end if\r
18                         AVX.store_instruction 16,VEX_0F38_W1,0F2h,@src2,@dest.rm,@src.rm\r
19                 else\r
20                         AVX.store_instruction 16,VEX_0F38_W0,0F2h,@src2,@dest.rm,@src.rm\r
21                 end if\r
22         else\r
23                 err 'invalid combination of operands'\r
24         end if\r
25 end macro\r
27 macro bextr? dest*,src*,src2*\r
28         x86.parse_operand @dest,dest\r
29         x86.parse_operand @src,src\r
30         x86.parse_operand @src2,src2\r
31         if @dest.type = 'reg' & (@src.type = 'mem' | @src.type = 'reg') & @src2.type = 'reg'\r
32                 if @dest.size < 4\r
33                         err 'invalid operand size'\r
34                 else if @src.size and not @dest.size | @src2.size <> @dest.size\r
35                         err 'operand sizes do not match'\r
36                 end if\r
37                 if @dest.size = 8\r
38                         if x86.mode < 64\r
39                                 err 'instruction requires long mode'\r
40                         end if\r
41                         AVX.store_instruction 16,VEX_0F38_W1,0F7h,@src,@dest.rm,@src2.rm\r
42                 else\r
43                         AVX.store_instruction 16,VEX_0F38_W0,0F7h,@src,@dest.rm,@src2.rm\r
44                 end if\r
45         else\r
46                 err 'invalid combination of operands'\r
47         end if\r
48 end macro\r
50 iterate <instr,opcode,postbyte>, blsi,0F3h,3, blmsk,0F3h,2, blsr,0F3h,1\r
52         macro instr? dest*,src*\r
53                 x86.parse_operand @dest,dest\r
54                 x86.parse_operand @src,src\r
55                 if @dest.type = 'reg' & (@src.type = 'mem' | @src.type = 'reg')\r
56                         if @dest.size < 4\r
57                                 err 'invalid operand size'\r
58                         else if @src.size and not @dest.size\r
59                                 err 'operand sizes do not match'\r
60                         end if\r
61                         if @dest.size = 8\r
62                                 if x86.mode < 64\r
63                                         err 'instruction requires long mode'\r
64                                 end if\r
65                                 AVX.store_instruction 16,VEX_0F38_W1,opcode,@src,postbyte,@dest.rm\r
66                         else\r
67                                 AVX.store_instruction 16,VEX_0F38_W0,opcode,@src,postbyte,@dest.rm\r
68                         end if\r
69                 else\r
70                         err 'invalid combination of operands'\r
71                 end if\r
72         end macro\r
74 end iterate\r
76 iterate <instr,opcode>, lzcnt,0BDh, tzcnt,0BCh\r
78         macro instr? dest*,src*\r
79                 x86.parse_operand @dest,dest\r
80                 x86.parse_operand @src,src\r
81                 if @dest.type = 'reg' & ( @src.type = 'reg' | @src.type = 'mem' )\r
82                         if @src.size and not @dest.size\r
83                                 err 'operand sizes do not match'\r
84                         end if\r
85                         @src.opcode_prefix = 0F3h\r
86                         if @dest.size > 1\r
87                                 x86.select_operand_prefix @src,@dest.size\r
88                                 x86.store_instruction <0Fh,opcode>,@src,@dest.rm\r
89                         else\r
90                                 err 'invalid operand size'\r
91                         end if\r
92                 else\r
93                         err 'invalid combination of operands'\r
94                 end if\r
95         end macro\r
97 end iterate\r