Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: src/mips/assembler-mips.h

Issue 1573983002: MIPS: Replace JR/JALR with JIC/JIALC for r6 (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/mips/assembler-mips.cc » ('j') | src/mips/assembler-mips.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // 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 505 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 // are split across two consecutive instructions and don't exist separately 516 // are split across two consecutive instructions and don't exist separately
517 // in the code, so the serializer should not step forwards in memory after 517 // in the code, so the serializer should not step forwards in memory after
518 // a target is resolved and written. 518 // a target is resolved and written.
519 static const int kSpecialTargetSize = 0; 519 static const int kSpecialTargetSize = 0;
520 520
521 // Number of consecutive instructions used to store 32bit constant. 521 // Number of consecutive instructions used to store 32bit constant.
522 // Before jump-optimizations, this constant was used in 522 // Before jump-optimizations, this constant was used in
523 // RelocInfo::target_address_address() function to tell serializer address of 523 // RelocInfo::target_address_address() function to tell serializer address of
524 // the instruction that follows LUI/ORI instruction pair. Now, with new jump 524 // the instruction that follows LUI/ORI instruction pair. Now, with new jump
525 // optimization, where jump-through-register instruction that usually 525 // optimization, where jump-through-register instruction that usually
526 // follows LUI/ORI pair is substituted with J/JAL, this constant equals 526 // follows LUI/ORI pair is substituted with J/JAL, this constant equals
paul.l... 2016/01/11 22:34:57 These comments about J/JAL should have been remove
miran.karic 2016/02/18 08:38:05 Done.
527 // to 3 instructions (LUI+ORI+J/JAL/JR/JALR). 527 // to 3 instructions (LUI+ORI+J/JAL/JR/JALR). On r6, 32bit constant is placed
528 // in 2 instructions (LUI+JIC)
529 #ifdef _MIPS_ARCH_MIPS32R6
530 static const int kInstructionsFor32BitConstant = 2;
531 #else
528 static const int kInstructionsFor32BitConstant = 3; 532 static const int kInstructionsFor32BitConstant = 3;
paul.l... 2016/01/11 22:34:57 I _think_ this case of 3 was only useful when we h
miran.karic 2016/02/18 08:38:05 Done. New CL created.
533 #endif
529 534
530 // Distance between the instruction referring to the address of the call 535 // Distance between the instruction referring to the address of the call
531 // target and the return address. 536 // target and the return address.
532 static const int kCallTargetAddressOffset = 4 * kInstrSize; 537 static const int kCallTargetAddressOffset = 4 * kInstrSize;
533 538
534 // Distance between start of patched debug break slot and the emitted address 539 // Distance between start of patched debug break slot and the emitted address
535 // to jump to. 540 // to jump to.
536 static const int kPatchDebugBreakSlotAddressOffset = 4 * kInstrSize; 541 static const int kPatchDebugBreakSlotAddressOffset = 4 * kInstrSize;
537 542
538 // Difference between address of current opcode and value read from pc 543 // Difference between address of current opcode and value read from pc
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
1079 // Check if an instruction is a branch of some kind. 1084 // Check if an instruction is a branch of some kind.
1080 static bool IsBranch(Instr instr); 1085 static bool IsBranch(Instr instr);
1081 static bool IsBc(Instr instr); 1086 static bool IsBc(Instr instr);
1082 static bool IsBzc(Instr instr); 1087 static bool IsBzc(Instr instr);
1083 static bool IsBeq(Instr instr); 1088 static bool IsBeq(Instr instr);
1084 static bool IsBne(Instr instr); 1089 static bool IsBne(Instr instr);
1085 static bool IsBeqzc(Instr instr); 1090 static bool IsBeqzc(Instr instr);
1086 static bool IsBnezc(Instr instr); 1091 static bool IsBnezc(Instr instr);
1087 static bool IsBeqc(Instr instr); 1092 static bool IsBeqc(Instr instr);
1088 static bool IsBnec(Instr instr); 1093 static bool IsBnec(Instr instr);
1094 static bool IsJicOrJialc(Instr instr);
1089 1095
1090 static bool IsJump(Instr instr); 1096 static bool IsJump(Instr instr);
1091 static bool IsJ(Instr instr); 1097 static bool IsJ(Instr instr);
1092 static bool IsLui(Instr instr); 1098 static bool IsLui(Instr instr);
1093 static bool IsOri(Instr instr); 1099 static bool IsOri(Instr instr);
1094 1100
1095 static bool IsJal(Instr instr); 1101 static bool IsJal(Instr instr);
1096 static bool IsJr(Instr instr); 1102 static bool IsJr(Instr instr);
1097 static bool IsJalr(Instr instr); 1103 static bool IsJalr(Instr instr);
1098 1104
(...skipping 19 matching lines...) Expand all
1118 static uint32_t GetSaField(Instr instr); 1124 static uint32_t GetSaField(Instr instr);
1119 static uint32_t GetOpcodeField(Instr instr); 1125 static uint32_t GetOpcodeField(Instr instr);
1120 static uint32_t GetFunction(Instr instr); 1126 static uint32_t GetFunction(Instr instr);
1121 static uint32_t GetFunctionField(Instr instr); 1127 static uint32_t GetFunctionField(Instr instr);
1122 static uint32_t GetImmediate16(Instr instr); 1128 static uint32_t GetImmediate16(Instr instr);
1123 static uint32_t GetLabelConst(Instr instr); 1129 static uint32_t GetLabelConst(Instr instr);
1124 1130
1125 static int32_t GetBranchOffset(Instr instr); 1131 static int32_t GetBranchOffset(Instr instr);
1126 static bool IsLw(Instr instr); 1132 static bool IsLw(Instr instr);
1127 static int16_t GetLwOffset(Instr instr); 1133 static int16_t GetLwOffset(Instr instr);
1134 static int16_t GetJicOrJialcOffset(Instr instr);
1135 static int16_t GetLuiOffset(Instr instr);
1128 static Instr SetLwOffset(Instr instr, int16_t offset); 1136 static Instr SetLwOffset(Instr instr, int16_t offset);
1129 1137
1130 static bool IsSw(Instr instr); 1138 static bool IsSw(Instr instr);
1131 static Instr SetSwOffset(Instr instr, int16_t offset); 1139 static Instr SetSwOffset(Instr instr, int16_t offset);
1132 static bool IsAddImmediate(Instr instr); 1140 static bool IsAddImmediate(Instr instr);
1133 static Instr SetAddImmediateOffset(Instr instr, int16_t offset); 1141 static Instr SetAddImmediateOffset(Instr instr, int16_t offset);
1142 static uint32_t createTargetAddress(Instr instr_lui, Instr instr_jic);
1143 static void unpackTargetAddress(uint32_t address, int16_t& lui_offset,
1144 int16_t& jic_offset);
1145 static void unpackTargetAddressUnsigned(uint32_t address,
1146 uint32_t& lui_offset,
1147 uint32_t& jic_offset);
1134 1148
1135 static bool IsAndImmediate(Instr instr); 1149 static bool IsAndImmediate(Instr instr);
1136 static bool IsEmittedConstant(Instr instr); 1150 static bool IsEmittedConstant(Instr instr);
1137 1151
1138 void CheckTrampolinePool(); 1152 void CheckTrampolinePool();
1139 1153
1140 void PatchConstantPoolAccessInstruction(int pc_offset, int offset, 1154 void PatchConstantPoolAccessInstruction(int pc_offset, int offset,
1141 ConstantPoolEntry::Access access, 1155 ConstantPoolEntry::Access access,
1142 ConstantPoolEntry::Type type) { 1156 ConstantPoolEntry::Type type) {
1143 // No embedded constant pool support. 1157 // No embedded constant pool support.
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 DCHECK(block_buffer_growth_); 1218 DCHECK(block_buffer_growth_);
1205 block_buffer_growth_ = false; 1219 block_buffer_growth_ = false;
1206 } 1220 }
1207 1221
1208 bool is_buffer_growth_blocked() const { 1222 bool is_buffer_growth_blocked() const {
1209 return block_buffer_growth_; 1223 return block_buffer_growth_;
1210 } 1224 }
1211 1225
1212 inline void CheckTrampolinePoolQuick(int extra_instructions = 0); 1226 inline void CheckTrampolinePoolQuick(int extra_instructions = 0);
1213 1227
1228 inline void CheckBuffer();
1229
1214 private: 1230 private:
1215 inline static void set_target_internal_reference_encoded_at(Address pc, 1231 inline static void set_target_internal_reference_encoded_at(Address pc,
1216 Address target); 1232 Address target);
1217 1233
1218 // Buffer size and constant pool distance are checked together at regular 1234 // Buffer size and constant pool distance are checked together at regular
1219 // intervals of kBufferCheckInterval emitted bytes. 1235 // intervals of kBufferCheckInterval emitted bytes.
1220 static const int kBufferCheckInterval = 1*KB/2; 1236 static const int kBufferCheckInterval = 1*KB/2;
1221 1237
1222 // Code generation. 1238 // Code generation.
1223 // The relocation writer's position is at least kGap bytes below the end of 1239 // The relocation writer's position is at least kGap bytes below the end of
(...skipping 26 matching lines...) Expand all
1250 static const int kMaxRelocSize = RelocInfoWriter::kMaxSize; 1266 static const int kMaxRelocSize = RelocInfoWriter::kMaxSize;
1251 RelocInfoWriter reloc_info_writer; 1267 RelocInfoWriter reloc_info_writer;
1252 1268
1253 // The bound position, before this we cannot do instruction elimination. 1269 // The bound position, before this we cannot do instruction elimination.
1254 int last_bound_pos_; 1270 int last_bound_pos_;
1255 1271
1256 // Readable constants for compact branch handling in emit() 1272 // Readable constants for compact branch handling in emit()
1257 enum class CompactBranchType : bool { NO = false, COMPACT_BRANCH = true }; 1273 enum class CompactBranchType : bool { NO = false, COMPACT_BRANCH = true };
1258 1274
1259 // Code emission. 1275 // Code emission.
1260 inline void CheckBuffer();
1261 void GrowBuffer(); 1276 void GrowBuffer();
1262 inline void emit(Instr x, 1277 inline void emit(Instr x,
1263 CompactBranchType is_compact_branch = CompactBranchType::NO); 1278 CompactBranchType is_compact_branch = CompactBranchType::NO);
1264 1279
1265 // Instruction generation. 1280 // Instruction generation.
1266 // We have 3 different kind of encoding layout on MIPS. 1281 // We have 3 different kind of encoding layout on MIPS.
1267 // However due to many different types of objects encoded in the same fields 1282 // However due to many different types of objects encoded in the same fields
1268 // we have quite a few aliases for each mode. 1283 // we have quite a few aliases for each mode.
1269 // Using the same structure to refer to Register and FPURegister would spare a 1284 // Using the same structure to refer to Register and FPURegister would spare a
1270 // few aliases, but mixing both does not look clean to me. 1285 // few aliases, but mixing both does not look clean to me.
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1392 }; 1407 };
1393 1408
1394 int32_t get_trampoline_entry(int32_t pos); 1409 int32_t get_trampoline_entry(int32_t pos);
1395 int unbound_labels_count_; 1410 int unbound_labels_count_;
1396 // If trampoline is emitted, generated code is becoming large. As this is 1411 // If trampoline is emitted, generated code is becoming large. As this is
1397 // already a slow case which can possibly break our code generation for the 1412 // already a slow case which can possibly break our code generation for the
1398 // extreme case, we use this information to trigger different mode of 1413 // extreme case, we use this information to trigger different mode of
1399 // branch instruction generation, where we use jump instructions rather 1414 // branch instruction generation, where we use jump instructions rather
1400 // than regular branch instructions. 1415 // than regular branch instructions.
1401 bool trampoline_emitted_; 1416 bool trampoline_emitted_;
1417 #ifdef _MIPS_ARCH_MIPS32R6
1418 static const int kTrampolineSlotsSize = 2 * kInstrSize;
1419 #else
1402 static const int kTrampolineSlotsSize = 4 * kInstrSize; 1420 static const int kTrampolineSlotsSize = 4 * kInstrSize;
1421 #endif
1403 static const int kMaxBranchOffset = (1 << (18 - 1)) - 1; 1422 static const int kMaxBranchOffset = (1 << (18 - 1)) - 1;
1404 static const int kMaxCompactBranchOffset = (1 << (28 - 1)) - 1; 1423 static const int kMaxCompactBranchOffset = (1 << (28 - 1)) - 1;
1405 static const int kInvalidSlotPos = -1; 1424 static const int kInvalidSlotPos = -1;
1406 1425
1407 // Internal reference positions, required for unbounded internal reference 1426 // Internal reference positions, required for unbounded internal reference
1408 // labels. 1427 // labels.
1409 std::set<int> internal_reference_positions_; 1428 std::set<int> internal_reference_positions_;
1410 1429
1411 void EmittedCompactBranchInstruction() { prev_instr_compact_branch_ = true; } 1430 void EmittedCompactBranchInstruction() { prev_instr_compact_branch_ = true; }
1412 void ClearCompactBranchState() { prev_instr_compact_branch_ = false; } 1431 void ClearCompactBranchState() { prev_instr_compact_branch_ = false; }
(...skipping 17 matching lines...) Expand all
1430 public: 1449 public:
1431 explicit EnsureSpace(Assembler* assembler) { 1450 explicit EnsureSpace(Assembler* assembler) {
1432 assembler->CheckBuffer(); 1451 assembler->CheckBuffer();
1433 } 1452 }
1434 }; 1453 };
1435 1454
1436 } // namespace internal 1455 } // namespace internal
1437 } // namespace v8 1456 } // namespace v8
1438 1457
1439 #endif // V8_ARM_ASSEMBLER_MIPS_H_ 1458 #endif // V8_ARM_ASSEMBLER_MIPS_H_
OLDNEW
« no previous file with comments | « no previous file | src/mips/assembler-mips.cc » ('j') | src/mips/assembler-mips.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698