| 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 |