Mercurial > repos > blastem
comparison gen_x86.c @ 1692:5dacaef602a7 segacd
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 05 Jan 2019 00:58:08 -0800 |
parents | 5453aafa0656 |
children | 37afb9cf58be |
comparison
equal
deleted
inserted
replaced
1504:95b3a1a8b26c | 1692:5dacaef602a7 |
---|---|
168 | 168 |
169 char * x86_sizes[] = { | 169 char * x86_sizes[] = { |
170 "b", "w", "d", "q" | 170 "b", "w", "d", "q" |
171 }; | 171 }; |
172 | 172 |
173 #ifdef X86_64 | |
174 #define CHECK_DISP(disp) (disp <= 0x7FFFFFFF && disp >= -2147483648) | |
175 #else | |
176 #define CHECK_DISP(disp) 1 | |
177 #endif | |
178 | |
173 void jmp_nocheck(code_info *code, code_ptr dest) | 179 void jmp_nocheck(code_info *code, code_ptr dest) |
174 { | 180 { |
175 code_ptr out = code->cur; | 181 code_ptr out = code->cur; |
176 ptrdiff_t disp = dest-(out+2); | 182 ptrdiff_t disp = dest-(out+2); |
177 if (disp <= 0x7F && disp >= -0x80) { | 183 if (disp <= 0x7F && disp >= -0x80) { |
178 *(out++) = OP_JMP_BYTE; | 184 *(out++) = OP_JMP_BYTE; |
179 *(out++) = disp; | 185 *(out++) = disp; |
180 } else { | 186 } else { |
181 disp = dest-(out+5); | 187 disp = dest-(out+5); |
182 if (disp <= 0x7FFFFFFF && disp >= -2147483648) { | 188 if (CHECK_DISP(disp)) { |
183 *(out++) = OP_JMP; | 189 *(out++) = OP_JMP; |
184 *(out++) = disp; | 190 *(out++) = disp; |
185 disp >>= 8; | 191 disp >>= 8; |
186 *(out++) = disp; | 192 *(out++) = disp; |
187 disp >>= 8; | 193 disp >>= 8; |
1915 if (disp <= 0x7F && disp >= -0x80) { | 1921 if (disp <= 0x7F && disp >= -0x80) { |
1916 *(out++) = OP_JCC | cc; | 1922 *(out++) = OP_JCC | cc; |
1917 *(out++) = disp; | 1923 *(out++) = disp; |
1918 } else { | 1924 } else { |
1919 disp = dest-(out+6); | 1925 disp = dest-(out+6); |
1920 if (disp <= 0x7FFFFFFF && disp >= -2147483648) { | 1926 if (CHECK_DISP(disp)) { |
1921 *(out++) = PRE_2BYTE; | 1927 *(out++) = PRE_2BYTE; |
1922 *(out++) = OP2_JCC | cc; | 1928 *(out++) = OP2_JCC | cc; |
1923 *(out++) = disp; | 1929 *(out++) = disp; |
1924 disp >>= 8; | 1930 disp >>= 8; |
1925 *(out++) = disp; | 1931 *(out++) = disp; |
1942 if (disp <= 0x7F && disp >= -0x80) { | 1948 if (disp <= 0x7F && disp >= -0x80) { |
1943 *(out++) = OP_JMP_BYTE; | 1949 *(out++) = OP_JMP_BYTE; |
1944 *(out++) = disp; | 1950 *(out++) = disp; |
1945 } else { | 1951 } else { |
1946 disp = dest-(out+5); | 1952 disp = dest-(out+5); |
1947 if (disp <= 0x7FFFFFFF && disp >= -2147483648) { | 1953 if (CHECK_DISP(disp)) { |
1948 *(out++) = OP_JMP; | 1954 *(out++) = OP_JMP; |
1949 *(out++) = disp; | 1955 *(out++) = disp; |
1950 disp >>= 8; | 1956 disp >>= 8; |
1951 *(out++) = disp; | 1957 *(out++) = disp; |
1952 disp >>= 8; | 1958 disp >>= 8; |
1989 void call_noalign(code_info *code, code_ptr fun) | 1995 void call_noalign(code_info *code, code_ptr fun) |
1990 { | 1996 { |
1991 check_alloc_code(code, 5); | 1997 check_alloc_code(code, 5); |
1992 code_ptr out = code->cur; | 1998 code_ptr out = code->cur; |
1993 ptrdiff_t disp = fun-(out+5); | 1999 ptrdiff_t disp = fun-(out+5); |
1994 if (disp <= 0x7FFFFFFF && disp >= -2147483648) { | 2000 if (CHECK_DISP(disp)) { |
1995 *(out++) = OP_CALL; | 2001 *(out++) = OP_CALL; |
1996 *(out++) = disp; | 2002 *(out++) = disp; |
1997 disp >>= 8; | 2003 disp >>= 8; |
1998 *(out++) = disp; | 2004 *(out++) = disp; |
1999 disp >>= 8; | 2005 disp >>= 8; |
2027 void call_raxfallback(code_info *code, code_ptr fun) | 2033 void call_raxfallback(code_info *code, code_ptr fun) |
2028 { | 2034 { |
2029 check_alloc_code(code, 5); | 2035 check_alloc_code(code, 5); |
2030 code_ptr out = code->cur; | 2036 code_ptr out = code->cur; |
2031 ptrdiff_t disp = fun-(out+5); | 2037 ptrdiff_t disp = fun-(out+5); |
2032 if (disp <= 0x7FFFFFFF && disp >= -2147483648) { | 2038 if (CHECK_DISP(disp)) { |
2033 *(out++) = OP_CALL; | 2039 *(out++) = OP_CALL; |
2034 *(out++) = disp; | 2040 *(out++) = disp; |
2035 disp >>= 8; | 2041 disp >>= 8; |
2036 *(out++) = disp; | 2042 *(out++) = disp; |
2037 disp >>= 8; | 2043 disp >>= 8; |
2144 } | 2150 } |
2145 for (int i = stack_args -1; i >= 0; i--) | 2151 for (int i = stack_args -1; i >= 0; i--) |
2146 { | 2152 { |
2147 push_r(code, arg_arr[i]); | 2153 push_r(code, arg_arr[i]); |
2148 } | 2154 } |
2155 free(arg_arr); | |
2149 | 2156 |
2150 return stack_args * sizeof(void *) + adjust; | 2157 return stack_args * sizeof(void *) + adjust; |
2151 } | 2158 } |
2152 | 2159 |
2153 void call_args(code_info *code, code_ptr fun, uint32_t num_args, ...) | 2160 void call_args(code_info *code, code_ptr fun, uint32_t num_args, ...) |