diff --git a/src/jit/backend/x64/x64_emitter.cc b/src/jit/backend/x64/x64_emitter.cc index 4b4a64c7..a6b928ea 100644 --- a/src/jit/backend/x64/x64_emitter.cc +++ b/src/jit/backend/x64/x64_emitter.cc @@ -82,6 +82,24 @@ X64Emitter::~X64Emitter() { delete[] modified_; } void X64Emitter::Reset() { reset(); + // emit xmm constants to codegen buffer + L(xmm_const_[XMM_CONST_ABS_MASK_PS]); + dq(INT64_C(0x7fffffff7fffffff)); + dq(INT64_C(0x7fffffff7fffffff)); + + L(xmm_const_[XMM_CONST_ABS_MASK_PD]); + dq(INT64_C(0x7fffffffffffffff)); + dq(INT64_C(0x7fffffffffffffff)); + + L(xmm_const_[XMM_CONST_SIGN_MASK_PS]); + dq(INT64_C(0x8000000080000000)); + dq(INT64_C(0x8000000080000000)); + + L(xmm_const_[XMM_CONST_SIGN_MASK_PD]); + dq(INT64_C(0x8000000000000000)); + dq(INT64_C(0x8000000000000000)); + + // reset modified registers modified_marker_ = 0; memset(modified_, modified_marker_, sizeof(int) * x64_num_registers); } @@ -227,7 +245,7 @@ const Xbyak::Reg X64Emitter::GetRegister(const Value *v) { } // copy value to the temporary register - CopyOperand(v, tmp); + mov(tmp, v->GetZExtValue()); return tmp; } @@ -256,9 +274,18 @@ const Xbyak::Reg X64Emitter::GetRegister(const Value *v) { // If the value isn't allocated a XMM register copy it to a temporary XMM, // register, else return the XMM register allocated for it. -const Xbyak::Xmm X64Emitter::GetXMMRegister(const Value *v) { +const Xbyak::Xmm X64Emitter::GetXmmRegister(const Value *v) { if (v->constant()) { - CopyOperand(v, xmm1); + // copy value to the temporary register + if (v->type() == VALUE_F32) { + float val = v->f32(); + mov(eax, re::load(&val)); + vmovd(xmm1, eax); + } else { + double val = v->f64(); + mov(rax, re::load(&val)); + vmovq(xmm1, rax); + } return xmm1; } @@ -271,53 +298,8 @@ const Xbyak::Xmm X64Emitter::GetXMMRegister(const Value *v) { return xmm; } -// Copy the value to the supplied operand. -void X64Emitter::CopyOperand(const Value *v, const Xbyak::Reg &to) { - if (v->constant()) { - if (to.isXMM()) { - CHECK(IsFloatType(v->type())); - - if (v->type() == VALUE_F32) { - float val = v->f32(); - mov(eax, re::load(&val)); - movd(reinterpret_cast(to), eax); - } else { - double val = v->f64(); - mov(rax, re::load(&val)); - movq(reinterpret_cast(to), rax); - } - } else { - CHECK(IsIntType(v->type())); - - mov(to, v->GetZExtValue()); - } - } else if (IsFloatType(v->type())) { - const Xbyak::Xmm from = GetXMMRegister(v); - - if (from != to) { - if (to.isXMM()) { - movdqa(reinterpret_cast(to), from); - } else if (to.isMEM() && to.isBit(32)) { - movss(reinterpret_cast(to), from); - } else if (to.isMEM() && to.isBit(64)) { - movsd(reinterpret_cast(to), from); - } else { - LOG_FATAL("Unexpected copy"); - } - } - } else { - const Xbyak::Reg from = GetRegister(v); - - if (from != to) { - if (to.isXMM() && from.isBit(32)) { - movss(reinterpret_cast(to), from); - } else if (to.isXMM() && from.isBit(64)) { - movsd(reinterpret_cast(to), from); - } else { - mov(to, from); - } - } - } +const Xbyak::Address X64Emitter::GetXmmConstant(XmmConstant c) { + return ptr[rip + xmm_const_[c]]; } Xbyak::Label *X64Emitter::AllocLabel() { @@ -338,7 +320,7 @@ EMITTER(LOAD_HOST) { const Xbyak::Reg a = e.GetRegister(instr->arg0()); if (IsFloatType(instr->type())) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); + const Xbyak::Xmm result = e.GetXmmRegister(instr); switch (instr->type()) { case VALUE_F32: @@ -378,14 +360,14 @@ EMITTER(STORE_HOST) { const Xbyak::Reg a = e.GetRegister(instr->arg0()); if (IsFloatType(instr->arg1()->type())) { - const Xbyak::Xmm b = e.GetXMMRegister(instr->arg1()); + const Xbyak::Xmm b = e.GetXmmRegister(instr->arg1()); switch (instr->arg1()->type()) { case VALUE_F32: - e.movss(e.dword[a], b); + e.vmovss(e.dword[a], b); break; case VALUE_F64: - e.movsd(e.qword[a], b); + e.vmovsd(e.qword[a], b); break; default: LOG_FATAL("Unexpected value type"); @@ -603,14 +585,14 @@ EMITTER(LOAD_CONTEXT) { int offset = instr->arg0()->i32(); if (IsFloatType(instr->type())) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); + const Xbyak::Xmm result = e.GetXmmRegister(instr); switch (instr->type()) { case VALUE_F32: - e.movss(result, e.dword[e.r14 + offset]); + e.vmovss(result, e.dword[e.r14 + offset]); break; case VALUE_F64: - e.movsd(result, e.qword[e.r14 + offset]); + e.vmovsd(result, e.qword[e.r14 + offset]); break; default: LOG_FATAL("Unexpected result type"); @@ -664,14 +646,14 @@ EMITTER(STORE_CONTEXT) { } } else { if (IsFloatType(instr->arg1()->type())) { - const Xbyak::Xmm src = e.GetXMMRegister(instr->arg1()); + const Xbyak::Xmm src = e.GetXmmRegister(instr->arg1()); switch (instr->arg1()->type()) { case VALUE_F32: - e.movss(e.dword[e.r14 + offset], src); + e.vmovss(e.dword[e.r14 + offset], src); break; case VALUE_F64: - e.movsd(e.qword[e.r14 + offset], src); + e.vmovsd(e.qword[e.r14 + offset], src); break; default: LOG_FATAL("Unexpected value type"); @@ -705,14 +687,14 @@ EMITTER(LOAD_LOCAL) { int offset = STACK_OFFSET_LOCALS + instr->arg0()->i32(); if (IsFloatType(instr->type())) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); + const Xbyak::Xmm result = e.GetXmmRegister(instr); switch (instr->type()) { case VALUE_F32: - e.movss(result, e.dword[e.rsp + offset]); + e.vmovss(result, e.dword[e.rsp + offset]); break; case VALUE_F64: - e.movsd(result, e.qword[e.rsp + offset]); + e.vmovsd(result, e.qword[e.rsp + offset]); break; default: LOG_FATAL("Unexpected result type"); @@ -747,14 +729,14 @@ EMITTER(STORE_LOCAL) { CHECK(!instr->arg1()->constant()); if (IsFloatType(instr->arg1()->type())) { - const Xbyak::Xmm src = e.GetXMMRegister(instr->arg1()); + const Xbyak::Xmm src = e.GetXmmRegister(instr->arg1()); switch (instr->arg1()->type()) { case VALUE_F32: - e.movss(e.dword[e.rsp + offset], src); + e.vmovss(e.dword[e.rsp + offset], src); break; case VALUE_F64: - e.movsd(e.qword[e.rsp + offset], src); + e.vmovsd(e.qword[e.rsp + offset], src); break; default: LOG_FATAL("Unexpected value type"); @@ -785,7 +767,7 @@ EMITTER(STORE_LOCAL) { EMITTER(FTOI) { const Xbyak::Reg result = e.GetRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); switch (instr->type()) { case VALUE_I32: @@ -803,7 +785,7 @@ EMITTER(FTOI) { } EMITTER(ITOF) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); + const Xbyak::Xmm result = e.GetXmmRegister(instr); const Xbyak::Reg a = e.GetRegister(instr->arg0()); switch (instr->type()) { @@ -888,15 +870,15 @@ EMITTER(TRUNC) { } EMITTER(FEXT) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); e.cvtss2sd(result, a); } EMITTER(FTRUNC) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); e.cvtsd2ss(result, a); } @@ -979,8 +961,8 @@ EMITTER(CMP) { EMITTER(FCMP) { const Xbyak::Reg result = e.GetRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); - const Xbyak::Xmm b = e.GetXMMRegister(instr->arg1()); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); + const Xbyak::Xmm b = e.GetXmmRegister(instr->arg1()); if (instr->arg0()->type() == VALUE_F32) { e.comiss(a, b); @@ -1097,129 +1079,83 @@ EMITTER(ABS) { } EMITTER(FADD) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); - const Xbyak::Xmm b = e.GetXMMRegister(instr->arg1()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); + const Xbyak::Xmm b = e.GetXmmRegister(instr->arg1()); if (instr->type() == VALUE_F32) { - if (result != a) { - e.movss(result, a); - } - - e.addss(result, b); + e.vaddss(result, a, b); } else { - if (result != a) { - e.movsd(result, a); - } - - e.addsd(result, b); + e.vaddsd(result, a, b); } } EMITTER(FSUB) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); - const Xbyak::Xmm b = e.GetXMMRegister(instr->arg1()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); + const Xbyak::Xmm b = e.GetXmmRegister(instr->arg1()); if (instr->type() == VALUE_F32) { - if (result != a) { - e.movss(result, a); - } - - e.subss(result, b); + e.vsubss(result, a, b); } else { - if (result != a) { - e.movsd(result, a); - } - - e.subsd(result, b); + e.vsubsd(result, a, b); } } EMITTER(FMUL) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); - const Xbyak::Xmm b = e.GetXMMRegister(instr->arg1()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); + const Xbyak::Xmm b = e.GetXmmRegister(instr->arg1()); if (instr->type() == VALUE_F32) { - if (result != a) { - e.movss(result, a); - } - - e.mulss(result, b); + e.vmulss(result, a, b); } else { - if (result != a) { - e.movsd(result, a); - } - - e.mulsd(result, b); + e.vmulsd(result, a, b); } } EMITTER(FDIV) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); - const Xbyak::Xmm b = e.GetXMMRegister(instr->arg1()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); + const Xbyak::Xmm b = e.GetXmmRegister(instr->arg1()); if (instr->type() == VALUE_F32) { - if (result != a) { - e.movss(result, a); - } - - e.divss(result, b); + e.vdivss(result, a, b); } else { - if (result != a) { - e.movsd(result, a); - } - - e.divsd(result, b); + e.vdivsd(result, a, b); } } EMITTER(FNEG) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); if (instr->type() == VALUE_F32) { - // TODO use xorps - e.movd(e.eax, a); - e.xor (e.eax, (uint32_t)0x80000000); - e.movd(result, e.eax); + e.vxorps(result, a, e.GetXmmConstant(XMM_CONST_SIGN_MASK_PS)); } else { - // TODO use xorpd - e.movq(e.rax, a); - e.mov(e.r9, (uint64_t)0x8000000000000000); - e.xor (e.rax, e.r9); - e.movq(result, e.rax); + e.vxorpd(result, a, e.GetXmmConstant(XMM_CONST_SIGN_MASK_PD)); } } EMITTER(FABS) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); if (instr->type() == VALUE_F32) { - // TODO use andps - e.movd(e.eax, a); - e.and (e.eax, (uint32_t)0x7fffffff); - e.movd(result, e.eax); + e.vandps(result, a, e.GetXmmConstant(XMM_CONST_ABS_MASK_PS)); } else { - // TODO use andpd - e.movq(e.rax, a); - e.mov(e.r9, (uint64_t)0x7fffffffffffffff); - e.and (e.rax, e.r9); - e.movq(result, e.rax); + e.vandpd(result, a, e.GetXmmConstant(XMM_CONST_ABS_MASK_PD)); } } EMITTER(SQRT) { - const Xbyak::Xmm result = e.GetXMMRegister(instr); - const Xbyak::Xmm a = e.GetXMMRegister(instr->arg0()); + const Xbyak::Xmm result = e.GetXmmRegister(instr); + const Xbyak::Xmm a = e.GetXmmRegister(instr->arg0()); if (instr->type() == VALUE_F32) { - e.sqrtss(result, a); + e.vsqrtss(result, a); } else { - e.sqrtsd(result, a); + e.vsqrtsd(result, a); } } @@ -1416,15 +1352,13 @@ EMITTER(LSHD) { } EMITTER(CALL_EXTERNAL) { - e.mov(arg0, reinterpret_cast(e.guest_ctx())); + const Xbyak::Reg addr = e.GetRegister(instr->arg0()); - // if an additional argument is specified, copy it into the register for arg1 + e.mov(arg0, reinterpret_cast(e.guest_ctx())); if (instr->arg1()) { const Xbyak::Reg arg = e.GetRegister(instr->arg1()); e.mov(arg1, arg); } - - // call the external function - e.CopyOperand(instr->arg0(), e.rax); + e.mov(e.rax, addr); e.call(e.rax); } diff --git a/src/jit/backend/x64/x64_emitter.h b/src/jit/backend/x64/x64_emitter.h index 2de8aafd..aa287996 100644 --- a/src/jit/backend/x64/x64_emitter.h +++ b/src/jit/backend/x64/x64_emitter.h @@ -24,6 +24,14 @@ enum { STACK_SIZE = STACK_OFFSET_LOCALS }; +enum XmmConstant { + XMM_CONST_ABS_MASK_PS, + XMM_CONST_ABS_MASK_PD, + XMM_CONST_SIGN_MASK_PS, + XMM_CONST_SIGN_MASK_PD, + NUM_XMM_CONST, +}; + class X64Emitter : public Xbyak::CodeGenerator { public: X64Emitter(void *buffer, size_t buffer_size); @@ -40,8 +48,8 @@ class X64Emitter : public Xbyak::CodeGenerator { // helpers for the emitter callbacks const Xbyak::Reg GetRegister(const ir::Value *v); - const Xbyak::Xmm GetXMMRegister(const ir::Value *v); - void CopyOperand(const ir::Value *v, const Xbyak::Reg &to); + const Xbyak::Xmm GetXmmRegister(const ir::Value *v); + const Xbyak::Address GetXmmConstant(XmmConstant c); Xbyak::Label *AllocLabel(); @@ -59,6 +67,7 @@ class X64Emitter : public Xbyak::CodeGenerator { int modified_marker_; int *modified_; int num_temps_; + Xbyak::Label xmm_const_[NUM_XMM_CONST]; }; } } diff --git a/src/jit/ir/passes/register_allocation_pass.cc b/src/jit/ir/passes/register_allocation_pass.cc index caabb4ad..84813ad1 100644 --- a/src/jit/ir/passes/register_allocation_pass.cc +++ b/src/jit/ir/passes/register_allocation_pass.cc @@ -18,7 +18,8 @@ static inline bool RegisterCanStore(const Register &r, ValueType type) { struct LiveIntervalSort { bool operator()(const Interval *lhs, const Interval *rhs) const { - return !lhs->next || GetOrdinal(lhs->next->instr()) < GetOrdinal(rhs->next->instr()); + return !lhs->next || + GetOrdinal(lhs->next->instr()) < GetOrdinal(rhs->next->instr()); } }; @@ -184,7 +185,8 @@ void RegisterAllocationPass::ExpireOldIntervals(Instr *instr) { // intervals are sorted by their next use, once one fails to expire or // advance, they all will - if (interval->next && GetOrdinal(interval->next->instr()) >= GetOrdinal(instr)) { + if (interval->next && + GetOrdinal(interval->next->instr()) >= GetOrdinal(instr)) { break; } diff --git a/test/asm/fabs.s b/test/asm/fabs.s index ced6622c..fe9d96f2 100644 --- a/test/asm/fabs.s +++ b/test/asm/fabs.s @@ -1,10 +1,10 @@ test_fabsd: # REGISTER_IN fpscr 0x000c0001 - # REGISTER_IN dr2 0xc010000000000000 + # REGISTER_IN dr2 0xc0100000f0000000 fabs dr2 rts nop - # REGISTER_OUT dr2 0x4010000000000000 + # REGISTER_OUT dr2 0x40100000f0000000 test_fabsf: # REGISTER_IN fr1 0xc0800000 diff --git a/test/test_sh4.inc b/test/test_sh4.inc index d196529e..0be8b553 100644 --- a/test/test_sh4.inc +++ b/test/test_sh4.inc @@ -41,7 +41,7 @@ TEST_SH4(test_extsb,(uint8_t *)"\x0e\x61\x0b\x00\x09\x00\x0f\x61\x0b\x00\x09\x00 TEST_SH4(test_extuw,(uint8_t *)"\x0e\x61\x0b\x00\x09\x00\x0f\x61\x0b\x00\x09\x00\x0c\x61\x0b\x00\x09\x00\x0d\x61\x0b\x00\x09\x00",24,0x12,0xbaadf00d,0xfffa3002,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x3002,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d) TEST_SH4(test_extsw,(uint8_t *)"\x0e\x61\x0b\x00\x09\x00\x0f\x61\x0b\x00\x09\x00\x0c\x61\x0b\x00\x09\x00\x0d\x61\x0b\x00\x09\x00",24,0x6,0xbaadf00d,0xffff,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xffffffff,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d) TEST_SH4(test_extub,(uint8_t *)"\x0e\x61\x0b\x00\x09\x00\x0f\x61\x0b\x00\x09\x00\x0c\x61\x0b\x00\x09\x00\x0d\x61\x0b\x00\x09\x00",24,0xc,0xbaadf00d,0xfffa3002,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x2,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d) -TEST_SH4(test_fabsd,(uint8_t *)"\x5d\xf2\x0b\x00\x09\x00\x5d\xf1\x0b\x00\x09\x00",12,0x0,0xc0001,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xc0100000L,0x0L,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x40100000,0x0,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d) +TEST_SH4(test_fabsd,(uint8_t *)"\x5d\xf2\x0b\x00\x09\x00\x5d\xf1\x0b\x00\x09\x00",12,0x0,0xc0001,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xc0100000L,0xf0000000L,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x40100000,0xf0000000,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d) TEST_SH4(test_fabsf,(uint8_t *)"\x5d\xf2\x0b\x00\x09\x00\x5d\xf1\x0b\x00\x09\x00",12,0x6,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xc0800000,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x40800000,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d) TEST_SH4(test_faddf,(uint8_t *)"\x00\xf2\x0b\x00\x09\x00\x00\xf1\x0b\x00\x09\x00",12,0x6,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x40400000,0xbf800000,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x40000000,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d) TEST_SH4(test_faddd,(uint8_t *)"\x00\xf2\x0b\x00\x09\x00\x00\xf1\x0b\x00\x09\x00",12,0x0,0xc0001,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x40140000,0x0,0xc0180000L,0x0L,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbff00000L,0x0L,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)