| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
| 6 // are met: | 6 // are met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 1387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1398 emit(cond | B27 | B25 | (imm24 & kImm24Mask)); | 1398 emit(cond | B27 | B25 | (imm24 & kImm24Mask)); |
| 1399 | 1399 |
| 1400 if (cond == al) { | 1400 if (cond == al) { |
| 1401 // Dead code is a good location to emit the constant pool. | 1401 // Dead code is a good location to emit the constant pool. |
| 1402 CheckConstPool(false, false); | 1402 CheckConstPool(false, false); |
| 1403 } | 1403 } |
| 1404 } | 1404 } |
| 1405 | 1405 |
| 1406 | 1406 |
| 1407 void Assembler::bl(int branch_offset, Condition cond) { | 1407 void Assembler::bl(int branch_offset, Condition cond) { |
| 1408 positions_recorder()->WriteRecordedPositions(); | |
| 1409 DCHECK((branch_offset & 3) == 0); | 1408 DCHECK((branch_offset & 3) == 0); |
| 1410 int imm24 = branch_offset >> 2; | 1409 int imm24 = branch_offset >> 2; |
| 1411 CHECK(is_int24(imm24)); | 1410 CHECK(is_int24(imm24)); |
| 1412 emit(cond | B27 | B25 | B24 | (imm24 & kImm24Mask)); | 1411 emit(cond | B27 | B25 | B24 | (imm24 & kImm24Mask)); |
| 1413 } | 1412 } |
| 1414 | 1413 |
| 1415 | 1414 |
| 1416 void Assembler::blx(int branch_offset) { // v5 and above | 1415 void Assembler::blx(int branch_offset) { // v5 and above |
| 1417 positions_recorder()->WriteRecordedPositions(); | |
| 1418 DCHECK((branch_offset & 1) == 0); | 1416 DCHECK((branch_offset & 1) == 0); |
| 1419 int h = ((branch_offset & 2) >> 1)*B24; | 1417 int h = ((branch_offset & 2) >> 1)*B24; |
| 1420 int imm24 = branch_offset >> 2; | 1418 int imm24 = branch_offset >> 2; |
| 1421 CHECK(is_int24(imm24)); | 1419 CHECK(is_int24(imm24)); |
| 1422 emit(kSpecialCondition | B27 | B25 | h | (imm24 & kImm24Mask)); | 1420 emit(kSpecialCondition | B27 | B25 | h | (imm24 & kImm24Mask)); |
| 1423 } | 1421 } |
| 1424 | 1422 |
| 1425 | 1423 |
| 1426 void Assembler::blx(Register target, Condition cond) { // v5 and above | 1424 void Assembler::blx(Register target, Condition cond) { // v5 and above |
| 1427 positions_recorder()->WriteRecordedPositions(); | |
| 1428 DCHECK(!target.is(pc)); | 1425 DCHECK(!target.is(pc)); |
| 1429 emit(cond | B24 | B21 | 15*B16 | 15*B12 | 15*B8 | BLX | target.code()); | 1426 emit(cond | B24 | B21 | 15*B16 | 15*B12 | 15*B8 | BLX | target.code()); |
| 1430 } | 1427 } |
| 1431 | 1428 |
| 1432 | 1429 |
| 1433 void Assembler::bx(Register target, Condition cond) { // v5 and above, plus v4t | 1430 void Assembler::bx(Register target, Condition cond) { // v5 and above, plus v4t |
| 1434 positions_recorder()->WriteRecordedPositions(); | |
| 1435 DCHECK(!target.is(pc)); // use of pc is actually allowed, but discouraged | 1431 DCHECK(!target.is(pc)); // use of pc is actually allowed, but discouraged |
| 1436 emit(cond | B24 | B21 | 15*B16 | 15*B12 | 15*B8 | BX | target.code()); | 1432 emit(cond | B24 | B21 | 15*B16 | 15*B12 | 15*B8 | BX | target.code()); |
| 1437 } | 1433 } |
| 1438 | 1434 |
| 1439 | 1435 |
| 1440 void Assembler::b(Label* L, Condition cond) { | 1436 void Assembler::b(Label* L, Condition cond) { |
| 1441 CheckBuffer(); | 1437 CheckBuffer(); |
| 1442 b(branch_offset(L), cond); | 1438 b(branch_offset(L), cond); |
| 1443 } | 1439 } |
| 1444 | 1440 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1532 } | 1528 } |
| 1533 | 1529 |
| 1534 | 1530 |
| 1535 void Assembler::orr(Register dst, Register src1, const Operand& src2, | 1531 void Assembler::orr(Register dst, Register src1, const Operand& src2, |
| 1536 SBit s, Condition cond) { | 1532 SBit s, Condition cond) { |
| 1537 addrmod1(cond | ORR | s, src1, dst, src2); | 1533 addrmod1(cond | ORR | s, src1, dst, src2); |
| 1538 } | 1534 } |
| 1539 | 1535 |
| 1540 | 1536 |
| 1541 void Assembler::mov(Register dst, const Operand& src, SBit s, Condition cond) { | 1537 void Assembler::mov(Register dst, const Operand& src, SBit s, Condition cond) { |
| 1542 if (dst.is(pc)) { | |
| 1543 positions_recorder()->WriteRecordedPositions(); | |
| 1544 } | |
| 1545 // Don't allow nop instructions in the form mov rn, rn to be generated using | 1538 // Don't allow nop instructions in the form mov rn, rn to be generated using |
| 1546 // the mov instruction. They must be generated using nop(int/NopMarkerTypes) | 1539 // the mov instruction. They must be generated using nop(int/NopMarkerTypes) |
| 1547 // or MarkCode(int/NopMarkerTypes) pseudo instructions. | 1540 // or MarkCode(int/NopMarkerTypes) pseudo instructions. |
| 1548 DCHECK(!(src.is_reg() && src.rm().is(dst) && s == LeaveCC && cond == al)); | 1541 DCHECK(!(src.is_reg() && src.rm().is(dst) && s == LeaveCC && cond == al)); |
| 1549 addrmod1(cond | MOV | s, r0, dst, src); | 1542 addrmod1(cond | MOV | s, r0, dst, src); |
| 1550 } | 1543 } |
| 1551 | 1544 |
| 1552 | 1545 |
| 1553 void Assembler::mov_label_offset(Register dst, Label* label) { | 1546 void Assembler::mov_label_offset(Register dst, Label* label) { |
| 1554 if (label->is_bound()) { | 1547 if (label->is_bound()) { |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2023 } else { | 2016 } else { |
| 2024 DCHECK(!src.rs_.is_valid() && src.shift_imm_ == 0); // only rm allowed | 2017 DCHECK(!src.rs_.is_valid() && src.shift_imm_ == 0); // only rm allowed |
| 2025 instr = src.rm_.code(); | 2018 instr = src.rm_.code(); |
| 2026 } | 2019 } |
| 2027 emit(cond | instr | B24 | B21 | fields | 15*B12); | 2020 emit(cond | instr | B24 | B21 | fields | 15*B12); |
| 2028 } | 2021 } |
| 2029 | 2022 |
| 2030 | 2023 |
| 2031 // Load/Store instructions. | 2024 // Load/Store instructions. |
| 2032 void Assembler::ldr(Register dst, const MemOperand& src, Condition cond) { | 2025 void Assembler::ldr(Register dst, const MemOperand& src, Condition cond) { |
| 2033 if (dst.is(pc)) { | |
| 2034 positions_recorder()->WriteRecordedPositions(); | |
| 2035 } | |
| 2036 addrmod2(cond | B26 | L, dst, src); | 2026 addrmod2(cond | B26 | L, dst, src); |
| 2037 } | 2027 } |
| 2038 | 2028 |
| 2039 | 2029 |
| 2040 void Assembler::str(Register src, const MemOperand& dst, Condition cond) { | 2030 void Assembler::str(Register src, const MemOperand& dst, Condition cond) { |
| 2041 addrmod2(cond | B26, src, dst); | 2031 addrmod2(cond | B26, src, dst); |
| 2042 } | 2032 } |
| 2043 | 2033 |
| 2044 | 2034 |
| 2045 void Assembler::ldrb(Register dst, const MemOperand& src, Condition cond) { | 2035 void Assembler::ldrb(Register dst, const MemOperand& src, Condition cond) { |
| (...skipping 2245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4291 DCHECK(is_uint12(offset)); | 4281 DCHECK(is_uint12(offset)); |
| 4292 instr_at_put(pc, SetLdrRegisterImmediateOffset(instr, offset)); | 4282 instr_at_put(pc, SetLdrRegisterImmediateOffset(instr, offset)); |
| 4293 } | 4283 } |
| 4294 } | 4284 } |
| 4295 | 4285 |
| 4296 | 4286 |
| 4297 } // namespace internal | 4287 } // namespace internal |
| 4298 } // namespace v8 | 4288 } // namespace v8 |
| 4299 | 4289 |
| 4300 #endif // V8_TARGET_ARCH_ARM | 4290 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |