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 1128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1139 EmitUint8(0x3B); | 1139 EmitUint8(0x3B); |
1140 EmitOperand(reg0, Operand(reg1)); | 1140 EmitOperand(reg0, Operand(reg1)); |
1141 } | 1141 } |
1142 | 1142 |
1143 void AssemblerX86::cmpl(GPRRegister reg, const Address &address) { | 1143 void AssemblerX86::cmpl(GPRRegister reg, const Address &address) { |
1144 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1144 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1145 EmitUint8(0x3B); | 1145 EmitUint8(0x3B); |
1146 EmitOperand(reg, address); | 1146 EmitOperand(reg, address); |
1147 } | 1147 } |
1148 | 1148 |
1149 void AssemblerX86::addl(GPRRegister dst, GPRRegister src) { | |
1150 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1151 EmitUint8(0x03); | |
1152 EmitRegisterOperand(dst, src); | |
1153 } | |
1154 | |
1155 void AssemblerX86::addl(GPRRegister reg, const Address &address) { | |
1156 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1157 EmitUint8(0x03); | |
1158 EmitOperand(reg, address); | |
1159 } | |
1160 | |
1161 void AssemblerX86::cmpl(const Address &address, GPRRegister reg) { | 1149 void AssemblerX86::cmpl(const Address &address, GPRRegister reg) { |
1162 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1150 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1163 EmitUint8(0x39); | 1151 EmitUint8(0x39); |
1164 EmitOperand(reg, address); | 1152 EmitOperand(reg, address); |
1165 } | 1153 } |
1166 | 1154 |
1167 void AssemblerX86::cmpl(const Address &address, const Immediate &imm) { | 1155 void AssemblerX86::cmpl(const Address &address, const Immediate &imm) { |
1168 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1156 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1169 EmitComplex(7, address, imm); | 1157 EmitComplex(7, address, imm); |
1170 } | 1158 } |
(...skipping 29 matching lines...) Expand all Loading... |
1200 // Use short form if the destination is EAX. | 1188 // Use short form if the destination is EAX. |
1201 EmitUint8(0xA9); | 1189 EmitUint8(0xA9); |
1202 EmitImmediate(immediate); | 1190 EmitImmediate(immediate); |
1203 } else { | 1191 } else { |
1204 EmitUint8(0xF7); | 1192 EmitUint8(0xF7); |
1205 EmitOperand(0, Operand(reg)); | 1193 EmitOperand(0, Operand(reg)); |
1206 EmitImmediate(immediate); | 1194 EmitImmediate(immediate); |
1207 } | 1195 } |
1208 } | 1196 } |
1209 | 1197 |
1210 void AssemblerX86::andl(GPRRegister dst, GPRRegister src) { | 1198 void AssemblerX86::And(Type Ty, GPRRegister dst, GPRRegister src) { |
1211 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1199 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1212 EmitUint8(0x23); | 1200 if (Ty == IceType_i16) |
1213 EmitOperand(dst, Operand(src)); | 1201 EmitOperandSizeOverride(); |
1214 } | 1202 if (Ty == IceType_i8 || Ty == IceType_i1) |
1215 | 1203 EmitUint8(0x22); |
1216 void AssemblerX86::andl(GPRRegister dst, const Immediate &imm) { | 1204 else |
1217 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1205 EmitUint8(0x23); |
| 1206 EmitRegisterOperand(dst, src); |
| 1207 } |
| 1208 |
| 1209 void AssemblerX86::And(Type Ty, GPRRegister dst, const Address &address) { |
| 1210 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1211 if (Ty == IceType_i16) |
| 1212 EmitOperandSizeOverride(); |
| 1213 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1214 EmitUint8(0x22); |
| 1215 else |
| 1216 EmitUint8(0x23); |
| 1217 EmitOperand(dst, address); |
| 1218 } |
| 1219 |
| 1220 void AssemblerX86::And(Type Ty, GPRRegister dst, const Immediate &imm) { |
| 1221 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1222 if (Ty == IceType_i8 || Ty == IceType_i1) { |
| 1223 EmitComplexI8(4, Operand(dst), imm); |
| 1224 return; |
| 1225 } |
| 1226 if (Ty == IceType_i16) |
| 1227 EmitOperandSizeOverride(); |
1218 EmitComplex(4, Operand(dst), imm); | 1228 EmitComplex(4, Operand(dst), imm); |
1219 } | 1229 } |
1220 | 1230 |
1221 void AssemblerX86::andl(GPRRegister dst, const Address &address) { | 1231 void AssemblerX86::Or(Type Ty, GPRRegister dst, GPRRegister src) { |
1222 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1232 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1223 EmitUint8(0x23); | 1233 if (Ty == IceType_i16) |
1224 EmitOperand(dst, address); | 1234 EmitOperandSizeOverride(); |
1225 } | 1235 if (Ty == IceType_i8 || Ty == IceType_i1) |
1226 | 1236 EmitUint8(0x0A); |
1227 void AssemblerX86::orl(GPRRegister dst, GPRRegister src) { | 1237 else |
1228 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1238 EmitUint8(0x0B); |
1229 EmitUint8(0x0B); | 1239 EmitRegisterOperand(dst, src); |
1230 EmitOperand(dst, Operand(src)); | 1240 } |
1231 } | 1241 |
1232 | 1242 void AssemblerX86::Or(Type Ty, GPRRegister dst, const Address &address) { |
1233 void AssemblerX86::orl(GPRRegister dst, const Immediate &imm) { | 1243 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1234 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1244 if (Ty == IceType_i16) |
| 1245 EmitOperandSizeOverride(); |
| 1246 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1247 EmitUint8(0x0A); |
| 1248 else |
| 1249 EmitUint8(0x0B); |
| 1250 EmitOperand(dst, address); |
| 1251 } |
| 1252 |
| 1253 void AssemblerX86::Or(Type Ty, GPRRegister dst, const Immediate &imm) { |
| 1254 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1255 if (Ty == IceType_i8 || Ty == IceType_i1) { |
| 1256 EmitComplexI8(1, Operand(dst), imm); |
| 1257 return; |
| 1258 } |
| 1259 if (Ty == IceType_i16) |
| 1260 EmitOperandSizeOverride(); |
1235 EmitComplex(1, Operand(dst), imm); | 1261 EmitComplex(1, Operand(dst), imm); |
1236 } | 1262 } |
1237 | 1263 |
1238 void AssemblerX86::orl(GPRRegister dst, const Address &address) { | 1264 void AssemblerX86::Xor(Type Ty, GPRRegister dst, GPRRegister src) { |
1239 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1265 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1240 EmitUint8(0x0B); | 1266 if (Ty == IceType_i16) |
1241 EmitOperand(dst, address); | 1267 EmitOperandSizeOverride(); |
1242 } | 1268 if (Ty == IceType_i8 || Ty == IceType_i1) |
1243 | 1269 EmitUint8(0x32); |
1244 void AssemblerX86::xorl(GPRRegister dst, GPRRegister src) { | 1270 else |
1245 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1271 EmitUint8(0x33); |
1246 EmitUint8(0x33); | 1272 EmitRegisterOperand(dst, src); |
1247 EmitOperand(dst, Operand(src)); | 1273 } |
1248 } | 1274 |
1249 | 1275 void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Address &address) { |
1250 void AssemblerX86::xorl(GPRRegister dst, const Immediate &imm) { | 1276 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1251 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1277 if (Ty == IceType_i16) |
| 1278 EmitOperandSizeOverride(); |
| 1279 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1280 EmitUint8(0x32); |
| 1281 else |
| 1282 EmitUint8(0x33); |
| 1283 EmitOperand(dst, address); |
| 1284 } |
| 1285 |
| 1286 void AssemblerX86::Xor(Type Ty, GPRRegister dst, const Immediate &imm) { |
| 1287 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1288 if (Ty == IceType_i8 || Ty == IceType_i1) { |
| 1289 EmitComplexI8(6, Operand(dst), imm); |
| 1290 return; |
| 1291 } |
| 1292 if (Ty == IceType_i16) |
| 1293 EmitOperandSizeOverride(); |
1252 EmitComplex(6, Operand(dst), imm); | 1294 EmitComplex(6, Operand(dst), imm); |
1253 } | 1295 } |
1254 | 1296 |
1255 void AssemblerX86::xorl(GPRRegister dst, const Address &address) { | 1297 void AssemblerX86::add(Type Ty, GPRRegister dst, GPRRegister src) { |
1256 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1298 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1257 EmitUint8(0x33); | 1299 if (Ty == IceType_i16) |
1258 EmitOperand(dst, address); | 1300 EmitOperandSizeOverride(); |
1259 } | 1301 if (Ty == IceType_i8 || Ty == IceType_i1) |
1260 | 1302 EmitUint8(0x02); |
1261 void AssemblerX86::addl(GPRRegister reg, const Immediate &imm) { | 1303 else |
1262 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1304 EmitUint8(0x03); |
| 1305 EmitRegisterOperand(dst, src); |
| 1306 } |
| 1307 |
| 1308 void AssemblerX86::add(Type Ty, GPRRegister reg, const Address &address) { |
| 1309 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1310 if (Ty == IceType_i16) |
| 1311 EmitOperandSizeOverride(); |
| 1312 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1313 EmitUint8(0x02); |
| 1314 else |
| 1315 EmitUint8(0x03); |
| 1316 EmitOperand(reg, address); |
| 1317 } |
| 1318 |
| 1319 void AssemblerX86::add(Type Ty, GPRRegister reg, const Immediate &imm) { |
| 1320 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1321 if (Ty == IceType_i8 || Ty == IceType_i1) { |
| 1322 EmitComplexI8(0, Operand(reg), imm); |
| 1323 return; |
| 1324 } |
| 1325 if (Ty == IceType_i16) |
| 1326 EmitOperandSizeOverride(); |
1263 EmitComplex(0, Operand(reg), imm); | 1327 EmitComplex(0, Operand(reg), imm); |
1264 } | 1328 } |
1265 | 1329 |
1266 void AssemblerX86::addl(const Address &address, GPRRegister reg) { | 1330 void AssemblerX86::adc(Type Ty, GPRRegister dst, GPRRegister src) { |
1267 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1331 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1268 EmitUint8(0x01); | 1332 if (Ty == IceType_i16) |
| 1333 EmitOperandSizeOverride(); |
| 1334 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1335 EmitUint8(0x12); |
| 1336 else |
| 1337 EmitUint8(0x13); |
| 1338 EmitRegisterOperand(dst, src); |
| 1339 } |
| 1340 |
| 1341 void AssemblerX86::adc(Type Ty, GPRRegister dst, const Address &address) { |
| 1342 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1343 if (Ty == IceType_i16) |
| 1344 EmitOperandSizeOverride(); |
| 1345 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1346 EmitUint8(0x12); |
| 1347 else |
| 1348 EmitUint8(0x13); |
| 1349 EmitOperand(dst, address); |
| 1350 } |
| 1351 |
| 1352 void AssemblerX86::adc(Type Ty, GPRRegister reg, const Immediate &imm) { |
| 1353 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1354 if (Ty == IceType_i8 || Ty == IceType_i1) { |
| 1355 EmitComplexI8(2, Operand(reg), imm); |
| 1356 return; |
| 1357 } |
| 1358 if (Ty == IceType_i16) |
| 1359 EmitOperandSizeOverride(); |
| 1360 EmitComplex(2, Operand(reg), imm); |
| 1361 } |
| 1362 |
| 1363 void AssemblerX86::sub(Type Ty, GPRRegister dst, GPRRegister src) { |
| 1364 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1365 if (Ty == IceType_i16) |
| 1366 EmitOperandSizeOverride(); |
| 1367 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1368 EmitUint8(0x2A); |
| 1369 else |
| 1370 EmitUint8(0x2B); |
| 1371 EmitRegisterOperand(dst, src); |
| 1372 } |
| 1373 |
| 1374 void AssemblerX86::sub(Type Ty, GPRRegister reg, const Address &address) { |
| 1375 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1376 if (Ty == IceType_i16) |
| 1377 EmitOperandSizeOverride(); |
| 1378 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1379 EmitUint8(0x2A); |
| 1380 else |
| 1381 EmitUint8(0x2B); |
1269 EmitOperand(reg, address); | 1382 EmitOperand(reg, address); |
1270 } | 1383 } |
1271 | 1384 |
1272 void AssemblerX86::addl(const Address &address, const Immediate &imm) { | 1385 void AssemblerX86::sub(Type Ty, GPRRegister reg, const Immediate &imm) { |
1273 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1386 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1274 EmitComplex(0, address, imm); | 1387 if (Ty == IceType_i8 || Ty == IceType_i1) { |
1275 } | 1388 EmitComplexI8(5, Operand(reg), imm); |
1276 | 1389 return; |
1277 void AssemblerX86::adcl(GPRRegister reg, const Immediate &imm) { | 1390 } |
1278 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1391 if (Ty == IceType_i16) |
1279 EmitComplex(2, Operand(reg), imm); | 1392 EmitOperandSizeOverride(); |
1280 } | |
1281 | |
1282 void AssemblerX86::adcl(GPRRegister dst, GPRRegister src) { | |
1283 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1284 EmitUint8(0x13); | |
1285 EmitOperand(dst, Operand(src)); | |
1286 } | |
1287 | |
1288 void AssemblerX86::adcl(GPRRegister dst, const Address &address) { | |
1289 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1290 EmitUint8(0x13); | |
1291 EmitOperand(dst, address); | |
1292 } | |
1293 | |
1294 void AssemblerX86::adcl(const Address &address, GPRRegister reg) { | |
1295 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1296 EmitUint8(0x11); | |
1297 EmitOperand(reg, address); | |
1298 } | |
1299 | |
1300 void AssemblerX86::subl(GPRRegister dst, GPRRegister src) { | |
1301 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1302 EmitUint8(0x2B); | |
1303 EmitOperand(dst, Operand(src)); | |
1304 } | |
1305 | |
1306 void AssemblerX86::subl(GPRRegister reg, const Immediate &imm) { | |
1307 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1308 EmitComplex(5, Operand(reg), imm); | 1393 EmitComplex(5, Operand(reg), imm); |
1309 } | 1394 } |
1310 | 1395 |
1311 void AssemblerX86::subl(GPRRegister reg, const Address &address) { | 1396 void AssemblerX86::sbb(Type Ty, GPRRegister dst, GPRRegister src) { |
1312 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1397 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1313 EmitUint8(0x2B); | 1398 if (Ty == IceType_i16) |
1314 EmitOperand(reg, address); | 1399 EmitOperandSizeOverride(); |
1315 } | 1400 if (Ty == IceType_i8 || Ty == IceType_i1) |
1316 | 1401 EmitUint8(0x1A); |
1317 void AssemblerX86::subl(const Address &address, GPRRegister reg) { | 1402 else |
1318 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1403 EmitUint8(0x1B); |
1319 EmitUint8(0x29); | 1404 EmitRegisterOperand(dst, src); |
1320 EmitOperand(reg, address); | 1405 } |
| 1406 |
| 1407 void AssemblerX86::sbb(Type Ty, GPRRegister dst, const Address &address) { |
| 1408 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1409 if (Ty == IceType_i16) |
| 1410 EmitOperandSizeOverride(); |
| 1411 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1412 EmitUint8(0x1A); |
| 1413 else |
| 1414 EmitUint8(0x1B); |
| 1415 EmitOperand(dst, address); |
| 1416 } |
| 1417 |
| 1418 void AssemblerX86::sbb(Type Ty, GPRRegister reg, const Immediate &imm) { |
| 1419 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1420 if (Ty == IceType_i8 || Ty == IceType_i1) { |
| 1421 EmitComplexI8(3, Operand(reg), imm); |
| 1422 return; |
| 1423 } |
| 1424 if (Ty == IceType_i16) |
| 1425 EmitOperandSizeOverride(); |
| 1426 EmitComplex(3, Operand(reg), imm); |
1321 } | 1427 } |
1322 | 1428 |
1323 void AssemblerX86::cbw() { | 1429 void AssemblerX86::cbw() { |
1324 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1430 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1325 EmitOperandSizeOverride(); | 1431 EmitOperandSizeOverride(); |
1326 EmitUint8(0x98); | 1432 EmitUint8(0x98); |
1327 } | 1433 } |
1328 | 1434 |
1329 void AssemblerX86::cwd() { | 1435 void AssemblerX86::cwd() { |
1330 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1436 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1331 EmitOperandSizeOverride(); | 1437 EmitOperandSizeOverride(); |
1332 EmitUint8(0x99); | 1438 EmitUint8(0x99); |
1333 } | 1439 } |
1334 | 1440 |
1335 void AssemblerX86::cdq() { | 1441 void AssemblerX86::cdq() { |
1336 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1442 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1337 EmitUint8(0x99); | 1443 EmitUint8(0x99); |
1338 } | 1444 } |
1339 | 1445 |
1340 void AssemblerX86::idivl(GPRRegister reg) { | 1446 void AssemblerX86::div(Type Ty, GPRRegister reg) { |
1341 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1447 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1342 EmitUint8(0xF7); | 1448 if (Ty == IceType_i16) |
1343 EmitUint8(0xF8 | reg); | 1449 EmitOperandSizeOverride(); |
| 1450 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1451 EmitUint8(0xF6); |
| 1452 else |
| 1453 EmitUint8(0xF7); |
| 1454 EmitRegisterOperand(6, reg); |
| 1455 } |
| 1456 |
| 1457 void AssemblerX86::div(Type Ty, const Address &addr) { |
| 1458 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1459 if (Ty == IceType_i16) |
| 1460 EmitOperandSizeOverride(); |
| 1461 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1462 EmitUint8(0xF6); |
| 1463 else |
| 1464 EmitUint8(0xF7); |
| 1465 EmitOperand(6, addr); |
| 1466 } |
| 1467 |
| 1468 void AssemblerX86::idiv(Type Ty, GPRRegister reg) { |
| 1469 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1470 if (Ty == IceType_i16) |
| 1471 EmitOperandSizeOverride(); |
| 1472 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1473 EmitUint8(0xF6); |
| 1474 else |
| 1475 EmitUint8(0xF7); |
| 1476 EmitRegisterOperand(7, reg); |
| 1477 } |
| 1478 |
| 1479 void AssemblerX86::idiv(Type Ty, const Address &addr) { |
| 1480 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1481 if (Ty == IceType_i16) |
| 1482 EmitOperandSizeOverride(); |
| 1483 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1484 EmitUint8(0xF6); |
| 1485 else |
| 1486 EmitUint8(0xF7); |
| 1487 EmitOperand(7, addr); |
1344 } | 1488 } |
1345 | 1489 |
1346 void AssemblerX86::imull(GPRRegister dst, GPRRegister src) { | 1490 void AssemblerX86::imull(GPRRegister dst, GPRRegister src) { |
1347 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1491 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1348 EmitUint8(0x0F); | 1492 EmitUint8(0x0F); |
1349 EmitUint8(0xAF); | 1493 EmitUint8(0xAF); |
1350 EmitOperand(dst, Operand(src)); | 1494 EmitOperand(dst, Operand(src)); |
1351 } | 1495 } |
1352 | 1496 |
1353 void AssemblerX86::imull(GPRRegister reg, const Immediate &imm) { | 1497 void AssemblerX86::imull(GPRRegister reg, const Immediate &imm) { |
(...skipping 15 matching lines...) Expand all Loading... |
1369 EmitUint8(0xF7); | 1513 EmitUint8(0xF7); |
1370 EmitOperand(5, Operand(reg)); | 1514 EmitOperand(5, Operand(reg)); |
1371 } | 1515 } |
1372 | 1516 |
1373 void AssemblerX86::imull(const Address &address) { | 1517 void AssemblerX86::imull(const Address &address) { |
1374 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1518 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1375 EmitUint8(0xF7); | 1519 EmitUint8(0xF7); |
1376 EmitOperand(5, address); | 1520 EmitOperand(5, address); |
1377 } | 1521 } |
1378 | 1522 |
1379 void AssemblerX86::mull(GPRRegister reg) { | 1523 void AssemblerX86::mul(Type Ty, GPRRegister reg) { |
1380 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1524 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1381 EmitUint8(0xF7); | 1525 if (Ty == IceType_i16) |
1382 EmitOperand(4, Operand(reg)); | 1526 EmitOperandSizeOverride(); |
| 1527 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1528 EmitUint8(0xF6); |
| 1529 else |
| 1530 EmitUint8(0xF7); |
| 1531 EmitRegisterOperand(4, reg); |
1383 } | 1532 } |
1384 | 1533 |
1385 void AssemblerX86::mull(const Address &address) { | 1534 void AssemblerX86::mul(Type Ty, const Address &address) { |
1386 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1535 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1387 EmitUint8(0xF7); | 1536 if (Ty == IceType_i16) |
| 1537 EmitOperandSizeOverride(); |
| 1538 if (Ty == IceType_i8 || Ty == IceType_i1) |
| 1539 EmitUint8(0xF6); |
| 1540 else |
| 1541 EmitUint8(0xF7); |
1388 EmitOperand(4, address); | 1542 EmitOperand(4, address); |
1389 } | 1543 } |
1390 | 1544 |
1391 void AssemblerX86::sbbl(GPRRegister dst, GPRRegister src) { | |
1392 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1393 EmitUint8(0x1B); | |
1394 EmitOperand(dst, Operand(src)); | |
1395 } | |
1396 | |
1397 void AssemblerX86::sbbl(GPRRegister reg, const Immediate &imm) { | |
1398 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1399 EmitComplex(3, Operand(reg), imm); | |
1400 } | |
1401 | |
1402 void AssemblerX86::sbbl(GPRRegister dst, const Address &address) { | |
1403 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1404 EmitUint8(0x1B); | |
1405 EmitOperand(dst, address); | |
1406 } | |
1407 | |
1408 void AssemblerX86::sbbl(const Address &address, GPRRegister dst) { | |
1409 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
1410 EmitUint8(0x19); | |
1411 EmitOperand(dst, address); | |
1412 } | |
1413 | |
1414 void AssemblerX86::incl(GPRRegister reg) { | 1545 void AssemblerX86::incl(GPRRegister reg) { |
1415 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1546 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1416 EmitUint8(0x40 + reg); | 1547 EmitUint8(0x40 + reg); |
1417 } | 1548 } |
1418 | 1549 |
1419 void AssemblerX86::incl(const Address &address) { | 1550 void AssemblerX86::incl(const Address &address) { |
1420 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1551 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1421 EmitUint8(0xFF); | 1552 EmitUint8(0xFF); |
1422 EmitOperand(0, address); | 1553 EmitOperand(0, address); |
1423 } | 1554 } |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1743 } | 1874 } |
1744 } | 1875 } |
1745 | 1876 |
1746 void AssemblerX86::jmp(const ConstantRelocatable *label) { | 1877 void AssemblerX86::jmp(const ConstantRelocatable *label) { |
1747 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1878 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1748 EmitUint8(0xE9); | 1879 EmitUint8(0xE9); |
1749 EmitFixup(DirectCallRelocation::create(this, FK_PcRel_4, label)); | 1880 EmitFixup(DirectCallRelocation::create(this, FK_PcRel_4, label)); |
1750 EmitInt32(-4); | 1881 EmitInt32(-4); |
1751 } | 1882 } |
1752 | 1883 |
| 1884 void AssemblerX86::mfence() { |
| 1885 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1886 EmitUint8(0x0F); |
| 1887 EmitUint8(0xAE); |
| 1888 EmitUint8(0xF0); |
| 1889 } |
| 1890 |
1753 void AssemblerX86::lock() { | 1891 void AssemblerX86::lock() { |
1754 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1892 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1755 EmitUint8(0xF0); | 1893 EmitUint8(0xF0); |
1756 } | 1894 } |
1757 | 1895 |
1758 void AssemblerX86::cmpxchg(Type Ty, const Address &address, GPRRegister reg) { | 1896 void AssemblerX86::cmpxchg(Type Ty, const Address &address, GPRRegister reg) { |
1759 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1897 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1760 if (Ty == IceType_i16) | 1898 if (Ty == IceType_i16) |
1761 EmitOperandSizeOverride(); | 1899 EmitOperandSizeOverride(); |
1762 EmitUint8(0x0F); | 1900 EmitUint8(0x0F); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1929 void AssemblerX86::EmitGenericShift(int rm, const Operand &operand, | 2067 void AssemblerX86::EmitGenericShift(int rm, const Operand &operand, |
1930 GPRRegister shifter) { | 2068 GPRRegister shifter) { |
1931 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2069 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1932 assert(shifter == RegX8632::Encoded_Reg_ecx); | 2070 assert(shifter == RegX8632::Encoded_Reg_ecx); |
1933 EmitUint8(0xD3); | 2071 EmitUint8(0xD3); |
1934 EmitOperand(rm, Operand(operand)); | 2072 EmitOperand(rm, Operand(operand)); |
1935 } | 2073 } |
1936 | 2074 |
1937 } // end of namespace x86 | 2075 } // end of namespace x86 |
1938 } // end of namespace Ice | 2076 } // end of namespace Ice |
OLD | NEW |