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

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

Issue 6966031: MIPS: Update for 23-May commits, and a few older ones. (Closed)
Patch Set: Created 9 years, 7 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
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 void DropAndRet(int drop = 0, 200 void DropAndRet(int drop = 0,
201 Condition cond = cc_always, 201 Condition cond = cc_always,
202 Register reg = no_reg, 202 Register reg = no_reg,
203 const Operand& op = Operand(no_reg)); 203 const Operand& op = Operand(no_reg));
204 204
205 // Swap two registers. If the scratch register is omitted then a slightly 205 // Swap two registers. If the scratch register is omitted then a slightly
206 // less efficient form using xor instead of mov is emitted. 206 // less efficient form using xor instead of mov is emitted.
207 void Swap(Register reg1, Register reg2, Register scratch = no_reg); 207 void Swap(Register reg1, Register reg2, Register scratch = no_reg);
208 208
209 void Call(Label* target); 209 void Call(Label* target);
210 // May do nothing if the registers are identical.
211 void Move(Register dst, Register src);
212 210
211 inline void Move(Register dst, Register src) {
212 if (!dst.is(src)) {
Søren Thygesen Gjesse 2011/05/24 07:21:00 Indentation.
213 mov(dst, src);
214 }
215 }
216
217 inline void Move(FPURegister dst, FPURegister src) {
218 if (!dst.is(src)) {
219 mov_d(dst, src);
220 }
221 }
222
223 inline void Move(Register dst_low, Register dst_high, FPURegister src) {
224 mfc1(dst_low, src);
225 mfc1(dst_high, FPURegister::from_code(src.code() + 1));
226 }
227
228 inline void Move(FPURegister dst, Register src_low, Register src_high) {
229 mtc1(src_low, dst);
230 mtc1(src_high, FPURegister::from_code(dst.code() + 1));
231 }
213 232
214 // Jump unconditionally to given label. 233 // Jump unconditionally to given label.
215 // We NEED a nop in the branch delay slot, as it used by v8, for example in 234 // We NEED a nop in the branch delay slot, as it used by v8, for example in
216 // CodeGenerator::ProcessDeferred(). 235 // CodeGenerator::ProcessDeferred().
217 // Currently the branch delay slot is filled by the MacroAssembler. 236 // Currently the branch delay slot is filled by the MacroAssembler.
218 // Use rather b(Label) for code generation. 237 // Use rather b(Label) for code generation.
219 void jmp(Label* L) { 238 void jmp(Label* L) {
220 Branch(L); 239 Branch(L);
221 } 240 }
222 241
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 ASSERT(!src1.is(src2)); 521 ASSERT(!src1.is(src2));
503 lw(src2, MemOperand(sp, 0 * kPointerSize)); 522 lw(src2, MemOperand(sp, 0 * kPointerSize));
504 lw(src1, MemOperand(sp, 1 * kPointerSize)); 523 lw(src1, MemOperand(sp, 1 * kPointerSize));
505 Addu(sp, sp, 2 * kPointerSize); 524 Addu(sp, sp, 2 * kPointerSize);
506 } 525 }
507 526
508 void Pop(uint32_t count = 1) { 527 void Pop(uint32_t count = 1) {
509 Addu(sp, sp, Operand(count * kPointerSize)); 528 Addu(sp, sp, Operand(count * kPointerSize));
510 } 529 }
511 530
512 // ---------------------------------------------------------------------------
513 // These functions are only used by crankshaft, so they are currently
514 // unimplemented.
515
516 // Push and pop the registers that can hold pointers, as defined by the 531 // Push and pop the registers that can hold pointers, as defined by the
517 // RegList constant kSafepointSavedRegisters. 532 // RegList constant kSafepointSavedRegisters.
518 void PushSafepointRegisters() { 533 void PushSafepointRegisters();
519 UNIMPLEMENTED_MIPS(); 534 void PopSafepointRegisters();
520 } 535 void PushSafepointRegistersAndDoubles();
521 536 void PopSafepointRegistersAndDoubles();
522 void PopSafepointRegisters() { 537 // Store value in register src in the safepoint stack slot for
523 UNIMPLEMENTED_MIPS(); 538 // register dst.
524 } 539 void StoreToSafepointRegisterSlot(Register src, Register dst);
525 540 void StoreToSafepointRegistersAndDoublesSlot(Register src, Register dst);
526 void PushSafepointRegistersAndDoubles() { 541 // Load the value of the src register from its safepoint stack slot
527 UNIMPLEMENTED_MIPS(); 542 // into register dst.
528 } 543 void LoadFromSafepointRegisterSlot(Register dst, Register src);
529
530 void PopSafepointRegistersAndDoubles() {
531 UNIMPLEMENTED_MIPS();
532 }
533
534 static int SafepointRegisterStackIndex(int reg_code) {
535 UNIMPLEMENTED_MIPS();
536 return 0;
537 }
538
539 // ---------------------------------------------------------------------------
540 544
541 // MIPS32 R2 instruction macro. 545 // MIPS32 R2 instruction macro.
542 void Ins(Register rt, Register rs, uint16_t pos, uint16_t size); 546 void Ins(Register rt, Register rs, uint16_t pos, uint16_t size);
543 void Ext(Register rt, Register rs, uint16_t pos, uint16_t size); 547 void Ext(Register rt, Register rs, uint16_t pos, uint16_t size);
544 548
545 // Convert unsigned word to double. 549 // Convert unsigned word to double.
546 void Cvt_d_uw(FPURegister fd, FPURegister fs); 550 void Cvt_d_uw(FPURegister fd, FPURegister fs);
547 void Cvt_d_uw(FPURegister fd, Register rs); 551 void Cvt_d_uw(FPURegister fd, Register rs);
548 552
549 // Convert double to unsigned word. 553 // Convert double to unsigned word.
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 878
875 // Calls a C function and cleans up the space for arguments allocated 879 // Calls a C function and cleans up the space for arguments allocated
876 // by PrepareCallCFunction. The called function is not allowed to trigger a 880 // by PrepareCallCFunction. The called function is not allowed to trigger a
877 // garbage collection, since that might move the code and invalidate the 881 // garbage collection, since that might move the code and invalidate the
878 // return address (unless this is somehow accounted for by the called 882 // return address (unless this is somehow accounted for by the called
879 // function). 883 // function).
880 void CallCFunction(ExternalReference function, int num_arguments); 884 void CallCFunction(ExternalReference function, int num_arguments);
881 void CallCFunction(Register function, Register scratch, int num_arguments); 885 void CallCFunction(Register function, Register scratch, int num_arguments);
882 void GetCFunctionDoubleResult(const DoubleRegister dst); 886 void GetCFunctionDoubleResult(const DoubleRegister dst);
883 887
888 // There are two ways of passing double arguments on MIPS, depending on
889 // whether soft or hard floating point ABI is used. These functions
890 // abstract parameter passing for the three different ways we call
891 // C functions from generated code.
892 void SetCallCDoubleArguments(DoubleRegister dreg);
893 void SetCallCDoubleArguments(DoubleRegister dreg1, DoubleRegister dreg2);
894 void SetCallCDoubleArguments(DoubleRegister dreg, Register reg);
895
884 // Calls an API function. Allocates HandleScope, extracts returned value 896 // Calls an API function. Allocates HandleScope, extracts returned value
885 // from handle and propagates exceptions. Restores context. 897 // from handle and propagates exceptions. Restores context.
886 MaybeObject* TryCallApiFunctionAndReturn(ExternalReference function, 898 MaybeObject* TryCallApiFunctionAndReturn(ExternalReference function,
887 int stack_space); 899 int stack_space);
888 900
889 // Jump to the builtin routine. 901 // Jump to the builtin routine.
890 void JumpToExternalReference(const ExternalReference& builtin); 902 void JumpToExternalReference(const ExternalReference& builtin);
891 903
892 MaybeObject* TryJumpToExternalReference(const ExternalReference& ext); 904 MaybeObject* TryJumpToExternalReference(const ExternalReference& ext);
893 905
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1053 Label* failure); 1065 Label* failure);
1054 1066
1055 // Test that both first and second are sequential ASCII strings. 1067 // Test that both first and second are sequential ASCII strings.
1056 // Check that they are non-smis. 1068 // Check that they are non-smis.
1057 void JumpIfNotBothSequentialAsciiStrings(Register first, 1069 void JumpIfNotBothSequentialAsciiStrings(Register first,
1058 Register second, 1070 Register second,
1059 Register scratch1, 1071 Register scratch1,
1060 Register scratch2, 1072 Register scratch2,
1061 Label* failure); 1073 Label* failure);
1062 1074
1075 void LoadInstanceDescriptors(Register map, Register descriptors);
1076
1063 private: 1077 private:
1064 void CallCFunctionHelper(Register function, 1078 void CallCFunctionHelper(Register function,
1065 ExternalReference function_reference, 1079 ExternalReference function_reference,
1066 Register scratch, 1080 Register scratch,
1067 int num_arguments); 1081 int num_arguments);
1068 1082
1069 void Jump(intptr_t target, RelocInfo::Mode rmode, 1083 void Jump(intptr_t target, RelocInfo::Mode rmode,
1070 BranchDelaySlot bd = PROTECT); 1084 BranchDelaySlot bd = PROTECT);
1071 void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = cc_always, 1085 void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = cc_always,
1072 Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg), 1086 Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg),
(...skipping 20 matching lines...) Expand all
1093 // Activation support. 1107 // Activation support.
1094 void EnterFrame(StackFrame::Type type); 1108 void EnterFrame(StackFrame::Type type);
1095 void LeaveFrame(StackFrame::Type type); 1109 void LeaveFrame(StackFrame::Type type);
1096 1110
1097 void InitializeNewString(Register string, 1111 void InitializeNewString(Register string,
1098 Register length, 1112 Register length,
1099 Heap::RootListIndex map_index, 1113 Heap::RootListIndex map_index,
1100 Register scratch1, 1114 Register scratch1,
1101 Register scratch2); 1115 Register scratch2);
1102 1116
1117 // Compute memory operands for safepoint stack slots.
1118 static int SafepointRegisterStackIndex(int reg_code);
1119 MemOperand SafepointRegisterSlot(Register reg);
1120 MemOperand SafepointRegistersAndDoublesSlot(Register reg);
1103 1121
1104 bool generating_stub_; 1122 bool generating_stub_;
1105 bool allow_stub_calls_; 1123 bool allow_stub_calls_;
1106 // This handle will be patched with the code object on installation. 1124 // This handle will be patched with the code object on installation.
1107 Handle<Object> code_object_; 1125 Handle<Object> code_object_;
1126
1127 // Needs access to SafepointRegisterStackIndex for optimized frame
1128 // traversal.
1129 friend class OptimizedFrame;
1108 }; 1130 };
1109 1131
1110 1132
1111 // The code patcher is used to patch (typically) small parts of code e.g. for 1133 // The code patcher is used to patch (typically) small parts of code e.g. for
1112 // debugging and other types of instrumentation. When using the code patcher 1134 // debugging and other types of instrumentation. When using the code patcher
1113 // the exact number of bytes specified must be emitted. It is not legal to emit 1135 // the exact number of bytes specified must be emitted. It is not legal to emit
1114 // relocation information. If any of these constraints are violated it causes 1136 // relocation information. If any of these constraints are violated it causes
1115 // an assertion to fail. 1137 // an assertion to fail.
1116 class CodePatcher { 1138 class CodePatcher {
1117 public: 1139 public:
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1175 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) 1197 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1176 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> 1198 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm->
1177 #else 1199 #else
1178 #define ACCESS_MASM(masm) masm-> 1200 #define ACCESS_MASM(masm) masm->
1179 #endif 1201 #endif
1180 1202
1181 } } // namespace v8::internal 1203 } } // namespace v8::internal
1182 1204
1183 #endif // V8_MIPS_MACRO_ASSEMBLER_MIPS_H_ 1205 #endif // V8_MIPS_MACRO_ASSEMBLER_MIPS_H_
1184 1206
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698