summaryrefslogtreecommitdiff
path: root/arch/powerpc/util.h
blob: 39f02bc2e40aae12493e1eb764a51d96ac9f97f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#ifdef __clang__
#define FALL_THROUGH
#elif defined(__GNUC__) && __GNUC__ >= 7
#define FALL_THROUGH __attribute__((fallthrough));
#else
#define FALL_THROUGH
#endif

#define ADDRMASK(addressSize, target) \
	if (addressSize == 4) \
	{ \
		target &= 0xffffffff; \
	}

#define EXTOPT(rawInsn, addressSize, extend, TYPE) \
	{ \
		int L_tmp = ((rawInsn >> 10) & 1); \
		if ((L_tmp == 1) && (addressSize == 8)) \
		{ \
			extend = OTI_ ## TYPE ## EXT64_IMMS; \
		} \
		else \
		{ \
			extend = OTI_ ## TYPE ## EXT32_IMMS; \
		} \
	}

#define EXTOPTZ(data, addressSize, extend) EXTOPT(data, addressSize, extend, Z)
#define EXTOPTS(data, addressSize, extend) EXTOPT(data, addressSize, extend, S)

#define ADDRNEG1(addressSize) (addressSize == 4) ? ((uint32_t)-1) : ((uint64_t)-1)

inline uint16_t bswap16(uint16_t x)
{
	return ((x&0xFF)<<8) |
		((x&0xFF00)>>8);
}

inline uint32_t bswap32(uint32_t x)
{
	return ((x&0xFF)<<24) |
		((x&0xFF00)<<8) |
		((x&0xFF0000)>>8) |
		((x&0xFF000000)>>24);
}

uint64_t sign_extend(size_t addressSize_local, uint64_t target, int signBit);