00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef MEM_ORDER_OPERATIONS_H
00033 #define MEM_ORDER_OPERATIONS_H
00034
00035 #include "Interface/MemAccess.h"
00036
00037 namespace Onikiri
00038 {
00039
00040 class MemOrderOperations
00041 {
00042 public:
00043
00044 MemOrderOperations();
00045 void SetTargetEndian( bool targetIsLittleEndian )
00046 {
00047 m_targetIsLittleEndian = targetIsLittleEndian;
00048 }
00049
00050 void SetAlignment( int alignment );
00051
00052
00053 u64 ReadPreviousAccess( const MemAccess& load, const MemAccess& store );
00054
00055
00056 u64 MergePartialAccess( const MemAccess& base, const MemAccess& store );
00057
00058
00059 u64 CorrectEndian( u64 src, int size );
00060
00061
00062 bool IsOverlapped( const MemAccess& access1, const MemAccess& access2 ) const;
00063 bool IsOverlapped( u64 addr1, int size1, u64 addr2, int size2 ) const;
00064
00065 bool IsOverlappedInAligned( const MemAccess& access1, const MemAccess& access2 ) const;
00066 bool IsOverlappedInAligned( u64 addr1, int size1, u64 addr2, int size2 ) const;
00067
00068
00069 bool IsInnerAccess( const MemAccess& inner, const MemAccess& outer ) const;
00070 bool IsInnerAccess( u64 inner, int innerSize, u64 outer, int outerSize ) const;
00071
00072 protected:
00073 bool m_targetIsLittleEndian;
00074 int m_memoryAlignment;
00075 u64 m_memoryAlignmentMask;
00076 };
00077 };
00078
00079 #endif // MEM_ORDER_OPERATIONS_H
00080