20829N/Adiff --git a/js/src/nanojit/NativeSparc.h b/js/src/nanojit/NativeSparc.h
20829N/Aindex 2a69caa..462ffc8 100644
20829N/A--- a/js/src/nanojit/NativeSparc.h
20829N/A+++ b/js/src/nanojit/NativeSparc.h
20829N/A@@ -71,7 +71,7 @@
20829N/A {
20829N/A const int NJ_MAX_REGISTERS = 30; // L0 - L7, I0 - I5, F2 - F14
20829N/A
20829N/A- const int LARGEST_UNDERRUN_PROT = 32; // largest value passed to underrunProtect
20829N/A+ const int LARGEST_UNDERRUN_PROT = 72; // largest value passed to underrunProtect
20829N/A
20829N/A #define NJ_MAX_STACK_ENTRY 8192
20829N/A #define NJ_MAX_PARAMETERS 1
20829N/A@@ -203,16 +203,18 @@
20829N/A #define DECLARE_PLATFORM_REGALLOC()
20829N/A
20829N/A #define DECLARE_PLATFORM_ASSEMBLER() \
20829N/A+ friend class SafeUnderrunProtect; \
20829N/A const static Register argRegs[6], retRegs[1]; \
20829N/A void nativePageReset(); \
20829N/A void nativePageSetup(); \
20829N/A void underrunProtect(int bytes); \
20829N/A bool hardenNopInsertion(const Config& /*c*/) { return false; } \
20829N/A void asm_align_code(); \
20829N/A- void asm_cmp(LIns *cond); \
20829N/A- void asm_cmpd(LIns *cond); \
20829N/A+ void asm_cmp(LIns* cond); \
20829N/A+ void asm_cmpd(LIns* cond); \
20829N/A NIns* asm_branchd(bool, LIns*, NIns*); \
20829N/A void IMM32(int32_t i) { \
20829N/A+ underrunProtect(4); \
20829N/A --_nIns; \
20829N/A *((int32_t*)_nIns) = i; \
20829N/A } \
20829N/A@@ -294,16 +296,16 @@
20829N/A void Format_4_5(Register rd, int32_t op3, int32_t cond, int32_t opf_cc, int32_t opf_low, Register rs2) { \
20829N/A Format_3A(2, rd, op3, (cond & 0xF) << 14 | (opf_cc & 0x7) << 11 | (opf_low & 0x3F) << 5 | _reg_(rs2)); \
20829N/A } \
20829N/A- void IntegerOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char *opcode); \
20829N/A- void IntegerOperationI(Register rs1, int32_t simm13, Register rd, int32_t op3, const char *opcode); \
20829N/A- void FloatOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char *opcode); \
20829N/A- void Bicc(int32_t a, int32_t dsp22, int32_t cond, const char *opcode); \
20829N/A- void FBfcc(int32_t a, int32_t dsp22, int32_t cond, const char *opcode); \
20829N/A+ void IntegerOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode); \
20829N/A+ void IntegerOperationI(Register rs1, int32_t simm13, Register rd, int32_t op3, const char* opcode); \
20829N/A+ void FloatOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode); \
20829N/A+ void Bicc(int32_t a, int32_t dsp22, int32_t cond, const char* opcode); \
20829N/A+ void FBfcc(int32_t a, int32_t dsp22, int32_t cond, const char* opcode); \
20829N/A void LoadOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode); \
20829N/A void LoadOperationI(Register rs1, int32_t simm13, Register rd, int32_t op3, const char* opcode); \
20829N/A- void MOVcc(Register rs, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char *opcode); \
20829N/A- void MOVccI(int32_t simm11, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char *opcode); \
20829N/A- void FMOVDcc(Register rs, int32_t opt_cc, Register rd, int32_t cond, const char *opcode); \
20829N/A+ void MOVcc(Register rs, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char* opcode); \
20829N/A+ void MOVccI(int32_t simm11, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char* opcode); \
20829N/A+ void FMOVDcc(Register rs, int32_t opt_cc, Register rd, int32_t cond, const char* opcode); \
20829N/A void ShiftOperation(Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode); \
20829N/A void ShiftOperationI(Register rs1, int32_t shcnt32, Register rd, int32_t op3, const char* opcode); \
20829N/A void Store(Register rd, Register rs1, Register rs2, int32_t op3, const char* opcode); \
20829N/A@@ -442,14 +444,13 @@
20829N/A void STB(Register rd, Register rs1, Register rs2); \
20829N/A void STBI(Register rd, int32_t simm13, Register rs1); \
20829N/A void STB32(Register rd, int32_t immI, Register rs1); \
20829N/A- bool isIMM13(int32_t imm) { return (imm) <= 0xfff && (imm) >= -0x1000; } \
20829N/A- bool isIMM19(int32_t imm) { return (imm) <= 0x3ffff && (imm) >= -0x40000; } \
20829N/A- bool isIMM22(int32_t imm) { return (imm) <= 0x1fffff && (imm) >= -0x200000; } \
20829N/A- void JMP_long_nocheck(int32_t t); \
20829N/A+ static bool isIMM13(int32_t imm) { return (imm) <= 0xfff && (imm) >= -0x1000; } \
20829N/A+ static bool isIMM19(int32_t imm) { return (imm) <= 0x3ffff && (imm) >= -0x40000; } \
20829N/A+ static bool isIMM22(int32_t imm) { return (imm) <= 0x1fffff && (imm) >= -0x200000; } \
20829N/A void JMP_long(int32_t t); \
20829N/A void JMP_long_placeholder(); \
20829N/A- int32_t JCC(void *t); \
20829N/A- void JMP(void *t); \
20829N/A+ int32_t JCC(void* t); \
20829N/A+ void JMP(void* t); \
20829N/A void MR(Register rd, Register rs);
20829N/A }
20829N/A #endif // __nanojit_NativeSparc__
20829N/A--- a/js/src/jsapi.cpp 2011-06-22 22:05:28.108252350 +0800
20829N/A+++ b/js/src/jsapi.cpp 2011-06-22 22:06:13.458823300 +0800
20829N/A@@ -2763,6 +2763,12 @@
20829N/A JS_PUBLIC_API(void)
20829N/A JS_SetNativeStackQuota(JSContext *cx, size_t stackSize)
20829N/A {
20829N/A+#ifdef JS_CPU_SPARC
20829N/A+ stackSize = stackSize * 8; // more stack is required on SPARC
20829N/A+#else
20829N/A+ // stackSize = stackSize * 2; // PGO needs more stack, why?
20829N/A+#endif
20829N/A+
20829N/A #ifdef JS_THREADSAFE
20829N/A JS_ASSERT(cx->thread());
20829N/A #endif
20829N/Adiff --git a/js/src/nanojit/NativeSparc.cpp b/js/src/nanojit/NativeSparc.cpp
20829N/Aindex 029a22a..a73be3d 100644
20829N/A--- a/js/src/nanojit/NativeSparc.cpp
20829N/A+++ b/js/src/nanojit/NativeSparc.cpp
20829N/A@@ -47,9 +47,33 @@
20829N/A namespace nanojit
20829N/A {
20829N/A #ifdef FEATURE_NANOJIT
20829N/A+ class SafeUnderrunProtect
20829N/A+ {
20829N/A+ public:
20829N/A+ SafeUnderrunProtect(Assembler* assembler, int n)
20829N/A+ {
20829N/A+ _nprotect = n;
20829N/A+ _assembler = assembler;
20829N/A+ _assembler->underrunProtect(n);
20829N/A+ _priorIns = _assembler->_nIns;
20829N/A+ _priorStart = _assembler->codeStart;
20829N/A+ };
20829N/A
20829N/A+ ~SafeUnderrunProtect()
20829N/A+ {
20829N/A+ NanoAssert(_priorStart == _assembler->codeStart);
20829N/A+ NanoAssert((intptr_t)_priorIns - (intptr_t)_assembler->_nIns <= _nprotect);
20829N/A+ };
20829N/A+
20829N/A+ private:
20829N/A+ int _nprotect;
20829N/A+ Assembler* _assembler;
20829N/A+ NIns* _priorIns;
20829N/A+ NIns* _priorStart;
20829N/A+ };
20829N/A+
20829N/A #ifdef NJ_VERBOSE
20829N/A- const char *regNames[] = {
20829N/A+ const char* regNames[] = {
20829N/A "%g0", "%g1", "%g2", "%g3", "%g4", "%g5", "%g6", "%g7",
20829N/A "%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%sp", "%o7",
20829N/A "%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7",
20829N/A@@ -79,13 +103,13 @@
20829N/A }
20829N/A
20829N/A inline void Assembler::IntegerOperation
20829N/A- (Register rs1, Register rs2, Register rd, int32_t op3, const char *opcode) {
20829N/A+ (Register rs1, Register rs2, Register rd, int32_t op3, const char* opcode) {
20829N/A Format_3_1(2, rd, op3, rs1, 0, rs2);
20829N/A asm_output("%s %s, %s, %s", opcode, gpn(rs1), gpn(rs2), gpn(rd));
20829N/A }
20829N/A
20829N/A inline void Assembler::IntegerOperationI
20829N/A- (Register rs1, int32_t simm13, Register rd, int32_t op3, const char *opcode) {
20829N/A+ (Register rs1, int32_t simm13, Register rd, int32_t op3, const char* opcode) {
20829N/A Format_3_1I(2, rd, op3, rs1, simm13);
20829N/A asm_output("%s %s, %d, %s", opcode, gpn(rs1), simm13, gpn(rd));
20829N/A }
20829N/A@@ -127,9 +151,9 @@
20829N/A IntegerOperation(rs1, rs2, rd, 0x3, "xor");
20829N/A }
20829N/A
20829N/A- inline void Assembler::Bicc(int32_t a, int32_t dsp22, int32_t cond, const char *opcode) {
20829N/A+ inline void Assembler::Bicc(int32_t a, int32_t dsp22, int32_t cond, const char* opcode) {
20829N/A Format_2_2(a, cond, 0x2, dsp22);
20829N/A- asm_output("%s 0x%x", opcode, _nIns + dsp22 - 1);
20829N/A+ asm_output("%s 0x%x", opcode, _nIns + dsp22);
20829N/A }
20829N/A
20829N/A inline void Assembler::BA (int32_t a, int32_t dsp22) { Bicc(a, dsp22, 0x8, "ba"); }
20829N/A@@ -156,7 +180,7 @@
20829N/A asm_output("faddd %s, %s, %s", gpn(rs1), gpn(rs2), gpn(rd));
20829N/A }
20829N/A
20829N/A- inline void Assembler::FBfcc(int32_t a, int32_t dsp22, int32_t cond, const char *opcode) {
20829N/A+ inline void Assembler::FBfcc(int32_t a, int32_t dsp22, int32_t cond, const char* opcode) {
20829N/A Format_2_2(a, cond, 0x6, dsp22);
20829N/A asm_output("%s 0x%x", opcode, _nIns + dsp22 - 1);
20829N/A }
20829N/A@@ -179,7 +203,7 @@
20829N/A }
20829N/A
20829N/A inline void Assembler::FloatOperation
20829N/A- (Register rs1, Register rs2, Register rd, int32_t opf, const char *opcode) {
20829N/A+ (Register rs1, Register rs2, Register rd, int32_t opf, const char* opcode) {
20829N/A Format_3_8(2, rd, 0x34, rs1, opf, rs2);
20829N/A if (rs1 != G0) {
20829N/A asm_output("%s %s, %s, %s", opcode, gpn(rs1), gpn(rs2), gpn(rd));
20829N/A@@ -347,13 +371,13 @@
20829N/A }
20829N/A
20829N/A inline void Assembler::MOVcc
20829N/A- (Register rs, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char *opcode) {
20829N/A+ (Register rs, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char* opcode) {
20829N/A Format_4_2(rd, 0x2c, cc2, cond, cc1, cc0, rs);
20829N/A asm_output("%s %s, %s", opcode, gpn(rs), gpn(rd));
20829N/A }
20829N/A
20829N/A inline void Assembler::MOVccI
20829N/A- (int32_t simm11, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char *opcode) {
20829N/A+ (int32_t simm11, int32_t cc2, int32_t cc1, int32_t cc0, Register rd, int32_t cond, const char* opcode) {
20829N/A Format_4_2I(rd, 0x2c, cc2, cond, cc1, cc0, simm11);
20829N/A asm_output("%s 0x%x, %s", opcode, simm11, gpn(rd));
20829N/A }
20829N/A@@ -386,7 +410,7 @@
20829N/A inline void Assembler::MOVFGI (int32_t simm11, Register rd) { MOVccI(simm11, 0, 0, 0, rd, 0x6, "movfg"); }
20829N/A inline void Assembler::MOVFGEI(int32_t simm11, Register rd) { MOVccI(simm11, 0, 0, 0, rd, 0xb, "movfge"); }
20829N/A
20829N/A- inline void Assembler::FMOVDcc(Register rs, int32_t opt_cc, Register rd, int32_t cond, const char *opcode) {
20829N/A+ inline void Assembler::FMOVDcc(Register rs, int32_t opt_cc, Register rd, int32_t cond, const char* opcode) {
20829N/A Format_4_5(rd, 0x35, cond, opt_cc, 0x2, rs);
20829N/A asm_output("%s %s, %s", opcode, gpn(rs), gpn(rd));
20829N/A }
20829N/A@@ -556,7 +580,19 @@
20829N/A }
20829N/A
20829N/A // general Assemble
20829N/A- inline void Assembler::JMP_long_nocheck(int32_t t) {
20829N/A+ inline void Assembler::JMP_long(int32_t t) {
20829N/A+ SafeUnderrunProtect protect(this, 16);
20829N/A+ /* if (t) {
20829N/A+ int32_t tt = ((intptr_t)t - (intptr_t)_nIns + 16) >> 2;
20829N/A+ if (isIMM22(tt)) {
20829N/A+ NOP();
20829N/A+ NOP();
20829N/A+ NOP();
20829N/A+ BA(0,tt);
20829N/A+ return;
20829N/A+ }
20829N/A+ }
20829N/A+*/
20829N/A NOP();
20829N/A JMPL(G0, G2, G0);
20829N/A ORI(G2, t & 0x3FF, G2);
20829N/A@@ -563,17 +599,12 @@
20829N/A SETHI(t, G2);
20829N/A }
20829N/A
20829N/A- inline void Assembler::JMP_long(int32_t t) {
20829N/A- underrunProtect(16);
20829N/A- JMP_long_nocheck(t);
20829N/A- }
20829N/A-
20829N/A inline void Assembler::JMP_long_placeholder() {
20829N/A JMP_long(0);
20829N/A }
20829N/A
20829N/A- inline int32_t Assembler::JCC(void *t) {
20829N/A- underrunProtect(32);
20829N/A+ inline int32_t Assembler::JCC(void* t) {
20829N/A+ SafeUnderrunProtect protect(this, 32);
20829N/A int32_t tt = ((intptr_t)t - (intptr_t)_nIns + 8) >> 2;
20829N/A if( !(isIMM22(tt)) ) {
20829N/A NOP();
20829N/A@@ -587,7 +618,7 @@
20829N/A return tt;
20829N/A }
20829N/A
20829N/A- void Assembler::JMP(void *t) {
20829N/A+ void Assembler::JMP(void* t) {
20829N/A if (!t) {
20829N/A JMP_long_placeholder();
20829N/A } else {
20829N/A@@ -597,7 +628,6 @@
20829N/A }
20829N/A
20829N/A void Assembler::MR(Register rd, Register rs) {
20829N/A- underrunProtect(4);
20829N/A ORI(rs, 0, rd);
20829N/A }
20829N/A
20829N/A@@ -612,7 +642,7 @@
20829N/A /**
20829N/A * Prologue
20829N/A */
20829N/A- underrunProtect(16);
20829N/A+ SafeUnderrunProtect protect(this, 28);
20829N/A uint32_t stackNeeded = STACK_GRANULARITY * _activation.stackSlotsNeeded();
20829N/A uint32_t frameSize = stackNeeded + kcalleeAreaSize + kLinkageAreaSize;
20829N/A frameSize = BIT_ROUND_UP(frameSize, 8);
20829N/A@@ -630,7 +660,7 @@
20829N/A outputf(" 0x%x:",_nIns);
20829N/A outputf(" patch entry:");
20829N/A })
20829N/A- NIns *patchEntry = _nIns;
20829N/A+ NIns* patchEntry = _nIns;
20829N/A
20829N/A // The frame size in SAVE is faked. We will still re-caculate SP later.
20829N/A // We can use 0 here but it is not good for debuggers.
20829N/A@@ -642,7 +672,8 @@
20829N/A return patchEntry;
20829N/A }
20829N/A
20829N/A- void Assembler::asm_align_code() {
20829N/A+ void Assembler::asm_align_code()
20829N/A+ {
20829N/A while(uintptr_t(_nIns) & 15) {
20829N/A NOP();
20829N/A }
20829N/A@@ -651,30 +682,27 @@
20829N/A void Assembler::nFragExit(LIns* guard)
20829N/A {
20829N/A SideExit* exit = guard->record()->exit;
20829N/A- Fragment *frag = exit->target;
20829N/A- GuardRecord *lr;
20829N/A- if (frag && frag->fragEntry)
20829N/A- {
20829N/A- JMP(frag->fragEntry);
20829N/A- lr = 0;
20829N/A- }
20829N/A- else
20829N/A- {
20829N/A- // Target doesn't exit yet. Emit jump to epilog, and set up to patch later.
20829N/A- if (!_epilogue)
20829N/A- _epilogue = genEpilogue();
20829N/A- lr = guard->record();
20829N/A- JMP_long((intptr_t)_epilogue);
20829N/A- lr->jmp = _nIns;
20829N/A- }
20829N/A+ Fragment* frag = exit->target;
20829N/A+ GuardRecord* lr;
20829N/A+ if (frag && frag->fragEntry) {
20829N/A+ JMP(frag->fragEntry);
20829N/A+ lr = 0;
20829N/A+ } else {
20829N/A+ // Target doesn't exit yet. Emit jump to epilog, and set up to patch later.
20829N/A+ if (!_epilogue)
20829N/A+ _epilogue = genEpilogue();
20829N/A+ lr = guard->record();
20829N/A+ JMP_long((intptr_t)_epilogue);
20829N/A+ lr->jmp = _nIns;
20829N/A+ }
20829N/A
20829N/A // return value is GuardRecord*
20829N/A SET32(int(lr), O0);
20829N/A }
20829N/A
20829N/A- NIns *Assembler::genEpilogue()
20829N/A+ NIns* Assembler::genEpilogue()
20829N/A {
20829N/A- underrunProtect(12);
20829N/A+ SafeUnderrunProtect protect(this, 12);
20829N/A RESTORE(G0, G0, G0); //restore
20829N/A JMPLI(I7, 8, G0); //ret
20829N/A ORI(O0, 0, I0);
20829N/A@@ -684,19 +712,15 @@
20829N/A void Assembler::asm_call(LIns* ins)
20829N/A {
20829N/A if (!ins->isop(LIR_callv)) {
20829N/A- Register retReg = ( ins->isop(LIR_calld) ? F0 : retRegs[0] );
20829N/A- deprecated_prepResultReg(ins, rmask(retReg));
20829N/A+ Register retReg = (ins->isop(LIR_calld) ? F0 : retRegs[0]);
20829N/A+ prepareResultReg(ins, rmask(retReg));
20829N/A+ evictScratchRegsExcept(rmask(retReg));
20829N/A+ } else {
20829N/A+ evictScratchRegsExcept(0);
20829N/A }
20829N/A
20829N/A- // Do this after we've handled the call result, so we don't
20829N/A- // force the call result to be spilled unnecessarily.
20829N/A- evictScratchRegsExcept(0);
20829N/A-
20829N/A const CallInfo* ci = ins->callInfo();
20829N/A
20829N/A- underrunProtect(8);
20829N/A- NOP();
20829N/A-
20829N/A ArgType argTypes[MAXARGS];
20829N/A uint32_t argc = ci->getArgTypes(argTypes);
20829N/A
20829N/A@@ -704,53 +728,59 @@
20829N/A ins->isop(LIR_calld));
20829N/A verbose_only(if (_logc->lcbits & LC_Native)
20829N/A outputf(" 0x%x:", _nIns);
20829N/A- )
20829N/A+ )
20829N/A bool indirect = ci->isIndirect();
20829N/A- if (!indirect) {
20829N/A- CALL(ci);
20829N/A+
20829N/A+ {
20829N/A+ SafeUnderrunProtect protect(this, 8);
20829N/A+ NOP();
20829N/A+ if (!indirect) {
20829N/A+ CALL(ci);
20829N/A+ }
20829N/A+ else {
20829N/A+ argc--;
20829N/A+ Register r = findSpecificRegFor(ins->arg(argc), I0);
20829N/A+ JMPL(G0, I0, O7);
20829N/A+ }
20829N/A }
20829N/A- else {
20829N/A- argc--;
20829N/A- Register r = findSpecificRegFor(ins->arg(argc), I0);
20829N/A- JMPL(G0, I0, O7);
20829N/A- }
20829N/A
20829N/A+ freeResourcesOf(ins);
20829N/A+
20829N/A Register GPRIndex = O0;
20829N/A uint32_t offset = kLinkageAreaSize; // start of parameters stack postion.
20829N/A
20829N/A- for(int i=0; i<argc; i++)
20829N/A- {
20829N/A- uint32_t j = argc-i-1;
20829N/A- ArgType ty = argTypes[j];
20829N/A- if (ty == ARGTYPE_D) {
20829N/A- Register r = findRegFor(ins->arg(j), FpRegs);
20829N/A+ for (int i = 0; i < argc; i++) {
20829N/A+ uint32_t j = argc-i-1;
20829N/A+ ArgType ty = argTypes[j];
20829N/A+ if (ty == ARGTYPE_D) {
20829N/A+ Register r = findRegFor(ins->arg(j), FpRegs);
20829N/A
20829N/A- underrunProtect(48);
20829N/A- // We might be calling a varargs function.
20829N/A- // So, make sure the GPR's are also loaded with
20829N/A- // the value, or the stack contains it.
20829N/A- if (GPRIndex <= O5) {
20829N/A- LDSW32(SP, offset, GPRIndex);
20829N/A- }
20829N/A- GPRIndex = GPRIndex + 1;
20829N/A- if (GPRIndex <= O5) {
20829N/A- LDSW32(SP, offset+4, GPRIndex);
20829N/A- }
20829N/A- GPRIndex = GPRIndex + 1;
20829N/A- STDF32(r, offset, SP);
20829N/A- offset += 8;
20829N/A+ SafeUnderrunProtect protect(this, 48);
20829N/A+ // We might be calling a varargs function.
20829N/A+ // So, make sure the GPR's are also loaded with
20829N/A+ // the value, or the stack contains it.
20829N/A+ if (GPRIndex <= O5) {
20829N/A+ LDSW32(SP, offset, GPRIndex);
20829N/A+ }
20829N/A+ GPRIndex = GPRIndex + 1;
20829N/A+ if (GPRIndex <= O5) {
20829N/A+ LDSW32(SP, offset+4, GPRIndex);
20829N/A+ }
20829N/A+ GPRIndex = GPRIndex + 1;
20829N/A+ STDF32(r, offset, SP);
20829N/A+ offset += 8;
20829N/A+ } else {
20829N/A+ if (GPRIndex > O5) {
20829N/A+ SafeUnderrunProtect protect(this, 12);
20829N/A+ Register r = findRegFor(ins->arg(j), GpRegs);
20829N/A+ STW32(r, offset, SP);
20829N/A } else {
20829N/A- if (GPRIndex > O5) {
20829N/A- underrunProtect(12);
20829N/A- Register r = findRegFor(ins->arg(j), GpRegs);
20829N/A- STW32(r, offset, SP);
20829N/A- } else {
20829N/A- Register r = findSpecificRegFor(ins->arg(j), GPRIndex);
20829N/A- }
20829N/A- GPRIndex = GPRIndex + 1;
20829N/A- offset += 4;
20829N/A+ Register r = findSpecificRegFor(ins->arg(j), GPRIndex);
20829N/A }
20829N/A+ GPRIndex = GPRIndex + 1;
20829N/A+ offset += 4;
20829N/A }
20829N/A+ }
20829N/A }
20829N/A
20829N/A Register Assembler::nRegisterAllocFromSet(RegisterMask set)
20829N/A@@ -771,10 +801,16 @@
20829N/A
20829N/A void Assembler::nPatchBranch(NIns* branch, NIns* location)
20829N/A {
20829N/A- *(uint32_t*)&branch[0] &= 0xFFC00000;
20829N/A- *(uint32_t*)&branch[0] |= ((intptr_t)location >> 10) & 0x3FFFFF;
20829N/A- *(uint32_t*)&branch[1] &= 0xFFFFFC00;
20829N/A- *(uint32_t*)&branch[1] |= (intptr_t)location & 0x3FF;
20829N/A+ intptr_t addr_diff = ((intptr_t)location - (intptr_t)branch) >> 2;
20829N/A+ if ( !isIMM22(addr_diff)) {
20829N/A+ *(uint32_t*)&branch[0] = 0x05000000 | ((intptr_t)location >> 10) & 0x3FFFFF; // sethi ..., %g2
20829N/A+ *(uint32_t*)&branch[1] = 0x8410a000 | (intptr_t)location & 0x3FF; // bset ..., %g2
20829N/A+ *(uint32_t*)&branch[2] = 0x81c00002; // jmp %g2
20829N/A+ } else {
20829N/A+ *(uint32_t*)&branch[0] = 0x10800000 | (addr_diff & 0x3FFFFF); // ba
20829N/A+ *(uint32_t*)&branch[1] = 0x01000000; // nop
20829N/A+ *(uint32_t*)&branch[2] = 0x01000000; // nop
20829N/A+ }
20829N/A }
20829N/A
20829N/A RegisterMask Assembler::nHint(LIns* ins)
20829N/A@@ -791,10 +827,10 @@
20829N/A
20829N/A void Assembler::asm_restore(LIns* i, Register r)
20829N/A {
20829N/A- underrunProtect(24);
20829N/A+ SafeUnderrunProtect protect(this, 24);
20829N/A if (i->isop(LIR_allocp)) {
20829N/A ADD(FP, L2, r);
20829N/A- int32_t d = deprecated_disp(i);
20829N/A+ int32_t d = arDisp(i);
20829N/A SET32(d, L2);
20829N/A }
20829N/A else if (i->isImmI()) {
20829N/A@@ -810,7 +846,7 @@
20829N/A }
20829N/A }
20829N/A
20829N/A- void Assembler::asm_store32(LOpcode op, LIns *value, int dr, LIns *base)
20829N/A+ void Assembler::asm_store32(LOpcode op, LIns* value, int dr, LIns* base)
20829N/A {
20829N/A switch (op) {
20829N/A case LIR_sti:
20829N/A@@ -823,53 +859,38 @@
20829N/A return;
20829N/A }
20829N/A
20829N/A- underrunProtect(20);
20829N/A- if (value->isImmI())
20829N/A- {
20829N/A- Register rb = getBaseReg(base, dr, GpRegs);
20829N/A- int c = value->immI();
20829N/A- switch (op) {
20829N/A- case LIR_sti:
20829N/A- STW32(L2, dr, rb);
20829N/A- break;
20829N/A- case LIR_sti2c:
20829N/A- STB32(L2, dr, rb);
20829N/A- break;
20829N/A- case LIR_sti2s:
20829N/A- STH32(L2, dr, rb);
20829N/A- break;
20829N/A- }
20829N/A- SET32(c, L2);
20829N/A+ SafeUnderrunProtect protect(this, 20);
20829N/A+ if (value->isImmI()) {
20829N/A+ Register rb = getBaseReg(base, dr, GpRegs);
20829N/A+ int c = value->immI();
20829N/A+ switch (op) {
20829N/A+ case LIR_sti: STW32(L2, dr, rb); break;
20829N/A+ case LIR_sti2c: STB32(L2, dr, rb); break;
20829N/A+ case LIR_sti2s: STH32(L2, dr, rb); break;
20829N/A }
20829N/A- else
20829N/A- {
20829N/A- // make sure what is in a register
20829N/A- Register ra, rb;
20829N/A- if (base->isImmI()) {
20829N/A- // absolute address
20829N/A- dr += base->immI();
20829N/A- ra = findRegFor(value, GpRegs);
20829N/A- rb = G0;
20829N/A- } else {
20829N/A- getBaseReg2(GpRegs, value, ra, GpRegs, base, rb, dr);
20829N/A- }
20829N/A- switch (op) {
20829N/A- case LIR_sti:
20829N/A- STW32(ra, dr, rb);
20829N/A- break;
20829N/A- case LIR_sti2c:
20829N/A- STB32(ra, dr, rb);
20829N/A- break;
20829N/A- case LIR_sti2s:
20829N/A- STH32(ra, dr, rb);
20829N/A- break;
20829N/A- }
20829N/A+ SET32(c, L2);
20829N/A+ } else {
20829N/A+ // make sure what is in a register
20829N/A+ Register ra, rb;
20829N/A+ if (base->isImmI()) {
20829N/A+ // absolute address
20829N/A+ dr += base->immI();
20829N/A+ ra = findRegFor(value, GpRegs);
20829N/A+ rb = G0;
20829N/A+ } else {
20829N/A+ getBaseReg2(GpRegs, value, ra, GpRegs, base, rb, dr);
20829N/A }
20829N/A+ switch (op) {
20829N/A+ case LIR_sti: STW32(ra, dr, rb); break;
20829N/A+ case LIR_sti2c: STB32(ra, dr, rb); break;
20829N/A+ case LIR_sti2s: STH32(ra, dr, rb); break;
20829N/A+ }
20829N/A+ }
20829N/A }
20829N/A
20829N/A void Assembler::asm_spill(Register rr, int d, bool quad)
20829N/A {
20829N/A- underrunProtect(24);
20829N/A+ SafeUnderrunProtect protect(this, 24);
20829N/A (void)quad;
20829N/A NanoAssert(d);
20829N/A if (rmask(rr) & FpRegs) {
20829N/A@@ -891,7 +912,7 @@
20829N/A return;
20829N/A }
20829N/A
20829N/A- underrunProtect(48);
20829N/A+ SafeUnderrunProtect protect(this, 48);
20829N/A LIns* base = ins->oprnd1();
20829N/A int db = ins->disp();
20829N/A Register rb = getBaseReg(base, db, GpRegs);
20829N/A@@ -936,7 +957,7 @@
20829N/A return;
20829N/A }
20829N/A
20829N/A- underrunProtect(48);
20829N/A+ SafeUnderrunProtect protect(this, 48);
20829N/A Register rb = getBaseReg(base, dr, GpRegs);
20829N/A if (op == LIR_std2f) {
20829N/A Register rv = ( !value->isInReg()
20829N/A@@ -948,32 +969,30 @@
20829N/A return;
20829N/A }
20829N/A
20829N/A- if (value->isImmD())
20829N/A- {
20829N/A- // if a constant 64-bit value just store it now rather than
20829N/A- // generating a pointless store/load/store sequence
20829N/A- STW32(L2, dr+4, rb);
20829N/A- SET32(value->immDlo(), L2);
20829N/A- STW32(L2, dr, rb);
20829N/A- SET32(value->immDhi(), L2);
20829N/A- return;
20829N/A- }
20829N/A+ if (value->isImmD()) {
20829N/A+ // if a constant 64-bit value just store it now rather than
20829N/A+ // generating a pointless store/load/store sequence
20829N/A+ STW32(L2, dr+4, rb);
20829N/A+ SET32(value->immDlo(), L2);
20829N/A+ STW32(L2, dr, rb);
20829N/A+ SET32(value->immDhi(), L2);
20829N/A+ return;
20829N/A+ }
20829N/A
20829N/A- if (value->isop(LIR_ldd))
20829N/A- {
20829N/A- // value is 64bit struct or int64_t, or maybe a double.
20829N/A- // it may be live in an FPU reg. Either way, don't
20829N/A- // put it in an FPU reg just to load & store it.
20829N/A+ if (value->isop(LIR_ldd)) {
20829N/A+ // value is 64bit struct or int64_t, or maybe a double.
20829N/A+ // it may be live in an FPU reg. Either way, don't
20829N/A+ // put it in an FPU reg just to load & store it.
20829N/A
20829N/A- // a) if we know it's not a double, this is right.
20829N/A- // b) if we guarded that its a double, this store could be on
20829N/A- // the side exit, copying a non-double.
20829N/A- // c) maybe its a double just being stored. oh well.
20829N/A+ // a) if we know it's not a double, this is right.
20829N/A+ // b) if we guarded that its a double, this store could be on
20829N/A+ // the side exit, copying a non-double.
20829N/A+ // c) maybe its a double just being stored. oh well.
20829N/A
20829N/A- int da = findMemFor(value);
20829N/A- asm_mmq(rb, dr, FP, da);
20829N/A- return;
20829N/A- }
20829N/A+ int da = findMemFor(value);
20829N/A+ asm_mmq(rb, dr, FP, da);
20829N/A+ return;
20829N/A+ }
20829N/A
20829N/A // if value already in a reg, use that, otherwise
20829N/A // get it into FPU regs.
20829N/A@@ -1004,66 +1023,56 @@
20829N/A NIns* at = 0;
20829N/A LOpcode condop = cond->opcode();
20829N/A NanoAssert(cond->isCmp());
20829N/A- if (isCmpDOpcode(condop))
20829N/A- {
20829N/A- return Branches(asm_branchd(branchOnFalse, cond, targ));
20829N/A- }
20829N/A+ if (isCmpDOpcode(condop)) {
20829N/A+ return Branches(asm_branchd(branchOnFalse, cond, targ));
20829N/A+ }
20829N/A
20829N/A- underrunProtect(32);
20829N/A- intptr_t tt = ((intptr_t)targ - (intptr_t)_nIns + 8) >> 2;
20829N/A- // !targ means that it needs patch.
20829N/A- if( !(isIMM22((int32_t)tt)) || !targ ) {
20829N/A- JMP_long_nocheck((intptr_t)targ);
20829N/A- at = _nIns;
20829N/A+ {
20829N/A+ SafeUnderrunProtect protect(this, 32);
20829N/A+ intptr_t tt = ((intptr_t)targ - (intptr_t)_nIns + 8) >> 2;
20829N/A+ // !targ means that it needs patch.
20829N/A+ if( !(isIMM22((int32_t)tt)) || !targ ) {
20829N/A+ JMP_long((intptr_t)targ);
20829N/A+ at = _nIns;
20829N/A+ NOP();
20829N/A+ BA(0, 5);
20829N/A+ tt = 4;
20829N/A+ }
20829N/A NOP();
20829N/A- BA(0, 5);
20829N/A- tt = 4;
20829N/A- }
20829N/A- NOP();
20829N/A
20829N/A- // produce the branch
20829N/A- if (branchOnFalse)
20829N/A- {
20829N/A- if (condop == LIR_eqi)
20829N/A- BNE(0, tt);
20829N/A- else if (condop == LIR_lti)
20829N/A- BGE(0, tt);
20829N/A- else if (condop == LIR_lei)
20829N/A- BG(0, tt);
20829N/A- else if (condop == LIR_gti)
20829N/A- BLE(0, tt);
20829N/A- else if (condop == LIR_gei)
20829N/A- BL(0, tt);
20829N/A- else if (condop == LIR_ltui)
20829N/A- BCC(0, tt);
20829N/A- else if (condop == LIR_leui)
20829N/A- BGU(0, tt);
20829N/A- else if (condop == LIR_gtui)
20829N/A- BLEU(0, tt);
20829N/A- else //if (condop == LIR_geui)
20829N/A- BCS(0, tt);
20829N/A+ // produce the branch
20829N/A+ if (branchOnFalse) {
20829N/A+ switch (condop) {
20829N/A+ case LIR_eqi : BNE (0, tt); break;
20829N/A+ case LIR_lti : BGE (0, tt); break;
20829N/A+ case LIR_lei : BG (0, tt); break;
20829N/A+ case LIR_gti : BLE (0, tt); break;
20829N/A+ case LIR_gei : BL (0, tt); break;
20829N/A+ case LIR_ltui: BCC (0, tt); break;
20829N/A+ case LIR_leui: BGU (0, tt); break;
20829N/A+ case LIR_gtui: BLEU(0, tt); break;
20829N/A+ case LIR_geui: BCS (0, tt); break;
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_branch should never receive this cond opcode");
20829N/A+ return;
20829N/A+ }
20829N/A+ } else {// op == LIR_xt
20829N/A+ switch (condop) {
20829N/A+ case LIR_eqi : BE (0, tt); break;
20829N/A+ case LIR_lti : BL (0, tt); break;
20829N/A+ case LIR_lei : BLE (0, tt); break;
20829N/A+ case LIR_gti : BG (0, tt); break;
20829N/A+ case LIR_gei : BGE (0, tt); break;
20829N/A+ case LIR_ltui: BCS (0, tt); break;
20829N/A+ case LIR_leui: BLEU(0, tt); break;
20829N/A+ case LIR_gtui: BGU (0, tt); break;
20829N/A+ case LIR_geui: BCC (0, tt); break;
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_branch should never receive this cond opcode");
20829N/A+ return;
20829N/A+ }
20829N/A }
20829N/A- else // op == LIR_xt
20829N/A- {
20829N/A- if (condop == LIR_eqi)
20829N/A- BE(0, tt);
20829N/A- else if (condop == LIR_lti)
20829N/A- BL(0, tt);
20829N/A- else if (condop == LIR_lei)
20829N/A- BLE(0, tt);
20829N/A- else if (condop == LIR_gti)
20829N/A- BG(0, tt);
20829N/A- else if (condop == LIR_gei)
20829N/A- BGE(0, tt);
20829N/A- else if (condop == LIR_ltui)
20829N/A- BCS(0, tt);
20829N/A- else if (condop == LIR_leui)
20829N/A- BLEU(0, tt);
20829N/A- else if (condop == LIR_gtui)
20829N/A- BGU(0, tt);
20829N/A- else //if (condop == LIR_geui)
20829N/A- BCC(0, tt);
20829N/A- }
20829N/A+ }
20829N/A asm_cmp(cond);
20829N/A return Branches(at);
20829N/A }
20829N/A@@ -1071,11 +1080,11 @@
20829N/A NIns* Assembler::asm_branch_ov(LOpcode op, NIns* targ)
20829N/A {
20829N/A NIns* at = 0;
20829N/A- underrunProtect(32);
20829N/A+ SafeUnderrunProtect protect(this, 32);
20829N/A intptr_t tt = ((intptr_t)targ - (intptr_t)_nIns + 8) >> 2;
20829N/A // !targ means that it needs patch.
20829N/A- if( !(isIMM22((int32_t)tt)) || !targ ) {
20829N/A- JMP_long_nocheck((intptr_t)targ);
20829N/A+ if (!(isIMM22((int32_t)tt)) || !targ) {
20829N/A+ JMP_long((intptr_t)targ);
20829N/A at = _nIns;
20829N/A NOP();
20829N/A BA(0, 5);
20829N/A@@ -1083,7 +1092,7 @@
20829N/A }
20829N/A NOP();
20829N/A
20829N/A- if( op == LIR_mulxovi || op == LIR_muljovi )
20829N/A+ if (op == LIR_mulxovi || op == LIR_muljovi)
20829N/A BNE(0, tt);
20829N/A else
20829N/A BVS(0, tt);
20829N/A@@ -1090,10 +1099,8 @@
20829N/A return at;
20829N/A }
20829N/A
20829N/A- void Assembler::asm_cmp(LIns *cond)
20829N/A+ void Assembler::asm_cmp(LIns* cond)
20829N/A {
20829N/A- underrunProtect(12);
20829N/A-
20829N/A LIns* lhs = cond->oprnd1();
20829N/A LIns* rhs = cond->oprnd2();
20829N/A
20829N/A@@ -1100,182 +1107,205 @@
20829N/A NanoAssert(lhs->isI() && rhs->isI());
20829N/A
20829N/A // ready to issue the compare
20829N/A- if (rhs->isImmI())
20829N/A- {
20829N/A- int c = rhs->immI();
20829N/A- Register r = findRegFor(lhs, GpRegs);
20829N/A- if (c == 0 && cond->isop(LIR_eqi)) {
20829N/A- ANDCC(r, r, G0);
20829N/A- }
20829N/A- else {
20829N/A- SUBCC(r, L2, G0);
20829N/A- SET32(c, L2);
20829N/A- }
20829N/A+ if (rhs->isImmI()) {
20829N/A+ int c = rhs->immI();
20829N/A+ Register r = findRegFor(lhs, GpRegs);
20829N/A+ SafeUnderrunProtect protect(this, 12);
20829N/A+ if (c == 0 && cond->isop(LIR_eqi)) {
20829N/A+ ANDCC(r, r, G0);
20829N/A+ } else {
20829N/A+ SUBCC(r, L2, G0);
20829N/A+ SET32(c, L2);
20829N/A }
20829N/A- else
20829N/A- {
20829N/A- Register ra, rb;
20829N/A- findRegFor2(GpRegs, lhs, ra, GpRegs, rhs, rb);
20829N/A- SUBCC(ra, rb, G0);
20829N/A- }
20829N/A+ } else {
20829N/A+ Register ra, rb;
20829N/A+ findRegFor2(GpRegs, lhs, ra, GpRegs, rhs, rb);
20829N/A+ SUBCC(ra, rb, G0);
20829N/A+ }
20829N/A }
20829N/A
20829N/A void Assembler::asm_condd(LIns* ins)
20829N/A {
20829N/A // only want certain regs
20829N/A- Register r = deprecated_prepResultReg(ins, AllowableFlagRegs);
20829N/A- underrunProtect(8);
20829N/A+ Register r = prepareResultReg(ins, AllowableFlagRegs);
20829N/A+ SafeUnderrunProtect protect(this, 12);
20829N/A LOpcode condop = ins->opcode();
20829N/A NanoAssert(isCmpDOpcode(condop));
20829N/A- if (condop == LIR_eqd)
20829N/A- MOVFEI(1, r);
20829N/A- else if (condop == LIR_led)
20829N/A- MOVFLEI(1, r);
20829N/A- else if (condop == LIR_ltd)
20829N/A- MOVFLI(1, r);
20829N/A- else if (condop == LIR_ged)
20829N/A- MOVFGEI(1, r);
20829N/A- else // if (condop == LIR_gtd)
20829N/A- MOVFGI(1, r);
20829N/A+ switch (condop) {
20829N/A+ case LIR_eqd: MOVFEI (1, r); break;
20829N/A+ case LIR_led: MOVFLEI(1, r); break;
20829N/A+ case LIR_ltd: MOVFLI (1, r); break;
20829N/A+ case LIR_ged: MOVFGEI(1, r); break;
20829N/A+ case LIR_gtd: MOVFGI (1, r); break;
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_condd should never receive this cond opcode");
20829N/A+ return;
20829N/A+ }
20829N/A ORI(G0, 0, r);
20829N/A+ freeResourcesOf(ins);
20829N/A asm_cmpd(ins);
20829N/A }
20829N/A
20829N/A void Assembler::asm_cond(LIns* ins)
20829N/A {
20829N/A- underrunProtect(8);
20829N/A // only want certain regs
20829N/A- LOpcode op = ins->opcode();
20829N/A- Register r = deprecated_prepResultReg(ins, AllowableFlagRegs);
20829N/A+ LOpcode condop = ins->opcode();
20829N/A+ Register r = prepareResultReg(ins, AllowableFlagRegs);
20829N/A+ SafeUnderrunProtect protect(this, 20);
20829N/A
20829N/A- if (op == LIR_eqi)
20829N/A- MOVEI(1, r);
20829N/A- else if (op == LIR_lti)
20829N/A- MOVLI(1, r);
20829N/A- else if (op == LIR_lei)
20829N/A- MOVLEI(1, r);
20829N/A- else if (op == LIR_gti)
20829N/A- MOVGI(1, r);
20829N/A- else if (op == LIR_gei)
20829N/A- MOVGEI(1, r);
20829N/A- else if (op == LIR_ltui)
20829N/A- MOVCSI(1, r);
20829N/A- else if (op == LIR_leui)
20829N/A- MOVLEUI(1, r);
20829N/A- else if (op == LIR_gtui)
20829N/A- MOVGUI(1, r);
20829N/A- else // if (op == LIR_geui)
20829N/A- MOVCCI(1, r);
20829N/A+ switch (condop) {
20829N/A+ case LIR_eqi : MOVEI (1, r); break;
20829N/A+ case LIR_lti : MOVLI (1, r); break;
20829N/A+ case LIR_lei : MOVLEI (1, r); break;
20829N/A+ case LIR_gti : MOVGI (1, r); break;
20829N/A+ case LIR_gei : MOVGEI (1, r); break;
20829N/A+ case LIR_ltui: MOVCSI (1, r); break;
20829N/A+ case LIR_leui: MOVLEUI(1, r); break;
20829N/A+ case LIR_gtui: MOVGUI (1, r); break;
20829N/A+ case LIR_geui: MOVCCI (1, r); break;
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_cond should never receive this cond opcode");
20829N/A+ return;
20829N/A+ }
20829N/A ORI(G0, 0, r);
20829N/A+ freeResourcesOf(ins);
20829N/A asm_cmp(ins);
20829N/A }
20829N/A
20829N/A void Assembler::asm_arith(LIns* ins)
20829N/A {
20829N/A- underrunProtect(28);
20829N/A+ SafeUnderrunProtect protect(this, 28);
20829N/A LOpcode op = ins->opcode();
20829N/A LIns* lhs = ins->oprnd1();
20829N/A LIns* rhs = ins->oprnd2();
20829N/A
20829N/A- Register rb = deprecated_UnknownReg;
20829N/A+ Register rb;
20829N/A RegisterMask allow = GpRegs;
20829N/A bool forceReg = (op == LIR_muli || op == LIR_mulxovi || op == LIR_muljovi || !rhs->isImmI());
20829N/A
20829N/A- if (lhs != rhs && forceReg)
20829N/A- {
20829N/A- if ((rb = asm_binop_rhs_reg(ins)) == deprecated_UnknownReg) {
20829N/A- rb = findRegFor(rhs, allow);
20829N/A- }
20829N/A- allow &= ~rmask(rb);
20829N/A- }
20829N/A- else if ((op == LIR_addi || op == LIR_addxovi || op == LIR_addjovi) && lhs->isop(LIR_allocp) && rhs->isImmI()) {
20829N/A+ if (lhs != rhs && forceReg) {
20829N/A+ rb = findRegFor(rhs, allow);
20829N/A+ allow &= ~rmask(rb);
20829N/A+ } else if ((op == LIR_addi || op == LIR_addxovi || op == LIR_addjovi) && lhs->isop(LIR_allocp) && rhs->isImmI()) {
20829N/A // add alloc+const, use lea
20829N/A- Register rr = deprecated_prepResultReg(ins, allow);
20829N/A+ Register rr = prepareResultReg(ins, allow);
20829N/A int d = findMemFor(lhs) + rhs->immI();
20829N/A+ SafeUnderrunProtect protect(this, 12);
20829N/A ADD(FP, L2, rr);
20829N/A SET32(d, L2);
20829N/A+ freeResourcesOf(ins);
20829N/A return;
20829N/A }
20829N/A
20829N/A- Register rr = deprecated_prepResultReg(ins, allow);
20829N/A- // if this is last use of lhs in reg, we can re-use result reg
20829N/A- // else, lhs already has a register assigned.
20829N/A- Register ra = ( !lhs->isInReg()
20829N/A- ? findSpecificRegFor(lhs, rr)
20829N/A- : lhs->deprecated_getReg() );
20829N/A+ Register rr = prepareResultReg(ins, allow);
20829N/A
20829N/A- if (forceReg)
20829N/A- {
20829N/A- if (lhs == rhs)
20829N/A- rb = ra;
20829N/A+ // If 'lhs' isn't in a register, it can be clobbered by 'ins'.
20829N/A+ Register ra = lhs->isInReg() ? lhs->getReg() : rr;
20829N/A
20829N/A- if (op == LIR_addi || op == LIR_addxovi || op == LIR_addjovi)
20829N/A+ if (forceReg) {
20829N/A+ if (lhs == rhs)
20829N/A+ rb = ra;
20829N/A+
20829N/A+ switch (op) {
20829N/A+ case LIR_addi:
20829N/A+ case LIR_addxovi:
20829N/A+ case LIR_addjovi:
20829N/A ADDCC(rr, rb, rr);
20829N/A- else if (op == LIR_subi || op == LIR_subxovi || op == LIR_subjovi)
20829N/A+ break;
20829N/A+ case LIR_subi:
20829N/A+ case LIR_subxovi:
20829N/A+ case LIR_subjovi:
20829N/A SUBCC(rr, rb, rr);
20829N/A- else if (op == LIR_muli)
20829N/A+ break;
20829N/A+ case LIR_muli:
20829N/A SMULCC(rr, rb, rr);
20829N/A- else if (op == LIR_mulxovi || op == LIR_muljovi) {
20829N/A+ break;
20829N/A+ case LIR_mulxovi:
20829N/A+ case LIR_muljovi:
20829N/A SUBCC(L4, L6, L4);
20829N/A SRAI(rr, 31, L6);
20829N/A RDY(L4);
20829N/A SMULCC(rr, rb, rr);
20829N/A- }
20829N/A- else if (op == LIR_andi)
20829N/A+ break;
20829N/A+ case LIR_andi:
20829N/A AND(rr, rb, rr);
20829N/A- else if (op == LIR_ori)
20829N/A+ break;
20829N/A+ case LIR_ori:
20829N/A OR(rr, rb, rr);
20829N/A- else if (op == LIR_xori)
20829N/A+ break;
20829N/A+ case LIR_xori:
20829N/A XOR(rr, rb, rr);
20829N/A- else if (op == LIR_lshi)
20829N/A+ break;
20829N/A+ case LIR_lshi:
20829N/A SLL(rr, rb, rr);
20829N/A- else if (op == LIR_rshi)
20829N/A+ break;
20829N/A+ case LIR_rshi:
20829N/A SRA(rr, rb, rr);
20829N/A- else if (op == LIR_rshui)
20829N/A+ break;
20829N/A+ case LIR_rshui:
20829N/A SRL(rr, rb, rr);
20829N/A- else
20829N/A+ break;
20829N/A+ default:
20829N/A NanoAssertMsg(0, "Unsupported");
20829N/A+ return;
20829N/A }
20829N/A- else
20829N/A- {
20829N/A- int c = rhs->immI();
20829N/A- if (op == LIR_addi || op == LIR_addxovi || op == LIR_addjovi)
20829N/A+ } else {
20829N/A+ int c = rhs->immI();
20829N/A+ switch (op) {
20829N/A+ case LIR_addi:
20829N/A+ case LIR_addxovi:
20829N/A+ case LIR_addjovi:
20829N/A ADDCC(rr, L2, rr);
20829N/A- else if (op == LIR_subi || op == LIR_subxovi || op == LIR_subjovi)
20829N/A+ break;
20829N/A+ case LIR_subi:
20829N/A+ case LIR_subxovi:
20829N/A+ case LIR_subjovi:
20829N/A SUBCC(rr, L2, rr);
20829N/A- else if (op == LIR_andi)
20829N/A+ break;
20829N/A+ case LIR_andi:
20829N/A AND(rr, L2, rr);
20829N/A- else if (op == LIR_ori)
20829N/A+ break;
20829N/A+ case LIR_ori:
20829N/A OR(rr, L2, rr);
20829N/A- else if (op == LIR_xori)
20829N/A+ break;
20829N/A+ case LIR_xori:
20829N/A XOR(rr, L2, rr);
20829N/A- else if (op == LIR_lshi)
20829N/A+ break;
20829N/A+ case LIR_lshi:
20829N/A SLL(rr, L2, rr);
20829N/A- else if (op == LIR_rshi)
20829N/A+ break;
20829N/A+ case LIR_rshi:
20829N/A SRA(rr, L2, rr);
20829N/A- else if (op == LIR_rshui)
20829N/A+ break;
20829N/A+ case LIR_rshui:
20829N/A SRL(rr, L2, rr);
20829N/A- else
20829N/A+ break;
20829N/A+ default:
20829N/A NanoAssertMsg(0, "Unsupported");
20829N/A- SET32(c, L2);
20829N/A+ return;
20829N/A }
20829N/A+ SET32(c, L2);
20829N/A+ }
20829N/A
20829N/A- if ( rr != ra )
20829N/A+ if (rr != ra)
20829N/A ORI(ra, 0, rr);
20829N/A+
20829N/A+ freeResourcesOf(ins);
20829N/A+ if (!lhs->isInReg()) {
20829N/A+ NanoAssert(ra == rr);
20829N/A+ findSpecificRegForUnallocated(lhs, ra);
20829N/A+ }
20829N/A }
20829N/A
20829N/A void Assembler::asm_neg_not(LIns* ins)
20829N/A {
20829N/A- underrunProtect(8);
20829N/A LOpcode op = ins->opcode();
20829N/A- Register rr = deprecated_prepResultReg(ins, GpRegs);
20829N/A+ Register rr = prepareResultReg(ins, GpRegs);
20829N/A
20829N/A+ SafeUnderrunProtect protect(this, 16);
20829N/A LIns* lhs = ins->oprnd1();
20829N/A- // if this is last use of lhs in reg, we can re-use result reg
20829N/A- // else, lhs already has a register assigned.
20829N/A- Register ra = ( !lhs->isInReg()
20829N/A- ? findSpecificRegFor(lhs, rr)
20829N/A- : lhs->deprecated_getReg() );
20829N/A+ // If 'lhs' isn't in a register, it can be clobbered by 'ins'.
20829N/A+ Register ra = lhs->isInReg() ? lhs->getReg() : rr;
20829N/A
20829N/A if (op == LIR_noti)
20829N/A ORN(G0, rr, rr);
20829N/A@@ -1282,43 +1312,44 @@
20829N/A else
20829N/A SUB(G0, rr, rr);
20829N/A
20829N/A- if ( rr != ra )
20829N/A+ if (rr != ra)
20829N/A ORI(ra, 0, rr);
20829N/A+
20829N/A+ freeResourcesOf(ins);
20829N/A+ if (!lhs->isInReg()) {
20829N/A+ NanoAssert(ra == rr);
20829N/A+ findSpecificRegForUnallocated(lhs, ra);
20829N/A+ }
20829N/A }
20829N/A
20829N/A void Assembler::asm_load32(LIns* ins)
20829N/A {
20829N/A- underrunProtect(12);
20829N/A LOpcode op = ins->opcode();
20829N/A LIns* base = ins->oprnd1();
20829N/A int d = ins->disp();
20829N/A- Register rr = deprecated_prepResultReg(ins, GpRegs);
20829N/A+ Register rr = prepareResultReg(ins, GpRegs);
20829N/A Register ra = getBaseReg(base, d, GpRegs);
20829N/A+
20829N/A+ SafeUnderrunProtect protect(this, 12);
20829N/A switch(op) {
20829N/A- case LIR_lduc2ui:
20829N/A- LDUB32(ra, d, rr);
20829N/A- break;
20829N/A- case LIR_ldus2ui:
20829N/A- LDUH32(ra, d, rr);
20829N/A- break;
20829N/A- case LIR_ldi:
20829N/A- LDSW32(ra, d, rr);
20829N/A- break;
20829N/A- case LIR_ldc2i:
20829N/A- LDSB32(ra, d, rr);
20829N/A- break;
20829N/A- case LIR_lds2i:
20829N/A- LDSH32(ra, d, rr);
20829N/A- break;
20829N/A+ case LIR_lduc2ui: LDUB32(ra, d, rr); break;
20829N/A+ case LIR_ldus2ui: LDUH32(ra, d, rr); break;
20829N/A+ case LIR_ldi : LDSW32(ra, d, rr); break;
20829N/A+ case LIR_ldc2i : LDSB32(ra, d, rr); break;
20829N/A+ case LIR_lds2i : LDSH32(ra, d, rr); break;
20829N/A default:
20829N/A NanoAssertMsg(0, "asm_load32 should never receive this LIR opcode");
20829N/A return;
20829N/A }
20829N/A+ freeResourcesOf(ins);
20829N/A+ if (!base->isop(LIR_allocp) && !base->isInReg()) {
20829N/A+ NanoAssert(ra == rr);
20829N/A+ findSpecificRegForUnallocated(base, ra);
20829N/A+ }
20829N/A }
20829N/A
20829N/A void Assembler::asm_cmov(LIns* ins)
20829N/A {
20829N/A- underrunProtect(4);
20829N/A LOpcode op = ins->opcode();
20829N/A LIns* condval = ins->oprnd1();
20829N/A LIns* iftrue = ins->oprnd2();
20829N/A@@ -1329,7 +1360,7 @@
20829N/A (op == LIR_cmovd && iftrue->isD() && iffalse->isD()));
20829N/A
20829N/A RegisterMask rm = (op == LIR_cmovi) ? GpRegs : FpRegs;
20829N/A- const Register rr = deprecated_prepResultReg(ins, rm);
20829N/A+ const Register rr = prepareResultReg(ins, rm);
20829N/A const Register iffalsereg = findRegFor(iffalse, rm & ~rmask(rr));
20829N/A bool isIcc = true;
20829N/A
20829N/A@@ -1345,7 +1376,9 @@
20829N/A case LIR_leui: MOVGU (iffalsereg, rr); break;
20829N/A case LIR_gtui: MOVLEU(iffalsereg, rr); break;
20829N/A case LIR_geui: MOVCS (iffalsereg, rr); break;
20829N/A- debug_only( default: NanoAssert(0); break; )
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_comv should never receive this cond opcode");
20829N/A+ return;
20829N/A }
20829N/A } else {
20829N/A switch (condval->opcode()) {
20829N/A@@ -1364,10 +1397,13 @@
20829N/A case LIR_ltd: FMOVDFUGE(iffalsereg, rr); isIcc = false; break;
20829N/A case LIR_ged: FMOVDFUL (iffalsereg, rr); isIcc = false; break;
20829N/A case LIR_gtd: FMOVDFULE(iffalsereg, rr); isIcc = false; break;
20829N/A- debug_only( default: NanoAssert(0); break; )
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_comv should never receive this cond opcode");
20829N/A+ return;
20829N/A }
20829N/A }
20829N/A
20829N/A+ freeResourcesOf(ins);
20829N/A /*const Register iftruereg =*/ findSpecificRegFor(iftrue, rr);
20829N/A if (isIcc)
20829N/A asm_cmp(condval);
20829N/A@@ -1378,16 +1414,16 @@
20829N/A
20829N/A void Assembler::asm_param(LIns* ins)
20829N/A {
20829N/A- underrunProtect(12);
20829N/A uint32_t a = ins->paramArg();
20829N/A NanoAssertMsg(ins->paramKind() == 0, "savedRegs are not used on SPARC");
20829N/A
20829N/A- if (a < sizeof(argRegs)/sizeof(argRegs[0])) { // i0 - i5
20829N/A+ if (a < sizeof(argRegs) / sizeof(argRegs[0])) { // i0 - i5
20829N/A prepareResultReg(ins, rmask(argRegs[a]));
20829N/A } else {
20829N/A // Incoming arg is on stack
20829N/A Register r = prepareResultReg(ins, GpRegs);
20829N/A int32_t d = a * sizeof (intptr_t) + kLinkageAreaSize;
20829N/A+ SafeUnderrunProtect protect(this, 12);
20829N/A LDSW32(FP, d, r);
20829N/A }
20829N/A freeResourcesOf(ins);
20829N/A@@ -1395,100 +1431,102 @@
20829N/A
20829N/A void Assembler::asm_immi(LIns* ins)
20829N/A {
20829N/A- underrunProtect(8);
20829N/A- Register rr = deprecated_prepResultReg(ins, GpRegs);
20829N/A+ Register rr = prepareResultReg(ins, GpRegs);
20829N/A+ SafeUnderrunProtect protect(this, 12);
20829N/A int32_t val = ins->immI();
20829N/A if (val == 0)
20829N/A XOR(rr, rr, rr);
20829N/A else
20829N/A SET32(val, rr);
20829N/A+ freeResourcesOf(ins);
20829N/A }
20829N/A
20829N/A void Assembler::asm_immd(LIns* ins)
20829N/A {
20829N/A- underrunProtect(64);
20829N/A- Register rr = ins->deprecated_getReg();
20829N/A- if (rr != deprecated_UnknownReg)
20829N/A- {
20829N/A- // @todo -- add special-cases for 0 and 1
20829N/A- _allocator.retire(rr);
20829N/A- ins->clearReg();
20829N/A- NanoAssert((rmask(rr) & FpRegs) != 0);
20829N/A- findMemFor(ins);
20829N/A- int d = deprecated_disp(ins);
20829N/A- LDDF32(FP, d, rr);
20829N/A- }
20829N/A+ SafeUnderrunProtect protect(this, 64);
20829N/A+ if (ins->isInReg()) {
20829N/A+ Register rr = ins->getReg();
20829N/A+ // @todo -- add special-cases for 0 and 1
20829N/A+ _allocator.retire(rr);
20829N/A+ ins->clearReg();
20829N/A+ NanoAssert((rmask(rr) & FpRegs) != 0);
20829N/A+ findMemFor(ins);
20829N/A+ int d = arDisp(ins);
20829N/A+ LDDF32(FP, d, rr);
20829N/A+ }
20829N/A
20829N/A // @todo, if we used xor, ldsd, fldz, etc above, we don't need mem here
20829N/A- int d = deprecated_disp(ins);
20829N/A- deprecated_freeRsrcOf(ins);
20829N/A- if (d)
20829N/A- {
20829N/A- STW32(L2, d+4, FP);
20829N/A- SET32(ins->immDlo(), L2);
20829N/A- STW32(L2, d, FP);
20829N/A- SET32(ins->immDhi(), L2);
20829N/A- }
20829N/A+ int d = arDisp(ins);
20829N/A+ if (d) {
20829N/A+ STW32(L2, d+4, FP);
20829N/A+ SET32(ins->immDlo(), L2);
20829N/A+ STW32(L2, d, FP);
20829N/A+ SET32(ins->immDhi(), L2);
20829N/A+ }
20829N/A+ freeResourcesOf(ins);
20829N/A }
20829N/A
20829N/A void Assembler::asm_fneg(LIns* ins)
20829N/A {
20829N/A- underrunProtect(4);
20829N/A- Register rr = deprecated_prepResultReg(ins, FpRegs);
20829N/A+ Register rr = prepareResultReg(ins, FpRegs);
20829N/A LIns* lhs = ins->oprnd1();
20829N/A
20829N/A- // lhs into reg, prefer same reg as result
20829N/A- // if this is last use of lhs in reg, we can re-use result reg
20829N/A- // else, lhs already has a different reg assigned
20829N/A- Register ra = ( !lhs->isInReg()
20829N/A- ? findSpecificRegFor(lhs, rr)
20829N/A- : findRegFor(lhs, FpRegs) );
20829N/A+ // If 'lhs' isn't in a register, it can be clobbered by 'ins'.
20829N/A+ Register ra = lhs->isInReg() ? lhs->getReg() : rr;
20829N/A
20829N/A FNEGD(ra, rr);
20829N/A+
20829N/A+ freeResourcesOf(ins);
20829N/A+ if (!lhs->isInReg()) {
20829N/A+ NanoAssert(ra == rr);
20829N/A+ findSpecificRegForUnallocated(lhs, ra);
20829N/A+ }
20829N/A }
20829N/A
20829N/A void Assembler::asm_fop(LIns* ins)
20829N/A {
20829N/A- underrunProtect(4);
20829N/A LOpcode op = ins->opcode();
20829N/A- LIns *lhs = ins->oprnd1();
20829N/A- LIns *rhs = ins->oprnd2();
20829N/A+ LIns* lhs = ins->oprnd1();
20829N/A+ LIns* rhs = ins->oprnd2();
20829N/A
20829N/A RegisterMask allow = FpRegs;
20829N/A Register ra, rb;
20829N/A findRegFor2(allow, lhs, ra, allow, rhs, rb);
20829N/A- Register rr = deprecated_prepResultReg(ins, allow);
20829N/A+ Register rr = prepareResultReg(ins, allow);
20829N/A
20829N/A- if (op == LIR_addd)
20829N/A- FADDD(ra, rb, rr);
20829N/A- else if (op == LIR_subd)
20829N/A- FSUBD(ra, rb, rr);
20829N/A- else if (op == LIR_muld)
20829N/A- FMULD(ra, rb, rr);
20829N/A- else //if (op == LIR_divd)
20829N/A- FDIVD(ra, rb, rr);
20829N/A+ switch (op) {
20829N/A+ case LIR_addd: FADDD(ra, rb, rr); break;
20829N/A+ case LIR_subd: FSUBD(ra, rb, rr); break;
20829N/A+ case LIR_muld: FMULD(ra, rb, rr); break;
20829N/A+ case LIR_divd: FDIVD(ra, rb, rr); break;
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_fop should never receive this opcode");
20829N/A+ return;
20829N/A+ }
20829N/A
20829N/A+ freeResourcesOf(ins);
20829N/A }
20829N/A
20829N/A void Assembler::asm_i2d(LIns* ins)
20829N/A {
20829N/A- underrunProtect(32);
20829N/A // where our result goes
20829N/A- Register rr = deprecated_prepResultReg(ins, FpRegs);
20829N/A+ Register rr = prepareResultReg(ins, FpRegs);
20829N/A+ SafeUnderrunProtect protect(this, 32);
20829N/A int d = findMemFor(ins->oprnd1());
20829N/A FITOD(rr, rr);
20829N/A LDDF32(FP, d, rr);
20829N/A+ freeResourcesOf(ins);
20829N/A }
20829N/A
20829N/A void Assembler::asm_ui2d(LIns* ins)
20829N/A {
20829N/A- underrunProtect(72);
20829N/A // where our result goes
20829N/A- Register rr = deprecated_prepResultReg(ins, FpRegs);
20829N/A+ Register rr = prepareResultReg(ins, FpRegs);
20829N/A Register rt = registerAllocTmp(FpRegs & ~(rmask(rr)));
20829N/A Register gr = findRegFor(ins->oprnd1(), GpRegs);
20829N/A int disp = -8;
20829N/A
20829N/A+ SafeUnderrunProtect protect(this, 72);
20829N/A FABSS(rr, rr);
20829N/A FSUBD(rt, rr, rr);
20829N/A LDDF32(SP, disp, rr);
20829N/A@@ -1497,37 +1535,37 @@
20829N/A STWI(gr, disp+4, SP);
20829N/A STWI(G1, disp, SP);
20829N/A SETHI(0x43300000, G1);
20829N/A+ freeResourcesOf(ins);
20829N/A }
20829N/A
20829N/A void Assembler::asm_d2i(LIns* ins) {
20829N/A- underrunProtect(28);
20829N/A- LIns *lhs = ins->oprnd1();
20829N/A+ LIns* lhs = ins->oprnd1();
20829N/A Register rr = prepareResultReg(ins, GpRegs);
20829N/A Register ra = findRegFor(lhs, FpRegs);
20829N/A int d = findMemFor(ins);
20829N/A+ SafeUnderrunProtect protect(this, 28);
20829N/A LDSW32(FP, d, rr);
20829N/A- STF32(ra, d, FP);
20829N/A- FDTOI(ra, ra);
20829N/A+ STF32(F28, d, FP);
20829N/A+ FDTOI(ra, F28);
20829N/A freeResourcesOf(ins);
20829N/A }
20829N/A
20829N/A void Assembler::asm_nongp_copy(Register r, Register s)
20829N/A {
20829N/A- underrunProtect(4);
20829N/A NanoAssert((rmask(r) & FpRegs) && (rmask(s) & FpRegs));
20829N/A FMOVD(s, r);
20829N/A }
20829N/A
20829N/A- NIns * Assembler::asm_branchd(bool branchOnFalse, LIns *cond, NIns *targ)
20829N/A+ NIns* Assembler::asm_branchd(bool branchOnFalse, LIns* cond, NIns* targ)
20829N/A {
20829N/A- NIns *at = 0;
20829N/A+ NIns* at = 0;
20829N/A LOpcode condop = cond->opcode();
20829N/A NanoAssert(isCmpDOpcode(condop));
20829N/A- underrunProtect(32);
20829N/A+ SafeUnderrunProtect protect(this, 32);
20829N/A intptr_t tt = ((intptr_t)targ - (intptr_t)_nIns + 8) >> 2;
20829N/A // !targ means that it needs patch.
20829N/A if( !(isIMM22((int32_t)tt)) || !targ ) {
20829N/A- JMP_long_nocheck((intptr_t)targ);
20829N/A+ JMP_long((intptr_t)targ);
20829N/A at = _nIns;
20829N/A NOP();
20829N/A BA(0, 5);
20829N/A@@ -1536,39 +1574,35 @@
20829N/A NOP();
20829N/A
20829N/A // produce the branch
20829N/A- if (branchOnFalse)
20829N/A- {
20829N/A- if (condop == LIR_eqd)
20829N/A- FBNE(0, tt);
20829N/A- else if (condop == LIR_led)
20829N/A- FBUG(0, tt);
20829N/A- else if (condop == LIR_ltd)
20829N/A- FBUGE(0, tt);
20829N/A- else if (condop == LIR_ged)
20829N/A- FBUL(0, tt);
20829N/A- else //if (condop == LIR_gtd)
20829N/A- FBULE(0, tt);
20829N/A+ if (branchOnFalse) {
20829N/A+ switch (condop) {
20829N/A+ case LIR_eqd: FBNE (0, tt); break;
20829N/A+ case LIR_led: FBUG (0, tt); break;
20829N/A+ case LIR_ltd: FBUGE(0, tt); break;
20829N/A+ case LIR_ged: FBUL (0, tt); break;
20829N/A+ case LIR_gtd: FBULE(0, tt); break;
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_branchd should never receive this cond opcode");
20829N/A+ return;
20829N/A }
20829N/A- else // op == LIR_xt
20829N/A- {
20829N/A- if (condop == LIR_eqd)
20829N/A- FBE(0, tt);
20829N/A- else if (condop == LIR_led)
20829N/A- FBLE(0, tt);
20829N/A- else if (condop == LIR_ltd)
20829N/A- FBL(0, tt);
20829N/A- else if (condop == LIR_ged)
20829N/A- FBGE(0, tt);
20829N/A- else //if (condop == LIR_gtd)
20829N/A- FBG(0, tt);
20829N/A+ } else { // op == LIR_xt
20829N/A+ switch (condop) {
20829N/A+ case LIR_eqd: FBE (0, tt); break;
20829N/A+ case LIR_led: FBLE(0, tt); break;
20829N/A+ case LIR_ltd: FBL (0, tt); break;
20829N/A+ case LIR_ged: FBGE(0, tt); break;
20829N/A+ case LIR_gtd: FBG (0, tt); break;
20829N/A+ default:
20829N/A+ NanoAssertMsg(0, "asm_branchd should never receive this cond opcode");
20829N/A+ return;
20829N/A }
20829N/A+ }
20829N/A asm_cmpd(cond);
20829N/A return at;
20829N/A }
20829N/A
20829N/A- void Assembler::asm_cmpd(LIns *cond)
20829N/A+ void Assembler::asm_cmpd(LIns* cond)
20829N/A {
20829N/A- underrunProtect(4);
20829N/A LIns* lhs = cond->oprnd1();
20829N/A LIns* rhs = cond->oprnd2();
20829N/A
20829N/A@@ -1582,11 +1616,6 @@
20829N/A {
20829N/A }
20829N/A
20829N/A- Register Assembler::asm_binop_rhs_reg(LIns* ins)
20829N/A- {
20829N/A- return deprecated_UnknownReg;
20829N/A- }
20829N/A-
20829N/A void Assembler::nativePageSetup()
20829N/A {
20829N/A NanoAssert(!_inExit);
20829N/A@@ -1606,11 +1635,12 @@
20829N/A void
20829N/A Assembler::underrunProtect(int n)
20829N/A {
20829N/A- NIns *eip = _nIns;
20829N/A+ NIns* eip = _nIns;
20829N/A+ NanoAssertMsg(n <= LARGEST_UNDERRUN_PROT, "constant LARGEST_UNDERRUN_PROT is too small %d");
20829N/A // This may be in a normal code chunk or an exit code chunk.
20829N/A- if (eip - n < codeStart) {
20829N/A+ if ((intptr_t)eip - n < (intptr_t)codeStart) {
20829N/A codeAlloc(codeStart, codeEnd, _nIns verbose_only(, codeBytes));
20829N/A- JMP_long_nocheck((intptr_t)eip);
20829N/A+ JMP_long((intptr_t)eip);
20829N/A }
20829N/A }
20829N/A
20829N/A@@ -1619,7 +1649,7 @@
20829N/A genEpilogue();
20829N/A releaseRegisters();
20829N/A assignSavedRegs();
20829N/A- LIns *val = ins->oprnd1();
20829N/A+ LIns* val = ins->oprnd1();
20829N/A if (ins->isop(LIR_reti)) {
20829N/A findSpecificRegFor(val, retRegs[0]);
20829N/A } else {