Bug 1229396: Templatize get{Float,Double,SimdData}; r=jandem

--HG--
extra : rebase_source : b5529425719159dc9d08ba67c3c6add7da33d210
extra : histedit_source : 8c4ff3221b3374d976835ea9c88d4f0ee4f7ccff
This commit is contained in:
Benjamin Bouvier 2015-12-01 19:09:40 +01:00
parent c1bb13250b
commit 0c856aafcc
2 changed files with 40 additions and 54 deletions

View File

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

View File

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