Commit eb568f55 by Nicolas Capens Committed by Jim Stichnoth

Implement minps/maxps x86 instructions.

BUG=swiftshader:19 Change-Id: I6954db6f1ab3456a199d164676d7f01f91ff7514 Reviewed-on: https://chromium-review.googlesource.com/400090Reviewed-by: 's avatarJim Stichnoth <stichnot@chromium.org>
parent e9655304
...@@ -113,6 +113,8 @@ template <typename TraitsType> struct InstImpl { ...@@ -113,6 +113,8 @@ template <typename TraitsType> struct InstImpl {
Lea, Lea,
Load, Load,
Mfence, Mfence,
Minps,
Maxps,
Minss, Minss,
Maxss, Maxss,
Mov, Mov,
...@@ -1719,6 +1721,38 @@ template <typename TraitsType> struct InstImpl { ...@@ -1719,6 +1721,38 @@ template <typename TraitsType> struct InstImpl {
Source) {} Source) {}
}; };
class InstX86Maxps
: public InstX86BaseBinopXmm<InstX86Base::Maxps, true,
InstX86Base::SseSuffix::None> {
public:
static InstX86Maxps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Maxps>())
InstX86Maxps(Func, Dest, Source);
}
private:
InstX86Maxps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<InstX86Base::Maxps, true,
InstX86Base::SseSuffix::None>(Func, Dest,
Source) {}
};
class InstX86Minps
: public InstX86BaseBinopXmm<InstX86Base::Minps, true,
InstX86Base::SseSuffix::None> {
public:
static InstX86Minps *create(Cfg *Func, Variable *Dest, Operand *Source) {
return new (Func->allocate<InstX86Minps>())
InstX86Minps(Func, Dest, Source);
}
private:
InstX86Minps(Cfg *Func, Variable *Dest, Operand *Source)
: InstX86BaseBinopXmm<InstX86Base::Minps, true,
InstX86Base::SseSuffix::None>(Func, Dest,
Source) {}
};
class InstX86Or : public InstX86BaseBinopGPR<InstX86Base::Or> { class InstX86Or : public InstX86BaseBinopGPR<InstX86Base::Or> {
public: public:
static InstX86Or *create(Cfg *Func, Variable *Dest, Operand *Source) { static InstX86Or *create(Cfg *Func, Variable *Dest, Operand *Source) {
...@@ -3210,6 +3244,8 @@ template <typename TraitsType> struct Insts { ...@@ -3210,6 +3244,8 @@ template <typename TraitsType> struct Insts {
using Pxor = typename InstImpl<TraitsType>::InstX86Pxor; using Pxor = typename InstImpl<TraitsType>::InstX86Pxor;
using Maxss = typename InstImpl<TraitsType>::InstX86Maxss; using Maxss = typename InstImpl<TraitsType>::InstX86Maxss;
using Minss = typename InstImpl<TraitsType>::InstX86Minss; using Minss = typename InstImpl<TraitsType>::InstX86Minss;
using Maxps = typename InstImpl<TraitsType>::InstX86Maxps;
using Minps = typename InstImpl<TraitsType>::InstX86Minps;
using Imul = typename InstImpl<TraitsType>::InstX86Imul; using Imul = typename InstImpl<TraitsType>::InstX86Imul;
using ImulImm = typename InstImpl<TraitsType>::InstX86ImulImm; using ImulImm = typename InstImpl<TraitsType>::InstX86ImulImm;
using Mulps = typename InstImpl<TraitsType>::InstX86Mulps; using Mulps = typename InstImpl<TraitsType>::InstX86Mulps;
...@@ -3369,6 +3405,12 @@ template <typename TraitsType> struct Insts { ...@@ -3369,6 +3405,12 @@ template <typename TraitsType> struct Insts {
const char *InstImpl<TraitsType>::InstX86Minss::Base::Opcode = "min"; \ const char *InstImpl<TraitsType>::InstX86Minss::Base::Opcode = "min"; \
template <> \ template <> \
template <> \ template <> \
const char *InstImpl<TraitsType>::InstX86Maxps::Base::Opcode = "max"; \
template <> \
template <> \
const char *InstImpl<TraitsType>::InstX86Minps::Base::Opcode = "min"; \
template <> \
template <> \
const char *InstImpl<TraitsType>::InstX86Padd::Base::Opcode = "padd"; \ const char *InstImpl<TraitsType>::InstX86Padd::Base::Opcode = "padd"; \
template <> \ template <> \
template <> \ template <> \
...@@ -3923,6 +3965,18 @@ template <typename TraitsType> struct Insts { ...@@ -3923,6 +3965,18 @@ template <typename TraitsType> struct Insts {
template <> \ template <> \
template <> \ template <> \
const InstImpl<TraitsType>::Assembler::XmmEmitterRegOp \ const InstImpl<TraitsType>::Assembler::XmmEmitterRegOp \
InstImpl<TraitsType>::InstX86Maxps::Base::Emitter = { \
&InstImpl<TraitsType>::Assembler::maxps, \
&InstImpl<TraitsType>::Assembler::maxps}; \
template <> \
template <> \
const InstImpl<TraitsType>::Assembler::XmmEmitterRegOp \
InstImpl<TraitsType>::InstX86Minps::Base::Emitter = { \
&InstImpl<TraitsType>::Assembler::minps, \
&InstImpl<TraitsType>::Assembler::minps}; \
template <> \
template <> \
const InstImpl<TraitsType>::Assembler::XmmEmitterRegOp \
InstImpl<TraitsType>::InstX86Orps::Base::Emitter = { \ InstImpl<TraitsType>::InstX86Orps::Base::Emitter = { \
&InstImpl<TraitsType>::Assembler::orps, \ &InstImpl<TraitsType>::Assembler::orps, \
&InstImpl<TraitsType>::Assembler::orps}; \ &InstImpl<TraitsType>::Assembler::orps}; \
......
...@@ -747,6 +747,14 @@ protected: ...@@ -747,6 +747,14 @@ protected:
AutoMemorySandboxer<> _(this, &Dest, &Src0); AutoMemorySandboxer<> _(this, &Dest, &Src0);
Context.insert<typename Traits::Insts::Minss>(Dest, Src0); Context.insert<typename Traits::Insts::Minss>(Dest, Src0);
} }
void _maxps(Variable *Dest, Operand *Src0) {
AutoMemorySandboxer<> _(this, &Dest, &Src0);
Context.insert<typename Traits::Insts::Maxps>(Dest, Src0);
}
void _minps(Variable *Dest, Operand *Src0) {
AutoMemorySandboxer<> _(this, &Dest, &Src0);
Context.insert<typename Traits::Insts::Minps>(Dest, Src0);
}
void _mul(Variable *Dest, Variable *Src0, Operand *Src1) { void _mul(Variable *Dest, Variable *Src0, Operand *Src1) {
AutoMemorySandboxer<> _(this, &Dest, &Src0, &Src1); AutoMemorySandboxer<> _(this, &Dest, &Src0, &Src1);
Context.insert<typename Traits::Insts::Mul>(Dest, Src0, Src1); Context.insert<typename Traits::Insts::Mul>(Dest, Src0, Src1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment