|
|
@ -867,10 +867,17 @@ void EmitIR<IR::Opcode::VectorMaxS32>(oaknut::CodeGenerator& code, EmitContext& |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
void EmitIR<IR::Opcode::VectorMaxS64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { |
|
|
void EmitIR<IR::Opcode::VectorMaxS64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { |
|
|
|
|
|
#ifdef __APPLE__
|
|
|
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { |
|
|
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { |
|
|
code.CMGT(Qresult->D2(), Qa->D2(), Qb->D2()); |
|
|
code.CMGT(Qresult->D2(), Qa->D2(), Qb->D2()); |
|
|
code.BSL(Qresult->B16(), Qa->B16(), Qb->B16()); |
|
|
code.BSL(Qresult->B16(), Qa->B16(), Qb->B16()); |
|
|
}); |
|
|
}); |
|
|
|
|
|
#else
|
|
|
|
|
|
(void)code; |
|
|
|
|
|
(void)ctx; |
|
|
|
|
|
(void)inst; |
|
|
|
|
|
UNREACHABLE(); |
|
|
|
|
|
#endif
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
@ -890,10 +897,17 @@ void EmitIR<IR::Opcode::VectorMaxU32>(oaknut::CodeGenerator& code, EmitContext& |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
void EmitIR<IR::Opcode::VectorMaxU64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { |
|
|
void EmitIR<IR::Opcode::VectorMaxU64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { |
|
|
|
|
|
#ifdef __APPLE__
|
|
|
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { |
|
|
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { |
|
|
code.CMHI(Qresult->D2(), Qa->D2(), Qb->D2()); |
|
|
code.CMHI(Qresult->D2(), Qa->D2(), Qb->D2()); |
|
|
code.BSL(Qresult->B16(), Qa->B16(), Qb->B16()); |
|
|
code.BSL(Qresult->B16(), Qa->B16(), Qb->B16()); |
|
|
}); |
|
|
}); |
|
|
|
|
|
#else
|
|
|
|
|
|
(void)code; |
|
|
|
|
|
(void)ctx; |
|
|
|
|
|
(void)inst; |
|
|
|
|
|
UNREACHABLE(); |
|
|
|
|
|
#endif
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
@ -913,10 +927,17 @@ void EmitIR<IR::Opcode::VectorMinS32>(oaknut::CodeGenerator& code, EmitContext& |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
void EmitIR<IR::Opcode::VectorMinS64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { |
|
|
void EmitIR<IR::Opcode::VectorMinS64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { |
|
|
|
|
|
#ifdef __APPLE__
|
|
|
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { |
|
|
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { |
|
|
code.CMGT(Qresult->D2(), Qb->D2(), Qa->D2()); |
|
|
code.CMGT(Qresult->D2(), Qb->D2(), Qa->D2()); |
|
|
code.BSL(Qresult->B16(), Qa->B16(), Qb->B16()); |
|
|
code.BSL(Qresult->B16(), Qa->B16(), Qb->B16()); |
|
|
}); |
|
|
}); |
|
|
|
|
|
#else
|
|
|
|
|
|
(void)code; |
|
|
|
|
|
(void)ctx; |
|
|
|
|
|
(void)inst; |
|
|
|
|
|
UNREACHABLE(); |
|
|
|
|
|
#endif
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
@ -936,10 +957,17 @@ void EmitIR<IR::Opcode::VectorMinU32>(oaknut::CodeGenerator& code, EmitContext& |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
void EmitIR<IR::Opcode::VectorMinU64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { |
|
|
void EmitIR<IR::Opcode::VectorMinU64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { |
|
|
|
|
|
#ifdef __APPLE__
|
|
|
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { |
|
|
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { |
|
|
code.CMHI(Qresult->D2(), Qb->D2(), Qa->D2()); |
|
|
code.CMHI(Qresult->D2(), Qb->D2(), Qa->D2()); |
|
|
code.BSL(Qresult->B16(), Qa->B16(), Qb->B16()); |
|
|
code.BSL(Qresult->B16(), Qa->B16(), Qb->B16()); |
|
|
}); |
|
|
}); |
|
|
|
|
|
#else
|
|
|
|
|
|
(void)code; |
|
|
|
|
|
(void)ctx; |
|
|
|
|
|
(void)inst; |
|
|
|
|
|
UNREACHABLE(); |
|
|
|
|
|
#endif
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<> |
|
|
template<> |
|
|
|