Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: src/IceAssemblerX86BaseImpl.h

Issue 1224173006: Adds the x86-64 assembler. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: make format Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- subzero/src/IceAssemblerX86BaseImpl.h - base x86 assembler -*- C++ -*-=// 1 //===- subzero/src/IceAssemblerX86BaseImpl.h - base x86 assembler -*- C++ -*-=//
2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
3 // for details. All rights reserved. Use of this source code is governed by a 3 // for details. All rights reserved. Use of this source code is governed by a
4 // BSD-style license that can be found in the LICENSE file. 4 // BSD-style license that can be found in the LICENSE file.
5 // 5 //
6 // Modified by the Subzero authors. 6 // Modified by the Subzero authors.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // The Subzero Code Generator 10 // The Subzero Code Generator
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 template <class Machine> 89 template <class Machine>
90 void AssemblerX86Base<Machine>::BindLocalLabel(SizeT Number) { 90 void AssemblerX86Base<Machine>::BindLocalLabel(SizeT Number) {
91 Label *L = GetOrCreateLocalLabel(Number); 91 Label *L = GetOrCreateLocalLabel(Number);
92 if (!getPreliminary()) 92 if (!getPreliminary())
93 this->bind(L); 93 this->bind(L);
94 } 94 }
95 95
96 template <class Machine> 96 template <class Machine>
97 void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) { 97 void AssemblerX86Base<Machine>::call(typename Traits::GPRRegister reg) {
98 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 98 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
99 emitRexB(IceType_i32, reg);
99 emitUint8(0xFF); 100 emitUint8(0xFF);
100 emitRegisterOperand(2, reg); 101 emitRegisterOperand(2, gprEncoding(reg));
101 } 102 }
102 103
103 template <class Machine> 104 template <class Machine>
104 void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) { 105 void AssemblerX86Base<Machine>::call(const typename Traits::Address &address) {
105 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 106 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
107 emitRex(IceType_i32, address, Traits::GPRRegister::Encoded_Reg_eax);
106 emitUint8(0xFF); 108 emitUint8(0xFF);
107 emitOperand(2, address); 109 emitOperand(2, address);
108 } 110 }
109 111
110 template <class Machine> 112 template <class Machine>
111 void AssemblerX86Base<Machine>::call(const ConstantRelocatable *label) { 113 void AssemblerX86Base<Machine>::call(const ConstantRelocatable *label) {
112 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 114 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
113 intptr_t call_start = Buffer.getPosition(); 115 intptr_t call_start = Buffer.getPosition();
114 emitUint8(0xE8); 116 emitUint8(0xE8);
115 emitFixup(this->createFixup(Traits::PcRelFixup, label)); 117 emitFixup(this->createFixup(Traits::PcRelFixup, label));
116 emitInt32(-4); 118 emitInt32(-4);
117 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize); 119 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
118 (void)call_start; 120 (void)call_start;
119 } 121 }
120 122
121 template <class Machine> 123 template <class Machine>
122 void AssemblerX86Base<Machine>::call(const Immediate &abs_address) { 124 void AssemblerX86Base<Machine>::call(const Immediate &abs_address) {
123 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 125 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
124 intptr_t call_start = Buffer.getPosition(); 126 intptr_t call_start = Buffer.getPosition();
125 emitUint8(0xE8); 127 emitUint8(0xE8);
126 emitFixup(this->createFixup(Traits::PcRelFixup, AssemblerFixup::NullSymbol)); 128 emitFixup(this->createFixup(Traits::PcRelFixup, AssemblerFixup::NullSymbol));
127 emitInt32(abs_address.value() - 4); 129 emitInt32(abs_address.value() - 4);
128 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize); 130 assert((Buffer.getPosition() - call_start) == kCallExternalLabelSize);
129 (void)call_start; 131 (void)call_start;
130 } 132 }
131 133
132 template <class Machine> 134 template <class Machine>
133 void AssemblerX86Base<Machine>::pushl(typename Traits::GPRRegister reg) { 135 void AssemblerX86Base<Machine>::pushl(typename Traits::GPRRegister reg) {
134 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 136 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
135 emitUint8(0x50 + reg); 137 emitRexB(IceType_i32, reg);
138 emitUint8(0x50 + gprEncoding(reg));
136 } 139 }
137 140
138 template <class Machine> 141 template <class Machine>
139 void AssemblerX86Base<Machine>::popl(typename Traits::GPRRegister reg) { 142 void AssemblerX86Base<Machine>::popl(typename Traits::GPRRegister reg) {
140 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 143 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
141 emitUint8(0x58 + reg); 144 // Any type that would not force a REX prefix to be emitted can be provided
145 // here.
146 emitRexB(IceType_i32, reg);
147 emitUint8(0x58 + gprEncoding(reg));
142 } 148 }
143 149
144 template <class Machine> 150 template <class Machine>
145 void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) { 151 void AssemblerX86Base<Machine>::popl(const typename Traits::Address &address) {
146 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 152 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
153 emitRex(IceType_i32, address, Traits::GPRRegister::Encoded_Reg_eax);
147 emitUint8(0x8F); 154 emitUint8(0x8F);
148 emitOperand(0, address); 155 emitOperand(0, address);
149 } 156 }
150 157
151 template <class Machine> void AssemblerX86Base<Machine>::pushal() { 158 template <class Machine>
159 template <typename, typename>
160 void AssemblerX86Base<Machine>::pushal() {
152 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 161 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
153 emitUint8(0x60); 162 emitUint8(0x60);
154 } 163 }
155 164
156 template <class Machine> void AssemblerX86Base<Machine>::popal() { 165 template <class Machine>
166 template <typename, typename>
167 void AssemblerX86Base<Machine>::popal() {
157 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 168 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
158 emitUint8(0x61); 169 emitUint8(0x61);
159 } 170 }
160 171
161 template <class Machine> 172 template <class Machine>
162 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition, 173 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition,
163 typename Traits::ByteRegister dst) { 174 typename Traits::ByteRegister dst) {
164 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 175 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
176 emitRexB(IceType_i8, dst);
165 emitUint8(0x0F); 177 emitUint8(0x0F);
166 emitUint8(0x90 + condition); 178 emitUint8(0x90 + condition);
167 emitUint8(0xC0 + dst); 179 emitUint8(0xC0 + gprEncoding(dst));
168 } 180 }
169 181
170 template <class Machine> 182 template <class Machine>
171 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition, 183 void AssemblerX86Base<Machine>::setcc(typename Traits::Cond::BrCond condition,
172 const typename Traits::Address &address) { 184 const typename Traits::Address &address) {
173 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 185 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
186 emitRex(/*Any non-i64 type*/ IceType_i32, address,
Jim Stichnoth 2015/07/26 15:31:11 It seems that most or all instances of IceType_i32
John 2015/07/27 20:35:58 Yes, it does. I added two named constants (IceType
187 /*any GPR not requiring a rex prefix for the given type*/ Traits::
188 GPRRegister::Encoded_Reg_eax);
174 emitUint8(0x0F); 189 emitUint8(0x0F);
175 emitUint8(0x90 + condition); 190 emitUint8(0x90 + condition);
176 emitOperand(0, address); 191 emitOperand(0, address);
177 } 192 }
178 193
179 template <class Machine> 194 template <class Machine>
180 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 195 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
181 const Immediate &imm) { 196 const Immediate &imm) {
197 assert(Ty != IceType_i64 && "i64 not supported yet.");
182 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 198 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
183 if (isByteSizedType(Ty)) {
184 emitUint8(0xB0 + dst);
185 emitUint8(imm.value() & 0xFF);
186 return;
187 }
188 if (Ty == IceType_i16) 199 if (Ty == IceType_i16)
189 emitOperandSizeOverride(); 200 emitOperandSizeOverride();
190 emitUint8(0xB8 + dst); 201 emitRexB(Ty, dst);
191 emitImmediate(Ty, imm); 202 if (isByteSizedType(Ty)) {
203 emitUint8(0xB0 + gprEncoding(dst));
204 emitUint8(imm.value() & 0xFF);
205 } else {
206 emitUint8(0xB8 + gprEncoding(dst));
207 emitImmediate(Ty, imm);
208 }
192 } 209 }
193 210
194 template <class Machine> 211 template <class Machine>
195 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 212 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
196 typename Traits::GPRRegister src) { 213 typename Traits::GPRRegister src) {
197 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 214 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
198 if (Ty == IceType_i16) 215 if (Ty == IceType_i16)
199 emitOperandSizeOverride(); 216 emitOperandSizeOverride();
217 emitRexRB(Ty, src, dst);
200 if (isByteSizedType(Ty)) { 218 if (isByteSizedType(Ty)) {
201 emitUint8(0x88); 219 emitUint8(0x88);
202 } else { 220 } else {
203 emitUint8(0x89); 221 emitUint8(0x89);
204 } 222 }
205 emitRegisterOperand(src, dst); 223 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
206 } 224 }
207 225
208 template <class Machine> 226 template <class Machine>
209 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst, 227 void AssemblerX86Base<Machine>::mov(Type Ty, typename Traits::GPRRegister dst,
210 const typename Traits::Address &src) { 228 const typename Traits::Address &src) {
211 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 229 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
212 if (Ty == IceType_i16) 230 if (Ty == IceType_i16)
213 emitOperandSizeOverride(); 231 emitOperandSizeOverride();
232 emitRex(Ty, src, dst);
214 if (isByteSizedType(Ty)) { 233 if (isByteSizedType(Ty)) {
215 emitUint8(0x8A); 234 emitUint8(0x8A);
216 } else { 235 } else {
217 emitUint8(0x8B); 236 emitUint8(0x8B);
218 } 237 }
219 emitOperand(dst, src); 238 emitOperand(gprEncoding(dst), src);
220 } 239 }
221 240
222 template <class Machine> 241 template <class Machine>
223 void AssemblerX86Base<Machine>::mov(Type Ty, 242 void AssemblerX86Base<Machine>::mov(Type Ty,
224 const typename Traits::Address &dst, 243 const typename Traits::Address &dst,
225 typename Traits::GPRRegister src) { 244 typename Traits::GPRRegister src) {
226 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 245 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
227 if (Ty == IceType_i16) 246 if (Ty == IceType_i16)
228 emitOperandSizeOverride(); 247 emitOperandSizeOverride();
248 emitRex(Ty, dst, src);
229 if (isByteSizedType(Ty)) { 249 if (isByteSizedType(Ty)) {
230 emitUint8(0x88); 250 emitUint8(0x88);
231 } else { 251 } else {
232 emitUint8(0x89); 252 emitUint8(0x89);
233 } 253 }
234 emitOperand(src, dst); 254 emitOperand(gprEncoding(src), dst);
235 } 255 }
236 256
237 template <class Machine> 257 template <class Machine>
238 void AssemblerX86Base<Machine>::mov(Type Ty, 258 void AssemblerX86Base<Machine>::mov(Type Ty,
239 const typename Traits::Address &dst, 259 const typename Traits::Address &dst,
240 const Immediate &imm) { 260 const Immediate &imm) {
261 assert(Ty != IceType_i64 && "i64 not supported yet.");
241 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 262 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
242 if (Ty == IceType_i16) 263 if (Ty == IceType_i16)
243 emitOperandSizeOverride(); 264 emitOperandSizeOverride();
265 // Any register not requiring a rex prefix is acceptable here instead of eax.
266 emitRex(Ty, dst, Traits::GPRRegister::Encoded_Reg_eax);
244 if (isByteSizedType(Ty)) { 267 if (isByteSizedType(Ty)) {
245 emitUint8(0xC6); 268 emitUint8(0xC6);
246 emitOperand(0, dst); 269 emitOperand(0, dst);
247 emitUint8(imm.value() & 0xFF); 270 emitUint8(imm.value() & 0xFF);
248 } else { 271 } else {
249 emitUint8(0xC7); 272 emitUint8(0xC7);
250 emitOperand(0, dst); 273 emitOperand(0, dst);
251 emitImmediate(Ty, imm); 274 emitImmediate(Ty, imm);
252 } 275 }
253 } 276 }
254 277
278 // For movzx below, we can emit or not rex based on SrcTy. X86-64 will
279 // automatically zero the upper 32 bits of the destination register. For movsx
280 // we force IceType_i64 because we want all sign bits in the (64- bit)
281 // destination register.
255 template <class Machine> 282 template <class Machine>
256 void AssemblerX86Base<Machine>::movzx(Type SrcTy, 283 void AssemblerX86Base<Machine>::movzx(Type SrcTy,
257 typename Traits::GPRRegister dst, 284 typename Traits::GPRRegister dst,
258 typename Traits::GPRRegister src) { 285 typename Traits::GPRRegister src) {
259 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 286 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
260 bool ByteSized = isByteSizedType(SrcTy); 287 bool ByteSized = isByteSizedType(SrcTy);
261 assert(ByteSized || SrcTy == IceType_i16); 288 assert(ByteSized || SrcTy == IceType_i16);
289 emitRexRB(SrcTy, dst, src);
262 emitUint8(0x0F); 290 emitUint8(0x0F);
263 emitUint8(ByteSized ? 0xB6 : 0xB7); 291 emitUint8(ByteSized ? 0xB6 : 0xB7);
264 emitRegisterOperand(dst, src); 292 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
265 } 293 }
266 294
267 template <class Machine> 295 template <class Machine>
268 void AssemblerX86Base<Machine>::movzx(Type SrcTy, 296 void AssemblerX86Base<Machine>::movzx(Type SrcTy,
269 typename Traits::GPRRegister dst, 297 typename Traits::GPRRegister dst,
270 const typename Traits::Address &src) { 298 const typename Traits::Address &src) {
271 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 299 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
272 bool ByteSized = isByteSizedType(SrcTy); 300 bool ByteSized = isByteSizedType(SrcTy);
273 assert(ByteSized || SrcTy == IceType_i16); 301 assert(ByteSized || SrcTy == IceType_i16);
302 emitRex(SrcTy, src, dst);
274 emitUint8(0x0F); 303 emitUint8(0x0F);
275 emitUint8(ByteSized ? 0xB6 : 0xB7); 304 emitUint8(ByteSized ? 0xB6 : 0xB7);
276 emitOperand(dst, src); 305 emitOperand(gprEncoding(dst), src);
277 } 306 }
278 307
279 template <class Machine> 308 template <class Machine>
280 void AssemblerX86Base<Machine>::movsx(Type SrcTy, 309 void AssemblerX86Base<Machine>::movsx(Type SrcTy,
281 typename Traits::GPRRegister dst, 310 typename Traits::GPRRegister dst,
282 typename Traits::GPRRegister src) { 311 typename Traits::GPRRegister src) {
283 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 312 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
284 bool ByteSized = isByteSizedType(SrcTy); 313 bool ByteSized = isByteSizedType(SrcTy);
285 assert(ByteSized || SrcTy == IceType_i16); 314 assert(ByteSized || SrcTy == IceType_i16);
315 emitRexRB(SrcTy, dst, src);
286 emitUint8(0x0F); 316 emitUint8(0x0F);
287 emitUint8(ByteSized ? 0xBE : 0xBF); 317 emitUint8(ByteSized ? 0xBE : 0xBF);
288 emitRegisterOperand(dst, src); 318 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
289 } 319 }
290 320
291 template <class Machine> 321 template <class Machine>
292 void AssemblerX86Base<Machine>::movsx(Type SrcTy, 322 void AssemblerX86Base<Machine>::movsx(Type SrcTy,
293 typename Traits::GPRRegister dst, 323 typename Traits::GPRRegister dst,
294 const typename Traits::Address &src) { 324 const typename Traits::Address &src) {
295 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 325 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
296 bool ByteSized = isByteSizedType(SrcTy); 326 bool ByteSized = isByteSizedType(SrcTy);
297 assert(ByteSized || SrcTy == IceType_i16); 327 assert(ByteSized || SrcTy == IceType_i16);
328 emitRex(SrcTy, src, dst);
298 emitUint8(0x0F); 329 emitUint8(0x0F);
299 emitUint8(ByteSized ? 0xBE : 0xBF); 330 emitUint8(ByteSized ? 0xBE : 0xBF);
300 emitOperand(dst, src); 331 emitOperand(gprEncoding(dst), src);
301 } 332 }
302 333
303 template <class Machine> 334 template <class Machine>
304 void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst, 335 void AssemblerX86Base<Machine>::lea(Type Ty, typename Traits::GPRRegister dst,
305 const typename Traits::Address &src) { 336 const typename Traits::Address &src) {
306 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 337 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
307 assert(Ty == IceType_i16 || Ty == IceType_i32); 338 assert(Ty == IceType_i16 || Ty == IceType_i32);
308 if (Ty == IceType_i16) 339 if (Ty == IceType_i16)
309 emitOperandSizeOverride(); 340 emitOperandSizeOverride();
341 emitRex(Ty, src, dst);
310 emitUint8(0x8D); 342 emitUint8(0x8D);
311 emitOperand(dst, src); 343 emitOperand(gprEncoding(dst), src);
312 } 344 }
313 345
314 template <class Machine> 346 template <class Machine>
315 void AssemblerX86Base<Machine>::cmov(Type Ty, 347 void AssemblerX86Base<Machine>::cmov(Type Ty,
316 typename Traits::Cond::BrCond cond, 348 typename Traits::Cond::BrCond cond,
317 typename Traits::GPRRegister dst, 349 typename Traits::GPRRegister dst,
318 typename Traits::GPRRegister src) { 350 typename Traits::GPRRegister src) {
319 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 351 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
320 if (Ty == IceType_i16) 352 if (Ty == IceType_i16)
321 emitOperandSizeOverride(); 353 emitOperandSizeOverride();
322 else 354 else
323 assert(Ty == IceType_i32); 355 assert(Ty == IceType_i32);
356 emitRexRB(Ty, dst, src);
324 emitUint8(0x0F); 357 emitUint8(0x0F);
325 emitUint8(0x40 + cond); 358 emitUint8(0x40 + cond);
326 emitRegisterOperand(dst, src); 359 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
327 } 360 }
328 361
329 template <class Machine> 362 template <class Machine>
330 void AssemblerX86Base<Machine>::cmov(Type Ty, 363 void AssemblerX86Base<Machine>::cmov(Type Ty,
331 typename Traits::Cond::BrCond cond, 364 typename Traits::Cond::BrCond cond,
332 typename Traits::GPRRegister dst, 365 typename Traits::GPRRegister dst,
333 const typename Traits::Address &src) { 366 const typename Traits::Address &src) {
334 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 367 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
335 if (Ty == IceType_i16) 368 if (Ty == IceType_i16)
336 emitOperandSizeOverride(); 369 emitOperandSizeOverride();
337 else 370 else
338 assert(Ty == IceType_i32); 371 assert(Ty == IceType_i32);
372 emitRex(Ty, src, dst);
339 emitUint8(0x0F); 373 emitUint8(0x0F);
340 emitUint8(0x40 + cond); 374 emitUint8(0x40 + cond);
341 emitOperand(dst, src); 375 emitOperand(gprEncoding(dst), src);
342 } 376 }
343 377
344 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() { 378 template <class Machine> void AssemblerX86Base<Machine>::rep_movsb() {
345 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 379 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
346 emitUint8(0xF3); 380 emitUint8(0xF3);
347 emitUint8(0xA4); 381 emitUint8(0xA4);
348 } 382 }
349 383
350 template <class Machine> 384 template <class Machine>
351 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, 385 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst,
352 const typename Traits::Address &src) { 386 const typename Traits::Address &src) {
353 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 387 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
354 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 388 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
389 emitRex(IceType_i32, src, dst);
355 emitUint8(0x0F); 390 emitUint8(0x0F);
356 emitUint8(0x10); 391 emitUint8(0x10);
357 emitOperand(dst, src); 392 emitOperand(gprEncoding(dst), src);
358 } 393 }
359 394
360 template <class Machine> 395 template <class Machine>
361 void AssemblerX86Base<Machine>::movss(Type Ty, 396 void AssemblerX86Base<Machine>::movss(Type Ty,
362 const typename Traits::Address &dst, 397 const typename Traits::Address &dst,
363 typename Traits::XmmRegister src) { 398 typename Traits::XmmRegister src) {
364 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 399 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
365 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 400 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
401 emitRex(IceType_i32, dst, src);
366 emitUint8(0x0F); 402 emitUint8(0x0F);
367 emitUint8(0x11); 403 emitUint8(0x11);
368 emitOperand(src, dst); 404 emitOperand(gprEncoding(src), dst);
369 } 405 }
370 406
371 template <class Machine> 407 template <class Machine>
372 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst, 408 void AssemblerX86Base<Machine>::movss(Type Ty, typename Traits::XmmRegister dst,
373 typename Traits::XmmRegister src) { 409 typename Traits::XmmRegister src) {
374 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 410 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
375 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 411 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
412 emitRexRB(IceType_i32, src, dst);
376 emitUint8(0x0F); 413 emitUint8(0x0F);
377 emitUint8(0x11); 414 emitUint8(0x11);
378 emitXmmRegisterOperand(src, dst); 415 emitXmmRegisterOperand(src, dst);
379 } 416 }
380 417
381 template <class Machine> 418 template <class Machine>
382 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst, 419 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst,
383 typename Traits::GPRRegister src) { 420 typename Traits::GPRRegister src) {
384 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 421 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
385 emitUint8(0x66); 422 emitUint8(0x66);
423 emitRexRB(IceType_i32, dst, src);
386 emitUint8(0x0F); 424 emitUint8(0x0F);
387 emitUint8(0x6E); 425 emitUint8(0x6E);
388 emitRegisterOperand(dst, src); 426 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
389 } 427 }
390 428
391 template <class Machine> 429 template <class Machine>
392 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst, 430 void AssemblerX86Base<Machine>::movd(typename Traits::XmmRegister dst,
393 const typename Traits::Address &src) { 431 const typename Traits::Address &src) {
394 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 432 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
395 emitUint8(0x66); 433 emitUint8(0x66);
434 emitRex(IceType_i32, src, dst);
396 emitUint8(0x0F); 435 emitUint8(0x0F);
397 emitUint8(0x6E); 436 emitUint8(0x6E);
398 emitOperand(dst, src); 437 emitOperand(gprEncoding(dst), src);
399 } 438 }
400 439
401 template <class Machine> 440 template <class Machine>
402 void AssemblerX86Base<Machine>::movd(typename Traits::GPRRegister dst, 441 void AssemblerX86Base<Machine>::movd(typename Traits::GPRRegister dst,
403 typename Traits::XmmRegister src) { 442 typename Traits::XmmRegister src) {
404 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 443 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
405 emitUint8(0x66); 444 emitUint8(0x66);
445 emitRexRB(IceType_i32, src, dst);
406 emitUint8(0x0F); 446 emitUint8(0x0F);
407 emitUint8(0x7E); 447 emitUint8(0x7E);
408 emitRegisterOperand(src, dst); 448 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
409 } 449 }
410 450
411 template <class Machine> 451 template <class Machine>
412 void AssemblerX86Base<Machine>::movd(const typename Traits::Address &dst, 452 void AssemblerX86Base<Machine>::movd(const typename Traits::Address &dst,
413 typename Traits::XmmRegister src) { 453 typename Traits::XmmRegister src) {
414 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 454 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
415 emitUint8(0x66); 455 emitUint8(0x66);
456 emitRex(IceType_i32, dst, src);
416 emitUint8(0x0F); 457 emitUint8(0x0F);
417 emitUint8(0x7E); 458 emitUint8(0x7E);
418 emitOperand(src, dst); 459 emitOperand(gprEncoding(src), dst);
419 } 460 }
420 461
421 template <class Machine> 462 template <class Machine>
422 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, 463 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst,
423 typename Traits::XmmRegister src) { 464 typename Traits::XmmRegister src) {
424 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 465 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
425 emitUint8(0xF3); 466 emitUint8(0xF3);
467 emitRexRB(IceType_i32, dst, src);
426 emitUint8(0x0F); 468 emitUint8(0x0F);
427 emitUint8(0x7E); 469 emitUint8(0x7E);
428 emitRegisterOperand(dst, src); 470 emitXmmRegisterOperand(dst, src);
429 } 471 }
430 472
431 template <class Machine> 473 template <class Machine>
432 void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst, 474 void AssemblerX86Base<Machine>::movq(const typename Traits::Address &dst,
433 typename Traits::XmmRegister src) { 475 typename Traits::XmmRegister src) {
434 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 476 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
435 emitUint8(0x66); 477 emitUint8(0x66);
478 emitRex(IceType_i32, dst, src);
436 emitUint8(0x0F); 479 emitUint8(0x0F);
437 emitUint8(0xD6); 480 emitUint8(0xD6);
438 emitOperand(src, dst); 481 emitOperand(gprEncoding(src), dst);
439 } 482 }
440 483
441 template <class Machine> 484 template <class Machine>
442 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst, 485 void AssemblerX86Base<Machine>::movq(typename Traits::XmmRegister dst,
443 const typename Traits::Address &src) { 486 const typename Traits::Address &src) {
444 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 487 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
445 emitUint8(0xF3); 488 emitUint8(0xF3);
489 emitRex(IceType_i32, src, dst);
446 emitUint8(0x0F); 490 emitUint8(0x0F);
447 emitUint8(0x7E); 491 emitUint8(0x7E);
448 emitOperand(dst, src); 492 emitOperand(gprEncoding(dst), src);
449 } 493 }
450 494
451 template <class Machine> 495 template <class Machine>
452 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, 496 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst,
453 typename Traits::XmmRegister src) { 497 typename Traits::XmmRegister src) {
454 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 498 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
455 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 499 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
500 emitRexRB(IceType_i32, dst, src);
456 emitUint8(0x0F); 501 emitUint8(0x0F);
457 emitUint8(0x58); 502 emitUint8(0x58);
458 emitXmmRegisterOperand(dst, src); 503 emitXmmRegisterOperand(dst, src);
459 } 504 }
460 505
461 template <class Machine> 506 template <class Machine>
462 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst, 507 void AssemblerX86Base<Machine>::addss(Type Ty, typename Traits::XmmRegister dst,
463 const typename Traits::Address &src) { 508 const typename Traits::Address &src) {
464 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 509 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
465 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 510 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
511 emitRex(IceType_i32, src, dst);
466 emitUint8(0x0F); 512 emitUint8(0x0F);
467 emitUint8(0x58); 513 emitUint8(0x58);
468 emitOperand(dst, src); 514 emitOperand(gprEncoding(dst), src);
469 } 515 }
470 516
471 template <class Machine> 517 template <class Machine>
472 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, 518 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst,
473 typename Traits::XmmRegister src) { 519 typename Traits::XmmRegister src) {
474 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 520 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
475 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 521 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
522 emitRexRB(IceType_i32, dst, src);
476 emitUint8(0x0F); 523 emitUint8(0x0F);
477 emitUint8(0x5C); 524 emitUint8(0x5C);
478 emitXmmRegisterOperand(dst, src); 525 emitXmmRegisterOperand(dst, src);
479 } 526 }
480 527
481 template <class Machine> 528 template <class Machine>
482 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst, 529 void AssemblerX86Base<Machine>::subss(Type Ty, typename Traits::XmmRegister dst,
483 const typename Traits::Address &src) { 530 const typename Traits::Address &src) {
484 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 531 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
485 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 532 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
533 emitRex(IceType_i32, src, dst);
486 emitUint8(0x0F); 534 emitUint8(0x0F);
487 emitUint8(0x5C); 535 emitUint8(0x5C);
488 emitOperand(dst, src); 536 emitOperand(gprEncoding(dst), src);
489 } 537 }
490 538
491 template <class Machine> 539 template <class Machine>
492 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, 540 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst,
493 typename Traits::XmmRegister src) { 541 typename Traits::XmmRegister src) {
494 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 542 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
495 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 543 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
544 emitRexRB(IceType_i32, dst, src);
496 emitUint8(0x0F); 545 emitUint8(0x0F);
497 emitUint8(0x59); 546 emitUint8(0x59);
498 emitXmmRegisterOperand(dst, src); 547 emitXmmRegisterOperand(dst, src);
499 } 548 }
500 549
501 template <class Machine> 550 template <class Machine>
502 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst, 551 void AssemblerX86Base<Machine>::mulss(Type Ty, typename Traits::XmmRegister dst,
503 const typename Traits::Address &src) { 552 const typename Traits::Address &src) {
504 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 553 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
505 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 554 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
555 emitRex(IceType_i32, src, dst);
506 emitUint8(0x0F); 556 emitUint8(0x0F);
507 emitUint8(0x59); 557 emitUint8(0x59);
508 emitOperand(dst, src); 558 emitOperand(gprEncoding(dst), src);
509 } 559 }
510 560
511 template <class Machine> 561 template <class Machine>
512 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, 562 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst,
513 typename Traits::XmmRegister src) { 563 typename Traits::XmmRegister src) {
514 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 564 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
515 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 565 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
566 emitRexRB(IceType_i32, dst, src);
516 emitUint8(0x0F); 567 emitUint8(0x0F);
517 emitUint8(0x5E); 568 emitUint8(0x5E);
518 emitXmmRegisterOperand(dst, src); 569 emitXmmRegisterOperand(dst, src);
519 } 570 }
520 571
521 template <class Machine> 572 template <class Machine>
522 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst, 573 void AssemblerX86Base<Machine>::divss(Type Ty, typename Traits::XmmRegister dst,
523 const typename Traits::Address &src) { 574 const typename Traits::Address &src) {
524 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 575 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
525 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 576 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
577 emitRex(IceType_i32, src, dst);
526 emitUint8(0x0F); 578 emitUint8(0x0F);
527 emitUint8(0x5E); 579 emitUint8(0x5E);
528 emitOperand(dst, src); 580 emitOperand(gprEncoding(dst), src);
529 } 581 }
530 582
531 template <class Machine> 583 template <class Machine>
532 void AssemblerX86Base<Machine>::fld(Type Ty, 584 template <typename T, typename>
533 const typename Traits::Address &src) { 585 void AssemblerX86Base<Machine>::fld(Type Ty, const typename T::Address &src) {
534 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 586 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
535 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); 587 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
536 emitOperand(0, src); 588 emitOperand(0, src);
537 } 589 }
538 590
539 template <class Machine> 591 template <class Machine>
540 void AssemblerX86Base<Machine>::fstp(Type Ty, 592 template <typename T, typename>
541 const typename Traits::Address &dst) { 593 void AssemblerX86Base<Machine>::fstp(Type Ty, const typename T::Address &dst) {
542 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 594 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
543 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); 595 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD);
544 emitOperand(3, dst); 596 emitOperand(3, dst);
545 } 597 }
546 598
547 template <class Machine> 599 template <class Machine>
548 void AssemblerX86Base<Machine>::fstp(typename Traits::X87STRegister st) { 600 template <typename T, typename>
601 void AssemblerX86Base<Machine>::fstp(typename T::X87STRegister st) {
549 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 602 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
550 emitUint8(0xDD); 603 emitUint8(0xDD);
551 emitUint8(0xD8 + st); 604 emitUint8(0xD8 + st);
552 } 605 }
553 606
554 template <class Machine> 607 template <class Machine>
555 void AssemblerX86Base<Machine>::movaps(typename Traits::XmmRegister dst, 608 void AssemblerX86Base<Machine>::movaps(typename Traits::XmmRegister dst,
556 typename Traits::XmmRegister src) { 609 typename Traits::XmmRegister src) {
557 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 610 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
611 emitRexRB(IceType_i32, dst, src);
558 emitUint8(0x0F); 612 emitUint8(0x0F);
559 emitUint8(0x28); 613 emitUint8(0x28);
560 emitXmmRegisterOperand(dst, src); 614 emitXmmRegisterOperand(dst, src);
561 } 615 }
562 616
563 template <class Machine> 617 template <class Machine>
564 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst, 618 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst,
565 typename Traits::XmmRegister src) { 619 typename Traits::XmmRegister src) {
566 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 620 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
621 emitRexRB(IceType_i32, dst, src);
567 emitUint8(0x0F); 622 emitUint8(0x0F);
568 emitUint8(0x10); 623 emitUint8(0x10);
569 emitRegisterOperand(dst, src); 624 emitXmmRegisterOperand(dst, src);
570 } 625 }
571 626
572 template <class Machine> 627 template <class Machine>
573 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst, 628 void AssemblerX86Base<Machine>::movups(typename Traits::XmmRegister dst,
574 const typename Traits::Address &src) { 629 const typename Traits::Address &src) {
575 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 630 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
631 emitRex(IceType_i32, src, dst);
576 emitUint8(0x0F); 632 emitUint8(0x0F);
577 emitUint8(0x10); 633 emitUint8(0x10);
578 emitOperand(dst, src); 634 emitOperand(gprEncoding(dst), src);
579 } 635 }
580 636
581 template <class Machine> 637 template <class Machine>
582 void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst, 638 void AssemblerX86Base<Machine>::movups(const typename Traits::Address &dst,
583 typename Traits::XmmRegister src) { 639 typename Traits::XmmRegister src) {
584 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 640 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
641 emitRex(IceType_i32, dst, src);
585 emitUint8(0x0F); 642 emitUint8(0x0F);
586 emitUint8(0x11); 643 emitUint8(0x11);
587 emitOperand(src, dst); 644 emitOperand(gprEncoding(src), dst);
588 } 645 }
589 646
590 template <class Machine> 647 template <class Machine>
591 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, 648 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst,
592 typename Traits::XmmRegister src) { 649 typename Traits::XmmRegister src) {
593 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 650 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
594 emitUint8(0x66); 651 emitUint8(0x66);
652 emitRexRB(IceType_i32, dst, src);
595 emitUint8(0x0F); 653 emitUint8(0x0F);
596 if (isByteSizedArithType(Ty)) { 654 if (isByteSizedArithType(Ty)) {
597 emitUint8(0xFC); 655 emitUint8(0xFC);
598 } else if (Ty == IceType_i16) { 656 } else if (Ty == IceType_i16) {
599 emitUint8(0xFD); 657 emitUint8(0xFD);
600 } else { 658 } else {
601 emitUint8(0xFE); 659 emitUint8(0xFE);
602 } 660 }
603 emitXmmRegisterOperand(dst, src); 661 emitXmmRegisterOperand(dst, src);
604 } 662 }
605 663
606 template <class Machine> 664 template <class Machine>
607 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst, 665 void AssemblerX86Base<Machine>::padd(Type Ty, typename Traits::XmmRegister dst,
608 const typename Traits::Address &src) { 666 const typename Traits::Address &src) {
609 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 667 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
610 emitUint8(0x66); 668 emitUint8(0x66);
669 emitRex(IceType_i32, src, dst);
611 emitUint8(0x0F); 670 emitUint8(0x0F);
612 if (isByteSizedArithType(Ty)) { 671 if (isByteSizedArithType(Ty)) {
613 emitUint8(0xFC); 672 emitUint8(0xFC);
614 } else if (Ty == IceType_i16) { 673 } else if (Ty == IceType_i16) {
615 emitUint8(0xFD); 674 emitUint8(0xFD);
616 } else { 675 } else {
617 emitUint8(0xFE); 676 emitUint8(0xFE);
618 } 677 }
619 emitOperand(dst, src); 678 emitOperand(gprEncoding(dst), src);
620 } 679 }
621 680
622 template <class Machine> 681 template <class Machine>
623 void AssemblerX86Base<Machine>::pand(Type /* Ty */, 682 void AssemblerX86Base<Machine>::pand(Type /* Ty */,
624 typename Traits::XmmRegister dst, 683 typename Traits::XmmRegister dst,
625 typename Traits::XmmRegister src) { 684 typename Traits::XmmRegister src) {
626 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 685 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
627 emitUint8(0x66); 686 emitUint8(0x66);
687 emitRexRB(IceType_i32, dst, src);
628 emitUint8(0x0F); 688 emitUint8(0x0F);
629 emitUint8(0xDB); 689 emitUint8(0xDB);
630 emitXmmRegisterOperand(dst, src); 690 emitXmmRegisterOperand(dst, src);
631 } 691 }
632 692
633 template <class Machine> 693 template <class Machine>
634 void AssemblerX86Base<Machine>::pand(Type /* Ty */, 694 void AssemblerX86Base<Machine>::pand(Type /* Ty */,
635 typename Traits::XmmRegister dst, 695 typename Traits::XmmRegister dst,
636 const typename Traits::Address &src) { 696 const typename Traits::Address &src) {
637 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 697 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
638 emitUint8(0x66); 698 emitUint8(0x66);
699 emitRex(IceType_i32, src, dst);
639 emitUint8(0x0F); 700 emitUint8(0x0F);
640 emitUint8(0xDB); 701 emitUint8(0xDB);
641 emitOperand(dst, src); 702 emitOperand(gprEncoding(dst), src);
642 } 703 }
643 704
644 template <class Machine> 705 template <class Machine>
645 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, 706 void AssemblerX86Base<Machine>::pandn(Type /* Ty */,
646 typename Traits::XmmRegister dst, 707 typename Traits::XmmRegister dst,
647 typename Traits::XmmRegister src) { 708 typename Traits::XmmRegister src) {
648 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 709 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
649 emitUint8(0x66); 710 emitUint8(0x66);
711 emitRexRB(IceType_i32, dst, src);
650 emitUint8(0x0F); 712 emitUint8(0x0F);
651 emitUint8(0xDF); 713 emitUint8(0xDF);
652 emitXmmRegisterOperand(dst, src); 714 emitXmmRegisterOperand(dst, src);
653 } 715 }
654 716
655 template <class Machine> 717 template <class Machine>
656 void AssemblerX86Base<Machine>::pandn(Type /* Ty */, 718 void AssemblerX86Base<Machine>::pandn(Type /* Ty */,
657 typename Traits::XmmRegister dst, 719 typename Traits::XmmRegister dst,
658 const typename Traits::Address &src) { 720 const typename Traits::Address &src) {
659 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 721 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
660 emitUint8(0x66); 722 emitUint8(0x66);
723 emitRex(IceType_i32, src, dst);
661 emitUint8(0x0F); 724 emitUint8(0x0F);
662 emitUint8(0xDF); 725 emitUint8(0xDF);
663 emitOperand(dst, src); 726 emitOperand(gprEncoding(dst), src);
664 } 727 }
665 728
666 template <class Machine> 729 template <class Machine>
667 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, 730 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst,
668 typename Traits::XmmRegister src) { 731 typename Traits::XmmRegister src) {
669 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 732 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
670 emitUint8(0x66); 733 emitUint8(0x66);
734 emitRexRB(IceType_i32, dst, src);
671 emitUint8(0x0F); 735 emitUint8(0x0F);
672 if (Ty == IceType_i16) { 736 if (Ty == IceType_i16) {
673 emitUint8(0xD5); 737 emitUint8(0xD5);
674 } else { 738 } else {
675 assert(Ty == IceType_i32); 739 assert(Ty == IceType_i32);
676 emitUint8(0x38); 740 emitUint8(0x38);
677 emitUint8(0x40); 741 emitUint8(0x40);
678 } 742 }
679 emitXmmRegisterOperand(dst, src); 743 emitXmmRegisterOperand(dst, src);
680 } 744 }
681 745
682 template <class Machine> 746 template <class Machine>
683 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst, 747 void AssemblerX86Base<Machine>::pmull(Type Ty, typename Traits::XmmRegister dst,
684 const typename Traits::Address &src) { 748 const typename Traits::Address &src) {
685 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 749 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
686 emitUint8(0x66); 750 emitUint8(0x66);
751 emitRex(IceType_i32, src, dst);
687 emitUint8(0x0F); 752 emitUint8(0x0F);
688 if (Ty == IceType_i16) { 753 if (Ty == IceType_i16) {
689 emitUint8(0xD5); 754 emitUint8(0xD5);
690 } else { 755 } else {
691 assert(Ty == IceType_i32); 756 assert(Ty == IceType_i32);
692 emitUint8(0x38); 757 emitUint8(0x38);
693 emitUint8(0x40); 758 emitUint8(0x40);
694 } 759 }
695 emitOperand(dst, src); 760 emitOperand(gprEncoding(dst), src);
696 } 761 }
697 762
698 template <class Machine> 763 template <class Machine>
699 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */, 764 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */,
700 typename Traits::XmmRegister dst, 765 typename Traits::XmmRegister dst,
701 typename Traits::XmmRegister src) { 766 typename Traits::XmmRegister src) {
702 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 767 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
703 emitUint8(0x66); 768 emitUint8(0x66);
769 emitRexRB(IceType_i32, dst, src);
704 emitUint8(0x0F); 770 emitUint8(0x0F);
705 emitUint8(0xF4); 771 emitUint8(0xF4);
706 emitXmmRegisterOperand(dst, src); 772 emitXmmRegisterOperand(dst, src);
707 } 773 }
708 774
709 template <class Machine> 775 template <class Machine>
710 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */, 776 void AssemblerX86Base<Machine>::pmuludq(Type /* Ty */,
711 typename Traits::XmmRegister dst, 777 typename Traits::XmmRegister dst,
712 const typename Traits::Address &src) { 778 const typename Traits::Address &src) {
713 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 779 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
714 emitUint8(0x66); 780 emitUint8(0x66);
781 emitRex(IceType_i32, src, dst);
715 emitUint8(0x0F); 782 emitUint8(0x0F);
716 emitUint8(0xF4); 783 emitUint8(0xF4);
717 emitOperand(dst, src); 784 emitOperand(gprEncoding(dst), src);
718 } 785 }
719 786
720 template <class Machine> 787 template <class Machine>
721 void AssemblerX86Base<Machine>::por(Type /* Ty */, 788 void AssemblerX86Base<Machine>::por(Type /* Ty */,
722 typename Traits::XmmRegister dst, 789 typename Traits::XmmRegister dst,
723 typename Traits::XmmRegister src) { 790 typename Traits::XmmRegister src) {
724 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 791 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
725 emitUint8(0x66); 792 emitUint8(0x66);
793 emitRexRB(IceType_i32, dst, src);
726 emitUint8(0x0F); 794 emitUint8(0x0F);
727 emitUint8(0xEB); 795 emitUint8(0xEB);
728 emitXmmRegisterOperand(dst, src); 796 emitXmmRegisterOperand(dst, src);
729 } 797 }
730 798
731 template <class Machine> 799 template <class Machine>
732 void AssemblerX86Base<Machine>::por(Type /* Ty */, 800 void AssemblerX86Base<Machine>::por(Type /* Ty */,
733 typename Traits::XmmRegister dst, 801 typename Traits::XmmRegister dst,
734 const typename Traits::Address &src) { 802 const typename Traits::Address &src) {
735 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 803 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
736 emitUint8(0x66); 804 emitUint8(0x66);
805 emitRex(IceType_i32, src, dst);
737 emitUint8(0x0F); 806 emitUint8(0x0F);
738 emitUint8(0xEB); 807 emitUint8(0xEB);
739 emitOperand(dst, src); 808 emitOperand(gprEncoding(dst), src);
740 } 809 }
741 810
742 template <class Machine> 811 template <class Machine>
743 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, 812 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst,
744 typename Traits::XmmRegister src) { 813 typename Traits::XmmRegister src) {
745 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 814 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
746 emitUint8(0x66); 815 emitUint8(0x66);
816 emitRexRB(IceType_i32, dst, src);
747 emitUint8(0x0F); 817 emitUint8(0x0F);
748 if (isByteSizedArithType(Ty)) { 818 if (isByteSizedArithType(Ty)) {
749 emitUint8(0xF8); 819 emitUint8(0xF8);
750 } else if (Ty == IceType_i16) { 820 } else if (Ty == IceType_i16) {
751 emitUint8(0xF9); 821 emitUint8(0xF9);
752 } else { 822 } else {
753 emitUint8(0xFA); 823 emitUint8(0xFA);
754 } 824 }
755 emitXmmRegisterOperand(dst, src); 825 emitXmmRegisterOperand(dst, src);
756 } 826 }
757 827
758 template <class Machine> 828 template <class Machine>
759 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst, 829 void AssemblerX86Base<Machine>::psub(Type Ty, typename Traits::XmmRegister dst,
760 const typename Traits::Address &src) { 830 const typename Traits::Address &src) {
761 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 831 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
762 emitUint8(0x66); 832 emitUint8(0x66);
833 emitRex(IceType_i32, src, dst);
763 emitUint8(0x0F); 834 emitUint8(0x0F);
764 if (isByteSizedArithType(Ty)) { 835 if (isByteSizedArithType(Ty)) {
765 emitUint8(0xF8); 836 emitUint8(0xF8);
766 } else if (Ty == IceType_i16) { 837 } else if (Ty == IceType_i16) {
767 emitUint8(0xF9); 838 emitUint8(0xF9);
768 } else { 839 } else {
769 emitUint8(0xFA); 840 emitUint8(0xFA);
770 } 841 }
771 emitOperand(dst, src); 842 emitOperand(gprEncoding(dst), src);
772 } 843 }
773 844
774 template <class Machine> 845 template <class Machine>
775 void AssemblerX86Base<Machine>::pxor(Type /* Ty */, 846 void AssemblerX86Base<Machine>::pxor(Type /* Ty */,
776 typename Traits::XmmRegister dst, 847 typename Traits::XmmRegister dst,
777 typename Traits::XmmRegister src) { 848 typename Traits::XmmRegister src) {
778 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 849 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
779 emitUint8(0x66); 850 emitUint8(0x66);
851 emitRexRB(IceType_i32, dst, src);
780 emitUint8(0x0F); 852 emitUint8(0x0F);
781 emitUint8(0xEF); 853 emitUint8(0xEF);
782 emitXmmRegisterOperand(dst, src); 854 emitXmmRegisterOperand(dst, src);
783 } 855 }
784 856
785 template <class Machine> 857 template <class Machine>
786 void AssemblerX86Base<Machine>::pxor(Type /* Ty */, 858 void AssemblerX86Base<Machine>::pxor(Type /* Ty */,
787 typename Traits::XmmRegister dst, 859 typename Traits::XmmRegister dst,
788 const typename Traits::Address &src) { 860 const typename Traits::Address &src) {
789 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 861 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
790 emitUint8(0x66); 862 emitUint8(0x66);
863 emitRex(IceType_i32, src, dst);
791 emitUint8(0x0F); 864 emitUint8(0x0F);
792 emitUint8(0xEF); 865 emitUint8(0xEF);
793 emitOperand(dst, src); 866 emitOperand(gprEncoding(dst), src);
794 } 867 }
795 868
796 template <class Machine> 869 template <class Machine>
797 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, 870 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
798 typename Traits::XmmRegister src) { 871 typename Traits::XmmRegister src) {
799 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 872 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
800 emitUint8(0x66); 873 emitUint8(0x66);
874 emitRexRB(IceType_i32, dst, src);
801 emitUint8(0x0F); 875 emitUint8(0x0F);
802 if (Ty == IceType_i16) { 876 if (Ty == IceType_i16) {
803 emitUint8(0xF1); 877 emitUint8(0xF1);
804 } else { 878 } else {
805 assert(Ty == IceType_i32); 879 assert(Ty == IceType_i32);
806 emitUint8(0xF2); 880 emitUint8(0xF2);
807 } 881 }
808 emitXmmRegisterOperand(dst, src); 882 emitXmmRegisterOperand(dst, src);
809 } 883 }
810 884
811 template <class Machine> 885 template <class Machine>
812 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, 886 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
813 const typename Traits::Address &src) { 887 const typename Traits::Address &src) {
814 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 888 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
815 emitUint8(0x66); 889 emitUint8(0x66);
890 emitRex(IceType_i32, src, dst);
816 emitUint8(0x0F); 891 emitUint8(0x0F);
817 if (Ty == IceType_i16) { 892 if (Ty == IceType_i16) {
818 emitUint8(0xF1); 893 emitUint8(0xF1);
819 } else { 894 } else {
820 assert(Ty == IceType_i32); 895 assert(Ty == IceType_i32);
821 emitUint8(0xF2); 896 emitUint8(0xF2);
822 } 897 }
823 emitOperand(dst, src); 898 emitOperand(gprEncoding(dst), src);
824 } 899 }
825 900
826 template <class Machine> 901 template <class Machine>
827 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst, 902 void AssemblerX86Base<Machine>::psll(Type Ty, typename Traits::XmmRegister dst,
828 const Immediate &imm) { 903 const Immediate &imm) {
829 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 904 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
830 assert(imm.is_int8()); 905 assert(imm.is_int8());
831 emitUint8(0x66); 906 emitUint8(0x66);
907 emitRexB(IceType_i32, dst);
832 emitUint8(0x0F); 908 emitUint8(0x0F);
833 if (Ty == IceType_i16) { 909 if (Ty == IceType_i16) {
834 emitUint8(0x71); 910 emitUint8(0x71);
835 } else { 911 } else {
836 assert(Ty == IceType_i32); 912 assert(Ty == IceType_i32);
837 emitUint8(0x72); 913 emitUint8(0x72);
838 } 914 }
839 emitRegisterOperand(6, dst); 915 emitRegisterOperand(6, gprEncoding(dst));
840 emitUint8(imm.value() & 0xFF); 916 emitUint8(imm.value() & 0xFF);
841 } 917 }
842 918
843 template <class Machine> 919 template <class Machine>
844 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, 920 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst,
845 typename Traits::XmmRegister src) { 921 typename Traits::XmmRegister src) {
846 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 922 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
847 emitUint8(0x66); 923 emitUint8(0x66);
924 emitRexRB(IceType_i32, dst, src);
848 emitUint8(0x0F); 925 emitUint8(0x0F);
849 if (Ty == IceType_i16) { 926 if (Ty == IceType_i16) {
850 emitUint8(0xE1); 927 emitUint8(0xE1);
851 } else { 928 } else {
852 assert(Ty == IceType_i32); 929 assert(Ty == IceType_i32);
853 emitUint8(0xE2); 930 emitUint8(0xE2);
854 } 931 }
855 emitXmmRegisterOperand(dst, src); 932 emitXmmRegisterOperand(dst, src);
856 } 933 }
857 934
858 template <class Machine> 935 template <class Machine>
859 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, 936 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst,
860 const typename Traits::Address &src) { 937 const typename Traits::Address &src) {
861 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 938 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
862 emitUint8(0x66); 939 emitUint8(0x66);
940 emitRex(IceType_i32, src, dst);
863 emitUint8(0x0F); 941 emitUint8(0x0F);
864 if (Ty == IceType_i16) { 942 if (Ty == IceType_i16) {
865 emitUint8(0xE1); 943 emitUint8(0xE1);
866 } else { 944 } else {
867 assert(Ty == IceType_i32); 945 assert(Ty == IceType_i32);
868 emitUint8(0xE2); 946 emitUint8(0xE2);
869 } 947 }
870 emitOperand(dst, src); 948 emitOperand(gprEncoding(dst), src);
871 } 949 }
872 950
873 template <class Machine> 951 template <class Machine>
874 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst, 952 void AssemblerX86Base<Machine>::psra(Type Ty, typename Traits::XmmRegister dst,
875 const Immediate &imm) { 953 const Immediate &imm) {
876 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 954 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
877 assert(imm.is_int8()); 955 assert(imm.is_int8());
878 emitUint8(0x66); 956 emitUint8(0x66);
957 emitRexB(IceType_i32, dst);
879 emitUint8(0x0F); 958 emitUint8(0x0F);
880 if (Ty == IceType_i16) { 959 if (Ty == IceType_i16) {
881 emitUint8(0x71); 960 emitUint8(0x71);
882 } else { 961 } else {
883 assert(Ty == IceType_i32); 962 assert(Ty == IceType_i32);
884 emitUint8(0x72); 963 emitUint8(0x72);
885 } 964 }
886 emitRegisterOperand(4, dst); 965 emitRegisterOperand(4, gprEncoding(dst));
887 emitUint8(imm.value() & 0xFF); 966 emitUint8(imm.value() & 0xFF);
888 } 967 }
889 968
890 template <class Machine> 969 template <class Machine>
891 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, 970 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst,
892 typename Traits::XmmRegister src) { 971 typename Traits::XmmRegister src) {
893 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 972 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
894 emitUint8(0x66); 973 emitUint8(0x66);
974 emitRexRB(IceType_i32, dst, src);
895 emitUint8(0x0F); 975 emitUint8(0x0F);
896 if (Ty == IceType_i16) { 976 if (Ty == IceType_i16) {
897 emitUint8(0xD1); 977 emitUint8(0xD1);
898 } else if (Ty == IceType_f64) { 978 } else if (Ty == IceType_f64) {
899 emitUint8(0xD3); 979 emitUint8(0xD3);
900 } else { 980 } else {
901 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 981 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
902 emitUint8(0xD2); 982 emitUint8(0xD2);
903 } 983 }
904 emitXmmRegisterOperand(dst, src); 984 emitXmmRegisterOperand(dst, src);
905 } 985 }
906 986
907 template <class Machine> 987 template <class Machine>
908 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, 988 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst,
909 const typename Traits::Address &src) { 989 const typename Traits::Address &src) {
910 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 990 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
911 emitUint8(0x66); 991 emitUint8(0x66);
992 emitRex(IceType_i32, src, dst);
912 emitUint8(0x0F); 993 emitUint8(0x0F);
913 if (Ty == IceType_i16) { 994 if (Ty == IceType_i16) {
914 emitUint8(0xD1); 995 emitUint8(0xD1);
915 } else if (Ty == IceType_f64) { 996 } else if (Ty == IceType_f64) {
916 emitUint8(0xD3); 997 emitUint8(0xD3);
917 } else { 998 } else {
918 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 999 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
919 emitUint8(0xD2); 1000 emitUint8(0xD2);
920 } 1001 }
921 emitOperand(dst, src); 1002 emitOperand(gprEncoding(dst), src);
922 } 1003 }
923 1004
924 template <class Machine> 1005 template <class Machine>
925 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst, 1006 void AssemblerX86Base<Machine>::psrl(Type Ty, typename Traits::XmmRegister dst,
926 const Immediate &imm) { 1007 const Immediate &imm) {
927 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1008 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
928 assert(imm.is_int8()); 1009 assert(imm.is_int8());
929 emitUint8(0x66); 1010 emitUint8(0x66);
1011 emitRexB(IceType_i32, dst);
930 emitUint8(0x0F); 1012 emitUint8(0x0F);
931 if (Ty == IceType_i16) { 1013 if (Ty == IceType_i16) {
932 emitUint8(0x71); 1014 emitUint8(0x71);
933 } else if (Ty == IceType_f64) { 1015 } else if (Ty == IceType_f64) {
934 emitUint8(0x73); 1016 emitUint8(0x73);
935 } else { 1017 } else {
936 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32); 1018 assert(Ty == IceType_i32 || Ty == IceType_f32 || Ty == IceType_v4f32);
937 emitUint8(0x72); 1019 emitUint8(0x72);
938 } 1020 }
939 emitRegisterOperand(2, dst); 1021 emitRegisterOperand(2, gprEncoding(dst));
940 emitUint8(imm.value() & 0xFF); 1022 emitUint8(imm.value() & 0xFF);
941 } 1023 }
942 1024
943 // {add,sub,mul,div}ps are given a Ty parameter for consistency with 1025 // {add,sub,mul,div}ps are given a Ty parameter for consistency with
944 // {add,sub,mul,div}ss. In the future, when the PNaCl ABI allows 1026 // {add,sub,mul,div}ss. In the future, when the PNaCl ABI allows
945 // addpd, etc., we can use the Ty parameter to decide on adding 1027 // addpd, etc., we can use the Ty parameter to decide on adding
946 // a 0x66 prefix. 1028 // a 0x66 prefix.
947 template <class Machine> 1029 template <class Machine>
948 void AssemblerX86Base<Machine>::addps(Type /* Ty */, 1030 void AssemblerX86Base<Machine>::addps(Type /* Ty */,
949 typename Traits::XmmRegister dst, 1031 typename Traits::XmmRegister dst,
950 typename Traits::XmmRegister src) { 1032 typename Traits::XmmRegister src) {
951 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1033 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1034 emitRexRB(IceType_i32, dst, src);
952 emitUint8(0x0F); 1035 emitUint8(0x0F);
953 emitUint8(0x58); 1036 emitUint8(0x58);
954 emitXmmRegisterOperand(dst, src); 1037 emitXmmRegisterOperand(dst, src);
955 } 1038 }
956 1039
957 template <class Machine> 1040 template <class Machine>
958 void AssemblerX86Base<Machine>::addps(Type /* Ty */, 1041 void AssemblerX86Base<Machine>::addps(Type /* Ty */,
959 typename Traits::XmmRegister dst, 1042 typename Traits::XmmRegister dst,
960 const typename Traits::Address &src) { 1043 const typename Traits::Address &src) {
961 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1044 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1045 emitRex(IceType_i32, src, dst);
962 emitUint8(0x0F); 1046 emitUint8(0x0F);
963 emitUint8(0x58); 1047 emitUint8(0x58);
964 emitOperand(dst, src); 1048 emitOperand(gprEncoding(dst), src);
965 } 1049 }
966 1050
967 template <class Machine> 1051 template <class Machine>
968 void AssemblerX86Base<Machine>::subps(Type /* Ty */, 1052 void AssemblerX86Base<Machine>::subps(Type /* Ty */,
969 typename Traits::XmmRegister dst, 1053 typename Traits::XmmRegister dst,
970 typename Traits::XmmRegister src) { 1054 typename Traits::XmmRegister src) {
971 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1055 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1056 emitRexRB(IceType_i32, dst, src);
972 emitUint8(0x0F); 1057 emitUint8(0x0F);
973 emitUint8(0x5C); 1058 emitUint8(0x5C);
974 emitXmmRegisterOperand(dst, src); 1059 emitXmmRegisterOperand(dst, src);
975 } 1060 }
976 1061
977 template <class Machine> 1062 template <class Machine>
978 void AssemblerX86Base<Machine>::subps(Type /* Ty */, 1063 void AssemblerX86Base<Machine>::subps(Type /* Ty */,
979 typename Traits::XmmRegister dst, 1064 typename Traits::XmmRegister dst,
980 const typename Traits::Address &src) { 1065 const typename Traits::Address &src) {
981 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1066 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1067 emitRex(IceType_i32, src, dst);
982 emitUint8(0x0F); 1068 emitUint8(0x0F);
983 emitUint8(0x5C); 1069 emitUint8(0x5C);
984 emitOperand(dst, src); 1070 emitOperand(gprEncoding(dst), src);
985 } 1071 }
986 1072
987 template <class Machine> 1073 template <class Machine>
988 void AssemblerX86Base<Machine>::divps(Type /* Ty */, 1074 void AssemblerX86Base<Machine>::divps(Type /* Ty */,
989 typename Traits::XmmRegister dst, 1075 typename Traits::XmmRegister dst,
990 typename Traits::XmmRegister src) { 1076 typename Traits::XmmRegister src) {
991 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1077 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1078 emitRexRB(IceType_i32, dst, src);
992 emitUint8(0x0F); 1079 emitUint8(0x0F);
993 emitUint8(0x5E); 1080 emitUint8(0x5E);
994 emitXmmRegisterOperand(dst, src); 1081 emitXmmRegisterOperand(dst, src);
995 } 1082 }
996 1083
997 template <class Machine> 1084 template <class Machine>
998 void AssemblerX86Base<Machine>::divps(Type /* Ty */, 1085 void AssemblerX86Base<Machine>::divps(Type /* Ty */,
999 typename Traits::XmmRegister dst, 1086 typename Traits::XmmRegister dst,
1000 const typename Traits::Address &src) { 1087 const typename Traits::Address &src) {
1001 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1088 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1089 emitRex(IceType_i32, src, dst);
1002 emitUint8(0x0F); 1090 emitUint8(0x0F);
1003 emitUint8(0x5E); 1091 emitUint8(0x5E);
1004 emitOperand(dst, src); 1092 emitOperand(gprEncoding(dst), src);
1005 } 1093 }
1006 1094
1007 template <class Machine> 1095 template <class Machine>
1008 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, 1096 void AssemblerX86Base<Machine>::mulps(Type /* Ty */,
1009 typename Traits::XmmRegister dst, 1097 typename Traits::XmmRegister dst,
1010 typename Traits::XmmRegister src) { 1098 typename Traits::XmmRegister src) {
1011 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1099 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1100 emitRexRB(IceType_i32, dst, src);
1012 emitUint8(0x0F); 1101 emitUint8(0x0F);
1013 emitUint8(0x59); 1102 emitUint8(0x59);
1014 emitXmmRegisterOperand(dst, src); 1103 emitXmmRegisterOperand(dst, src);
1015 } 1104 }
1016 1105
1017 template <class Machine> 1106 template <class Machine>
1018 void AssemblerX86Base<Machine>::mulps(Type /* Ty */, 1107 void AssemblerX86Base<Machine>::mulps(Type /* Ty */,
1019 typename Traits::XmmRegister dst, 1108 typename Traits::XmmRegister dst,
1020 const typename Traits::Address &src) { 1109 const typename Traits::Address &src) {
1021 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1110 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1111 emitRex(IceType_i32, src, dst);
1022 emitUint8(0x0F); 1112 emitUint8(0x0F);
1023 emitUint8(0x59); 1113 emitUint8(0x59);
1024 emitOperand(dst, src); 1114 emitOperand(gprEncoding(dst), src);
1025 } 1115 }
1026 1116
1027 template <class Machine> 1117 template <class Machine>
1028 void AssemblerX86Base<Machine>::minps(typename Traits::XmmRegister dst, 1118 void AssemblerX86Base<Machine>::minps(typename Traits::XmmRegister dst,
1029 typename Traits::XmmRegister src) { 1119 typename Traits::XmmRegister src) {
1030 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1120 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1121 emitRexRB(IceType_i32, dst, src);
1031 emitUint8(0x0F); 1122 emitUint8(0x0F);
1032 emitUint8(0x5D); 1123 emitUint8(0x5D);
1033 emitXmmRegisterOperand(dst, src); 1124 emitXmmRegisterOperand(dst, src);
1034 } 1125 }
1035 1126
1036 template <class Machine> 1127 template <class Machine>
1037 void AssemblerX86Base<Machine>::maxps(typename Traits::XmmRegister dst, 1128 void AssemblerX86Base<Machine>::maxps(typename Traits::XmmRegister dst,
1038 typename Traits::XmmRegister src) { 1129 typename Traits::XmmRegister src) {
1039 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1130 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1131 emitRexRB(IceType_i32, dst, src);
1040 emitUint8(0x0F); 1132 emitUint8(0x0F);
1041 emitUint8(0x5F); 1133 emitUint8(0x5F);
1042 emitXmmRegisterOperand(dst, src); 1134 emitXmmRegisterOperand(dst, src);
1043 } 1135 }
1044 1136
1045 template <class Machine> 1137 template <class Machine>
1046 void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst, 1138 void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst,
1047 typename Traits::XmmRegister src) { 1139 typename Traits::XmmRegister src) {
1048 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1140 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1141 emitRexRB(IceType_i32, dst, src);
1049 emitUint8(0x0F); 1142 emitUint8(0x0F);
1050 emitUint8(0x54); 1143 emitUint8(0x54);
1051 emitXmmRegisterOperand(dst, src); 1144 emitXmmRegisterOperand(dst, src);
1052 } 1145 }
1053 1146
1054 template <class Machine> 1147 template <class Machine>
1055 void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst, 1148 void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst,
1056 const typename Traits::Address &src) { 1149 const typename Traits::Address &src) {
1057 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1150 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1151 emitRex(IceType_i32, src, dst);
1058 emitUint8(0x0F); 1152 emitUint8(0x0F);
1059 emitUint8(0x54); 1153 emitUint8(0x54);
1060 emitOperand(dst, src); 1154 emitOperand(gprEncoding(dst), src);
1061 } 1155 }
1062 1156
1063 template <class Machine> 1157 template <class Machine>
1064 void AssemblerX86Base<Machine>::orps(typename Traits::XmmRegister dst, 1158 void AssemblerX86Base<Machine>::orps(typename Traits::XmmRegister dst,
1065 typename Traits::XmmRegister src) { 1159 typename Traits::XmmRegister src) {
1066 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1160 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1161 emitRexRB(IceType_i32, dst, src);
1067 emitUint8(0x0F); 1162 emitUint8(0x0F);
1068 emitUint8(0x56); 1163 emitUint8(0x56);
1069 emitXmmRegisterOperand(dst, src); 1164 emitXmmRegisterOperand(dst, src);
1070 } 1165 }
1071 1166
1072 template <class Machine> 1167 template <class Machine>
1073 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, 1168 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */,
1074 typename Traits::XmmRegister dst, 1169 typename Traits::XmmRegister dst,
1075 typename Traits::XmmRegister src) { 1170 typename Traits::XmmRegister src) {
1076 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1171 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1077 emitUint8(0x66); 1172 emitUint8(0x66);
1173 emitRexRB(IceType_i32, dst, src);
1078 emitUint8(0x0F); 1174 emitUint8(0x0F);
1079 emitUint8(0x38); 1175 emitUint8(0x38);
1080 emitUint8(0x14); 1176 emitUint8(0x14);
1081 emitXmmRegisterOperand(dst, src); 1177 emitXmmRegisterOperand(dst, src);
1082 } 1178 }
1083 1179
1084 template <class Machine> 1180 template <class Machine>
1085 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */, 1181 void AssemblerX86Base<Machine>::blendvps(Type /* Ty */,
1086 typename Traits::XmmRegister dst, 1182 typename Traits::XmmRegister dst,
1087 const typename Traits::Address &src) { 1183 const typename Traits::Address &src) {
1088 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1184 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1089 emitUint8(0x66); 1185 emitUint8(0x66);
1186 emitRex(IceType_i32, src, dst);
1090 emitUint8(0x0F); 1187 emitUint8(0x0F);
1091 emitUint8(0x38); 1188 emitUint8(0x38);
1092 emitUint8(0x14); 1189 emitUint8(0x14);
1093 emitOperand(dst, src); 1190 emitOperand(gprEncoding(dst), src);
1094 } 1191 }
1095 1192
1096 template <class Machine> 1193 template <class Machine>
1097 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, 1194 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */,
1098 typename Traits::XmmRegister dst, 1195 typename Traits::XmmRegister dst,
1099 typename Traits::XmmRegister src) { 1196 typename Traits::XmmRegister src) {
1100 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1197 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1101 emitUint8(0x66); 1198 emitUint8(0x66);
1199 emitRexRB(IceType_i32, dst, src);
1102 emitUint8(0x0F); 1200 emitUint8(0x0F);
1103 emitUint8(0x38); 1201 emitUint8(0x38);
1104 emitUint8(0x10); 1202 emitUint8(0x10);
1105 emitXmmRegisterOperand(dst, src); 1203 emitXmmRegisterOperand(dst, src);
1106 } 1204 }
1107 1205
1108 template <class Machine> 1206 template <class Machine>
1109 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */, 1207 void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */,
1110 typename Traits::XmmRegister dst, 1208 typename Traits::XmmRegister dst,
1111 const typename Traits::Address &src) { 1209 const typename Traits::Address &src) {
1112 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1210 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1113 emitUint8(0x66); 1211 emitUint8(0x66);
1212 emitRex(IceType_i32, src, dst);
1114 emitUint8(0x0F); 1213 emitUint8(0x0F);
1115 emitUint8(0x38); 1214 emitUint8(0x38);
1116 emitUint8(0x10); 1215 emitUint8(0x10);
1117 emitOperand(dst, src); 1216 emitOperand(gprEncoding(dst), src);
1118 } 1217 }
1119 1218
1120 template <class Machine> 1219 template <class Machine>
1121 void AssemblerX86Base<Machine>::cmpps( 1220 void AssemblerX86Base<Machine>::cmpps(
1122 typename Traits::XmmRegister dst, typename Traits::XmmRegister src, 1221 typename Traits::XmmRegister dst, typename Traits::XmmRegister src,
1123 typename Traits::Cond::CmppsCond CmpCondition) { 1222 typename Traits::Cond::CmppsCond CmpCondition) {
1124 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1223 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1224 emitRexRB(IceType_i32, dst, src);
1125 emitUint8(0x0F); 1225 emitUint8(0x0F);
1126 emitUint8(0xC2); 1226 emitUint8(0xC2);
1127 emitXmmRegisterOperand(dst, src); 1227 emitXmmRegisterOperand(dst, src);
1128 emitUint8(CmpCondition); 1228 emitUint8(CmpCondition);
1129 } 1229 }
1130 1230
1131 template <class Machine> 1231 template <class Machine>
1132 void AssemblerX86Base<Machine>::cmpps( 1232 void AssemblerX86Base<Machine>::cmpps(
1133 typename Traits::XmmRegister dst, const typename Traits::Address &src, 1233 typename Traits::XmmRegister dst, const typename Traits::Address &src,
1134 typename Traits::Cond::CmppsCond CmpCondition) { 1234 typename Traits::Cond::CmppsCond CmpCondition) {
1135 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1235 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1236 emitRex(IceType_i32, src, dst);
1136 emitUint8(0x0F); 1237 emitUint8(0x0F);
1137 emitUint8(0xC2); 1238 emitUint8(0xC2);
1138 emitOperand(dst, src); 1239 emitOperand(gprEncoding(dst), src);
1139 emitUint8(CmpCondition); 1240 emitUint8(CmpCondition);
1140 } 1241 }
1141 1242
1142 template <class Machine> 1243 template <class Machine>
1143 void AssemblerX86Base<Machine>::sqrtps(typename Traits::XmmRegister dst) { 1244 void AssemblerX86Base<Machine>::sqrtps(typename Traits::XmmRegister dst) {
1144 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1245 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1246 emitRexRB(IceType_i32, dst, dst);
1145 emitUint8(0x0F); 1247 emitUint8(0x0F);
1146 emitUint8(0x51); 1248 emitUint8(0x51);
1147 emitXmmRegisterOperand(dst, dst); 1249 emitXmmRegisterOperand(dst, dst);
1148 } 1250 }
1149 1251
1150 template <class Machine> 1252 template <class Machine>
1151 void AssemblerX86Base<Machine>::rsqrtps(typename Traits::XmmRegister dst) { 1253 void AssemblerX86Base<Machine>::rsqrtps(typename Traits::XmmRegister dst) {
1152 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1254 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1255 emitRexRB(IceType_i32, dst, dst);
1153 emitUint8(0x0F); 1256 emitUint8(0x0F);
1154 emitUint8(0x52); 1257 emitUint8(0x52);
1155 emitXmmRegisterOperand(dst, dst); 1258 emitXmmRegisterOperand(dst, dst);
1156 } 1259 }
1157 1260
1158 template <class Machine> 1261 template <class Machine>
1159 void AssemblerX86Base<Machine>::reciprocalps(typename Traits::XmmRegister dst) { 1262 void AssemblerX86Base<Machine>::reciprocalps(typename Traits::XmmRegister dst) {
1160 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1263 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1264 emitRexRB(IceType_i32, dst, dst);
1161 emitUint8(0x0F); 1265 emitUint8(0x0F);
1162 emitUint8(0x53); 1266 emitUint8(0x53);
1163 emitXmmRegisterOperand(dst, dst); 1267 emitXmmRegisterOperand(dst, dst);
1164 } 1268 }
1165 1269
1166 template <class Machine> 1270 template <class Machine>
1167 void AssemblerX86Base<Machine>::movhlps(typename Traits::XmmRegister dst, 1271 void AssemblerX86Base<Machine>::movhlps(typename Traits::XmmRegister dst,
1168 typename Traits::XmmRegister src) { 1272 typename Traits::XmmRegister src) {
1169 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1273 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1274 emitRexRB(IceType_i32, dst, src);
1170 emitUint8(0x0F); 1275 emitUint8(0x0F);
1171 emitUint8(0x12); 1276 emitUint8(0x12);
1172 emitXmmRegisterOperand(dst, src); 1277 emitXmmRegisterOperand(dst, src);
1173 } 1278 }
1174 1279
1175 template <class Machine> 1280 template <class Machine>
1176 void AssemblerX86Base<Machine>::movlhps(typename Traits::XmmRegister dst, 1281 void AssemblerX86Base<Machine>::movlhps(typename Traits::XmmRegister dst,
1177 typename Traits::XmmRegister src) { 1282 typename Traits::XmmRegister src) {
1178 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1283 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1284 emitRexRB(IceType_i32, dst, src);
1179 emitUint8(0x0F); 1285 emitUint8(0x0F);
1180 emitUint8(0x16); 1286 emitUint8(0x16);
1181 emitXmmRegisterOperand(dst, src); 1287 emitXmmRegisterOperand(dst, src);
1182 } 1288 }
1183 1289
1184 template <class Machine> 1290 template <class Machine>
1185 void AssemblerX86Base<Machine>::unpcklps(typename Traits::XmmRegister dst, 1291 void AssemblerX86Base<Machine>::unpcklps(typename Traits::XmmRegister dst,
1186 typename Traits::XmmRegister src) { 1292 typename Traits::XmmRegister src) {
1187 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1293 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1294 emitRexRB(IceType_i32, dst, src);
1188 emitUint8(0x0F); 1295 emitUint8(0x0F);
1189 emitUint8(0x14); 1296 emitUint8(0x14);
1190 emitXmmRegisterOperand(dst, src); 1297 emitXmmRegisterOperand(dst, src);
1191 } 1298 }
1192 1299
1193 template <class Machine> 1300 template <class Machine>
1194 void AssemblerX86Base<Machine>::unpckhps(typename Traits::XmmRegister dst, 1301 void AssemblerX86Base<Machine>::unpckhps(typename Traits::XmmRegister dst,
1195 typename Traits::XmmRegister src) { 1302 typename Traits::XmmRegister src) {
1196 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1303 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1304 emitRexRB(IceType_i32, dst, src);
1197 emitUint8(0x0F); 1305 emitUint8(0x0F);
1198 emitUint8(0x15); 1306 emitUint8(0x15);
1199 emitXmmRegisterOperand(dst, src); 1307 emitXmmRegisterOperand(dst, src);
1200 } 1308 }
1201 1309
1202 template <class Machine> 1310 template <class Machine>
1203 void AssemblerX86Base<Machine>::unpcklpd(typename Traits::XmmRegister dst, 1311 void AssemblerX86Base<Machine>::unpcklpd(typename Traits::XmmRegister dst,
1204 typename Traits::XmmRegister src) { 1312 typename Traits::XmmRegister src) {
1205 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1313 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1206 emitUint8(0x66); 1314 emitUint8(0x66);
1315 emitRexRB(IceType_i32, dst, src);
1207 emitUint8(0x0F); 1316 emitUint8(0x0F);
1208 emitUint8(0x14); 1317 emitUint8(0x14);
1209 emitXmmRegisterOperand(dst, src); 1318 emitXmmRegisterOperand(dst, src);
1210 } 1319 }
1211 1320
1212 template <class Machine> 1321 template <class Machine>
1213 void AssemblerX86Base<Machine>::unpckhpd(typename Traits::XmmRegister dst, 1322 void AssemblerX86Base<Machine>::unpckhpd(typename Traits::XmmRegister dst,
1214 typename Traits::XmmRegister src) { 1323 typename Traits::XmmRegister src) {
1215 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1324 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1216 emitUint8(0x66); 1325 emitUint8(0x66);
1326 emitRexRB(IceType_i32, dst, src);
1217 emitUint8(0x0F); 1327 emitUint8(0x0F);
1218 emitUint8(0x15); 1328 emitUint8(0x15);
1219 emitXmmRegisterOperand(dst, src); 1329 emitXmmRegisterOperand(dst, src);
1220 } 1330 }
1221 1331
1222 template <class Machine> 1332 template <class Machine>
1223 void AssemblerX86Base<Machine>::set1ps(typename Traits::XmmRegister dst, 1333 void AssemblerX86Base<Machine>::set1ps(typename Traits::XmmRegister dst,
1224 typename Traits::GPRRegister tmp1, 1334 typename Traits::GPRRegister tmp1,
1225 const Immediate &imm) { 1335 const Immediate &imm) {
1226 // Load 32-bit immediate value into tmp1. 1336 // Load 32-bit immediate value into tmp1.
1227 mov(IceType_i32, tmp1, imm); 1337 mov(IceType_i32, tmp1, imm);
1228 // Move value from tmp1 into dst. 1338 // Move value from tmp1 into dst.
1229 movd(dst, tmp1); 1339 movd(dst, tmp1);
1230 // Broadcast low lane into other three lanes. 1340 // Broadcast low lane into other three lanes.
1231 shufps(dst, dst, Immediate(0x0)); 1341 shufps(dst, dst, Immediate(0x0));
1232 } 1342 }
1233 1343
1234 template <class Machine> 1344 template <class Machine>
1235 void AssemblerX86Base<Machine>::shufps(typename Traits::XmmRegister dst, 1345 void AssemblerX86Base<Machine>::shufps(typename Traits::XmmRegister dst,
1236 typename Traits::XmmRegister src, 1346 typename Traits::XmmRegister src,
1237 const Immediate &imm) { 1347 const Immediate &imm) {
1238 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1348 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1349 emitRexRB(IceType_i32, dst, src);
1239 emitUint8(0x0F); 1350 emitUint8(0x0F);
1240 emitUint8(0xC6); 1351 emitUint8(0xC6);
1241 emitXmmRegisterOperand(dst, src); 1352 emitXmmRegisterOperand(dst, src);
1242 assert(imm.is_uint8()); 1353 assert(imm.is_uint8());
1243 emitUint8(imm.value()); 1354 emitUint8(imm.value());
1244 } 1355 }
1245 1356
1246 template <class Machine> 1357 template <class Machine>
1247 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, 1358 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */,
1248 typename Traits::XmmRegister dst, 1359 typename Traits::XmmRegister dst,
1249 typename Traits::XmmRegister src, 1360 typename Traits::XmmRegister src,
1250 const Immediate &imm) { 1361 const Immediate &imm) {
1251 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1362 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1252 emitUint8(0x66); 1363 emitUint8(0x66);
1364 emitRexRB(IceType_i32, dst, src);
1253 emitUint8(0x0F); 1365 emitUint8(0x0F);
1254 emitUint8(0x70); 1366 emitUint8(0x70);
1255 emitXmmRegisterOperand(dst, src); 1367 emitXmmRegisterOperand(dst, src);
1256 assert(imm.is_uint8()); 1368 assert(imm.is_uint8());
1257 emitUint8(imm.value()); 1369 emitUint8(imm.value());
1258 } 1370 }
1259 1371
1260 template <class Machine> 1372 template <class Machine>
1261 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */, 1373 void AssemblerX86Base<Machine>::pshufd(Type /* Ty */,
1262 typename Traits::XmmRegister dst, 1374 typename Traits::XmmRegister dst,
1263 const typename Traits::Address &src, 1375 const typename Traits::Address &src,
1264 const Immediate &imm) { 1376 const Immediate &imm) {
1265 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1377 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1266 emitUint8(0x66); 1378 emitUint8(0x66);
1379 emitRex(IceType_i32, src, dst);
1267 emitUint8(0x0F); 1380 emitUint8(0x0F);
1268 emitUint8(0x70); 1381 emitUint8(0x70);
1269 emitOperand(dst, src); 1382 emitOperand(gprEncoding(dst), src);
1270 assert(imm.is_uint8()); 1383 assert(imm.is_uint8());
1271 emitUint8(imm.value()); 1384 emitUint8(imm.value());
1272 } 1385 }
1273 1386
1274 template <class Machine> 1387 template <class Machine>
1275 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, 1388 void AssemblerX86Base<Machine>::shufps(Type /* Ty */,
1276 typename Traits::XmmRegister dst, 1389 typename Traits::XmmRegister dst,
1277 typename Traits::XmmRegister src, 1390 typename Traits::XmmRegister src,
1278 const Immediate &imm) { 1391 const Immediate &imm) {
1279 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1392 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1393 emitRexRB(IceType_i32, dst, src);
1280 emitUint8(0x0F); 1394 emitUint8(0x0F);
1281 emitUint8(0xC6); 1395 emitUint8(0xC6);
1282 emitXmmRegisterOperand(dst, src); 1396 emitXmmRegisterOperand(dst, src);
1283 assert(imm.is_uint8()); 1397 assert(imm.is_uint8());
1284 emitUint8(imm.value()); 1398 emitUint8(imm.value());
1285 } 1399 }
1286 1400
1287 template <class Machine> 1401 template <class Machine>
1288 void AssemblerX86Base<Machine>::shufps(Type /* Ty */, 1402 void AssemblerX86Base<Machine>::shufps(Type /* Ty */,
1289 typename Traits::XmmRegister dst, 1403 typename Traits::XmmRegister dst,
1290 const typename Traits::Address &src, 1404 const typename Traits::Address &src,
1291 const Immediate &imm) { 1405 const Immediate &imm) {
1292 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1406 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1407 emitRex(IceType_i32, src, dst);
1293 emitUint8(0x0F); 1408 emitUint8(0x0F);
1294 emitUint8(0xC6); 1409 emitUint8(0xC6);
1295 emitOperand(dst, src); 1410 emitOperand(gprEncoding(dst), src);
1296 assert(imm.is_uint8()); 1411 assert(imm.is_uint8());
1297 emitUint8(imm.value()); 1412 emitUint8(imm.value());
1298 } 1413 }
1299 1414
1300 template <class Machine> 1415 template <class Machine>
1301 void AssemblerX86Base<Machine>::minpd(typename Traits::XmmRegister dst, 1416 void AssemblerX86Base<Machine>::minpd(typename Traits::XmmRegister dst,
1302 typename Traits::XmmRegister src) { 1417 typename Traits::XmmRegister src) {
1303 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1418 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1304 emitUint8(0x66); 1419 emitUint8(0x66);
1420 emitRexRB(IceType_i32, dst, src);
1305 emitUint8(0x0F); 1421 emitUint8(0x0F);
1306 emitUint8(0x5D); 1422 emitUint8(0x5D);
1307 emitXmmRegisterOperand(dst, src); 1423 emitXmmRegisterOperand(dst, src);
1308 } 1424 }
1309 1425
1310 template <class Machine> 1426 template <class Machine>
1311 void AssemblerX86Base<Machine>::maxpd(typename Traits::XmmRegister dst, 1427 void AssemblerX86Base<Machine>::maxpd(typename Traits::XmmRegister dst,
1312 typename Traits::XmmRegister src) { 1428 typename Traits::XmmRegister src) {
1313 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1429 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1314 emitUint8(0x66); 1430 emitUint8(0x66);
1431 emitRexRB(IceType_i32, dst, src);
1315 emitUint8(0x0F); 1432 emitUint8(0x0F);
1316 emitUint8(0x5F); 1433 emitUint8(0x5F);
1317 emitXmmRegisterOperand(dst, src); 1434 emitXmmRegisterOperand(dst, src);
1318 } 1435 }
1319 1436
1320 template <class Machine> 1437 template <class Machine>
1321 void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) { 1438 void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) {
1322 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1439 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1323 emitUint8(0x66); 1440 emitUint8(0x66);
1441 emitRexRB(IceType_i32, dst, dst);
1324 emitUint8(0x0F); 1442 emitUint8(0x0F);
1325 emitUint8(0x51); 1443 emitUint8(0x51);
1326 emitXmmRegisterOperand(dst, dst); 1444 emitXmmRegisterOperand(dst, dst);
1327 } 1445 }
1328 1446
1329 template <class Machine> 1447 template <class Machine>
1330 void AssemblerX86Base<Machine>::shufpd(typename Traits::XmmRegister dst, 1448 void AssemblerX86Base<Machine>::shufpd(typename Traits::XmmRegister dst,
1331 typename Traits::XmmRegister src, 1449 typename Traits::XmmRegister src,
1332 const Immediate &imm) { 1450 const Immediate &imm) {
1333 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1451 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1334 emitUint8(0x66); 1452 emitUint8(0x66);
1453 emitRexRB(IceType_i32, dst, src);
1335 emitUint8(0x0F); 1454 emitUint8(0x0F);
1336 emitUint8(0xC6); 1455 emitUint8(0xC6);
1337 emitXmmRegisterOperand(dst, src); 1456 emitXmmRegisterOperand(dst, src);
1338 assert(imm.is_uint8()); 1457 assert(imm.is_uint8());
1339 emitUint8(imm.value()); 1458 emitUint8(imm.value());
1340 } 1459 }
1341 1460
1342 template <class Machine> 1461 template <class Machine>
1343 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */, 1462 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */,
1344 typename Traits::XmmRegister dst, 1463 typename Traits::XmmRegister dst,
1345 typename Traits::XmmRegister src) { 1464 typename Traits::XmmRegister src) {
1346 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1465 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1466 emitRexRB(IceType_i32, dst, src);
1347 emitUint8(0x0F); 1467 emitUint8(0x0F);
1348 emitUint8(0x5B); 1468 emitUint8(0x5B);
1349 emitXmmRegisterOperand(dst, src); 1469 emitXmmRegisterOperand(dst, src);
1350 } 1470 }
1351 1471
1352 template <class Machine> 1472 template <class Machine>
1353 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */, 1473 void AssemblerX86Base<Machine>::cvtdq2ps(Type /* Ignore */,
1354 typename Traits::XmmRegister dst, 1474 typename Traits::XmmRegister dst,
1355 const typename Traits::Address &src) { 1475 const typename Traits::Address &src) {
1356 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1476 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1477 emitRex(IceType_i32, src, dst);
1357 emitUint8(0x0F); 1478 emitUint8(0x0F);
1358 emitUint8(0x5B); 1479 emitUint8(0x5B);
1359 emitOperand(dst, src); 1480 emitOperand(gprEncoding(dst), src);
1360 } 1481 }
1361 1482
1362 template <class Machine> 1483 template <class Machine>
1363 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, 1484 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */,
1364 typename Traits::XmmRegister dst, 1485 typename Traits::XmmRegister dst,
1365 typename Traits::XmmRegister src) { 1486 typename Traits::XmmRegister src) {
1366 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1487 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1367 emitUint8(0xF3); 1488 emitUint8(0xF3);
1489 emitRexRB(IceType_i32, dst, src);
1368 emitUint8(0x0F); 1490 emitUint8(0x0F);
1369 emitUint8(0x5B); 1491 emitUint8(0x5B);
1370 emitXmmRegisterOperand(dst, src); 1492 emitXmmRegisterOperand(dst, src);
1371 } 1493 }
1372 1494
1373 template <class Machine> 1495 template <class Machine>
1374 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */, 1496 void AssemblerX86Base<Machine>::cvttps2dq(Type /* Ignore */,
1375 typename Traits::XmmRegister dst, 1497 typename Traits::XmmRegister dst,
1376 const typename Traits::Address &src) { 1498 const typename Traits::Address &src) {
1377 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1499 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1378 emitUint8(0xF3); 1500 emitUint8(0xF3);
1501 emitRex(IceType_i32, src, dst);
1379 emitUint8(0x0F); 1502 emitUint8(0x0F);
1380 emitUint8(0x5B); 1503 emitUint8(0x5B);
1381 emitOperand(dst, src); 1504 emitOperand(gprEncoding(dst), src);
1382 } 1505 }
1383 1506
1384 template <class Machine> 1507 template <class Machine>
1385 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, 1508 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
1386 typename Traits::XmmRegister dst, 1509 typename Traits::XmmRegister dst,
1387 typename Traits::GPRRegister src) { 1510 typename Traits::GPRRegister src) {
1388 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1511 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1389 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1512 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1513 emitRexRB(IceType_i32, dst, src);
1390 emitUint8(0x0F); 1514 emitUint8(0x0F);
1391 emitUint8(0x2A); 1515 emitUint8(0x2A);
1392 emitRegisterOperand(dst, src); 1516 emitXmmRegisterOperand(dst, src);
1393 } 1517 }
1394 1518
1395 template <class Machine> 1519 template <class Machine>
1396 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy, 1520 void AssemblerX86Base<Machine>::cvtsi2ss(Type DestTy,
1397 typename Traits::XmmRegister dst, 1521 typename Traits::XmmRegister dst,
1398 const typename Traits::Address &src) { 1522 const typename Traits::Address &src) {
1399 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1523 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1400 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); 1524 emitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2);
1525 emitRex(IceType_i32, src, dst);
1401 emitUint8(0x0F); 1526 emitUint8(0x0F);
1402 emitUint8(0x2A); 1527 emitUint8(0x2A);
1403 emitOperand(dst, src); 1528 emitOperand(gprEncoding(dst), src);
1404 } 1529 }
1405 1530
1406 template <class Machine> 1531 template <class Machine>
1407 void AssemblerX86Base<Machine>::cvtfloat2float( 1532 void AssemblerX86Base<Machine>::cvtfloat2float(
1408 Type SrcTy, typename Traits::XmmRegister dst, 1533 Type SrcTy, typename Traits::XmmRegister dst,
1409 typename Traits::XmmRegister src) { 1534 typename Traits::XmmRegister src) {
1410 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1535 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1411 // ss2sd or sd2ss 1536 // ss2sd or sd2ss
1412 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1537 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1538 emitRexRB(IceType_i32, dst, src);
1413 emitUint8(0x0F); 1539 emitUint8(0x0F);
1414 emitUint8(0x5A); 1540 emitUint8(0x5A);
1415 emitXmmRegisterOperand(dst, src); 1541 emitXmmRegisterOperand(dst, src);
1416 } 1542 }
1417 1543
1418 template <class Machine> 1544 template <class Machine>
1419 void AssemblerX86Base<Machine>::cvtfloat2float( 1545 void AssemblerX86Base<Machine>::cvtfloat2float(
1420 Type SrcTy, typename Traits::XmmRegister dst, 1546 Type SrcTy, typename Traits::XmmRegister dst,
1421 const typename Traits::Address &src) { 1547 const typename Traits::Address &src) {
1422 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1548 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1423 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1549 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1550 emitRex(IceType_i32, src, dst);
1424 emitUint8(0x0F); 1551 emitUint8(0x0F);
1425 emitUint8(0x5A); 1552 emitUint8(0x5A);
1426 emitOperand(dst, src); 1553 emitOperand(gprEncoding(dst), src);
1427 } 1554 }
1428 1555
1429 template <class Machine> 1556 template <class Machine>
1430 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy, 1557 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy,
1431 typename Traits::GPRRegister dst, 1558 typename Traits::GPRRegister dst,
1432 typename Traits::XmmRegister src) { 1559 typename Traits::XmmRegister src) {
1433 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1560 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1434 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1561 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1562 emitRexRB(IceType_i32, dst, src);
1435 emitUint8(0x0F); 1563 emitUint8(0x0F);
1436 emitUint8(0x2C); 1564 emitUint8(0x2C);
1437 emitXmmRegisterOperand(dst, src); 1565 emitXmmRegisterOperand(dst, src);
1438 } 1566 }
1439 1567
1440 template <class Machine> 1568 template <class Machine>
1441 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy, 1569 void AssemblerX86Base<Machine>::cvttss2si(Type SrcTy,
1442 typename Traits::GPRRegister dst, 1570 typename Traits::GPRRegister dst,
1443 const typename Traits::Address &src) { 1571 const typename Traits::Address &src) {
1444 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1572 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1445 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); 1573 emitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2);
1574 emitRex(IceType_i32, src, dst);
1446 emitUint8(0x0F); 1575 emitUint8(0x0F);
1447 emitUint8(0x2C); 1576 emitUint8(0x2C);
1448 emitOperand(dst, src); 1577 emitOperand(gprEncoding(dst), src);
1449 } 1578 }
1450 1579
1451 template <class Machine> 1580 template <class Machine>
1452 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, 1581 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a,
1453 typename Traits::XmmRegister b) { 1582 typename Traits::XmmRegister b) {
1454 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1583 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1455 if (Ty == IceType_f64) 1584 if (Ty == IceType_f64)
1456 emitUint8(0x66); 1585 emitUint8(0x66);
1586 emitRexRB(IceType_i32, a, b);
1457 emitUint8(0x0F); 1587 emitUint8(0x0F);
1458 emitUint8(0x2E); 1588 emitUint8(0x2E);
1459 emitXmmRegisterOperand(a, b); 1589 emitXmmRegisterOperand(a, b);
1460 } 1590 }
1461 1591
1462 template <class Machine> 1592 template <class Machine>
1463 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a, 1593 void AssemblerX86Base<Machine>::ucomiss(Type Ty, typename Traits::XmmRegister a,
1464 const typename Traits::Address &b) { 1594 const typename Traits::Address &b) {
1465 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1595 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1466 if (Ty == IceType_f64) 1596 if (Ty == IceType_f64)
1467 emitUint8(0x66); 1597 emitUint8(0x66);
1598 emitRex(IceType_i32, b, a);
1468 emitUint8(0x0F); 1599 emitUint8(0x0F);
1469 emitUint8(0x2E); 1600 emitUint8(0x2E);
1470 emitOperand(a, b); 1601 emitOperand(gprEncoding(a), b);
1471 } 1602 }
1472 1603
1473 template <class Machine> 1604 template <class Machine>
1474 void AssemblerX86Base<Machine>::movmskpd(typename Traits::GPRRegister dst, 1605 void AssemblerX86Base<Machine>::movmskpd(typename Traits::GPRRegister dst,
1475 typename Traits::XmmRegister src) { 1606 typename Traits::XmmRegister src) {
1476 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1607 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1477 emitUint8(0x66); 1608 emitUint8(0x66);
1609 emitRexRB(IceType_i32, dst, src);
1478 emitUint8(0x0F); 1610 emitUint8(0x0F);
1479 emitUint8(0x50); 1611 emitUint8(0x50);
1480 emitXmmRegisterOperand(dst, src); 1612 emitXmmRegisterOperand(dst, src);
1481 } 1613 }
1482 1614
1483 template <class Machine> 1615 template <class Machine>
1484 void AssemblerX86Base<Machine>::movmskps(typename Traits::GPRRegister dst, 1616 void AssemblerX86Base<Machine>::movmskps(typename Traits::GPRRegister dst,
1485 typename Traits::XmmRegister src) { 1617 typename Traits::XmmRegister src) {
1486 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1618 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1619 emitRexRB(IceType_i32, dst, src);
1487 emitUint8(0x0F); 1620 emitUint8(0x0F);
1488 emitUint8(0x50); 1621 emitUint8(0x50);
1489 emitXmmRegisterOperand(dst, src); 1622 emitXmmRegisterOperand(dst, src);
1490 } 1623 }
1491 1624
1492 template <class Machine> 1625 template <class Machine>
1493 void AssemblerX86Base<Machine>::sqrtss(Type Ty, 1626 void AssemblerX86Base<Machine>::sqrtss(Type Ty,
1494 typename Traits::XmmRegister dst, 1627 typename Traits::XmmRegister dst,
1495 const typename Traits::Address &src) { 1628 const typename Traits::Address &src) {
1496 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1629 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1497 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1630 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1631 emitRex(IceType_i32, src, dst);
1498 emitUint8(0x0F); 1632 emitUint8(0x0F);
1499 emitUint8(0x51); 1633 emitUint8(0x51);
1500 emitOperand(dst, src); 1634 emitOperand(gprEncoding(dst), src);
1501 } 1635 }
1502 1636
1503 template <class Machine> 1637 template <class Machine>
1504 void AssemblerX86Base<Machine>::sqrtss(Type Ty, 1638 void AssemblerX86Base<Machine>::sqrtss(Type Ty,
1505 typename Traits::XmmRegister dst, 1639 typename Traits::XmmRegister dst,
1506 typename Traits::XmmRegister src) { 1640 typename Traits::XmmRegister src) {
1507 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1641 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1508 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); 1642 emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
1643 emitRexRB(IceType_i32, dst, src);
1509 emitUint8(0x0F); 1644 emitUint8(0x0F);
1510 emitUint8(0x51); 1645 emitUint8(0x51);
1511 emitXmmRegisterOperand(dst, src); 1646 emitXmmRegisterOperand(dst, src);
1512 } 1647 }
1513 1648
1514 template <class Machine> 1649 template <class Machine>
1515 void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst, 1650 void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst,
1516 const typename Traits::Address &src) { 1651 const typename Traits::Address &src) {
1517 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1652 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1518 emitUint8(0x66); 1653 emitUint8(0x66);
1654 emitRex(IceType_i32, src, dst);
1519 emitUint8(0x0F); 1655 emitUint8(0x0F);
1520 emitUint8(0x57); 1656 emitUint8(0x57);
1521 emitOperand(dst, src); 1657 emitOperand(gprEncoding(dst), src);
1522 } 1658 }
1523 1659
1524 template <class Machine> 1660 template <class Machine>
1525 void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst, 1661 void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst,
1526 typename Traits::XmmRegister src) { 1662 typename Traits::XmmRegister src) {
1527 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1663 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1528 emitUint8(0x66); 1664 emitUint8(0x66);
1665 emitRexRB(IceType_i32, dst, src);
1529 emitUint8(0x0F); 1666 emitUint8(0x0F);
1530 emitUint8(0x57); 1667 emitUint8(0x57);
1531 emitXmmRegisterOperand(dst, src); 1668 emitXmmRegisterOperand(dst, src);
1532 } 1669 }
1533 1670
1534 template <class Machine> 1671 template <class Machine>
1535 void AssemblerX86Base<Machine>::orpd(typename Traits::XmmRegister dst, 1672 void AssemblerX86Base<Machine>::orpd(typename Traits::XmmRegister dst,
1536 typename Traits::XmmRegister src) { 1673 typename Traits::XmmRegister src) {
1537 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1674 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1538 emitUint8(0x66); 1675 emitUint8(0x66);
1676 emitRexRB(IceType_i32, dst, src);
1539 emitUint8(0x0F); 1677 emitUint8(0x0F);
1540 emitUint8(0x56); 1678 emitUint8(0x56);
1541 emitXmmRegisterOperand(dst, src); 1679 emitXmmRegisterOperand(dst, src);
1542 } 1680 }
1543 1681
1544 template <class Machine> 1682 template <class Machine>
1545 void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst, 1683 void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst,
1546 const typename Traits::Address &src) { 1684 const typename Traits::Address &src) {
1547 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1685 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1686 emitRex(IceType_i32, src, dst);
1548 emitUint8(0x0F); 1687 emitUint8(0x0F);
1549 emitUint8(0x57); 1688 emitUint8(0x57);
1550 emitOperand(dst, src); 1689 emitOperand(gprEncoding(dst), src);
1551 } 1690 }
1552 1691
1553 template <class Machine> 1692 template <class Machine>
1554 void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst, 1693 void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst,
1555 typename Traits::XmmRegister src) { 1694 typename Traits::XmmRegister src) {
1556 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1695 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1696 emitRexRB(IceType_i32, dst, src);
1557 emitUint8(0x0F); 1697 emitUint8(0x0F);
1558 emitUint8(0x57); 1698 emitUint8(0x57);
1559 emitXmmRegisterOperand(dst, src); 1699 emitXmmRegisterOperand(dst, src);
1560 } 1700 }
1561 1701
1562 template <class Machine> 1702 template <class Machine>
1563 void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst, 1703 void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst,
1564 const typename Traits::Address &src) { 1704 const typename Traits::Address &src) {
1565 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1705 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1566 emitUint8(0x66); 1706 emitUint8(0x66);
1707 emitRex(IceType_i32, src, dst);
1567 emitUint8(0x0F); 1708 emitUint8(0x0F);
1568 emitUint8(0x54); 1709 emitUint8(0x54);
1569 emitOperand(dst, src); 1710 emitOperand(gprEncoding(dst), src);
1570 } 1711 }
1571 1712
1572 template <class Machine> 1713 template <class Machine>
1573 void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst, 1714 void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst,
1574 typename Traits::XmmRegister src) { 1715 typename Traits::XmmRegister src) {
1575 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1716 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1576 emitUint8(0x66); 1717 emitUint8(0x66);
1718 emitRexRB(IceType_i32, dst, src);
1577 emitUint8(0x0F); 1719 emitUint8(0x0F);
1578 emitUint8(0x54); 1720 emitUint8(0x54);
1579 emitXmmRegisterOperand(dst, src); 1721 emitXmmRegisterOperand(dst, src);
1580 } 1722 }
1581 1723
1582 template <class Machine> 1724 template <class Machine>
1583 void AssemblerX86Base<Machine>::insertps(Type Ty, 1725 void AssemblerX86Base<Machine>::insertps(Type Ty,
1584 typename Traits::XmmRegister dst, 1726 typename Traits::XmmRegister dst,
1585 typename Traits::XmmRegister src, 1727 typename Traits::XmmRegister src,
1586 const Immediate &imm) { 1728 const Immediate &imm) {
1587 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1729 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1588 assert(imm.is_uint8()); 1730 assert(imm.is_uint8());
1589 assert(isVectorFloatingType(Ty)); 1731 assert(isVectorFloatingType(Ty));
1590 (void)Ty; 1732 (void)Ty;
1591 emitUint8(0x66); 1733 emitUint8(0x66);
1734 emitRexRB(IceType_i32, dst, src);
1592 emitUint8(0x0F); 1735 emitUint8(0x0F);
1593 emitUint8(0x3A); 1736 emitUint8(0x3A);
1594 emitUint8(0x21); 1737 emitUint8(0x21);
1595 emitXmmRegisterOperand(dst, src); 1738 emitXmmRegisterOperand(dst, src);
1596 emitUint8(imm.value()); 1739 emitUint8(imm.value());
1597 } 1740 }
1598 1741
1599 template <class Machine> 1742 template <class Machine>
1600 void AssemblerX86Base<Machine>::insertps(Type Ty, 1743 void AssemblerX86Base<Machine>::insertps(Type Ty,
1601 typename Traits::XmmRegister dst, 1744 typename Traits::XmmRegister dst,
1602 const typename Traits::Address &src, 1745 const typename Traits::Address &src,
1603 const Immediate &imm) { 1746 const Immediate &imm) {
1604 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1747 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1605 assert(imm.is_uint8()); 1748 assert(imm.is_uint8());
1606 assert(isVectorFloatingType(Ty)); 1749 assert(isVectorFloatingType(Ty));
1607 (void)Ty; 1750 (void)Ty;
1608 emitUint8(0x66); 1751 emitUint8(0x66);
1752 emitRex(IceType_i32, src, dst);
1609 emitUint8(0x0F); 1753 emitUint8(0x0F);
1610 emitUint8(0x3A); 1754 emitUint8(0x3A);
1611 emitUint8(0x21); 1755 emitUint8(0x21);
1612 emitOperand(dst, src); 1756 emitOperand(gprEncoding(dst), src);
1613 emitUint8(imm.value()); 1757 emitUint8(imm.value());
1614 } 1758 }
1615 1759
1616 template <class Machine> 1760 template <class Machine>
1617 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, 1761 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst,
1618 typename Traits::GPRRegister src, 1762 typename Traits::GPRRegister src,
1619 const Immediate &imm) { 1763 const Immediate &imm) {
1620 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1764 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1621 assert(imm.is_uint8()); 1765 assert(imm.is_uint8());
1766 emitUint8(0x66);
1767 emitRexRB(Ty, dst, src);
1768 emitUint8(0x0F);
1622 if (Ty == IceType_i16) { 1769 if (Ty == IceType_i16) {
1623 emitUint8(0x66);
1624 emitUint8(0x0F);
1625 emitUint8(0xC4); 1770 emitUint8(0xC4);
1626 emitXmmRegisterOperand(dst, typename Traits::XmmRegister(src));
1627 emitUint8(imm.value());
1628 } else { 1771 } else {
1629 emitUint8(0x66);
1630 emitUint8(0x0F);
1631 emitUint8(0x3A); 1772 emitUint8(0x3A);
1632 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); 1773 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1633 emitXmmRegisterOperand(dst, typename Traits::XmmRegister(src));
1634 emitUint8(imm.value());
1635 } 1774 }
1775 emitXmmRegisterOperand(dst, src);
1776 emitUint8(imm.value());
1636 } 1777 }
1637 1778
1638 template <class Machine> 1779 template <class Machine>
1639 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst, 1780 void AssemblerX86Base<Machine>::pinsr(Type Ty, typename Traits::XmmRegister dst,
1640 const typename Traits::Address &src, 1781 const typename Traits::Address &src,
1641 const Immediate &imm) { 1782 const Immediate &imm) {
1642 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1783 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1643 assert(imm.is_uint8()); 1784 assert(imm.is_uint8());
1785 emitUint8(0x66);
1786 emitRex(IceType_i32, src, dst);
1787 emitUint8(0x0F);
1644 if (Ty == IceType_i16) { 1788 if (Ty == IceType_i16) {
1645 emitUint8(0x66);
1646 emitUint8(0x0F);
1647 emitUint8(0xC4); 1789 emitUint8(0xC4);
1648 emitOperand(dst, src);
1649 emitUint8(imm.value());
1650 } else { 1790 } else {
1651 emitUint8(0x66);
1652 emitUint8(0x0F);
1653 emitUint8(0x3A); 1791 emitUint8(0x3A);
1654 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); 1792 emitUint8(isByteSizedType(Ty) ? 0x20 : 0x22);
1655 emitOperand(dst, src);
1656 emitUint8(imm.value());
1657 } 1793 }
1794 emitOperand(gprEncoding(dst), src);
1795 emitUint8(imm.value());
1658 } 1796 }
1659 1797
1660 template <class Machine> 1798 template <class Machine>
1661 void AssemblerX86Base<Machine>::pextr(Type Ty, typename Traits::GPRRegister dst, 1799 void AssemblerX86Base<Machine>::pextr(Type Ty, typename Traits::GPRRegister dst,
1662 typename Traits::XmmRegister src, 1800 typename Traits::XmmRegister src,
1663 const Immediate &imm) { 1801 const Immediate &imm) {
1664 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1802 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1665 assert(imm.is_uint8()); 1803 assert(imm.is_uint8());
1666 if (Ty == IceType_i16) { 1804 if (Ty == IceType_i16) {
1667 emitUint8(0x66); 1805 emitUint8(0x66);
1806 emitRexRB(Ty, dst, src);
1668 emitUint8(0x0F); 1807 emitUint8(0x0F);
1669 emitUint8(0xC5); 1808 emitUint8(0xC5);
1670 emitXmmRegisterOperand(typename Traits::XmmRegister(dst), src); 1809 emitXmmRegisterOperand(dst, src);
1671 emitUint8(imm.value()); 1810 emitUint8(imm.value());
1672 } else { 1811 } else {
1673 emitUint8(0x66); 1812 emitUint8(0x66);
1813 emitRexRB(Ty, src, dst);
1674 emitUint8(0x0F); 1814 emitUint8(0x0F);
1675 emitUint8(0x3A); 1815 emitUint8(0x3A);
1676 emitUint8(isByteSizedType(Ty) ? 0x14 : 0x16); 1816 emitUint8(isByteSizedType(Ty) ? 0x14 : 0x16);
1677 // SSE 4.1 versions are "MRI" because dst can be mem, while 1817 // SSE 4.1 versions are "MRI" because dst can be mem, while
1678 // pextrw (SSE2) is RMI because dst must be reg. 1818 // pextrw (SSE2) is RMI because dst must be reg.
1679 emitXmmRegisterOperand(src, typename Traits::XmmRegister(dst)); 1819 emitXmmRegisterOperand(src, dst);
1680 emitUint8(imm.value()); 1820 emitUint8(imm.value());
1681 } 1821 }
1682 } 1822 }
1683 1823
1684 template <class Machine> 1824 template <class Machine>
1685 void AssemblerX86Base<Machine>::pmovsxdq(typename Traits::XmmRegister dst, 1825 void AssemblerX86Base<Machine>::pmovsxdq(typename Traits::XmmRegister dst,
1686 typename Traits::XmmRegister src) { 1826 typename Traits::XmmRegister src) {
1687 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1827 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1688 emitUint8(0x66); 1828 emitUint8(0x66);
1829 emitRexRB(IceType_i32, dst, src);
1689 emitUint8(0x0F); 1830 emitUint8(0x0F);
1690 emitUint8(0x38); 1831 emitUint8(0x38);
1691 emitUint8(0x25); 1832 emitUint8(0x25);
1692 emitXmmRegisterOperand(dst, src); 1833 emitXmmRegisterOperand(dst, src);
1693 } 1834 }
1694 1835
1695 template <class Machine> 1836 template <class Machine>
1696 void AssemblerX86Base<Machine>::pcmpeq(Type Ty, 1837 void AssemblerX86Base<Machine>::pcmpeq(Type Ty,
1697 typename Traits::XmmRegister dst, 1838 typename Traits::XmmRegister dst,
1698 typename Traits::XmmRegister src) { 1839 typename Traits::XmmRegister src) {
1699 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1840 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1700 emitUint8(0x66); 1841 emitUint8(0x66);
1842 emitRexRB(IceType_i32, dst, src);
1701 emitUint8(0x0F); 1843 emitUint8(0x0F);
1702 if (isByteSizedArithType(Ty)) { 1844 if (isByteSizedArithType(Ty)) {
1703 emitUint8(0x74); 1845 emitUint8(0x74);
1704 } else if (Ty == IceType_i16) { 1846 } else if (Ty == IceType_i16) {
1705 emitUint8(0x75); 1847 emitUint8(0x75);
1706 } else { 1848 } else {
1707 emitUint8(0x76); 1849 emitUint8(0x76);
1708 } 1850 }
1709 emitXmmRegisterOperand(dst, src); 1851 emitXmmRegisterOperand(dst, src);
1710 } 1852 }
1711 1853
1712 template <class Machine> 1854 template <class Machine>
1713 void AssemblerX86Base<Machine>::pcmpeq(Type Ty, 1855 void AssemblerX86Base<Machine>::pcmpeq(Type Ty,
1714 typename Traits::XmmRegister dst, 1856 typename Traits::XmmRegister dst,
1715 const typename Traits::Address &src) { 1857 const typename Traits::Address &src) {
1716 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1858 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1717 emitUint8(0x66); 1859 emitUint8(0x66);
1860 emitRex(IceType_i32, src, dst);
1718 emitUint8(0x0F); 1861 emitUint8(0x0F);
1719 if (isByteSizedArithType(Ty)) { 1862 if (isByteSizedArithType(Ty)) {
1720 emitUint8(0x74); 1863 emitUint8(0x74);
1721 } else if (Ty == IceType_i16) { 1864 } else if (Ty == IceType_i16) {
1722 emitUint8(0x75); 1865 emitUint8(0x75);
1723 } else { 1866 } else {
1724 emitUint8(0x76); 1867 emitUint8(0x76);
1725 } 1868 }
1726 emitOperand(dst, src); 1869 emitOperand(gprEncoding(dst), src);
1727 } 1870 }
1728 1871
1729 template <class Machine> 1872 template <class Machine>
1730 void AssemblerX86Base<Machine>::pcmpgt(Type Ty, 1873 void AssemblerX86Base<Machine>::pcmpgt(Type Ty,
1731 typename Traits::XmmRegister dst, 1874 typename Traits::XmmRegister dst,
1732 typename Traits::XmmRegister src) { 1875 typename Traits::XmmRegister src) {
1733 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1876 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1734 emitUint8(0x66); 1877 emitUint8(0x66);
1878 emitRexRB(IceType_i32, dst, src);
1735 emitUint8(0x0F); 1879 emitUint8(0x0F);
1736 if (isByteSizedArithType(Ty)) { 1880 if (isByteSizedArithType(Ty)) {
1737 emitUint8(0x64); 1881 emitUint8(0x64);
1738 } else if (Ty == IceType_i16) { 1882 } else if (Ty == IceType_i16) {
1739 emitUint8(0x65); 1883 emitUint8(0x65);
1740 } else { 1884 } else {
1741 emitUint8(0x66); 1885 emitUint8(0x66);
1742 } 1886 }
1743 emitXmmRegisterOperand(dst, src); 1887 emitXmmRegisterOperand(dst, src);
1744 } 1888 }
1745 1889
1746 template <class Machine> 1890 template <class Machine>
1747 void AssemblerX86Base<Machine>::pcmpgt(Type Ty, 1891 void AssemblerX86Base<Machine>::pcmpgt(Type Ty,
1748 typename Traits::XmmRegister dst, 1892 typename Traits::XmmRegister dst,
1749 const typename Traits::Address &src) { 1893 const typename Traits::Address &src) {
1750 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1894 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1751 emitUint8(0x66); 1895 emitUint8(0x66);
1896 emitRex(IceType_i32, src, dst);
1752 emitUint8(0x0F); 1897 emitUint8(0x0F);
1753 if (isByteSizedArithType(Ty)) { 1898 if (isByteSizedArithType(Ty)) {
1754 emitUint8(0x64); 1899 emitUint8(0x64);
1755 } else if (Ty == IceType_i16) { 1900 } else if (Ty == IceType_i16) {
1756 emitUint8(0x65); 1901 emitUint8(0x65);
1757 } else { 1902 } else {
1758 emitUint8(0x66); 1903 emitUint8(0x66);
1759 } 1904 }
1760 emitOperand(dst, src); 1905 emitOperand(gprEncoding(dst), src);
1761 } 1906 }
1762 1907
1763 template <class Machine> 1908 template <class Machine>
1764 void AssemblerX86Base<Machine>::roundsd(typename Traits::XmmRegister dst, 1909 void AssemblerX86Base<Machine>::roundsd(typename Traits::XmmRegister dst,
1765 typename Traits::XmmRegister src, 1910 typename Traits::XmmRegister src,
1766 RoundingMode mode) { 1911 RoundingMode mode) {
1767 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1912 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1768 emitUint8(0x66); 1913 emitUint8(0x66);
1914 emitRexRB(IceType_i32, dst, src);
1769 emitUint8(0x0F); 1915 emitUint8(0x0F);
1770 emitUint8(0x3A); 1916 emitUint8(0x3A);
1771 emitUint8(0x0B); 1917 emitUint8(0x0B);
1772 emitXmmRegisterOperand(dst, src); 1918 emitXmmRegisterOperand(dst, src);
1773 // Mask precision exeption. 1919 // Mask precision exeption.
1774 emitUint8(static_cast<uint8_t>(mode) | 0x8); 1920 emitUint8(static_cast<uint8_t>(mode) | 0x8);
1775 } 1921 }
1776 1922
1777 template <class Machine> 1923 template <class Machine>
1778 void AssemblerX86Base<Machine>::fnstcw(const typename Traits::Address &dst) { 1924 template <typename T, typename>
1925 void AssemblerX86Base<Machine>::fnstcw(const typename T::Address &dst) {
1779 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1926 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1780 emitUint8(0xD9); 1927 emitUint8(0xD9);
1781 emitOperand(7, dst); 1928 emitOperand(7, dst);
1782 } 1929 }
1783 1930
1784 template <class Machine> 1931 template <class Machine>
1785 void AssemblerX86Base<Machine>::fldcw(const typename Traits::Address &src) { 1932 template <typename T, typename>
1933 void AssemblerX86Base<Machine>::fldcw(const typename T::Address &src) {
1786 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1934 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1787 emitUint8(0xD9); 1935 emitUint8(0xD9);
1788 emitOperand(5, src); 1936 emitOperand(5, src);
1789 } 1937 }
1790 1938
1791 template <class Machine> 1939 template <class Machine>
1792 void AssemblerX86Base<Machine>::fistpl(const typename Traits::Address &dst) { 1940 template <typename T, typename>
1941 void AssemblerX86Base<Machine>::fistpl(const typename T::Address &dst) {
1793 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1942 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1794 emitUint8(0xDF); 1943 emitUint8(0xDF);
1795 emitOperand(7, dst); 1944 emitOperand(7, dst);
1796 } 1945 }
1797 1946
1798 template <class Machine> 1947 template <class Machine>
1799 void AssemblerX86Base<Machine>::fistps(const typename Traits::Address &dst) { 1948 template <typename T, typename>
1949 void AssemblerX86Base<Machine>::fistps(const typename T::Address &dst) {
1800 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1950 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1801 emitUint8(0xDB); 1951 emitUint8(0xDB);
1802 emitOperand(3, dst); 1952 emitOperand(3, dst);
1803 } 1953 }
1804 1954
1805 template <class Machine> 1955 template <class Machine>
1806 void AssemblerX86Base<Machine>::fildl(const typename Traits::Address &src) { 1956 template <typename T, typename>
1957 void AssemblerX86Base<Machine>::fildl(const typename T::Address &src) {
1807 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1958 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1808 emitUint8(0xDF); 1959 emitUint8(0xDF);
1809 emitOperand(5, src); 1960 emitOperand(5, src);
1810 } 1961 }
1811 1962
1812 template <class Machine> 1963 template <class Machine>
1813 void AssemblerX86Base<Machine>::filds(const typename Traits::Address &src) { 1964 template <typename T, typename>
1965 void AssemblerX86Base<Machine>::filds(const typename T::Address &src) {
1814 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1966 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1815 emitUint8(0xDB); 1967 emitUint8(0xDB);
1816 emitOperand(0, src); 1968 emitOperand(0, src);
1817 } 1969 }
1818 1970
1819 template <class Machine> void AssemblerX86Base<Machine>::fincstp() { 1971 template <class Machine>
1972 template <typename, typename>
1973 void AssemblerX86Base<Machine>::fincstp() {
1820 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1974 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1821 emitUint8(0xD9); 1975 emitUint8(0xD9);
1822 emitUint8(0xF7); 1976 emitUint8(0xF7);
1823 } 1977 }
1824 1978
1825 template <class Machine> 1979 template <class Machine>
1826 template <uint32_t Tag> 1980 template <uint32_t Tag>
1827 void AssemblerX86Base<Machine>::arith_int(Type Ty, 1981 void AssemblerX86Base<Machine>::arith_int(Type Ty,
1828 typename Traits::GPRRegister reg, 1982 typename Traits::GPRRegister reg,
1829 const Immediate &imm) { 1983 const Immediate &imm) {
1830 static_assert(Tag < 8, "Tag must be between 0..7"); 1984 static_assert(Tag < 8, "Tag must be between 0..7");
1831 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 1985 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1986 if (Ty == IceType_i16)
1987 emitOperandSizeOverride();
1988 emitRexB(Ty, reg);
1832 if (isByteSizedType(Ty)) { 1989 if (isByteSizedType(Ty)) {
1833 emitComplexI8(Tag, typename Traits::Operand(reg), imm); 1990 emitComplexI8(Tag, typename Traits::Operand(reg), imm);
1834 return; 1991 } else {
1992 emitComplex(Ty, Tag, typename Traits::Operand(reg), imm);
1835 } 1993 }
1836 if (Ty == IceType_i16)
1837 emitOperandSizeOverride();
1838 emitComplex(Ty, Tag, typename Traits::Operand(reg), imm);
1839 } 1994 }
1840 1995
1841 template <class Machine> 1996 template <class Machine>
1842 template <uint32_t Tag> 1997 template <uint32_t Tag>
1843 void AssemblerX86Base<Machine>::arith_int(Type Ty, 1998 void AssemblerX86Base<Machine>::arith_int(Type Ty,
1844 typename Traits::GPRRegister reg0, 1999 typename Traits::GPRRegister reg0,
1845 typename Traits::GPRRegister reg1) { 2000 typename Traits::GPRRegister reg1) {
1846 static_assert(Tag < 8, "Tag must be between 0..7"); 2001 static_assert(Tag < 8, "Tag must be between 0..7");
1847 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2002 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1848 if (Ty == IceType_i16) 2003 if (Ty == IceType_i16)
1849 emitOperandSizeOverride(); 2004 emitOperandSizeOverride();
2005 emitRexRB(Ty, reg0, reg1);
1850 if (isByteSizedType(Ty)) 2006 if (isByteSizedType(Ty))
1851 emitUint8(Tag * 8 + 2); 2007 emitUint8(Tag * 8 + 2);
1852 else 2008 else
1853 emitUint8(Tag * 8 + 3); 2009 emitUint8(Tag * 8 + 3);
1854 emitRegisterOperand(reg0, reg1); 2010 emitRegisterOperand(gprEncoding(reg0), gprEncoding(reg1));
1855 } 2011 }
1856 2012
1857 template <class Machine> 2013 template <class Machine>
1858 template <uint32_t Tag> 2014 template <uint32_t Tag>
1859 void AssemblerX86Base<Machine>::arith_int( 2015 void AssemblerX86Base<Machine>::arith_int(
1860 Type Ty, typename Traits::GPRRegister reg, 2016 Type Ty, typename Traits::GPRRegister reg,
1861 const typename Traits::Address &address) { 2017 const typename Traits::Address &address) {
1862 static_assert(Tag < 8, "Tag must be between 0..7"); 2018 static_assert(Tag < 8, "Tag must be between 0..7");
1863 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2019 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1864 if (Ty == IceType_i16) 2020 if (Ty == IceType_i16)
1865 emitOperandSizeOverride(); 2021 emitOperandSizeOverride();
2022 emitRex(Ty, address, reg);
1866 if (isByteSizedType(Ty)) 2023 if (isByteSizedType(Ty))
1867 emitUint8(Tag * 8 + 2); 2024 emitUint8(Tag * 8 + 2);
1868 else 2025 else
1869 emitUint8(Tag * 8 + 3); 2026 emitUint8(Tag * 8 + 3);
1870 emitOperand(reg, address); 2027 emitOperand(gprEncoding(reg), address);
1871 } 2028 }
1872 2029
1873 template <class Machine> 2030 template <class Machine>
1874 template <uint32_t Tag> 2031 template <uint32_t Tag>
1875 void AssemblerX86Base<Machine>::arith_int( 2032 void AssemblerX86Base<Machine>::arith_int(
1876 Type Ty, const typename Traits::Address &address, 2033 Type Ty, const typename Traits::Address &address,
1877 typename Traits::GPRRegister reg) { 2034 typename Traits::GPRRegister reg) {
1878 static_assert(Tag < 8, "Tag must be between 0..7"); 2035 static_assert(Tag < 8, "Tag must be between 0..7");
1879 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2036 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1880 if (Ty == IceType_i16) 2037 if (Ty == IceType_i16)
1881 emitOperandSizeOverride(); 2038 emitOperandSizeOverride();
2039 emitRex(Ty, address, reg);
1882 if (isByteSizedType(Ty)) 2040 if (isByteSizedType(Ty))
1883 emitUint8(Tag * 8 + 0); 2041 emitUint8(Tag * 8 + 0);
1884 else 2042 else
1885 emitUint8(Tag * 8 + 1); 2043 emitUint8(Tag * 8 + 1);
1886 emitOperand(reg, address); 2044 emitOperand(gprEncoding(reg), address);
1887 } 2045 }
1888 2046
1889 template <class Machine> 2047 template <class Machine>
1890 template <uint32_t Tag> 2048 template <uint32_t Tag>
1891 void AssemblerX86Base<Machine>::arith_int( 2049 void AssemblerX86Base<Machine>::arith_int(
1892 Type Ty, const typename Traits::Address &address, const Immediate &imm) { 2050 Type Ty, const typename Traits::Address &address, const Immediate &imm) {
1893 static_assert(Tag < 8, "Tag must be between 0..7"); 2051 static_assert(Tag < 8, "Tag must be between 0..7");
1894 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2052 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2053 if (Ty == IceType_i16)
2054 emitOperandSizeOverride();
2055 emitRex(Ty, address, Traits::GPRRegister::Encoded_Reg_eax);
1895 if (isByteSizedType(Ty)) { 2056 if (isByteSizedType(Ty)) {
1896 emitComplexI8(Tag, address, imm); 2057 emitComplexI8(Tag, address, imm);
1897 return; 2058 } else {
2059 emitComplex(Ty, Tag, address, imm);
1898 } 2060 }
1899 if (Ty == IceType_i16)
1900 emitOperandSizeOverride();
1901 emitComplex(Ty, Tag, address, imm);
1902 } 2061 }
1903 2062
1904 template <class Machine> 2063 template <class Machine>
1905 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg, 2064 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg,
1906 const Immediate &imm) { 2065 const Immediate &imm) {
1907 arith_int<7>(Ty, reg, imm); 2066 arith_int<7>(Ty, reg, imm);
1908 } 2067 }
1909 2068
1910 template <class Machine> 2069 template <class Machine>
1911 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg0, 2070 void AssemblerX86Base<Machine>::cmp(Type Ty, typename Traits::GPRRegister reg0,
(...skipping 20 matching lines...) Expand all
1932 const Immediate &imm) { 2091 const Immediate &imm) {
1933 arith_int<7>(Ty, address, imm); 2092 arith_int<7>(Ty, address, imm);
1934 } 2093 }
1935 2094
1936 template <class Machine> 2095 template <class Machine>
1937 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg1, 2096 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg1,
1938 typename Traits::GPRRegister reg2) { 2097 typename Traits::GPRRegister reg2) {
1939 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2098 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1940 if (Ty == IceType_i16) 2099 if (Ty == IceType_i16)
1941 emitOperandSizeOverride(); 2100 emitOperandSizeOverride();
2101 emitRexRB(Ty, reg1, reg2);
1942 if (isByteSizedType(Ty)) 2102 if (isByteSizedType(Ty))
1943 emitUint8(0x84); 2103 emitUint8(0x84);
1944 else 2104 else
1945 emitUint8(0x85); 2105 emitUint8(0x85);
1946 emitRegisterOperand(reg1, reg2); 2106 emitRegisterOperand(gprEncoding(reg1), gprEncoding(reg2));
1947 } 2107 }
1948 2108
1949 template <class Machine> 2109 template <class Machine>
1950 void AssemblerX86Base<Machine>::test(Type Ty, 2110 void AssemblerX86Base<Machine>::test(Type Ty,
1951 const typename Traits::Address &addr, 2111 const typename Traits::Address &addr,
1952 typename Traits::GPRRegister reg) { 2112 typename Traits::GPRRegister reg) {
1953 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2113 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1954 if (Ty == IceType_i16) 2114 if (Ty == IceType_i16)
1955 emitOperandSizeOverride(); 2115 emitOperandSizeOverride();
2116 emitRex(Ty, addr, reg);
1956 if (isByteSizedType(Ty)) 2117 if (isByteSizedType(Ty))
1957 emitUint8(0x84); 2118 emitUint8(0x84);
1958 else 2119 else
1959 emitUint8(0x85); 2120 emitUint8(0x85);
1960 emitOperand(reg, addr); 2121 emitOperand(gprEncoding(reg), addr);
1961 } 2122 }
1962 2123
1963 template <class Machine> 2124 template <class Machine>
1964 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg, 2125 void AssemblerX86Base<Machine>::test(Type Ty, typename Traits::GPRRegister reg,
1965 const Immediate &immediate) { 2126 const Immediate &immediate) {
1966 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2127 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
1967 // For registers that have a byte variant (EAX, EBX, ECX, and EDX) 2128 // For registers that have a byte variant (EAX, EBX, ECX, and EDX)
1968 // we only test the byte register to keep the encoding short. 2129 // we only test the byte register to keep the encoding short.
1969 // This is legal even if the register had high bits set since 2130 // This is legal even if the register had high bits set since
1970 // this only sets flags registers based on the "AND" of the two operands, 2131 // this only sets flags registers based on the "AND" of the two operands,
1971 // and the immediate had zeros at those high bits. 2132 // and the immediate had zeros at those high bits.
1972 if (immediate.is_uint8() && reg < 4) { 2133 if (immediate.is_uint8() && reg <= Traits::Last8BitGPR) {
1973 // Use zero-extended 8-bit immediate. 2134 // Use zero-extended 8-bit immediate.
2135 emitRexB(Ty, reg);
1974 if (reg == Traits::Encoded_Reg_Accumulator) { 2136 if (reg == Traits::Encoded_Reg_Accumulator) {
1975 emitUint8(0xA8); 2137 emitUint8(0xA8);
1976 } else { 2138 } else {
1977 emitUint8(0xF6); 2139 emitUint8(0xF6);
1978 emitUint8(0xC0 + reg); 2140 emitUint8(0xC0 + gprEncoding(reg));
1979 } 2141 }
1980 emitUint8(immediate.value() & 0xFF); 2142 emitUint8(immediate.value() & 0xFF);
1981 } else if (reg == Traits::Encoded_Reg_Accumulator) { 2143 } else if (reg == Traits::Encoded_Reg_Accumulator) {
1982 // Use short form if the destination is EAX. 2144 // Use short form if the destination is EAX.
1983 if (Ty == IceType_i16) 2145 if (Ty == IceType_i16)
1984 emitOperandSizeOverride(); 2146 emitOperandSizeOverride();
1985 emitUint8(0xA9); 2147 emitUint8(0xA9);
1986 emitImmediate(Ty, immediate); 2148 emitImmediate(Ty, immediate);
1987 } else { 2149 } else {
1988 if (Ty == IceType_i16) 2150 if (Ty == IceType_i16)
1989 emitOperandSizeOverride(); 2151 emitOperandSizeOverride();
2152 emitRexB(Ty, reg);
1990 emitUint8(0xF7); 2153 emitUint8(0xF7);
1991 emitRegisterOperand(0, reg); 2154 emitRegisterOperand(0, gprEncoding(reg));
1992 emitImmediate(Ty, immediate); 2155 emitImmediate(Ty, immediate);
1993 } 2156 }
1994 } 2157 }
1995 2158
1996 template <class Machine> 2159 template <class Machine>
1997 void AssemblerX86Base<Machine>::test(Type Ty, 2160 void AssemblerX86Base<Machine>::test(Type Ty,
1998 const typename Traits::Address &addr, 2161 const typename Traits::Address &addr,
1999 const Immediate &immediate) { 2162 const Immediate &immediate) {
2000 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2163 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2001 // If the immediate is short, we only test the byte addr to keep the 2164 // If the immediate is short, we only test the byte addr to keep the
2002 // encoding short. 2165 // encoding short.
2003 if (immediate.is_uint8()) { 2166 if (immediate.is_uint8()) {
2004 // Use zero-extended 8-bit immediate. 2167 // Use zero-extended 8-bit immediate.
2168 emitRex(Ty, addr, Traits::GPRRegister::Encoded_Reg_eax);
2005 emitUint8(0xF6); 2169 emitUint8(0xF6);
2006 emitOperand(0, addr); 2170 emitOperand(0, addr);
2007 emitUint8(immediate.value() & 0xFF); 2171 emitUint8(immediate.value() & 0xFF);
2008 } else { 2172 } else {
2009 if (Ty == IceType_i16) 2173 if (Ty == IceType_i16)
2010 emitOperandSizeOverride(); 2174 emitOperandSizeOverride();
2175 emitRex(Ty, addr, Traits::GPRRegister::Encoded_Reg_eax);
2011 emitUint8(0xF7); 2176 emitUint8(0xF7);
2012 emitOperand(0, addr); 2177 emitOperand(0, addr);
2013 emitImmediate(Ty, immediate); 2178 emitImmediate(Ty, immediate);
2014 } 2179 }
2015 } 2180 }
2016 2181
2017 template <class Machine> 2182 template <class Machine>
2018 void AssemblerX86Base<Machine>::And(Type Ty, typename Traits::GPRRegister dst, 2183 void AssemblerX86Base<Machine>::And(Type Ty, typename Traits::GPRRegister dst,
2019 typename Traits::GPRRegister src) { 2184 typename Traits::GPRRegister src) {
2020 arith_int<4>(Ty, dst, src); 2185 arith_int<4>(Ty, dst, src);
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
2253 template <class Machine> void AssemblerX86Base<Machine>::cdq() { 2418 template <class Machine> void AssemblerX86Base<Machine>::cdq() {
2254 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2419 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2255 emitUint8(0x99); 2420 emitUint8(0x99);
2256 } 2421 }
2257 2422
2258 template <class Machine> 2423 template <class Machine>
2259 void AssemblerX86Base<Machine>::div(Type Ty, typename Traits::GPRRegister reg) { 2424 void AssemblerX86Base<Machine>::div(Type Ty, typename Traits::GPRRegister reg) {
2260 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2425 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2261 if (Ty == IceType_i16) 2426 if (Ty == IceType_i16)
2262 emitOperandSizeOverride(); 2427 emitOperandSizeOverride();
2428 emitRexB(Ty, reg);
2263 if (isByteSizedArithType(Ty)) 2429 if (isByteSizedArithType(Ty))
2264 emitUint8(0xF6); 2430 emitUint8(0xF6);
2265 else 2431 else
2266 emitUint8(0xF7); 2432 emitUint8(0xF7);
2267 emitRegisterOperand(6, reg); 2433 emitRegisterOperand(6, gprEncoding(reg));
2268 } 2434 }
2269 2435
2270 template <class Machine> 2436 template <class Machine>
2271 void AssemblerX86Base<Machine>::div(Type Ty, 2437 void AssemblerX86Base<Machine>::div(Type Ty,
2272 const typename Traits::Address &addr) { 2438 const typename Traits::Address &addr) {
2273 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2439 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2274 if (Ty == IceType_i16) 2440 if (Ty == IceType_i16)
2275 emitOperandSizeOverride(); 2441 emitOperandSizeOverride();
2442 emitRex(Ty, addr, Traits::GPRRegister::Encoded_Reg_eax);
2276 if (isByteSizedArithType(Ty)) 2443 if (isByteSizedArithType(Ty))
2277 emitUint8(0xF6); 2444 emitUint8(0xF6);
2278 else 2445 else
2279 emitUint8(0xF7); 2446 emitUint8(0xF7);
2280 emitOperand(6, addr); 2447 emitOperand(6, addr);
2281 } 2448 }
2282 2449
2283 template <class Machine> 2450 template <class Machine>
2284 void AssemblerX86Base<Machine>::idiv(Type Ty, 2451 void AssemblerX86Base<Machine>::idiv(Type Ty,
2285 typename Traits::GPRRegister reg) { 2452 typename Traits::GPRRegister reg) {
2286 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2453 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2287 if (Ty == IceType_i16) 2454 if (Ty == IceType_i16)
2288 emitOperandSizeOverride(); 2455 emitOperandSizeOverride();
2456 emitRexB(Ty, reg);
2289 if (isByteSizedArithType(Ty)) 2457 if (isByteSizedArithType(Ty))
2290 emitUint8(0xF6); 2458 emitUint8(0xF6);
2291 else 2459 else
2292 emitUint8(0xF7); 2460 emitUint8(0xF7);
2293 emitRegisterOperand(7, reg); 2461 emitRegisterOperand(7, gprEncoding(reg));
2294 } 2462 }
2295 2463
2296 template <class Machine> 2464 template <class Machine>
2297 void AssemblerX86Base<Machine>::idiv(Type Ty, 2465 void AssemblerX86Base<Machine>::idiv(Type Ty,
2298 const typename Traits::Address &addr) { 2466 const typename Traits::Address &addr) {
2299 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2467 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2300 if (Ty == IceType_i16) 2468 if (Ty == IceType_i16)
2301 emitOperandSizeOverride(); 2469 emitOperandSizeOverride();
2470 emitRex(Ty, addr, Traits::GPRRegister::Encoded_Reg_eax);
2302 if (isByteSizedArithType(Ty)) 2471 if (isByteSizedArithType(Ty))
2303 emitUint8(0xF6); 2472 emitUint8(0xF6);
2304 else 2473 else
2305 emitUint8(0xF7); 2474 emitUint8(0xF7);
2306 emitOperand(7, addr); 2475 emitOperand(7, addr);
2307 } 2476 }
2308 2477
2309 template <class Machine> 2478 template <class Machine>
2310 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst, 2479 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister dst,
2311 typename Traits::GPRRegister src) { 2480 typename Traits::GPRRegister src) {
2312 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2481 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2313 assert(Ty == IceType_i16 || Ty == IceType_i32); 2482 assert(Ty == IceType_i16 || Ty == IceType_i32);
2314 if (Ty == IceType_i16) 2483 if (Ty == IceType_i16)
2315 emitOperandSizeOverride(); 2484 emitOperandSizeOverride();
2485 emitRexRB(Ty, dst, src);
2316 emitUint8(0x0F); 2486 emitUint8(0x0F);
2317 emitUint8(0xAF); 2487 emitUint8(0xAF);
2318 emitRegisterOperand(dst, src); 2488 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2319 } 2489 }
2320 2490
2321 template <class Machine> 2491 template <class Machine>
2322 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, 2492 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
2323 const typename Traits::Address &address) { 2493 const typename Traits::Address &address) {
2324 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2494 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2325 assert(Ty == IceType_i16 || Ty == IceType_i32); 2495 assert(Ty == IceType_i16 || Ty == IceType_i32);
2326 if (Ty == IceType_i16) 2496 if (Ty == IceType_i16)
2327 emitOperandSizeOverride(); 2497 emitOperandSizeOverride();
2498 emitRex(Ty, address, reg);
2328 emitUint8(0x0F); 2499 emitUint8(0x0F);
2329 emitUint8(0xAF); 2500 emitUint8(0xAF);
2330 emitOperand(reg, address); 2501 emitOperand(gprEncoding(reg), address);
2331 } 2502 }
2332 2503
2333 template <class Machine> 2504 template <class Machine>
2334 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg, 2505 void AssemblerX86Base<Machine>::imul(Type Ty, typename Traits::GPRRegister reg,
2335 const Immediate &imm) { 2506 const Immediate &imm) {
2336 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2507 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2337 assert(Ty == IceType_i16 || Ty == IceType_i32); 2508 assert(Ty == IceType_i16 || Ty == IceType_i32);
2338 if (Ty == IceType_i16) 2509 if (Ty == IceType_i16)
2339 emitOperandSizeOverride(); 2510 emitOperandSizeOverride();
2511 emitRexRB(Ty, reg, reg);
2340 if (imm.is_int8()) { 2512 if (imm.is_int8()) {
2341 emitUint8(0x6B); 2513 emitUint8(0x6B);
2342 emitRegisterOperand(reg, reg); 2514 emitRegisterOperand(gprEncoding(reg), gprEncoding(reg));
2343 emitUint8(imm.value() & 0xFF); 2515 emitUint8(imm.value() & 0xFF);
2344 } else { 2516 } else {
2345 emitUint8(0x69); 2517 emitUint8(0x69);
2346 emitRegisterOperand(reg, reg); 2518 emitRegisterOperand(gprEncoding(reg), gprEncoding(reg));
2347 emitImmediate(Ty, imm); 2519 emitImmediate(Ty, imm);
2348 } 2520 }
2349 } 2521 }
2350 2522
2351 template <class Machine> 2523 template <class Machine>
2352 void AssemblerX86Base<Machine>::imul(Type Ty, 2524 void AssemblerX86Base<Machine>::imul(Type Ty,
2353 typename Traits::GPRRegister reg) { 2525 typename Traits::GPRRegister reg) {
2354 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2526 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2355 if (Ty == IceType_i16) 2527 if (Ty == IceType_i16)
2356 emitOperandSizeOverride(); 2528 emitOperandSizeOverride();
2529 emitRexB(Ty, reg);
2357 if (isByteSizedArithType(Ty)) 2530 if (isByteSizedArithType(Ty))
2358 emitUint8(0xF6); 2531 emitUint8(0xF6);
2359 else 2532 else
2360 emitUint8(0xF7); 2533 emitUint8(0xF7);
2361 emitRegisterOperand(5, reg); 2534 emitRegisterOperand(5, gprEncoding(reg));
2362 } 2535 }
2363 2536
2364 template <class Machine> 2537 template <class Machine>
2365 void AssemblerX86Base<Machine>::imul(Type Ty, 2538 void AssemblerX86Base<Machine>::imul(Type Ty,
2366 const typename Traits::Address &address) { 2539 const typename Traits::Address &address) {
2367 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2540 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2368 if (Ty == IceType_i16) 2541 if (Ty == IceType_i16)
2369 emitOperandSizeOverride(); 2542 emitOperandSizeOverride();
2543 emitRex(Ty, address, Traits::GPRRegister::Encoded_Reg_eax);
2370 if (isByteSizedArithType(Ty)) 2544 if (isByteSizedArithType(Ty))
2371 emitUint8(0xF6); 2545 emitUint8(0xF6);
2372 else 2546 else
2373 emitUint8(0xF7); 2547 emitUint8(0xF7);
2374 emitOperand(5, address); 2548 emitOperand(5, address);
2375 } 2549 }
2376 2550
2377 template <class Machine> 2551 template <class Machine>
2378 void AssemblerX86Base<Machine>::mul(Type Ty, typename Traits::GPRRegister reg) { 2552 void AssemblerX86Base<Machine>::mul(Type Ty, typename Traits::GPRRegister reg) {
2379 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2553 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2380 if (Ty == IceType_i16) 2554 if (Ty == IceType_i16)
2381 emitOperandSizeOverride(); 2555 emitOperandSizeOverride();
2556 emitRexB(Ty, reg);
2382 if (isByteSizedArithType(Ty)) 2557 if (isByteSizedArithType(Ty))
2383 emitUint8(0xF6); 2558 emitUint8(0xF6);
2384 else 2559 else
2385 emitUint8(0xF7); 2560 emitUint8(0xF7);
2386 emitRegisterOperand(4, reg); 2561 emitRegisterOperand(4, gprEncoding(reg));
2387 } 2562 }
2388 2563
2389 template <class Machine> 2564 template <class Machine>
2390 void AssemblerX86Base<Machine>::mul(Type Ty, 2565 void AssemblerX86Base<Machine>::mul(Type Ty,
2391 const typename Traits::Address &address) { 2566 const typename Traits::Address &address) {
2392 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2567 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2393 if (Ty == IceType_i16) 2568 if (Ty == IceType_i16)
2394 emitOperandSizeOverride(); 2569 emitOperandSizeOverride();
2570 emitRex(Ty, address, Traits::GPRRegister::Encoded_Reg_eax);
2395 if (isByteSizedArithType(Ty)) 2571 if (isByteSizedArithType(Ty))
2396 emitUint8(0xF6); 2572 emitUint8(0xF6);
2397 else 2573 else
2398 emitUint8(0xF7); 2574 emitUint8(0xF7);
2399 emitOperand(4, address); 2575 emitOperand(4, address);
2400 } 2576 }
2401 2577
2402 template <class Machine> 2578 template <class Machine>
2579 template <typename, typename>
2403 void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) { 2580 void AssemblerX86Base<Machine>::incl(typename Traits::GPRRegister reg) {
2404 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2581 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2405 emitUint8(0x40 + reg); 2582 emitUint8(0x40 + reg);
2406 } 2583 }
2407 2584
2408 template <class Machine> 2585 template <class Machine>
2409 void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) { 2586 void AssemblerX86Base<Machine>::incl(const typename Traits::Address &address) {
2410 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2587 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2588 emitRex(IceType_i32, address, Traits::GPRRegister::Encoded_Reg_eax);
2411 emitUint8(0xFF); 2589 emitUint8(0xFF);
2412 emitOperand(0, address); 2590 emitOperand(0, address);
2413 } 2591 }
2414 2592
2415 template <class Machine> 2593 template <class Machine>
2594 template <typename, typename>
2416 void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) { 2595 void AssemblerX86Base<Machine>::decl(typename Traits::GPRRegister reg) {
2417 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2596 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2418 emitUint8(0x48 + reg); 2597 emitUint8(0x48 + reg);
2419 } 2598 }
2420 2599
2421 template <class Machine> 2600 template <class Machine>
2422 void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) { 2601 void AssemblerX86Base<Machine>::decl(const typename Traits::Address &address) {
2423 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2602 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2603 emitRex(IceType_i32, address, Traits::GPRRegister::Encoded_Reg_eax);
2424 emitUint8(0xFF); 2604 emitUint8(0xFF);
2425 emitOperand(1, address); 2605 emitOperand(1, address);
2426 } 2606 }
2427 2607
2428 template <class Machine> 2608 template <class Machine>
2429 void AssemblerX86Base<Machine>::rol(Type Ty, typename Traits::GPRRegister reg, 2609 void AssemblerX86Base<Machine>::rol(Type Ty, typename Traits::GPRRegister reg,
2430 const Immediate &imm) { 2610 const Immediate &imm) {
2431 emitGenericShift(0, Ty, reg, imm); 2611 emitGenericShift(0, Ty, reg, imm);
2432 } 2612 }
2433 2613
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2505 emitGenericShift(7, Ty, address, shifter); 2685 emitGenericShift(7, Ty, address, shifter);
2506 } 2686 }
2507 2687
2508 template <class Machine> 2688 template <class Machine>
2509 void AssemblerX86Base<Machine>::shld(Type Ty, typename Traits::GPRRegister dst, 2689 void AssemblerX86Base<Machine>::shld(Type Ty, typename Traits::GPRRegister dst,
2510 typename Traits::GPRRegister src) { 2690 typename Traits::GPRRegister src) {
2511 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2691 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2512 assert(Ty == IceType_i16 || Ty == IceType_i32); 2692 assert(Ty == IceType_i16 || Ty == IceType_i32);
2513 if (Ty == IceType_i16) 2693 if (Ty == IceType_i16)
2514 emitOperandSizeOverride(); 2694 emitOperandSizeOverride();
2695 emitRexRB(Ty, src, dst);
2515 emitUint8(0x0F); 2696 emitUint8(0x0F);
2516 emitUint8(0xA5); 2697 emitUint8(0xA5);
2517 emitRegisterOperand(src, dst); 2698 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2518 } 2699 }
2519 2700
2520 template <class Machine> 2701 template <class Machine>
2521 void AssemblerX86Base<Machine>::shld(Type Ty, typename Traits::GPRRegister dst, 2702 void AssemblerX86Base<Machine>::shld(Type Ty, typename Traits::GPRRegister dst,
2522 typename Traits::GPRRegister src, 2703 typename Traits::GPRRegister src,
2523 const Immediate &imm) { 2704 const Immediate &imm) {
2524 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2705 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2525 assert(Ty == IceType_i16 || Ty == IceType_i32); 2706 assert(Ty == IceType_i16 || Ty == IceType_i32);
2526 assert(imm.is_int8()); 2707 assert(imm.is_int8());
2527 if (Ty == IceType_i16) 2708 if (Ty == IceType_i16)
2528 emitOperandSizeOverride(); 2709 emitOperandSizeOverride();
2710 emitRexRB(Ty, src, dst);
2529 emitUint8(0x0F); 2711 emitUint8(0x0F);
2530 emitUint8(0xA4); 2712 emitUint8(0xA4);
2531 emitRegisterOperand(src, dst); 2713 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2532 emitUint8(imm.value() & 0xFF); 2714 emitUint8(imm.value() & 0xFF);
2533 } 2715 }
2534 2716
2535 template <class Machine> 2717 template <class Machine>
2536 void AssemblerX86Base<Machine>::shld(Type Ty, 2718 void AssemblerX86Base<Machine>::shld(Type Ty,
2537 const typename Traits::Address &operand, 2719 const typename Traits::Address &operand,
2538 typename Traits::GPRRegister src) { 2720 typename Traits::GPRRegister src) {
2539 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2721 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2540 assert(Ty == IceType_i16 || Ty == IceType_i32); 2722 assert(Ty == IceType_i16 || Ty == IceType_i32);
2541 if (Ty == IceType_i16) 2723 if (Ty == IceType_i16)
2542 emitOperandSizeOverride(); 2724 emitOperandSizeOverride();
2725 emitRex(Ty, operand, src);
2543 emitUint8(0x0F); 2726 emitUint8(0x0F);
2544 emitUint8(0xA5); 2727 emitUint8(0xA5);
2545 emitOperand(src, operand); 2728 emitOperand(gprEncoding(src), operand);
2546 } 2729 }
2547 2730
2548 template <class Machine> 2731 template <class Machine>
2549 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst, 2732 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst,
2550 typename Traits::GPRRegister src) { 2733 typename Traits::GPRRegister src) {
2551 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2734 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2552 assert(Ty == IceType_i16 || Ty == IceType_i32); 2735 assert(Ty == IceType_i16 || Ty == IceType_i32);
2553 if (Ty == IceType_i16) 2736 if (Ty == IceType_i16)
2554 emitOperandSizeOverride(); 2737 emitOperandSizeOverride();
2738 emitRexRB(Ty, src, dst);
2555 emitUint8(0x0F); 2739 emitUint8(0x0F);
2556 emitUint8(0xAD); 2740 emitUint8(0xAD);
2557 emitRegisterOperand(src, dst); 2741 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2558 } 2742 }
2559 2743
2560 template <class Machine> 2744 template <class Machine>
2561 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst, 2745 void AssemblerX86Base<Machine>::shrd(Type Ty, typename Traits::GPRRegister dst,
2562 typename Traits::GPRRegister src, 2746 typename Traits::GPRRegister src,
2563 const Immediate &imm) { 2747 const Immediate &imm) {
2564 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2748 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2565 assert(Ty == IceType_i16 || Ty == IceType_i32); 2749 assert(Ty == IceType_i16 || Ty == IceType_i32);
2566 assert(imm.is_int8()); 2750 assert(imm.is_int8());
2567 if (Ty == IceType_i16) 2751 if (Ty == IceType_i16)
2568 emitOperandSizeOverride(); 2752 emitOperandSizeOverride();
2753 emitRexRB(Ty, src, dst);
2569 emitUint8(0x0F); 2754 emitUint8(0x0F);
2570 emitUint8(0xAC); 2755 emitUint8(0xAC);
2571 emitRegisterOperand(src, dst); 2756 emitRegisterOperand(gprEncoding(src), gprEncoding(dst));
2572 emitUint8(imm.value() & 0xFF); 2757 emitUint8(imm.value() & 0xFF);
2573 } 2758 }
2574 2759
2575 template <class Machine> 2760 template <class Machine>
2576 void AssemblerX86Base<Machine>::shrd(Type Ty, 2761 void AssemblerX86Base<Machine>::shrd(Type Ty,
2577 const typename Traits::Address &dst, 2762 const typename Traits::Address &dst,
2578 typename Traits::GPRRegister src) { 2763 typename Traits::GPRRegister src) {
2579 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2764 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2580 assert(Ty == IceType_i16 || Ty == IceType_i32); 2765 assert(Ty == IceType_i16 || Ty == IceType_i32);
2581 if (Ty == IceType_i16) 2766 if (Ty == IceType_i16)
2582 emitOperandSizeOverride(); 2767 emitOperandSizeOverride();
2768 emitRex(Ty, dst, src);
2583 emitUint8(0x0F); 2769 emitUint8(0x0F);
2584 emitUint8(0xAD); 2770 emitUint8(0xAD);
2585 emitOperand(src, dst); 2771 emitOperand(gprEncoding(src), dst);
2586 } 2772 }
2587 2773
2588 template <class Machine> 2774 template <class Machine>
2589 void AssemblerX86Base<Machine>::neg(Type Ty, typename Traits::GPRRegister reg) { 2775 void AssemblerX86Base<Machine>::neg(Type Ty, typename Traits::GPRRegister reg) {
2590 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2776 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2591 if (Ty == IceType_i16) 2777 if (Ty == IceType_i16)
2592 emitOperandSizeOverride(); 2778 emitOperandSizeOverride();
2779 emitRexB(Ty, reg);
2593 if (isByteSizedArithType(Ty)) 2780 if (isByteSizedArithType(Ty))
2594 emitUint8(0xF6); 2781 emitUint8(0xF6);
2595 else 2782 else
2596 emitUint8(0xF7); 2783 emitUint8(0xF7);
2597 emitRegisterOperand(3, reg); 2784 emitRegisterOperand(3, gprEncoding(reg));
2598 } 2785 }
2599 2786
2600 template <class Machine> 2787 template <class Machine>
2601 void AssemblerX86Base<Machine>::neg(Type Ty, 2788 void AssemblerX86Base<Machine>::neg(Type Ty,
2602 const typename Traits::Address &addr) { 2789 const typename Traits::Address &addr) {
2603 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2790 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2604 if (Ty == IceType_i16) 2791 if (Ty == IceType_i16)
2605 emitOperandSizeOverride(); 2792 emitOperandSizeOverride();
2793 emitRex(Ty, addr, Traits::GPRRegister::Encoded_Reg_eax);
2606 if (isByteSizedArithType(Ty)) 2794 if (isByteSizedArithType(Ty))
2607 emitUint8(0xF6); 2795 emitUint8(0xF6);
2608 else 2796 else
2609 emitUint8(0xF7); 2797 emitUint8(0xF7);
2610 emitOperand(3, addr); 2798 emitOperand(3, addr);
2611 } 2799 }
2612 2800
2613 template <class Machine> 2801 template <class Machine>
2614 void AssemblerX86Base<Machine>::notl(typename Traits::GPRRegister reg) { 2802 void AssemblerX86Base<Machine>::notl(typename Traits::GPRRegister reg) {
2615 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2803 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2804 emitRexB(IceType_i32, reg);
2616 emitUint8(0xF7); 2805 emitUint8(0xF7);
2617 emitUint8(0xD0 | reg); 2806 emitUint8(0xD0 | gprEncoding(reg));
2618 } 2807 }
2619 2808
2620 template <class Machine> 2809 template <class Machine>
2621 void AssemblerX86Base<Machine>::bswap(Type Ty, 2810 void AssemblerX86Base<Machine>::bswap(Type Ty,
2622 typename Traits::GPRRegister reg) { 2811 typename Traits::GPRRegister reg) {
2623 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2812 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2624 assert(Ty == IceType_i32); 2813 assert(Ty == IceType_i32);
2625 (void)Ty; 2814 (void)Ty;
2815 emitRexB(Ty, reg);
2626 emitUint8(0x0F); 2816 emitUint8(0x0F);
2627 emitUint8(0xC8 | reg); 2817 emitUint8(0xC8 | gprEncoding(reg));
2628 } 2818 }
2629 2819
2630 template <class Machine> 2820 template <class Machine>
2631 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, 2821 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
2632 typename Traits::GPRRegister src) { 2822 typename Traits::GPRRegister src) {
2633 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2823 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2634 assert(Ty == IceType_i16 || Ty == IceType_i32); 2824 assert(Ty == IceType_i16 || Ty == IceType_i32);
2635 if (Ty == IceType_i16) 2825 if (Ty == IceType_i16)
2636 emitOperandSizeOverride(); 2826 emitOperandSizeOverride();
2827 emitRexRB(Ty, dst, src);
2637 emitUint8(0x0F); 2828 emitUint8(0x0F);
2638 emitUint8(0xBC); 2829 emitUint8(0xBC);
2639 emitRegisterOperand(dst, src); 2830 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2640 } 2831 }
2641 2832
2642 template <class Machine> 2833 template <class Machine>
2643 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst, 2834 void AssemblerX86Base<Machine>::bsf(Type Ty, typename Traits::GPRRegister dst,
2644 const typename Traits::Address &src) { 2835 const typename Traits::Address &src) {
2645 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2836 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2646 assert(Ty == IceType_i16 || Ty == IceType_i32); 2837 assert(Ty == IceType_i16 || Ty == IceType_i32);
2647 if (Ty == IceType_i16) 2838 if (Ty == IceType_i16)
2648 emitOperandSizeOverride(); 2839 emitOperandSizeOverride();
2840 emitRex(Ty, src, dst);
2649 emitUint8(0x0F); 2841 emitUint8(0x0F);
2650 emitUint8(0xBC); 2842 emitUint8(0xBC);
2651 emitOperand(dst, src); 2843 emitOperand(gprEncoding(dst), src);
2652 } 2844 }
2653 2845
2654 template <class Machine> 2846 template <class Machine>
2655 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, 2847 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst,
2656 typename Traits::GPRRegister src) { 2848 typename Traits::GPRRegister src) {
2657 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2849 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2658 assert(Ty == IceType_i16 || Ty == IceType_i32); 2850 assert(Ty == IceType_i16 || Ty == IceType_i32);
2659 if (Ty == IceType_i16) 2851 if (Ty == IceType_i16)
2660 emitOperandSizeOverride(); 2852 emitOperandSizeOverride();
2853 emitRexRB(Ty, dst, src);
2661 emitUint8(0x0F); 2854 emitUint8(0x0F);
2662 emitUint8(0xBD); 2855 emitUint8(0xBD);
2663 emitRegisterOperand(dst, src); 2856 emitRegisterOperand(gprEncoding(dst), gprEncoding(src));
2664 } 2857 }
2665 2858
2666 template <class Machine> 2859 template <class Machine>
2667 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst, 2860 void AssemblerX86Base<Machine>::bsr(Type Ty, typename Traits::GPRRegister dst,
2668 const typename Traits::Address &src) { 2861 const typename Traits::Address &src) {
2669 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2862 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2670 assert(Ty == IceType_i16 || Ty == IceType_i32); 2863 assert(Ty == IceType_i16 || Ty == IceType_i32);
2671 if (Ty == IceType_i16) 2864 if (Ty == IceType_i16)
2672 emitOperandSizeOverride(); 2865 emitOperandSizeOverride();
2866 emitRex(Ty, src, dst);
2673 emitUint8(0x0F); 2867 emitUint8(0x0F);
2674 emitUint8(0xBD); 2868 emitUint8(0xBD);
2675 emitOperand(dst, src); 2869 emitOperand(gprEncoding(dst), src);
2676 } 2870 }
2677 2871
2678 template <class Machine> 2872 template <class Machine>
2679 void AssemblerX86Base<Machine>::bt(typename Traits::GPRRegister base, 2873 void AssemblerX86Base<Machine>::bt(typename Traits::GPRRegister base,
2680 typename Traits::GPRRegister offset) { 2874 typename Traits::GPRRegister offset) {
2681 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2875 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2876 emitRexRB(IceType_i32, offset, base);
2682 emitUint8(0x0F); 2877 emitUint8(0x0F);
2683 emitUint8(0xA3); 2878 emitUint8(0xA3);
2684 emitRegisterOperand(offset, base); 2879 emitRegisterOperand(gprEncoding(offset), gprEncoding(base));
2685 } 2880 }
2686 2881
2687 template <class Machine> void AssemblerX86Base<Machine>::ret() { 2882 template <class Machine> void AssemblerX86Base<Machine>::ret() {
2688 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2883 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2689 emitUint8(0xC3); 2884 emitUint8(0xC3);
2690 } 2885 }
2691 2886
2692 template <class Machine> 2887 template <class Machine>
2693 void AssemblerX86Base<Machine>::ret(const Immediate &imm) { 2888 void AssemblerX86Base<Machine>::ret(const Immediate &imm) {
2694 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 2889 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2816 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3011 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2817 emitUint8(0x0F); 3012 emitUint8(0x0F);
2818 emitUint8(0x80 + condition); 3013 emitUint8(0x80 + condition);
2819 emitFixup(this->createFixup(Traits::PcRelFixup, label)); 3014 emitFixup(this->createFixup(Traits::PcRelFixup, label));
2820 emitInt32(-4); 3015 emitInt32(-4);
2821 } 3016 }
2822 3017
2823 template <class Machine> 3018 template <class Machine>
2824 void AssemblerX86Base<Machine>::jmp(typename Traits::GPRRegister reg) { 3019 void AssemblerX86Base<Machine>::jmp(typename Traits::GPRRegister reg) {
2825 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3020 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3021 emitRexB(IceType_i64, reg);
2826 emitUint8(0xFF); 3022 emitUint8(0xFF);
2827 emitRegisterOperand(4, reg); 3023 emitRegisterOperand(4, gprEncoding(reg));
2828 } 3024 }
2829 3025
2830 template <class Machine> 3026 template <class Machine>
2831 void AssemblerX86Base<Machine>::jmp(Label *label, bool near) { 3027 void AssemblerX86Base<Machine>::jmp(Label *label, bool near) {
2832 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3028 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2833 if (label->IsBound()) { 3029 if (label->IsBound()) {
2834 static const int kShortSize = 2; 3030 static const int kShortSize = 2;
2835 static const int kLongSize = 5; 3031 static const int kLongSize = 5;
2836 intptr_t offset = label->Position() - Buffer.size(); 3032 intptr_t offset = label->Position() - Buffer.size();
2837 assert(offset <= 0); 3033 assert(offset <= 0);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 template <class Machine> 3070 template <class Machine>
2875 void AssemblerX86Base<Machine>::cmpxchg(Type Ty, 3071 void AssemblerX86Base<Machine>::cmpxchg(Type Ty,
2876 const typename Traits::Address &address, 3072 const typename Traits::Address &address,
2877 typename Traits::GPRRegister reg, 3073 typename Traits::GPRRegister reg,
2878 bool Locked) { 3074 bool Locked) {
2879 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3075 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2880 if (Ty == IceType_i16) 3076 if (Ty == IceType_i16)
2881 emitOperandSizeOverride(); 3077 emitOperandSizeOverride();
2882 if (Locked) 3078 if (Locked)
2883 emitUint8(0xF0); 3079 emitUint8(0xF0);
3080 emitRex(Ty, address, reg);
2884 emitUint8(0x0F); 3081 emitUint8(0x0F);
2885 if (isByteSizedArithType(Ty)) 3082 if (isByteSizedArithType(Ty))
2886 emitUint8(0xB0); 3083 emitUint8(0xB0);
2887 else 3084 else
2888 emitUint8(0xB1); 3085 emitUint8(0xB1);
2889 emitOperand(reg, address); 3086 emitOperand(gprEncoding(reg), address);
2890 } 3087 }
2891 3088
2892 template <class Machine> 3089 template <class Machine>
2893 void AssemblerX86Base<Machine>::cmpxchg8b( 3090 void AssemblerX86Base<Machine>::cmpxchg8b(
2894 const typename Traits::Address &address, bool Locked) { 3091 const typename Traits::Address &address, bool Locked) {
2895 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3092 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2896 if (Locked) 3093 if (Locked)
2897 emitUint8(0xF0); 3094 emitUint8(0xF0);
3095 emitRex(IceType_i32, address, Traits::GPRRegister::Encoded_Reg_eax);
2898 emitUint8(0x0F); 3096 emitUint8(0x0F);
2899 emitUint8(0xC7); 3097 emitUint8(0xC7);
2900 emitOperand(1, address); 3098 emitOperand(1, address);
2901 } 3099 }
2902 3100
2903 template <class Machine> 3101 template <class Machine>
2904 void AssemblerX86Base<Machine>::xadd(Type Ty, 3102 void AssemblerX86Base<Machine>::xadd(Type Ty,
2905 const typename Traits::Address &addr, 3103 const typename Traits::Address &addr,
2906 typename Traits::GPRRegister reg, 3104 typename Traits::GPRRegister reg,
2907 bool Locked) { 3105 bool Locked) {
2908 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3106 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2909 if (Ty == IceType_i16) 3107 if (Ty == IceType_i16)
2910 emitOperandSizeOverride(); 3108 emitOperandSizeOverride();
2911 if (Locked) 3109 if (Locked)
2912 emitUint8(0xF0); 3110 emitUint8(0xF0);
3111 emitRex(Ty, addr, reg);
2913 emitUint8(0x0F); 3112 emitUint8(0x0F);
2914 if (isByteSizedArithType(Ty)) 3113 if (isByteSizedArithType(Ty))
2915 emitUint8(0xC0); 3114 emitUint8(0xC0);
2916 else 3115 else
2917 emitUint8(0xC1); 3116 emitUint8(0xC1);
2918 emitOperand(reg, addr); 3117 emitOperand(gprEncoding(reg), addr);
2919 } 3118 }
2920 3119
2921 template <class Machine> 3120 template <class Machine>
2922 void AssemblerX86Base<Machine>::xchg(Type Ty, 3121 void AssemblerX86Base<Machine>::xchg(Type Ty,
2923 const typename Traits::Address &addr, 3122 const typename Traits::Address &addr,
2924 typename Traits::GPRRegister reg) { 3123 typename Traits::GPRRegister reg) {
2925 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3124 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2926 if (Ty == IceType_i16) 3125 if (Ty == IceType_i16)
2927 emitOperandSizeOverride(); 3126 emitOperandSizeOverride();
3127 emitRex(Ty, addr, reg);
2928 if (isByteSizedArithType(Ty)) 3128 if (isByteSizedArithType(Ty))
2929 emitUint8(0x86); 3129 emitUint8(0x86);
2930 else 3130 else
2931 emitUint8(0x87); 3131 emitUint8(0x87);
2932 emitOperand(reg, addr); 3132 emitOperand(gprEncoding(reg), addr);
2933 } 3133 }
2934 3134
2935 template <class Machine> 3135 template <class Machine>
2936 void AssemblerX86Base<Machine>::emitSegmentOverride(uint8_t prefix) { 3136 void AssemblerX86Base<Machine>::emitSegmentOverride(uint8_t prefix) {
2937 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3137 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
2938 emitUint8(prefix); 3138 emitUint8(prefix);
2939 } 3139 }
2940 3140
2941 template <class Machine> 3141 template <class Machine>
2942 void AssemblerX86Base<Machine>::align(intptr_t alignment, intptr_t offset) { 3142 void AssemblerX86Base<Machine>::align(intptr_t alignment, intptr_t offset) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
3075 label->NearLinkTo(position); 3275 label->NearLinkTo(position);
3076 } 3276 }
3077 3277
3078 template <class Machine> 3278 template <class Machine>
3079 void AssemblerX86Base<Machine>::emitGenericShift( 3279 void AssemblerX86Base<Machine>::emitGenericShift(
3080 int rm, Type Ty, typename Traits::GPRRegister reg, const Immediate &imm) { 3280 int rm, Type Ty, typename Traits::GPRRegister reg, const Immediate &imm) {
3081 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3281 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3082 assert(imm.is_int8()); 3282 assert(imm.is_int8());
3083 if (Ty == IceType_i16) 3283 if (Ty == IceType_i16)
3084 emitOperandSizeOverride(); 3284 emitOperandSizeOverride();
3285 emitRexB(Ty, reg);
3085 if (imm.value() == 1) { 3286 if (imm.value() == 1) {
3086 emitUint8(isByteSizedArithType(Ty) ? 0xD0 : 0xD1); 3287 emitUint8(isByteSizedArithType(Ty) ? 0xD0 : 0xD1);
3087 emitOperand(rm, typename Traits::Operand(reg)); 3288 emitOperand(rm, typename Traits::Operand(reg));
3088 } else { 3289 } else {
3089 emitUint8(isByteSizedArithType(Ty) ? 0xC0 : 0xC1); 3290 emitUint8(isByteSizedArithType(Ty) ? 0xC0 : 0xC1);
3090 emitOperand(rm, typename Traits::Operand(reg)); 3291 emitOperand(rm, typename Traits::Operand(reg));
3091 emitUint8(imm.value() & 0xFF); 3292 emitUint8(imm.value() & 0xFF);
3092 } 3293 }
3093 } 3294 }
3094 3295
3095 template <class Machine> 3296 template <class Machine>
3096 void AssemblerX86Base<Machine>::emitGenericShift( 3297 void AssemblerX86Base<Machine>::emitGenericShift(
3097 int rm, Type Ty, const typename Traits::Operand &operand, 3298 int rm, Type Ty, const typename Traits::Operand &operand,
3098 typename Traits::GPRRegister shifter) { 3299 typename Traits::GPRRegister shifter) {
3099 AssemblerBuffer::EnsureCapacity ensured(&Buffer); 3300 AssemblerBuffer::EnsureCapacity ensured(&Buffer);
3100 assert(shifter == Traits::Encoded_Reg_Counter); 3301 assert(shifter == Traits::Encoded_Reg_Counter);
3101 (void)shifter; 3302 (void)shifter;
3102 if (Ty == IceType_i16) 3303 if (Ty == IceType_i16)
3103 emitOperandSizeOverride(); 3304 emitOperandSizeOverride();
3305 emitRexB(Ty, operand.rm());
3104 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); 3306 emitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3);
3105 emitOperand(rm, operand); 3307 emitOperand(rm, operand);
3106 } 3308 }
3107 3309
3108 } // end of namespace X86Internal 3310 } // end of namespace X86Internal
3109 } // end of namespace Ice 3311 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698