about summary refs log tree commit diff stats
path: root/miasm2/jitter/op_semantics.h
blob: c56c41cf4623d7ecdf44bdeb55aa35861cd2e150 (plain) (blame)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#ifndef OP_SEMANTICS_H
#define OP_SEMANTICS_H

#define CC_P 1
extern const uint8_t parity_table[256];
#define parity(a) parity_table[(a) & 0xFF]

unsigned int my_imul08(unsigned int a, unsigned int b);
unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b);
unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b);
unsigned int imul_lo_op_08(char a, char b);
unsigned int imul_lo_op_16(short a, short b);
unsigned int imul_lo_op_32(int a, int b);
int imul_hi_op_08(char a, char b);
int imul_hi_op_16(short a, short b);
int imul_hi_op_32(int a, int b);


unsigned int umul16_lo(unsigned short a, unsigned short b);
unsigned int umul16_hi(unsigned short a, unsigned short b);


uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b);
uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b);

unsigned int cntleadzeros(uint64_t size, uint64_t src);
unsigned int cnttrailzeros(uint64_t size, uint64_t src);

#define UDIV(sizeA)						\
	uint ## sizeA ## _t udiv ## sizeA (uint ## sizeA ## _t a, uint ## sizeA ## _t b) \
	{								\
		uint ## sizeA ## _t r;					\
		if (b == 0) {						\
			fprintf(stderr, "Should not happen\n");		\
			exit(EXIT_FAILURE);				\
		}							\
		r = a/b;						\
		return r;						\
	}


#define UMOD(sizeA)						\
	uint ## sizeA ## _t umod ## sizeA (uint ## sizeA ## _t a, uint ## sizeA ## _t b) \
	{								\
		uint ## sizeA ## _t r;					\
		if (b == 0) {						\
			fprintf(stderr, "Should not happen\n");		\
			exit(EXIT_FAILURE);				\
		}							\
		r = a%b;						\
		return r;						\
	}


#define IDIV(sizeA)						\
	int ## sizeA ## _t idiv ## sizeA (int ## sizeA ## _t a, int ## sizeA ## _t b) \
	{								\
		int ## sizeA ## _t r;					\
		if (b == 0) {						\
			fprintf(stderr, "Should not happen\n");		\
			exit(EXIT_FAILURE);				\
		}							\
		r = a/b;						\
		return r;						\
	}


#define IMOD(sizeA)						\
	int ## sizeA ## _t imod ## sizeA (int ## sizeA ## _t a, int ## sizeA ## _t b) \
	{								\
		int ## sizeA ## _t r;					\
		if (b == 0) {						\
			fprintf(stderr, "Should not happen\n");		\
			exit(EXIT_FAILURE);				\
		}							\
		r = a%b;						\
		return r;						\
	}

uint64_t udiv64(uint64_t a, uint64_t b);
uint64_t umod64(uint64_t a, uint64_t b);
int64_t idiv64(int64_t a, int64_t b);
int64_t imod64(int64_t a, int64_t b);

uint32_t udiv32(uint32_t a, uint32_t b);
uint32_t umod32(uint32_t a, uint32_t b);
int32_t idiv32(int32_t a, int32_t b);
int32_t imod32(int32_t a, int32_t b);

uint16_t udiv16(uint16_t a, uint16_t b);
uint16_t umod16(uint16_t a, uint16_t b);
int16_t idiv16(int16_t a, int16_t b);
int16_t imod16(int16_t a, int16_t b);

uint8_t udiv8(uint8_t a, uint8_t b);
uint8_t umod8(uint8_t a, uint8_t b);
int8_t idiv8(int8_t a, int8_t b);
int8_t imod8(int8_t a, int8_t b);

unsigned int x86_cpuid(unsigned int a, unsigned int reg_num);

uint32_t fpu_fadd32(uint32_t a, uint32_t b);
uint64_t fpu_fadd64(uint64_t a, uint64_t b);
uint32_t fpu_fsub32(uint32_t a, uint32_t b);
uint64_t fpu_fsub64(uint64_t a, uint64_t b);
uint32_t fpu_fmul32(uint32_t a, uint32_t b);
uint64_t fpu_fmul64(uint64_t a, uint64_t b);
uint32_t fpu_fdiv32(uint32_t a, uint32_t b);
uint64_t fpu_fdiv64(uint64_t a, uint64_t b);
double fpu_ftan(double a);
double fpu_frndint(double a);
double fpu_fsin(double a);
double fpu_fcos(double a);
double fpu_fscale(double a, double b);
double fpu_f2xm1(double a);
uint32_t fpu_fsqrt32(uint32_t a);
uint64_t fpu_fsqrt64(uint64_t a);
uint64_t fpu_fabs64(uint64_t a);
uint64_t fpu_fprem64(uint64_t a, uint64_t b);
double fpu_fchs(double a);
double fpu_fyl2x(double a, double b);
double fpu_fpatan(double a, double b);
unsigned int fpu_fcom_c0(double a, double b);
unsigned int fpu_fcom_c1(double a, double b);
unsigned int fpu_fcom_c2(double a, double b);
unsigned int fpu_fcom_c3(double a, double b);

uint64_t sint_to_fp_64(int64_t a);
uint32_t sint_to_fp_32(int32_t a);
int32_t fp32_to_sint32(uint32_t a);
int64_t fp64_to_sint64(uint64_t a);
int32_t fp64_to_sint32(uint64_t a);
uint32_t fp64_to_fp32(uint64_t a);
uint64_t fp32_to_fp64(uint32_t a);
uint32_t fpround_towardszero_fp32(uint32_t a);
uint64_t fpround_towardszero_fp64(uint64_t a);

#define SHIFT_RIGHT_ARITH(size, value, shift)				\
	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
			      (((int ## size ## _t) (value)) < 0 ? -1 : 0) : \
			      (((int ## size ## _t) (value)) >> (shift))))

#define SHIFT_RIGHT_LOGIC(size, value, shift)				\
	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
			      0 :					\
			      (((uint ## size ## _t) (value)) >> (shift))))

#define SHIFT_LEFT_LOGIC(size, value, shift)		\
	((uint ## size ## _t)((((uint64_t) (shift)) > ((size) - 1))?	\
			      0 :					\
			      (((uint ## size ## _t) (value)) << (shift))))

#endif