use avx instructions

This commit is contained in:
Anthony Pesch 2016-04-06 01:08:14 -07:00
parent 7defb9ab45
commit 898e4001f4
5 changed files with 109 additions and 164 deletions

View File

@ -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<int32_t>(&val));
vmovd(xmm1, eax);
} else {
double val = v->f64();
mov(rax, re::load<int64_t>(&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<int32_t>(&val));
movd(reinterpret_cast<const Xbyak::Xmm &>(to), eax);
} else {
double val = v->f64();
mov(rax, re::load<int64_t>(&val));
movq(reinterpret_cast<const Xbyak::Xmm &>(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<const Xbyak::Xmm &>(to), from);
} else if (to.isMEM() && to.isBit(32)) {
movss(reinterpret_cast<const Xbyak::Address &>(to), from);
} else if (to.isMEM() && to.isBit(64)) {
movsd(reinterpret_cast<const Xbyak::Address &>(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<const Xbyak::Xmm &>(to), from);
} else if (to.isXMM() && from.isBit(64)) {
movsd(reinterpret_cast<const Xbyak::Xmm &>(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<uint64_t>(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<uint64_t>(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);
}

View File

@ -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];
};
}
}

View File

@ -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;
}

View File

@ -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

View File

@ -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)