completely wrong. Chebychev (Remez), Padé, and maybe Taylor.
[fmap.git] / x86_64_sse2_x87 / fasm / examples / x86 / include / ext / sse4.1.inc
blob3f181f941862907aa2a5191f19d99bae04b445c6
1 \r
2 include 'ssse3.inc'\r
3 \r
4 iterate <instr,supp>, ptest,17h, pmuldq,28h, pcmpeqq,29h, packusdw,2Bh, pminsb,38h, pminsd,39h, pminuw,3Ah, pminud,3Bh, pmaxsb,3Ch, pmaxsd,3Dh, pmaxuw,3Eh, pmaxud,3Fh, pmulld,40h, phminposuw,41h\r
5         macro instr? dest*,src*\r
6                 SSE.basic_instruction 66h,<38h,supp>,16,dest,src\r
7         end macro\r
8 end iterate\r
9 \r
10 iterate <instr,supp>, roundps,08h, roundpd,09h, roundss,0Ah, roundsd,0Bh, blendps,0Ch, blendpd,0Dh, pblendw,0Eh, dpps,40h, dppd,41h, mpsadbw,42h\r
11         macro instr? dest*,src*,imm*\r
12                 SSE.basic_instruction_imm8 66h,<3Ah,supp>,16,dest,src,imm\r
13         end macro\r
14 end iterate\r
16 iterate <instr,supp>, pblendvb,10h, blendvps,14h, blendvpd,15h\r
17         macro instr? dest*,src*,sel*\r
18                 SSE.parse_operand @dest,dest\r
19                 SSE.parse_operand @src,src\r
20                 SSE.parse_operand @aux,sel\r
21                 if @dest.type = 'mmreg' & (@src.type = 'mem' | @src.type = 'mmreg') & @aux.type = 'mmreg' & @aux.size = 16 & @aux.rm = 0\r
22                         if @dest.size or @src.size and not 16\r
23                                 err 'invalid operand size'\r
24                         end if\r
25                         @src.opcode_prefix = 66h\r
26                         x86.store_instruction <0Fh,38h,supp>,@src,@dest.rm\r
27                 else\r
28                         err 'invalid combination of operands'\r
29                 end if\r
30         end macro\r
31 end iterate\r
33 iterate <conv,code,msize>, bw,0,8, bd,1,4, bq,2,2, wd,3,8, wq,4,4, dq,5,8\r
34         macro pmovsx#conv? dest*,src*\r
35                 SSE.basic_instruction 66h,<38h,20h+code>,msize,dest,src\r
36         end macro\r
37         macro pmovzx#conv? dest*,src*\r
38                 SSE.basic_instruction 66h,<38h,30h+code>,msize,dest,src\r
39         end macro\r
40 end iterate\r
42 macro insertps? dest*,src*,sel*\r
43         SSE.basic_instruction_imm8 66h,<3Ah,21h>,4,dest,src,sel\r
44 end macro\r
46 macro extractps? dest*,src*,sel*\r
47         x86.parse_operand @dest,dest\r
48         SSE.parse_operand @src,src\r
49         x86.parse_operand @aux,sel\r
50         if @dest.type = 'reg' & @src.type = 'mmreg' & @aux.type = 'imm'\r
51                 if x86.mode = 64 & @dest.size = 8\r
52                         @dest.size = 4\r
53                 end if\r
54                 if @dest.size <> 4 | @src.size and not 16 | @aux.size and not 1\r
55                         err 'invalid operand size'\r
56                 end if\r
57                 @dest.opcode_prefix = 66h\r
58                 x86.store_instruction <0Fh,3Ah,17h>,@dest,@src.rm,1,@aux.imm\r
59         else\r
60                 err 'invalid combination of operands'\r
61         end if\r
62 end macro\r
64 macro pinsrb? dest*,src*,sel*\r
65         SSE.parse_operand @dest,dest\r
66         x86.parse_operand @src,src\r
67         x86.parse_operand @aux,sel\r
68         if (@dest.type = 'mmreg' & @dest.size = 16) & (@src.type = 'reg' | @src.type = 'mem') & @aux.type = 'imm'\r
69                 if (@src.type = 'reg' & @src.size <> 4) | (@src.type = 'mem' & @src.size and not 1) | @aux.size and not 1\r
70                         err 'invalid operand size'\r
71                 end if\r
72                 @src.opcode_prefix = 66h\r
73                 x86.store_instruction <0Fh,3Ah,20h>,@src,@dest.rm,1,@aux.imm\r
74         else\r
75                 err 'invalid combination of operands'\r
76         end if\r
77 end macro\r
79 macro pinsrd? dest*,src*,sel*\r
80         SSE.parse_operand @dest,dest\r
81         x86.parse_operand @src,src\r
82         x86.parse_operand @aux,sel\r
83         if (@dest.type = 'mmreg' & @dest.size = 16) & (@src.type = 'reg' | @src.type = 'mem') & @aux.type = 'imm'\r
84                 if @src.size and not 4 | @aux.size and not 1\r
85                         err 'invalid operand size'\r
86                 end if\r
87                 @src.opcode_prefix = 66h\r
88                 x86.store_instruction <0Fh,3Ah,22h>,@src,@dest.rm,1,@aux.imm\r
89         else\r
90                 err 'invalid combination of operands'\r
91         end if\r
92 end macro\r
94 macro pinsrq? dest*,src*,sel*\r
95         SSE.parse_operand @dest,dest\r
96         x86.parse_operand @src,src\r
97         x86.parse_operand @aux,sel\r
98         if (@dest.type = 'mmreg' & @dest.size = 16) & (@src.type = 'reg' | @src.type = 'mem') & @aux.type = 'imm'\r
99                 if @src.size and not 8 | @aux.size and not 1\r
100                         err 'invalid operand size'\r
101                 end if\r
102                 if x86.mode < 64\r
103                         err 'instruction requires long mode'\r
104                 end if\r
105                 @src.opcode_prefix = 66h\r
106                 @src.rex_prefix = 48h\r
107                 x86.store_instruction <0Fh,3Ah,22h>,@src,@dest.rm,1,@aux.imm\r
108         else\r
109                 err 'invalid combination of operands'\r
110         end if\r
111 end macro\r
113 macro pextrb? dest*,src*,sel*\r
114         x86.parse_operand @dest,dest\r
115         SSE.parse_operand @src,src\r
116         x86.parse_operand @aux,sel\r
117         if (@dest.type = 'reg' | @dest.type = 'mem') & (@src.type = 'mmreg' & @src.size = 16) & @aux.type = 'imm'\r
118                 if x86.mode = 64 & @dest.type = 'reg' & @dest.size = 8\r
119                         @dest.size = 4\r
120                 end if\r
121                 if (@dest.type = 'reg' & @dest.size <> 4) | (@dest.size = 'mem' & @dest.size and not 1) | @aux.size and not 1\r
122                         err 'invalid operand size'\r
123                 end if\r
124                 @dest.opcode_prefix = 66h\r
125                 x86.store_instruction <0Fh,3Ah,14h>,@dest,@src.rm,1,@aux.imm\r
126         else\r
127                 err 'invalid combination of operands'\r
128         end if\r
129 end macro\r
131 macro pextrw? dest*,src*,sel*\r
132         x86.parse_operand @dest,dest\r
133         SSE.parse_operand @src,src\r
134         x86.parse_operand @aux,sel\r
135         if @dest.type = 'reg' & @src.type = 'mmreg' & @aux.type = 'imm'\r
136                 if x86.mode = 64 & @dest.size = 8\r
137                         @dest.size = 4\r
138                 end if\r
139                 if @dest.size <> 4 | @aux.size and not 1\r
140                         err 'invalid operand size'\r
141                 end if\r
142                 MMX.select_operand_prefix @src,@src.size\r
143                 x86.store_instruction <0Fh,0C5h>,@src,@dest.rm,1,@aux.imm\r
144         else if @dest.type = 'mem' & (@src.type = 'mmreg' & @src.size = 16) & @aux.type = 'imm'\r
145                 if @dest.size and not 2 | @aux.size and not 1\r
146                         err 'invalid operand size'\r
147                 end if\r
148                 @dest.opcode_prefix = 66h\r
149                 x86.store_instruction <0Fh,3Ah,15h>,@dest,@src.rm,1,@aux.imm\r
150         else\r
151                 err 'invalid combination of operands'\r
152         end if\r
153 end macro\r
155 macro pextrd? dest*,src*,sel*\r
156         x86.parse_operand @dest,dest\r
157         SSE.parse_operand @src,src\r
158         x86.parse_operand @aux,sel\r
159         if (@dest.type = 'reg' | @dest.type = 'mem') & (@src.type = 'mmreg' & @src.size = 16) & @aux.type = 'imm'\r
160                 if x86.mode = 64 & @dest.type = 'reg' & @dest.size = 8\r
161                         @dest.size = 4\r
162                 end if\r
163                 if @dest.size and not 4 | @aux.size and not 1\r
164                         err 'invalid operand size'\r
165                 end if\r
166                 @dest.opcode_prefix = 66h\r
167                 x86.store_instruction <0Fh,3Ah,16h>,@dest,@src.rm,1,@aux.imm\r
168         else\r
169                 err 'invalid combination of operands'\r
170         end if\r
171 end macro\r
173 macro pextrq? dest*,src*,sel*\r
174         x86.parse_operand @dest,dest\r
175         SSE.parse_operand @src,src\r
176         x86.parse_operand @aux,sel\r
177         if (@dest.type = 'reg' | @dest.type = 'mem') & (@src.type = 'mmreg' & @src.size = 16) & @aux.type = 'imm'\r
178                 if @dest.size and not 8 | @aux.size and not 1\r
179                         err 'invalid operand size'\r
180                 end if\r
181                 if x86.mode < 64\r
182                         err 'instruction requires long mode'\r
183                 end if\r
184                 @dest.opcode_prefix = 66h\r
185                 @dest.rex_prefix = 48h\r
186                 x86.store_instruction <0Fh,3Ah,16h>,@dest,@src.rm,1,@aux.imm\r
187         else\r
188                 err 'invalid combination of operands'\r
189         end if\r
190 end macro\r
192 macro movntdqa? dest*,src*\r
193         SSE.parse_operand @dest,dest\r
194         SSE.parse_operand @src,src\r
195         if @dest.type = 'mmreg' & @src.type = 'mem'\r
196                 if (@dest.size or @src.size) and not 16\r
197                         err 'invalid operand size'\r
198                 end if\r
199                 @src.opcode_prefix = 66h\r
200                 x86.store_instruction <0Fh,38h,2Ah>,@src,@dest.rm\r
201         else\r
202                 err 'invalid combination of operands'\r
203         end if\r
204 end macro\r