comparison gen_x86.c @ 1469:723f6381cffa

Attempt at fixing issue reported when compiling with MSVC
author Michael Pavone <pavone@retrodev.com>
date Mon, 09 Oct 2017 07:48:48 -0700
parents 5d41d0574863
children 5453aafa0656
comparison
equal deleted inserted replaced
1468:17c1c30e0d6f 1469:723f6381cffa
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;