Commit 87f4827e1dc49d5d4d26ffca9ef15a33a325c676
1 parent
4a585ccb
more code moved to helpers
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@216 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
14 additions
and
128 deletions
op-i386.c
@@ -19,8 +19,6 @@ | @@ -19,8 +19,6 @@ | ||
19 | */ | 19 | */ |
20 | #include "exec-i386.h" | 20 | #include "exec-i386.h" |
21 | 21 | ||
22 | -/* NOTE: data are not static to force relocation generation by GCC */ | ||
23 | - | ||
24 | uint8_t parity_table[256] = { | 22 | uint8_t parity_table[256] = { |
25 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, | 23 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
26 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, | 24 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
@@ -72,44 +70,6 @@ const uint8_t rclb_table[32] = { | @@ -72,44 +70,6 @@ const uint8_t rclb_table[32] = { | ||
72 | 6, 7, 8, 0, 1, 2, 3, 4, | 70 | 6, 7, 8, 0, 1, 2, 3, 4, |
73 | }; | 71 | }; |
74 | 72 | ||
75 | -#ifdef USE_X86LDOUBLE | ||
76 | -/* an array of Intel 80-bit FP constants, to be loaded via integer ops */ | ||
77 | -typedef unsigned short f15ld[5]; | ||
78 | -const f15ld f15rk[] = | ||
79 | -{ | ||
80 | -/*0*/ {0x0000,0x0000,0x0000,0x0000,0x0000}, | ||
81 | -/*1*/ {0x0000,0x0000,0x0000,0x8000,0x3fff}, | ||
82 | -/*pi*/ {0xc235,0x2168,0xdaa2,0xc90f,0x4000}, | ||
83 | -/*lg2*/ {0xf799,0xfbcf,0x9a84,0x9a20,0x3ffd}, | ||
84 | -/*ln2*/ {0x79ac,0xd1cf,0x17f7,0xb172,0x3ffe}, | ||
85 | -/*l2e*/ {0xf0bc,0x5c17,0x3b29,0xb8aa,0x3fff}, | ||
86 | -/*l2t*/ {0x8afe,0xcd1b,0x784b,0xd49a,0x4000} | ||
87 | -}; | ||
88 | -#else | ||
89 | -/* the same, 64-bit version */ | ||
90 | -typedef unsigned short f15ld[4]; | ||
91 | -const f15ld f15rk[] = | ||
92 | -{ | ||
93 | -#ifndef WORDS_BIGENDIAN | ||
94 | -/*0*/ {0x0000,0x0000,0x0000,0x0000}, | ||
95 | -/*1*/ {0x0000,0x0000,0x0000,0x3ff0}, | ||
96 | -/*pi*/ {0x2d18,0x5444,0x21fb,0x4009}, | ||
97 | -/*lg2*/ {0x79ff,0x509f,0x4413,0x3fd3}, | ||
98 | -/*ln2*/ {0x39ef,0xfefa,0x2e42,0x3fe6}, | ||
99 | -/*l2e*/ {0x82fe,0x652b,0x1547,0x3ff7}, | ||
100 | -/*l2t*/ {0xa371,0x0979,0x934f,0x400a} | ||
101 | -#else | ||
102 | -/*0*/ {0x0000,0x0000,0x0000,0x0000}, | ||
103 | -/*1*/ {0x3ff0,0x0000,0x0000,0x0000}, | ||
104 | -/*pi*/ {0x4009,0x21fb,0x5444,0x2d18}, | ||
105 | -/*lg2*/ {0x3fd3,0x4413,0x509f,0x79ff}, | ||
106 | -/*ln2*/ {0x3fe6,0x2e42,0xfefa,0x39ef}, | ||
107 | -/*l2e*/ {0x3ff7,0x1547,0x652b,0x82fe}, | ||
108 | -/*l2t*/ {0x400a,0x934f,0x0979,0xa371} | ||
109 | -#endif | ||
110 | -}; | ||
111 | -#endif | ||
112 | - | ||
113 | /* n must be a constant to be efficient */ | 73 | /* n must be a constant to be efficient */ |
114 | static inline int lshift(int x, int n) | 74 | static inline int lshift(int x, int n) |
115 | { | 75 | { |
@@ -358,6 +318,7 @@ void OPPROTO op_imull_T0_T1(void) | @@ -358,6 +318,7 @@ void OPPROTO op_imull_T0_T1(void) | ||
358 | 318 | ||
359 | /* division, flags are undefined */ | 319 | /* division, flags are undefined */ |
360 | /* XXX: add exceptions for overflow */ | 320 | /* XXX: add exceptions for overflow */ |
321 | + | ||
361 | void OPPROTO op_divb_AL_T0(void) | 322 | void OPPROTO op_divb_AL_T0(void) |
362 | { | 323 | { |
363 | unsigned int num, den, q, r; | 324 | unsigned int num, den, q, r; |
@@ -420,62 +381,14 @@ void OPPROTO op_idivw_AX_T0(void) | @@ -420,62 +381,14 @@ void OPPROTO op_idivw_AX_T0(void) | ||
420 | EDX = (EDX & 0xffff0000) | r; | 381 | EDX = (EDX & 0xffff0000) | r; |
421 | } | 382 | } |
422 | 383 | ||
423 | -#ifdef BUGGY_GCC_DIV64 | ||
424 | -/* gcc 2.95.4 on PowerPC does not seem to like using __udivdi3, so we | ||
425 | - call it from another function */ | ||
426 | -uint32_t div64(uint32_t *q_ptr, uint64_t num, uint32_t den) | ||
427 | -{ | ||
428 | - *q_ptr = num / den; | ||
429 | - return num % den; | ||
430 | -} | ||
431 | - | ||
432 | -int32_t idiv64(int32_t *q_ptr, int64_t num, int32_t den) | ||
433 | -{ | ||
434 | - *q_ptr = num / den; | ||
435 | - return num % den; | ||
436 | -} | ||
437 | -#endif | ||
438 | - | ||
439 | void OPPROTO op_divl_EAX_T0(void) | 384 | void OPPROTO op_divl_EAX_T0(void) |
440 | { | 385 | { |
441 | - unsigned int den, q, r; | ||
442 | - uint64_t num; | ||
443 | - | ||
444 | - num = EAX | ((uint64_t)EDX << 32); | ||
445 | - den = T0; | ||
446 | - if (den == 0) { | ||
447 | - EIP = PARAM1; | ||
448 | - raise_exception(EXCP00_DIVZ); | ||
449 | - } | ||
450 | -#ifdef BUGGY_GCC_DIV64 | ||
451 | - r = div64(&q, num, den); | ||
452 | -#else | ||
453 | - q = (num / den); | ||
454 | - r = (num % den); | ||
455 | -#endif | ||
456 | - EAX = q; | ||
457 | - EDX = r; | 386 | + helper_divl_EAX_T0(PARAM1); |
458 | } | 387 | } |
459 | 388 | ||
460 | void OPPROTO op_idivl_EAX_T0(void) | 389 | void OPPROTO op_idivl_EAX_T0(void) |
461 | { | 390 | { |
462 | - int den, q, r; | ||
463 | - int64_t num; | ||
464 | - | ||
465 | - num = EAX | ((uint64_t)EDX << 32); | ||
466 | - den = T0; | ||
467 | - if (den == 0) { | ||
468 | - EIP = PARAM1; | ||
469 | - raise_exception(EXCP00_DIVZ); | ||
470 | - } | ||
471 | -#ifdef BUGGY_GCC_DIV64 | ||
472 | - r = idiv64(&q, num, den); | ||
473 | -#else | ||
474 | - q = (num / den); | ||
475 | - r = (num % den); | ||
476 | -#endif | ||
477 | - EAX = q; | ||
478 | - EDX = r; | 391 | + helper_idivl_EAX_T0(PARAM1); |
479 | } | 392 | } |
480 | 393 | ||
481 | /* constant load & misc op */ | 394 | /* constant load & misc op */ |
@@ -708,21 +621,7 @@ void OPPROTO op_boundl(void) | @@ -708,21 +621,7 @@ void OPPROTO op_boundl(void) | ||
708 | 621 | ||
709 | void OPPROTO op_cmpxchg8b(void) | 622 | void OPPROTO op_cmpxchg8b(void) |
710 | { | 623 | { |
711 | - uint64_t d; | ||
712 | - int eflags; | ||
713 | - | ||
714 | - eflags = cc_table[CC_OP].compute_all(); | ||
715 | - d = ldq((uint8_t *)A0); | ||
716 | - if (d == (((uint64_t)EDX << 32) | EAX)) { | ||
717 | - stq((uint8_t *)A0, ((uint64_t)ECX << 32) | EBX); | ||
718 | - eflags |= CC_Z; | ||
719 | - } else { | ||
720 | - EDX = d >> 32; | ||
721 | - EAX = d; | ||
722 | - eflags &= ~CC_Z; | ||
723 | - } | ||
724 | - CC_SRC = eflags; | ||
725 | - FORCE_RET(); | 624 | + helper_cmpxchg8b(); |
726 | } | 625 | } |
727 | 626 | ||
728 | #if defined(__powerpc__) | 627 | #if defined(__powerpc__) |
@@ -937,22 +836,9 @@ void op_addw_ESP_im(void) | @@ -937,22 +836,9 @@ void op_addw_ESP_im(void) | ||
937 | ESP = (ESP & ~0xffff) | ((ESP + PARAM1) & 0xffff); | 836 | ESP = (ESP & ~0xffff) | ((ESP + PARAM1) & 0xffff); |
938 | } | 837 | } |
939 | 838 | ||
940 | -/* rdtsc */ | ||
941 | -#ifndef __i386__ | ||
942 | -uint64_t emu_time; | ||
943 | -#endif | ||
944 | - | ||
945 | void OPPROTO op_rdtsc(void) | 839 | void OPPROTO op_rdtsc(void) |
946 | { | 840 | { |
947 | - uint64_t val; | ||
948 | -#ifdef __i386__ | ||
949 | - asm("rdtsc" : "=A" (val)); | ||
950 | -#else | ||
951 | - /* better than nothing: the time increases */ | ||
952 | - val = emu_time++; | ||
953 | -#endif | ||
954 | - EAX = val; | ||
955 | - EDX = val >> 32; | 841 | + helper_rdtsc(); |
956 | } | 842 | } |
957 | 843 | ||
958 | void OPPROTO op_cpuid(void) | 844 | void OPPROTO op_cpuid(void) |
@@ -1640,7 +1526,7 @@ void OPPROTO op_fildll_ST0_A0(void) | @@ -1640,7 +1526,7 @@ void OPPROTO op_fildll_ST0_A0(void) | ||
1640 | void OPPROTO op_fsts_ST0_A0(void) | 1526 | void OPPROTO op_fsts_ST0_A0(void) |
1641 | { | 1527 | { |
1642 | #ifdef USE_FP_CONVERT | 1528 | #ifdef USE_FP_CONVERT |
1643 | - FP_CONVERT.d = ST0; | 1529 | + FP_CONVERT.f = (float)ST0; |
1644 | stfl((void *)A0, FP_CONVERT.f); | 1530 | stfl((void *)A0, FP_CONVERT.f); |
1645 | #else | 1531 | #else |
1646 | stfl((void *)A0, (float)ST0); | 1532 | stfl((void *)A0, (float)ST0); |
@@ -1904,42 +1790,42 @@ void OPPROTO op_fxam_ST0(void) | @@ -1904,42 +1790,42 @@ void OPPROTO op_fxam_ST0(void) | ||
1904 | 1790 | ||
1905 | void OPPROTO op_fld1_ST0(void) | 1791 | void OPPROTO op_fld1_ST0(void) |
1906 | { | 1792 | { |
1907 | - ST0 = *(CPU86_LDouble *)&f15rk[1]; | 1793 | + ST0 = f15rk[1]; |
1908 | } | 1794 | } |
1909 | 1795 | ||
1910 | void OPPROTO op_fldl2t_ST0(void) | 1796 | void OPPROTO op_fldl2t_ST0(void) |
1911 | { | 1797 | { |
1912 | - ST0 = *(CPU86_LDouble *)&f15rk[6]; | 1798 | + ST0 = f15rk[6]; |
1913 | } | 1799 | } |
1914 | 1800 | ||
1915 | void OPPROTO op_fldl2e_ST0(void) | 1801 | void OPPROTO op_fldl2e_ST0(void) |
1916 | { | 1802 | { |
1917 | - ST0 = *(CPU86_LDouble *)&f15rk[5]; | 1803 | + ST0 = f15rk[5]; |
1918 | } | 1804 | } |
1919 | 1805 | ||
1920 | void OPPROTO op_fldpi_ST0(void) | 1806 | void OPPROTO op_fldpi_ST0(void) |
1921 | { | 1807 | { |
1922 | - ST0 = *(CPU86_LDouble *)&f15rk[2]; | 1808 | + ST0 = f15rk[2]; |
1923 | } | 1809 | } |
1924 | 1810 | ||
1925 | void OPPROTO op_fldlg2_ST0(void) | 1811 | void OPPROTO op_fldlg2_ST0(void) |
1926 | { | 1812 | { |
1927 | - ST0 = *(CPU86_LDouble *)&f15rk[3]; | 1813 | + ST0 = f15rk[3]; |
1928 | } | 1814 | } |
1929 | 1815 | ||
1930 | void OPPROTO op_fldln2_ST0(void) | 1816 | void OPPROTO op_fldln2_ST0(void) |
1931 | { | 1817 | { |
1932 | - ST0 = *(CPU86_LDouble *)&f15rk[4]; | 1818 | + ST0 = f15rk[4]; |
1933 | } | 1819 | } |
1934 | 1820 | ||
1935 | void OPPROTO op_fldz_ST0(void) | 1821 | void OPPROTO op_fldz_ST0(void) |
1936 | { | 1822 | { |
1937 | - ST0 = *(CPU86_LDouble *)&f15rk[0]; | 1823 | + ST0 = f15rk[0]; |
1938 | } | 1824 | } |
1939 | 1825 | ||
1940 | void OPPROTO op_fldz_FT0(void) | 1826 | void OPPROTO op_fldz_FT0(void) |
1941 | { | 1827 | { |
1942 | - ST0 = *(CPU86_LDouble *)&f15rk[0]; | 1828 | + ST0 = f15rk[0]; |
1943 | } | 1829 | } |
1944 | 1830 | ||
1945 | /* associated heplers to reduce generated code length and to simplify | 1831 | /* associated heplers to reduce generated code length and to simplify |