28 #ifndef V8_MIPS_MACRO_ASSEMBLER_MIPS_H_
29 #define V8_MIPS_MACRO_ASSEMBLER_MIPS_H_
132 class MacroAssembler:
public Assembler {
141 #define COND_TYPED_ARGS Condition cond, Register r1, const Operand& r2
142 #define COND_ARGS cond, r1, r2
145 #define DECLARE_NORELOC_PROTOTYPE(Name, target_type) \
146 void Name(target_type target, BranchDelaySlot bd = PROTECT); \
147 inline void Name(BranchDelaySlot bd, target_type target) { \
150 void Name(target_type target, \
152 BranchDelaySlot bd = PROTECT); \
153 inline void Name(BranchDelaySlot bd, \
154 target_type target, \
156 Name(target, COND_ARGS, bd); \
159 #define DECLARE_BRANCH_PROTOTYPES(Name) \
160 DECLARE_NORELOC_PROTOTYPE(Name, Label*) \
161 DECLARE_NORELOC_PROTOTYPE(Name, int16_t)
166 #undef DECLARE_BRANCH_PROTOTYPES
167 #undef COND_TYPED_ARGS
172 #define COND_ARGS Condition cond = al, Register rs = zero_reg, \
173 const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
176 void Jump(intptr_t target, RelocInfo::Mode rmode,
COND_ARGS);
178 void Jump(Handle<Code> code, RelocInfo::Mode rmode,
COND_ARGS);
183 static int CallSize(Handle<Code> code,
184 RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
187 void Call(Handle<Code> code,
188 RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
193 Register rs = zero_reg,
const Operand& rt = Operand(zero_reg)) {
194 Ret(cond, rs, rt, bd);
210 const Operand& op = Operand(
no_reg));
225 void Call(Label* target);
284 if (object->IsHeapObject()) {
317 Label* condition_met);
324 InNewSpace(
object, scratch,
ne, branch);
332 InNewSpace(
object, scratch,
eq, branch);
357 Label* object_is_white_and_not_data);
363 Label* not_data_object);
397 remembered_set_action,
445 return IsNop(instr, type);
457 bool sllzz = (opcode ==
SLL &&
458 rt ==
static_cast<uint32_t
>(
ToNumber(zero_reg)) &&
459 rs == static_cast<uint32_t>(
ToNumber(zero_reg)));
549 #define DEFINE_INSTRUCTION(instr) \
550 void instr(Register rd, Register rs, const Operand& rt); \
551 void instr(Register rd, Register rs, Register rt) { \
552 instr(rd, rs, Operand(rt)); \
554 void instr(Register rs, Register rt, int32_t j) { \
555 instr(rs, rt, Operand(j)); \
558 #define DEFINE_INSTRUCTION2(instr) \
559 void instr(Register rs, const Operand& rt); \
560 void instr(Register rs, Register rt) { \
561 instr(rs, Operand(rt)); \
563 void instr(Register rs, int32_t j) { \
564 instr(rs, Operand(j)); \
587 #undef DEFINE_INSTRUCTION
588 #undef DEFINE_INSTRUCTION2
599 li(rd, Operand(j), mode);
603 li(dst, Operand(value), mode);
650 Branch(3, cond, tst1, Operand(tst2));
685 void Pop(uint32_t count = 1) {
741 BranchF(target, nan, cc, cmp1, cmp2, bd);
793 int stack_space = 0);
798 bool do_return =
false);
817 Label* no_map_match);
823 bool can_have_holes);
834 ExternalReference roots_array_start =
835 ExternalReference::roots_array_start(
isolate());
849 const ParameterCount& expected,
850 const ParameterCount& actual,
856 const ParameterCount& expected,
857 const ParameterCount& actual,
858 RelocInfo::Mode rmode,
865 const ParameterCount& actual,
871 const ParameterCount& actual,
890 #ifdef ENABLE_DEBUGGER_SUPPORT
945 bool miss_on_bound_function =
false);
990 Label* early_success,
999 Label* early_success,
1099 Branch(label,
lt, overflow_check, Operand(zero_reg), bd);
1105 Branch(label,
ge, overflow_check, Operand(zero_reg), bd);
1109 Ret(
lt, overflow_check, Operand(zero_reg), bd);
1113 Ret(
ge, overflow_check, Operand(zero_reg), bd);
1126 li(
s2, Operand(ref));
1133 const Operand&
r2 = Operand(zero_reg),
1166 int num_double_arguments);
1178 int num_double_registers,
1192 void CallCFunction(ExternalReference
function,
int num_arguments);
1195 int num_reg_arguments,
1196 int num_double_arguments);
1198 int num_reg_arguments,
1199 int num_double_arguments);
1241 return code_object_;
1268 void Abort(
const char* msg);
1288 Label* not_power_of_two_or_zero);
1294 Addu(reg, reg, reg);
1302 Addu(dst, src, src);
1329 Label* not_smi_label,
1348 const char* message);
1356 Label* on_not_heap_number);
1364 Register first_object_instance_type,
1365 Register second_object_instance_type,
1420 void CallCFunctionHelper(
Register function,
1421 int num_reg_arguments,
1422 int num_double_arguments);
1445 void InvokePrologue(
const ParameterCount& expected,
1446 const ParameterCount& actual,
1450 bool* definitely_mismatches,
1459 void InitializeNewString(
Register string,
1474 inline void GetMarkBits(
Register addr_reg,
1480 void JumpToHandlerEntry();
1483 static int SafepointRegisterStackIndex(
int reg_code);
1487 bool generating_stub_;
1488 bool allow_stub_calls_;
1531 #ifdef GENERATED_CODE_COVERAGE
1532 #define CODE_COVERAGE_STRINGIFY(x) #x
1533 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
1534 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1535 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm->
1537 #define ACCESS_MASM(masm) masm->
1542 #endif // V8_MIPS_MACRO_ASSEMBLER_MIPS_H_
void CallRuntime(const Runtime::Function *f, int num_arguments)
void ClampDoubleToUint8(Register result_reg, DoubleRegister input_reg, DoubleRegister temp_double_reg)
void Push(Handle< Object > handle)
void ClampUint8(Register output_reg, Register input_reg)
const int kCArgsSlotsSize
Isolate * isolate() const
void PushSafepointRegisters()
void FlushICache(Register address, unsigned instructions)
void Assert(Condition cond, const char *msg)
void Branch(Label *L, Condition cond, Register rs, Heap::RootListIndex index, BranchDelaySlot bdslot=PROTECT)
static int SlotOffset(int index)
void SmiUntag(Register reg)
void mtc1(Register rt, FPURegister fs)
void GetCFunctionDoubleResult(const DoubleRegister dst)
void SmiTag(Register dst, Register src)
void AllocateTwoByteSlicedString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void mov(Register rd, Register rt)
void IncrementalMarkingRecordWriteHelper(Register object, Register value, Register address)
void Push(Register src1, Register src2, Register src3, Register src4)
void JumpIfInNewSpace(Register object, Register scratch, Label *branch)
void LeaveExitFrame(bool save_doubles, Register argument_count)
void sw(Register rd, const MemOperand &rs)
void AdduAndCheckForOverflow(Register dst, Register left, Register right, Register overflow_dst, Register scratch=at)
void IsObjectJSStringType(Register object, Register scratch, Label *fail)
void mov_d(FPURegister fd, FPURegister fs)
void JumpToExternalReference(const ExternalReference &builtin)
void Pop(Register src1, Register src2, Register src3)
void Cvt_d_uw(FPURegister fd, FPURegister fs, FPURegister scratch)
void UntagAndJumpIfSmi(Register dst, Register src, Label *smi_case)
void LoadInstanceDescriptors(Register map, Register descriptors)
void AllocateAsciiString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void JumpIfNotBothSequentialAsciiStrings(Register first, Register second, Register scratch1, Register scratch2, Label *not_flat_ascii_strings)
void LoadFromNumberDictionary(Label *miss, Register elements, Register key, Register result, Register t0, Register t1, Register t2)
void SetCallCDoubleArguments(DoubleRegister dreg)
void or_(Register dst, int32_t imm32)
void SubuAndCheckForOverflow(Register dst, Register left, Register right, Register overflow_dst, Register scratch=at)
void GetBuiltinEntry(Register target, Builtins::JavaScript id)
void JumpIfSmi(Register value, Label *smi_label)
void DispatchMap(Register obj, Register scratch, Handle< Map > map, Handle< Code > success, SmiCheckType smi_check_type)
bool AllowThisStubCall(CodeStub *stub)
void JumpIfNotPowerOfTwoOrZero(Register reg, Register scratch, Label *not_power_of_two_or_zero)
void StoreToSafepointRegisterSlot(Register src, Register dst)
void PopSafepointRegistersAndDoubles()
void set_allow_stub_calls(bool value)
void CheckFastObjectElements(Register map, Register scratch, Label *fail)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
DEFINE_INSTRUCTION2(Mult)
void Swap(Register reg1, Register reg2, Register scratch=no_reg, Condition cond=al)
bool is(FPURegister creg) const
void MultiPopReversed(RegList regs)
bool AreAliased(Register r1, Register r2, Register r3, Register r4)
#define ASSERT(condition)
#define DECLARE_BRANCH_PROTOTYPES(Name)
void Pop(uint32_t count=1)
void RecordWriteField(Register object, int offset, Register value, Register scratch, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK)
void SmiTagCheckOverflow(Register reg, Register overflow)
void PushTryHandler(StackHandler::Kind kind, int handler_index)
void LoadTransitionedArrayMapConditional(ElementsKind expected_kind, ElementsKind transitioned_kind, Register map_in_out, Register scratch, Label *no_map_match)
void And(Register dst, Register src1, const Operand &src2, Condition cond=al)
static bool IsMarkedCode(Instr instr, int type)
void Ext(Register rt, Register rs, uint16_t pos, uint16_t size)
MemOperand GlobalObjectOperand()
void IncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void Move(FPURegister dst, Register src_low, Register src_high)
void Abort(const char *msg)
void RetOnOverflow(Register overflow_check, BranchDelaySlot bd=PROTECT)
void MarkCode(NopMarkerTypes type)
MemOperand ContextOperand(Register context, int index)
void CheckMap(Register obj, Register scratch, Handle< Map > map, Label *fail, SmiCheckType smi_check_type, CompareMapMode mode=REQUIRE_EXACT_MAP)
void RetOnNoOverflow(Register overflow_check, BranchDelaySlot bd=PROTECT)
void CopyFields(Register dst, Register src, RegList temps, int field_count)
void DecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void StoreToSafepointRegistersAndDoublesSlot(Register src, Register dst)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 instructions(ARM only)") DEFINE_bool(enable_armv7
void AllocateHeapNumber(Register result, Register scratch1, Register scratch2, Register heap_number_map, Label *gc_required)
void Movn(Register rd, Register rs, Register rt)
const Register kRootRegister
void Movz(Register rd, Register rs, Register rt)
void li(Register dst, Handle< Object > value, LiFlags mode=OPTIMIZE_SIZE)
void PrepareCEntryFunction(const ExternalReference &ref)
void MultiPush(RegList regs)
void JumpIfInstanceTypeIsNotSequentialAscii(Register type, Register scratch, Label *failure)
void SmiToDoubleFPURegister(Register smi, FPURegister value, Register scratch1)
void JumpIfNotHeapNumber(Register object, Register heap_number_map, Register scratch, Label *on_not_heap_number)
void PrepareCEntryArgs(int num_args)
void MultiPop(RegList regs)
void AssertRegisterIsRoot(Register reg, Heap::RootListIndex index)
void AbortIfNotRootValue(Register src, Heap::RootListIndex root_value_index, const char *message)
void JumpIfNotInNewSpace(Register object, Register scratch, Label *branch)
void IsObjectJSObjectType(Register heap_object, Register map, Register scratch, Label *fail)
void BranchOnNoOverflow(Label *label, Register overflow_check, BranchDelaySlot bd=PROTECT)
void sra(Register rt, Register rd, uint16_t sa)
static int ActivationFrameAlignment()
void lbu(Register rd, const MemOperand &rs)
void LeaveFrame(StackFrame::Type type)
void CheckFastElements(Register map, Register scratch, Label *fail)
void LoadGlobalFunction(int index, Register function)
void CheckPageFlag(Register object, Register scratch, int mask, Condition cc, Label *condition_met)
void TryGetFunctionPrototype(Register function, Register result, Register scratch, Label *miss, bool miss_on_bound_function=false)
void AbortIfNotSmi(Register object)
void ChangeBranchCondition(Condition cond)
void EmitECMATruncate(Register result, DwVfpRegister double_input, SwVfpRegister single_scratch, Register scratch, Register scratch2, Register scratch3)
void CallCFunction(ExternalReference function, int num_arguments)
void AllocateAsciiConsString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void IsInstanceJSObjectType(Register map, Register scratch, Label *fail)
void CheckFastSmiElements(Register map, Register scratch, Label *fail)
void Jump(Register target, Condition cond=al)
void RecordWrite(Register object, Register address, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK)
void JumpIfDataObject(Register value, Register scratch, Label *not_data_object)
void Push(Register src1, Register src2)
void CopyBytes(Register src, Register dst, Register length, Register scratch)
void LoadHeapObject(Register dst, Handle< HeapObject > object)
void Throw(Register value)
void Move(FPURegister dst, FPURegister src)
void ConvertToInt32(Register source, Register dest, Register scratch, Register scratch2, DwVfpRegister double_scratch, Label *not_int32)
void Move(Register dst, Handle< Object > value)
void DropAndRet(int drop)
void Ins(Register rt, Register rs, uint16_t pos, uint16_t size)
void Movt(Register rd, Register rs, uint16_t cc=0)
void set_has_frame(bool value)
void SetCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void AssertStackIsAligned()
void GetRelocatedValue(Register li_location, Register value, Register scratch)
void Floor_w_d(FPURegister fd, FPURegister fs)
void InvokeCode(Register code, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper, CallKind call_kind)
void SmiUntag(Register dst, Register src)
void GetLeastBitsFromInt32(Register dst, Register src, int mun_least_bits)
void Clz(Register rd, Register rs)
MacroAssembler(Isolate *isolate, void *buffer, int size)
const uint32_t kStringTag
void LoadContext(Register dst, int context_chain_length)
Condition IsObjectStringType(Register obj, Register type, Register result)
void CallExternalReference(const ExternalReference &ext, int num_arguments)
static int CallSize(Register target, Condition cond=al)
void StoreNumberToDoubleElements(Register value_reg, Register key_reg, Register receiver_reg, Register elements_reg, Register scratch1, Register scratch2, Register scratch3, Register scratch4, Label *fail)
void AssertFastElements(Register elements)
void GetLeastBitsFromSmi(Register dst, Register src, int num_least_bits)
void PushSafepointRegistersAndDoubles()
void JumpIfNotBothSmi(Register reg1, Register reg2, Label *on_not_both_smi)
void JumpIfBlack(Register object, Register scratch0, Register scratch1, Label *on_black)
void lw(Register rd, const MemOperand &rs)
void AllocateTwoByteConsString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void Pop(Register src1, Register src2)
static bool IsNop(Instr instr, int type=NON_MARKING_NOP)
void Drop(int count, Condition cond=al)
void GetBuiltinFunction(Register target, Builtins::JavaScript id)
void Movf(Register rd, Register rs, uint16_t cc=0)
void IllegalOperation(int num_arguments)
void ObjectToDoubleFPURegister(Register object, FPURegister value, Register scratch1, Register scratch2, Register heap_number_map, Label *not_number, ObjectToDoubleFlags flags=NO_OBJECT_TO_DOUBLE_FLAGS)
void CheckAccessGlobalProxy(Register holder_reg, Register scratch, Label *miss)
void CallApiFunctionAndReturn(ExternalReference function, int stack_space)
static const int kMapOffset
int ToNumber(Register reg)
bool is(Register reg) const
const uint32_t kIsNotStringMask
void LoadObject(Register result, Handle< Object > object)
void SmiTag(Register reg)
void li(Register rd, Operand j, LiFlags mode=OPTIMIZE_SIZE)
void CallRuntimeSaveDoubles(Runtime::FunctionId id)
void ThrowUncatchable(Register value)
void Trunc_uw_d(FPURegister fd, FPURegister fs, FPURegister scratch)
MemOperand CFunctionArgumentOperand(int index)
void StoreRoot(Register source, Heap::RootListIndex index, Condition cond=al)
void AllocateInNewSpace(int object_size, Register result, Register scratch1, Register scratch2, Label *gc_required, AllocationFlags flags)
MemOperand FieldMemOperand(Register object, int offset)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers, Register scratch)
void GetObjectType(Register function, Register map, Register type_reg)
void EmitOutOfInt32RangeTruncate(Register result, Register input_high, Register input_low, Register scratch)
void LoadGlobalFunctionInitialMap(Register function, Register map, Register scratch)
void GetNumberHash(Register t0, Register scratch)
void AbortIfNotString(Register object)
void InvokeFunction(Register function, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper, CallKind call_kind)
void CompareMapAndBranch(Register obj, Register scratch, Handle< Map > map, Label *early_success, Condition cond, Label *branch_to, CompareMapMode mode=REQUIRE_EXACT_MAP)
void MultiPopReversedFPU(RegList regs)
Handle< Object > CodeObject()
static int GetCodeMarker(Instr instr)
void li(Register rd, int32_t j, LiFlags mode=OPTIMIZE_SIZE)
void JumpIfNonSmisNotBothSequentialAsciiStrings(Register object1, Register object2, Register scratch1, Register scratch2, Label *failure)
void mfc1(Register rt, FPURegister fs)
void JumpIfBothInstanceTypesAreNotSequentialAscii(Register first_object_instance_type, Register second_object_instance_type, Register scratch1, Register scratch2, Label *failure)
kPropertyAccessorsOffset kNamedPropertyHandlerOffset kInstanceTemplateOffset kAccessCheckInfoOffset kEvalFrominstructionsOffsetOffset kThisPropertyAssignmentsOffset flag
void UndoAllocationInNewSpace(Register object, Register scratch)
void Ret(BranchDelaySlot bd, Condition cond=al, Register rs=zero_reg, const Operand &rt=Operand(zero_reg))
void LoadFromSafepointRegisterSlot(Register dst, Register src)
void Push(Register src, Condition cond, Register tst1, Register tst2)
#define ASSERT_EQ(v1, v2)
void Call(Register target, Condition cond=al)
void Trunc_w_d(FPURegister fd, FPURegister fs)
void AllocateAsciiSlicedString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void set_generating_stub(bool value)
void Check(Condition cond, const char *msg)
void MultiPushFPU(RegList regs)
void LoadInitialArrayMap(Register function_in, Register scratch, Register map_out, bool can_have_holes)
void JumpIfNotSmi(Register value, Label *not_smi_label)
void MultiPushReversedFPU(RegList regs)
void BranchF(BranchDelaySlot bd, Label *target, Label *nan, Condition cc, FPURegister cmp1, FPURegister cmp2)
void EmitFPUTruncate(FPURoundingMode rounding_mode, FPURegister result, DoubleRegister double_input, Register scratch1, Register except_flag, CheckForInexactConversion check_inexact=kDontCheckForInexactConversion)
void InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag, const CallWrapper &call_wrapper=NullCallWrapper())
CheckForInexactConversion
void TailCallStub(CodeStub *stub, Condition cond=al)
CodePatcher(byte *address, int instructions)
void UntagAndJumpIfNotSmi(Register dst, Register src, Label *non_smi_case)
void EnsureNotWhite(Register object, Register scratch1, Register scratch2, Register scratch3, Label *object_is_white_and_not_data)
void InitializeRootRegister()
int CalculateStackPassedWords(int num_reg_arguments, int num_double_arguments)
void CallJSExitStub(CodeStub *stub)
void JumpIfEitherSmi(Register reg1, Register reg2, Label *on_either_smi)
void PatchRelocatedValue(Register li_location, Register scratch, Register new_value)
void CallStub(CodeStub *stub, Condition cond=al)
static FPURegister from_code(int code)
void IndexFromHash(Register hash, Register index)
void Round_w_d(FPURegister fd, FPURegister fs)
void TailCallExternalReference(const ExternalReference &ext, int num_arguments, int result_size)
void EnterExitFrame(bool save_doubles, int stack_space=0)
void MultiPushReversed(RegList regs)
void InitializeFieldsWithFiller(Register start_offset, Register end_offset, Register filler)
void RecordWriteContextSlot(Register context, int offset, Register value, Register scratch, RAStatus ra_status, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK)
void TailCallRuntime(Runtime::FunctionId fid, int num_arguments, int result_size)
void SetCallKind(Register dst, CallKind kind)
void AllocateTwoByteString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void LoadRoot(Register destination, Heap::RootListIndex index, Condition cond=al)
void MultiPopFPU(RegList regs)
void RememberedSetHelper(Register object, Register addr, Register scratch, SaveFPRegsMode save_fp, RememberedSetFinalAction and_then)
void AbortIfSmi(Register object)
void Ceil_w_d(FPURegister fd, FPURegister fs)
void BranchF(Label *target, Label *nan, Condition cc, FPURegister cmp1, FPURegister cmp2, BranchDelaySlot bd=PROTECT)
void HasColor(Register object, Register scratch0, Register scratch1, Label *has_color, int first_bit, int second_bit)
void EnterFrame(StackFrame::Type type)
void BranchOnOverflow(Label *label, Register overflow_check, BranchDelaySlot bd=PROTECT)
void CheckEnumCache(Register null_value, Label *call_runtime)
static const int kInstanceTypeOffset
void PopSafepointRegisters()
void AllocateHeapNumberWithValue(Register result, DwVfpRegister value, Register scratch1, Register scratch2, Register heap_number_map, Label *gc_required)
void Move(Register dst_low, Register dst_high, FPURegister src)
void Move(Register dst, Register src)
void Push(Register src1, Register src2, Register src3)