| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Modified by the Subzero authors. | 5 // Modified by the Subzero authors. |
| 6 // | 6 // |
| 7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// | 7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// |
| 8 // | 8 // |
| 9 // The Subzero Code Generator | 9 // The Subzero Code Generator |
| 10 // | 10 // |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 EmitUint8(0x40 + cond); | 265 EmitUint8(0x40 + cond); |
| 266 EmitRegisterOperand(dst, src); | 266 EmitRegisterOperand(dst, src); |
| 267 } | 267 } |
| 268 | 268 |
| 269 void AssemblerX86::rep_movsb() { | 269 void AssemblerX86::rep_movsb() { |
| 270 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 270 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 271 EmitUint8(0xF3); | 271 EmitUint8(0xF3); |
| 272 EmitUint8(0xA4); | 272 EmitUint8(0xA4); |
| 273 } | 273 } |
| 274 | 274 |
| 275 void AssemblerX86::movss(XmmRegister dst, const Address &src) { | 275 void AssemblerX86::movss(Type Ty, XmmRegister dst, const Address &src) { |
| 276 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 276 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 277 EmitUint8(0xF3); | 277 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 278 EmitUint8(0x0F); | 278 EmitUint8(0x0F); |
| 279 EmitUint8(0x10); | 279 EmitUint8(0x10); |
| 280 EmitOperand(dst, src); | 280 EmitOperand(dst, src); |
| 281 } | 281 } |
| 282 | 282 |
| 283 void AssemblerX86::movss(const Address &dst, XmmRegister src) { | 283 void AssemblerX86::movss(Type Ty, const Address &dst, XmmRegister src) { |
| 284 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 284 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 285 EmitUint8(0xF3); | 285 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 286 EmitUint8(0x0F); | 286 EmitUint8(0x0F); |
| 287 EmitUint8(0x11); | 287 EmitUint8(0x11); |
| 288 EmitOperand(src, dst); | 288 EmitOperand(src, dst); |
| 289 } | 289 } |
| 290 | 290 |
| 291 void AssemblerX86::movss(XmmRegister dst, XmmRegister src) { | 291 void AssemblerX86::movss(Type Ty, XmmRegister dst, XmmRegister src) { |
| 292 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 292 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 293 EmitUint8(0xF3); | 293 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 294 EmitUint8(0x0F); | 294 EmitUint8(0x0F); |
| 295 EmitUint8(0x11); | 295 EmitUint8(0x11); |
| 296 EmitXmmRegisterOperand(src, dst); | 296 EmitXmmRegisterOperand(src, dst); |
| 297 } | 297 } |
| 298 | 298 |
| 299 void AssemblerX86::movd(XmmRegister dst, GPRRegister src) { | 299 void AssemblerX86::movd(XmmRegister dst, GPRRegister src) { |
| 300 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 300 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 301 EmitUint8(0x66); | 301 EmitUint8(0x66); |
| 302 EmitUint8(0x0F); | 302 EmitUint8(0x0F); |
| 303 EmitUint8(0x6E); | 303 EmitUint8(0x6E); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 } | 409 } |
| 410 | 410 |
| 411 void AssemblerX86::divss(Type Ty, XmmRegister dst, const Address &src) { | 411 void AssemblerX86::divss(Type Ty, XmmRegister dst, const Address &src) { |
| 412 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 412 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 413 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); | 413 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2); |
| 414 EmitUint8(0x0F); | 414 EmitUint8(0x0F); |
| 415 EmitUint8(0x5E); | 415 EmitUint8(0x5E); |
| 416 EmitOperand(dst, src); | 416 EmitOperand(dst, src); |
| 417 } | 417 } |
| 418 | 418 |
| 419 void AssemblerX86::flds(const Address &src) { | 419 void AssemblerX86::fld(Type Ty, const Address &src) { |
| 420 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 420 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 421 EmitUint8(0xD9); | 421 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); |
| 422 EmitOperand(0, src); | 422 EmitOperand(0, src); |
| 423 } | 423 } |
| 424 | 424 |
| 425 void AssemblerX86::fstps(const Address &dst) { | 425 void AssemblerX86::fstp(Type Ty, const Address &dst) { |
| 426 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 426 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 427 EmitUint8(0xD9); | 427 EmitUint8(isFloat32Asserting32Or64(Ty) ? 0xD9 : 0xDD); |
| 428 EmitOperand(3, dst); | 428 EmitOperand(3, dst); |
| 429 } | 429 } |
| 430 | 430 |
| 431 void AssemblerX86::movsd(XmmRegister dst, const Address &src) { | 431 void AssemblerX86::fstp(X87STRegister st) { |
| 432 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 432 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 433 EmitUint8(0xF2); | 433 EmitUint8(0xDD); |
| 434 EmitUint8(0x0F); | 434 EmitUint8(0xD8 + st); |
| 435 EmitUint8(0x10); | |
| 436 EmitOperand(dst, src); | |
| 437 } | |
| 438 | |
| 439 void AssemblerX86::movsd(const Address &dst, XmmRegister src) { | |
| 440 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 441 EmitUint8(0xF2); | |
| 442 EmitUint8(0x0F); | |
| 443 EmitUint8(0x11); | |
| 444 EmitOperand(src, dst); | |
| 445 } | |
| 446 | |
| 447 void AssemblerX86::movsd(XmmRegister dst, XmmRegister src) { | |
| 448 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 449 EmitUint8(0xF2); | |
| 450 EmitUint8(0x0F); | |
| 451 EmitUint8(0x11); | |
| 452 EmitXmmRegisterOperand(src, dst); | |
| 453 } | 435 } |
| 454 | 436 |
| 455 void AssemblerX86::movaps(XmmRegister dst, XmmRegister src) { | 437 void AssemblerX86::movaps(XmmRegister dst, XmmRegister src) { |
| 456 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 438 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 457 EmitUint8(0x0F); | 439 EmitUint8(0x0F); |
| 458 EmitUint8(0x28); | 440 EmitUint8(0x28); |
| 459 EmitXmmRegisterOperand(dst, src); | 441 EmitXmmRegisterOperand(dst, src); |
| 460 } | 442 } |
| 461 | 443 |
| 462 void AssemblerX86::movups(XmmRegister dst, XmmRegister src) { | 444 void AssemblerX86::movups(XmmRegister dst, XmmRegister src) { |
| (...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1231 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1213 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1232 EmitUint8(0x66); | 1214 EmitUint8(0x66); |
| 1233 EmitUint8(0x0F); | 1215 EmitUint8(0x0F); |
| 1234 EmitUint8(0x3A); | 1216 EmitUint8(0x3A); |
| 1235 EmitUint8(0x0B); | 1217 EmitUint8(0x0B); |
| 1236 EmitXmmRegisterOperand(dst, src); | 1218 EmitXmmRegisterOperand(dst, src); |
| 1237 // Mask precision exeption. | 1219 // Mask precision exeption. |
| 1238 EmitUint8(static_cast<uint8_t>(mode) | 0x8); | 1220 EmitUint8(static_cast<uint8_t>(mode) | 0x8); |
| 1239 } | 1221 } |
| 1240 | 1222 |
| 1241 void AssemblerX86::fldl(const Address &src) { | |
| 1242 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 1243 EmitUint8(0xDD); | |
| 1244 EmitOperand(0, src); | |
| 1245 } | |
| 1246 | |
| 1247 void AssemblerX86::fstpl(const Address &dst) { | |
| 1248 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 1249 EmitUint8(0xDD); | |
| 1250 EmitOperand(3, dst); | |
| 1251 } | |
| 1252 | |
| 1253 void AssemblerX86::fnstcw(const Address &dst) { | 1223 void AssemblerX86::fnstcw(const Address &dst) { |
| 1254 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1224 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1255 EmitUint8(0xD9); | 1225 EmitUint8(0xD9); |
| 1256 EmitOperand(7, dst); | 1226 EmitOperand(7, dst); |
| 1257 } | 1227 } |
| 1258 | 1228 |
| 1259 void AssemblerX86::fldcw(const Address &src) { | 1229 void AssemblerX86::fldcw(const Address &src) { |
| 1260 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1230 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1261 EmitUint8(0xD9); | 1231 EmitUint8(0xD9); |
| 1262 EmitOperand(5, src); | 1232 EmitOperand(5, src); |
| (...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2347 assert(shifter == RegX8632::Encoded_Reg_ecx); | 2317 assert(shifter == RegX8632::Encoded_Reg_ecx); |
| 2348 (void)shifter; | 2318 (void)shifter; |
| 2349 if (Ty == IceType_i16) | 2319 if (Ty == IceType_i16) |
| 2350 EmitOperandSizeOverride(); | 2320 EmitOperandSizeOverride(); |
| 2351 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); | 2321 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); |
| 2352 EmitOperand(rm, operand); | 2322 EmitOperand(rm, operand); |
| 2353 } | 2323 } |
| 2354 | 2324 |
| 2355 } // end of namespace x86 | 2325 } // end of namespace x86 |
| 2356 } // end of namespace Ice | 2326 } // end of namespace Ice |
| OLD | NEW |