sys_lwcond* funcs moved and rewritten

This commit is contained in:
Nekotekina 2015-03-09 22:56:55 +03:00
parent 2709dc2e36
commit 3cf80b0831
18 changed files with 433 additions and 288 deletions

View file

@ -197,6 +197,42 @@ public:
}
};
__forceinline static u64 operator ++(_atomic_base<be_t<u64>>& left, int)
{
u64 result;
left.atomic_op([&result](be_t<u64>& value)
{
result = value++;
});
return result;
}
__forceinline static u64 operator --(_atomic_base<be_t<u64>>& left, int)
{
u64 result;
left.atomic_op([&result](be_t<u64>& value)
{
result = value--;
});
return result;
}
__forceinline static u64 operator +=(_atomic_base<be_t<u64>>& left, u64 right)
{
u64 result;
left.atomic_op([&result, right](be_t<u64>& value)
{
result = (value += right);
});
return result;
}
template<typename T> using atomic_le_t = _atomic_base<T>;
template<typename T> using atomic_be_t = _atomic_base<typename to_be_t<T>::type>;

View file

@ -78,10 +78,10 @@ namespace vm
}
template<typename AT2>
operator const _ptr_base<T, lvl, AT2>() const
operator _ptr_base<T, lvl, AT2>() const
{
const AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<const _ptr_base<T, lvl, AT2>&>(addr);
AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<_ptr_base<T, lvl, AT2>&>(addr);
}
AT addr() const
@ -94,9 +94,9 @@ namespace vm
m_addr = value;
}
static const _ptr_base make(const AT& addr)
static _ptr_base make(const AT& addr)
{
return reinterpret_cast<const _ptr_base&>(addr);
return reinterpret_cast<_ptr_base&>(addr);
}
_ptr_base& operator = (const _ptr_base& right) = default;
@ -203,10 +203,10 @@ namespace vm
}
template<typename AT2>
operator const _ptr_base<T, 1, AT2>() const
operator _ptr_base<T, 1, AT2>() const
{
const AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<const _ptr_base<T, 1, AT2>&>(addr);
AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<_ptr_base<T, 1, AT2>&>(addr);
}
T* get_ptr() const
@ -269,17 +269,17 @@ namespace vm
explicit operator bool() const { return m_addr != 0; }
template<typename AT2>
operator const _ptr_base<void, 1, AT2>() const
operator _ptr_base<void, 1, AT2>() const
{
const AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<const _ptr_base<void, 1, AT2>&>(addr);
AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<_ptr_base<void, 1, AT2>&>(addr);
}
template<typename AT2>
operator const _ptr_base<const void, 1, AT2>() const
operator _ptr_base<const void, 1, AT2>() const
{
const AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<const _ptr_base<const void, 1, AT2>&>(addr);
AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<_ptr_base<const void, 1, AT2>&>(addr);
}
static const _ptr_base make(const AT& addr)
@ -332,10 +332,10 @@ namespace vm
explicit operator bool() const { return m_addr != 0; }
template<typename AT2>
operator const _ptr_base<const void, 1, AT2>() const
operator _ptr_base<const void, 1, AT2>() const
{
const AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<const _ptr_base<const void, 1, AT2>&>(addr);
AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<_ptr_base<const void, 1, AT2>&>(addr);
}
static const _ptr_base make(const AT& addr)
@ -381,10 +381,10 @@ namespace vm
explicit operator bool() const { return m_addr != 0; }
template<typename AT2>
operator const _ptr_base<type, 1, AT2>() const
operator _ptr_base<type, 1, AT2>() const
{
const AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<const _ptr_base<type, 1, AT2>&>(addr);
AT2 addr = convert_le_be<AT2>(m_addr);
return reinterpret_cast<_ptr_base<type, 1, AT2>&>(addr);
}
static const _ptr_base make(const AT& addr)
@ -467,7 +467,7 @@ struct cast_ppu_gpr<vm::_ptr_base<T, lvl, AT>, false>
{
__forceinline static u64 to_gpr(const vm::_ptr_base<T, lvl, AT>& value)
{
return value.addr();
return cast_ppu_gpr<AT, std::is_enum<AT>::value>::to_gpr(value.addr());
}
__forceinline static vm::_ptr_base<T, lvl, AT> from_gpr(const u64 reg)
@ -486,7 +486,7 @@ struct cast_armv7_gpr<vm::_ptr_base<T, lvl, AT>, false>
{
__forceinline static u32 to_gpr(const vm::_ptr_base<T, lvl, AT>& value)
{
return value.addr();
return cast_armv7_gpr<AT, std::is_enum<AT>::value>::to_gpr(value.addr());
}
__forceinline static vm::_ptr_base<T, lvl, AT> from_gpr(const u32 reg)

View file

@ -117,7 +117,7 @@ struct cast_ppu_gpr<vm::_ref_base<T, AT>, false>
{
__forceinline static u64 to_gpr(const vm::_ref_base<T, AT>& value)
{
return value.addr();
return cast_ppu_gpr<AT, std::is_enum<AT>::value>::to_gpr(value.addr());
}
__forceinline static vm::_ref_base<T, AT> from_gpr(const u64 reg)
@ -136,7 +136,7 @@ struct cast_armv7_gpr<vm::_ref_base<T, AT>, false>
{
__forceinline static u32 to_gpr(const vm::_ref_base<T, AT>& value)
{
return value.addr();
return cast_armv7_gpr<AT, std::is_enum<AT>::value>::to_gpr(value.addr());
}
__forceinline static vm::_ref_base<T, AT> from_gpr(const u32 reg)