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 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1206 WriteRecordedPositions(); | 1206 WriteRecordedPositions(); |
1207 } | 1207 } |
1208 addrmod2(cond | B26 | L, dst, src); | 1208 addrmod2(cond | B26 | L, dst, src); |
1209 | 1209 |
1210 // Eliminate pattern: push(ry), pop(rx) | 1210 // Eliminate pattern: push(ry), pop(rx) |
1211 // str(ry, MemOperand(sp, 4, NegPreIndex), al) | 1211 // str(ry, MemOperand(sp, 4, NegPreIndex), al) |
1212 // ldr(rx, MemOperand(sp, 4, PostIndex), al) | 1212 // ldr(rx, MemOperand(sp, 4, PostIndex), al) |
1213 // Both instructions can be eliminated if ry = rx. | 1213 // Both instructions can be eliminated if ry = rx. |
1214 // If ry != rx, a register copy from ry to rx is inserted | 1214 // If ry != rx, a register copy from ry to rx is inserted |
1215 // after eliminating the push and the pop instructions. | 1215 // after eliminating the push and the pop instructions. |
1216 Instr push_instr = instr_at(pc_ - 2 * kInstrSize); | 1216 if (can_peephole_optimize(2)) { |
1217 Instr pop_instr = instr_at(pc_ - 1 * kInstrSize); | 1217 Instr push_instr = instr_at(pc_ - 2 * kInstrSize); |
| 1218 Instr pop_instr = instr_at(pc_ - 1 * kInstrSize); |
1218 | 1219 |
1219 if (can_peephole_optimize(2) && | 1220 if (IsPush(push_instr) && IsPop(pop_instr)) { |
1220 IsPush(push_instr) && | 1221 if ((pop_instr & kRdMask) != (push_instr & kRdMask)) { |
1221 IsPop(pop_instr)) { | 1222 // For consecutive push and pop on different registers, |
1222 if ((pop_instr & kRdMask) != (push_instr & kRdMask)) { | 1223 // we delete both the push & pop and insert a register move. |
1223 // For consecutive push and pop on different registers, | 1224 // push ry, pop rx --> mov rx, ry |
1224 // we delete both the push & pop and insert a register move. | 1225 Register reg_pushed, reg_popped; |
1225 // push ry, pop rx --> mov rx, ry | 1226 reg_pushed = GetRd(push_instr); |
1226 Register reg_pushed, reg_popped; | 1227 reg_popped = GetRd(pop_instr); |
1227 reg_pushed = GetRd(push_instr); | 1228 pc_ -= 2 * kInstrSize; |
1228 reg_popped = GetRd(pop_instr); | 1229 // Insert a mov instruction, which is better than a pair of push & pop |
1229 pc_ -= 2 * kInstrSize; | 1230 mov(reg_popped, reg_pushed); |
1230 // Insert a mov instruction, which is better than a pair of push & pop | 1231 if (FLAG_print_peephole_optimization) { |
1231 mov(reg_popped, reg_pushed); | 1232 PrintF("%x push/pop (diff reg) replaced by a reg move\n", |
1232 if (FLAG_print_peephole_optimization) { | 1233 pc_offset()); |
1233 PrintF("%x push/pop (diff reg) replaced by a reg move\n", pc_offset()); | 1234 } |
1234 } | 1235 } else { |
1235 } else { | 1236 // For consecutive push and pop on the same register, |
1236 // For consecutive push and pop on the same register, | 1237 // both the push and the pop can be deleted. |
1237 // both the push and the pop can be deleted. | 1238 pc_ -= 2 * kInstrSize; |
1238 pc_ -= 2 * kInstrSize; | 1239 if (FLAG_print_peephole_optimization) { |
1239 if (FLAG_print_peephole_optimization) { | 1240 PrintF("%x push/pop (same reg) eliminated\n", pc_offset()); |
1240 PrintF("%x push/pop (same reg) eliminated\n", pc_offset()); | 1241 } |
1241 } | 1242 } |
1242 } | 1243 } |
1243 } | 1244 } |
1244 | 1245 |
1245 if (can_peephole_optimize(2)) { | 1246 if (can_peephole_optimize(2)) { |
1246 Instr str_instr = instr_at(pc_ - 2 * kInstrSize); | 1247 Instr str_instr = instr_at(pc_ - 2 * kInstrSize); |
1247 Instr ldr_instr = instr_at(pc_ - 1 * kInstrSize); | 1248 Instr ldr_instr = instr_at(pc_ - 1 * kInstrSize); |
1248 | 1249 |
1249 if ((IsStrRegFpOffset(str_instr) && | 1250 if ((IsStrRegFpOffset(str_instr) && |
1250 IsLdrRegFpOffset(ldr_instr)) || | 1251 IsLdrRegFpOffset(ldr_instr)) || |
(...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2269 | 2270 |
2270 // Since a constant pool was just emitted, move the check offset forward by | 2271 // Since a constant pool was just emitted, move the check offset forward by |
2271 // the standard interval. | 2272 // the standard interval. |
2272 next_buffer_check_ = pc_offset() + kCheckConstInterval; | 2273 next_buffer_check_ = pc_offset() + kCheckConstInterval; |
2273 } | 2274 } |
2274 | 2275 |
2275 | 2276 |
2276 } } // namespace v8::internal | 2277 } } // namespace v8::internal |
2277 | 2278 |
2278 #endif // V8_TARGET_ARCH_ARM | 2279 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |