mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 23:35:34 +00:00
Bug 1229396: Templatize get{Float,Double,SimdData}; r=jandem
--HG-- extra : rebase_source : b5529425719159dc9d08ba67c3c6add7da33d210 extra : histedit_source : 8c4ff3221b3374d976835ea9c88d4f0ee4f7ccff
This commit is contained in:
parent
c1bb13250b
commit
0c856aafcc
@ -226,73 +226,48 @@ template void
|
||||
MacroAssemblerX86Shared::atomicExchangeToTypedIntArray(Scalar::Type arrayType, const BaseIndex& mem,
|
||||
Register value, Register temp, AnyRegister output);
|
||||
|
||||
template<class T, class Map>
|
||||
T*
|
||||
MacroAssemblerX86Shared::getConstant(const typename T::Pod& value, Map& map,
|
||||
Vector<T, 0, SystemAllocPolicy>& vec)
|
||||
{
|
||||
typedef typename Map::AddPtr AddPtr;
|
||||
if (!map.initialized()) {
|
||||
enoughMemory_ &= map.init();
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
}
|
||||
size_t index;
|
||||
if (AddPtr p = map.lookupForAdd(value)) {
|
||||
index = p->value();
|
||||
} else {
|
||||
index = vec.length();
|
||||
enoughMemory_ &= vec.append(T(value));
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
enoughMemory_ &= map.add(p, value, index);
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
}
|
||||
return &vec[index];
|
||||
}
|
||||
|
||||
MacroAssemblerX86Shared::Float*
|
||||
MacroAssemblerX86Shared::getFloat(float f)
|
||||
{
|
||||
if (!floatMap_.initialized()) {
|
||||
enoughMemory_ &= floatMap_.init();
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
}
|
||||
size_t floatIndex;
|
||||
if (FloatMap::AddPtr p = floatMap_.lookupForAdd(f)) {
|
||||
floatIndex = p->value();
|
||||
} else {
|
||||
floatIndex = floats_.length();
|
||||
enoughMemory_ &= floats_.append(Float(f));
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
enoughMemory_ &= floatMap_.add(p, f, floatIndex);
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
}
|
||||
return &floats_[floatIndex];
|
||||
return getConstant<Float, FloatMap>(f, floatMap_, floats_);
|
||||
}
|
||||
|
||||
MacroAssemblerX86Shared::Double*
|
||||
MacroAssemblerX86Shared::getDouble(double d)
|
||||
{
|
||||
if (!doubleMap_.initialized()) {
|
||||
enoughMemory_ &= doubleMap_.init();
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
}
|
||||
size_t doubleIndex;
|
||||
if (DoubleMap::AddPtr p = doubleMap_.lookupForAdd(d)) {
|
||||
doubleIndex = p->value();
|
||||
} else {
|
||||
doubleIndex = doubles_.length();
|
||||
enoughMemory_ &= doubles_.append(Double(d));
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
enoughMemory_ &= doubleMap_.add(p, d, doubleIndex);
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
}
|
||||
return &doubles_[doubleIndex];
|
||||
return getConstant<Double, DoubleMap>(d, doubleMap_, doubles_);
|
||||
}
|
||||
|
||||
MacroAssemblerX86Shared::SimdData*
|
||||
MacroAssemblerX86Shared::getSimdData(const SimdConstant& v)
|
||||
{
|
||||
if (!simdMap_.initialized()) {
|
||||
enoughMemory_ &= simdMap_.init();
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
}
|
||||
size_t index;
|
||||
if (SimdMap::AddPtr p = simdMap_.lookupForAdd(v)) {
|
||||
index = p->value();
|
||||
} else {
|
||||
index = simds_.length();
|
||||
enoughMemory_ &= simds_.append(SimdData(v));
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
enoughMemory_ &= simdMap_.add(p, v, index);
|
||||
if (!enoughMemory_)
|
||||
return nullptr;
|
||||
}
|
||||
return &simds_[index];
|
||||
return getConstant<SimdData, SimdMap>(v, simdMap_, simds_);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -49,11 +49,14 @@ class MacroAssemblerX86Shared : public Assembler
|
||||
typedef Vector<CodeOffset, 0, SystemAllocPolicy> UsesVector;
|
||||
|
||||
protected:
|
||||
|
||||
// For Double, Float and SimdData, make the move ctors explicit so that MSVC
|
||||
// knows what to use instead of copying these data structures.
|
||||
struct Double {
|
||||
typedef double Pod;
|
||||
double value;
|
||||
UsesVector uses;
|
||||
|
||||
explicit Double(double value) : value(value) {}
|
||||
Double(Double&& other) : value(other.value), uses(mozilla::Move(other.uses)) {}
|
||||
explicit Double(const Double&) = delete;
|
||||
@ -67,8 +70,10 @@ class MacroAssemblerX86Shared : public Assembler
|
||||
DoubleMap doubleMap_;
|
||||
|
||||
struct Float {
|
||||
typedef float Pod;
|
||||
float value;
|
||||
UsesVector uses;
|
||||
|
||||
explicit Float(float value) : value(value) {}
|
||||
Float(Float&& other) : value(other.value), uses(mozilla::Move(other.uses)) {}
|
||||
explicit Float(const Float&) = delete;
|
||||
@ -79,11 +84,14 @@ class MacroAssemblerX86Shared : public Assembler
|
||||
FloatMap floatMap_;
|
||||
|
||||
struct SimdData {
|
||||
typedef SimdConstant Pod;
|
||||
SimdConstant value;
|
||||
UsesVector uses;
|
||||
|
||||
explicit SimdData(const SimdConstant& v) : value(v) {}
|
||||
SimdData(SimdData&& other) : value(other.value), uses(mozilla::Move(other.uses)) {}
|
||||
explicit SimdData(const SimdData&) = delete;
|
||||
|
||||
SimdConstant::Type type() const { return value.type(); }
|
||||
};
|
||||
|
||||
@ -91,6 +99,9 @@ class MacroAssemblerX86Shared : public Assembler
|
||||
typedef HashMap<SimdConstant, size_t, SimdConstant, SystemAllocPolicy> SimdMap;
|
||||
SimdMap simdMap_;
|
||||
|
||||
template<class T, class Map>
|
||||
T* getConstant(const typename T::Pod& value, Map& map, Vector<T, 0, SystemAllocPolicy>& vec);
|
||||
|
||||
Float* getFloat(float f);
|
||||
Double* getDouble(double d);
|
||||
SimdData* getSimdData(const SimdConstant& v);
|
||||
|
Loading…
Reference in New Issue
Block a user