Commit b5b38f61b8d5f4fb900472bade38e7ff610223aa

Authored by bellard
1 parent dbd02bdf

converted more helpers to TCG

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4447 c046a42c-6fe2-441c-8c8c-71466251a162
target-i386/exec.h
@@ -95,10 +95,6 @@ extern int loglevel; @@ -95,10 +95,6 @@ extern int loglevel;
95 #define ST(n) (env->fpregs[(env->fpstt + (n)) & 7].d) 95 #define ST(n) (env->fpregs[(env->fpstt + (n)) & 7].d)
96 #define ST1 ST(1) 96 #define ST1 ST(1)
97 97
98 -#ifdef USE_FP_CONVERT  
99 -#define FP_CONVERT (env->fp_convert)  
100 -#endif  
101 -  
102 #include "cpu.h" 98 #include "cpu.h"
103 #include "exec-all.h" 99 #include "exec-all.h"
104 100
@@ -109,15 +105,13 @@ typedef struct CCTable { @@ -109,15 +105,13 @@ typedef struct CCTable {
109 105
110 extern CCTable cc_table[]; 106 extern CCTable cc_table[];
111 107
112 -void load_seg(int seg_reg, int selector); 108 +void helper_load_seg(int seg_reg, int selector);
113 void helper_ljmp_protected_T0_T1(int next_eip); 109 void helper_ljmp_protected_T0_T1(int next_eip);
114 void helper_lcall_real_T0_T1(int shift, int next_eip); 110 void helper_lcall_real_T0_T1(int shift, int next_eip);
115 void helper_lcall_protected_T0_T1(int shift, int next_eip); 111 void helper_lcall_protected_T0_T1(int shift, int next_eip);
116 void helper_iret_real(int shift); 112 void helper_iret_real(int shift);
117 void helper_iret_protected(int shift, int next_eip); 113 void helper_iret_protected(int shift, int next_eip);
118 void helper_lret_protected(int shift, int addend); 114 void helper_lret_protected(int shift, int addend);
119 -void helper_lldt_T0(void);  
120 -void helper_ltr_T0(void);  
121 void helper_movl_crN_T0(int reg); 115 void helper_movl_crN_T0(int reg);
122 void helper_movl_drN_T0(int reg); 116 void helper_movl_drN_T0(int reg);
123 void helper_invlpg(target_ulong addr); 117 void helper_invlpg(target_ulong addr);
@@ -150,27 +144,7 @@ void OPPROTO op_movl_T0_eflags(void); @@ -150,27 +144,7 @@ void OPPROTO op_movl_T0_eflags(void);
150 void helper_mulq_EAX_T0(void); 144 void helper_mulq_EAX_T0(void);
151 void helper_imulq_EAX_T0(void); 145 void helper_imulq_EAX_T0(void);
152 void helper_imulq_T0_T1(void); 146 void helper_imulq_T0_T1(void);
153 -void helper_divq_EAX_T0(void);  
154 -void helper_idivq_EAX_T0(void);  
155 -void helper_bswapq_T0(void);  
156 void helper_cmpxchg8b(void); 147 void helper_cmpxchg8b(void);
157 -void helper_single_step(void);  
158 -void helper_cpuid(void);  
159 -void helper_enter_level(int level, int data32);  
160 -void helper_enter64_level(int level, int data64);  
161 -void helper_sysenter(void);  
162 -void helper_sysexit(void);  
163 -void helper_syscall(int next_eip_addend);  
164 -void helper_sysret(int dflag);  
165 -void helper_rdtsc(void);  
166 -void helper_rdpmc(void);  
167 -void helper_rdmsr(void);  
168 -void helper_wrmsr(void);  
169 -void helper_lsl(void);  
170 -void helper_lar(void);  
171 -void helper_verr(void);  
172 -void helper_verw(void);  
173 -void helper_rsm(void);  
174 148
175 void check_iob_T0(void); 149 void check_iob_T0(void);
176 void check_iow_T0(void); 150 void check_iow_T0(void);
@@ -183,46 +157,6 @@ void check_iol_DX(void); @@ -183,46 +157,6 @@ void check_iol_DX(void);
183 157
184 #include "softmmu_exec.h" 158 #include "softmmu_exec.h"
185 159
186 -static inline double ldfq(target_ulong ptr)  
187 -{  
188 - union {  
189 - double d;  
190 - uint64_t i;  
191 - } u;  
192 - u.i = ldq(ptr);  
193 - return u.d;  
194 -}  
195 -  
196 -static inline void stfq(target_ulong ptr, double v)  
197 -{  
198 - union {  
199 - double d;  
200 - uint64_t i;  
201 - } u;  
202 - u.d = v;  
203 - stq(ptr, u.i);  
204 -}  
205 -  
206 -static inline float ldfl(target_ulong ptr)  
207 -{  
208 - union {  
209 - float f;  
210 - uint32_t i;  
211 - } u;  
212 - u.i = ldl(ptr);  
213 - return u.f;  
214 -}  
215 -  
216 -static inline void stfl(target_ulong ptr, float v)  
217 -{  
218 - union {  
219 - float f;  
220 - uint32_t i;  
221 - } u;  
222 - u.f = v;  
223 - stl(ptr, u.i);  
224 -}  
225 -  
226 #endif /* !defined(CONFIG_USER_ONLY) */ 160 #endif /* !defined(CONFIG_USER_ONLY) */
227 161
228 #ifdef USE_X86LDOUBLE 162 #ifdef USE_X86LDOUBLE
@@ -429,20 +363,6 @@ extern const CPU86_LDouble f15rk[7]; @@ -429,20 +363,6 @@ extern const CPU86_LDouble f15rk[7];
429 void fpu_raise_exception(void); 363 void fpu_raise_exception(void);
430 void restore_native_fp_state(CPUState *env); 364 void restore_native_fp_state(CPUState *env);
431 void save_native_fp_state(CPUState *env); 365 void save_native_fp_state(CPUState *env);
432 -float approx_rsqrt(float a);  
433 -float approx_rcp(float a);  
434 -void update_fp_status(void);  
435 -void helper_hlt(void);  
436 -void helper_monitor(void);  
437 -void helper_mwait(void);  
438 -void helper_vmrun(target_ulong addr);  
439 -void helper_vmmcall(void);  
440 -void helper_vmload(target_ulong addr);  
441 -void helper_vmsave(target_ulong addr);  
442 -void helper_stgi(void);  
443 -void helper_clgi(void);  
444 -void helper_skinit(void);  
445 -void helper_invlpga(void);  
446 void vmexit(uint64_t exit_code, uint64_t exit_info_1); 366 void vmexit(uint64_t exit_code, uint64_t exit_info_1);
447 367
448 extern const uint8_t parity_table[256]; 368 extern const uint8_t parity_table[256];
target-i386/helper.c
@@ -1609,7 +1609,79 @@ int32_t idiv32(int64_t *q_ptr, int64_t num, int32_t den) @@ -1609,7 +1609,79 @@ int32_t idiv32(int64_t *q_ptr, int64_t num, int32_t den)
1609 } 1609 }
1610 #endif 1610 #endif
1611 1611
1612 -void helper_divl_EAX_T0(target_ulong t0) 1612 +/* division, flags are undefined */
  1613 +
  1614 +void helper_divb_AL(target_ulong t0)
  1615 +{
  1616 + unsigned int num, den, q, r;
  1617 +
  1618 + num = (EAX & 0xffff);
  1619 + den = (t0 & 0xff);
  1620 + if (den == 0) {
  1621 + raise_exception(EXCP00_DIVZ);
  1622 + }
  1623 + q = (num / den);
  1624 + if (q > 0xff)
  1625 + raise_exception(EXCP00_DIVZ);
  1626 + q &= 0xff;
  1627 + r = (num % den) & 0xff;
  1628 + EAX = (EAX & ~0xffff) | (r << 8) | q;
  1629 +}
  1630 +
  1631 +void helper_idivb_AL(target_ulong t0)
  1632 +{
  1633 + int num, den, q, r;
  1634 +
  1635 + num = (int16_t)EAX;
  1636 + den = (int8_t)t0;
  1637 + if (den == 0) {
  1638 + raise_exception(EXCP00_DIVZ);
  1639 + }
  1640 + q = (num / den);
  1641 + if (q != (int8_t)q)
  1642 + raise_exception(EXCP00_DIVZ);
  1643 + q &= 0xff;
  1644 + r = (num % den) & 0xff;
  1645 + EAX = (EAX & ~0xffff) | (r << 8) | q;
  1646 +}
  1647 +
  1648 +void helper_divw_AX(target_ulong t0)
  1649 +{
  1650 + unsigned int num, den, q, r;
  1651 +
  1652 + num = (EAX & 0xffff) | ((EDX & 0xffff) << 16);
  1653 + den = (t0 & 0xffff);
  1654 + if (den == 0) {
  1655 + raise_exception(EXCP00_DIVZ);
  1656 + }
  1657 + q = (num / den);
  1658 + if (q > 0xffff)
  1659 + raise_exception(EXCP00_DIVZ);
  1660 + q &= 0xffff;
  1661 + r = (num % den) & 0xffff;
  1662 + EAX = (EAX & ~0xffff) | q;
  1663 + EDX = (EDX & ~0xffff) | r;
  1664 +}
  1665 +
  1666 +void helper_idivw_AX(target_ulong t0)
  1667 +{
  1668 + int num, den, q, r;
  1669 +
  1670 + num = (EAX & 0xffff) | ((EDX & 0xffff) << 16);
  1671 + den = (int16_t)t0;
  1672 + if (den == 0) {
  1673 + raise_exception(EXCP00_DIVZ);
  1674 + }
  1675 + q = (num / den);
  1676 + if (q != (int16_t)q)
  1677 + raise_exception(EXCP00_DIVZ);
  1678 + q &= 0xffff;
  1679 + r = (num % den) & 0xffff;
  1680 + EAX = (EAX & ~0xffff) | q;
  1681 + EDX = (EDX & ~0xffff) | r;
  1682 +}
  1683 +
  1684 +void helper_divl_EAX(target_ulong t0)
1613 { 1685 {
1614 unsigned int den, r; 1686 unsigned int den, r;
1615 uint64_t num, q; 1687 uint64_t num, q;
@@ -1631,7 +1703,7 @@ void helper_divl_EAX_T0(target_ulong t0) @@ -1631,7 +1703,7 @@ void helper_divl_EAX_T0(target_ulong t0)
1631 EDX = (uint32_t)r; 1703 EDX = (uint32_t)r;
1632 } 1704 }
1633 1705
1634 -void helper_idivl_EAX_T0(target_ulong t0) 1706 +void helper_idivl_EAX(target_ulong t0)
1635 { 1707 {
1636 int den, r; 1708 int den, r;
1637 int64_t num, q; 1709 int64_t num, q;
@@ -1653,6 +1725,138 @@ void helper_idivl_EAX_T0(target_ulong t0) @@ -1653,6 +1725,138 @@ void helper_idivl_EAX_T0(target_ulong t0)
1653 EDX = (uint32_t)r; 1725 EDX = (uint32_t)r;
1654 } 1726 }
1655 1727
  1728 +/* bcd */
  1729 +
  1730 +/* XXX: exception */
  1731 +void helper_aam(int base)
  1732 +{
  1733 + int al, ah;
  1734 + al = EAX & 0xff;
  1735 + ah = al / base;
  1736 + al = al % base;
  1737 + EAX = (EAX & ~0xffff) | al | (ah << 8);
  1738 + CC_DST = al;
  1739 +}
  1740 +
  1741 +void helper_aad(int base)
  1742 +{
  1743 + int al, ah;
  1744 + al = EAX & 0xff;
  1745 + ah = (EAX >> 8) & 0xff;
  1746 + al = ((ah * base) + al) & 0xff;
  1747 + EAX = (EAX & ~0xffff) | al;
  1748 + CC_DST = al;
  1749 +}
  1750 +
  1751 +void helper_aaa(void)
  1752 +{
  1753 + int icarry;
  1754 + int al, ah, af;
  1755 + int eflags;
  1756 +
  1757 + eflags = cc_table[CC_OP].compute_all();
  1758 + af = eflags & CC_A;
  1759 + al = EAX & 0xff;
  1760 + ah = (EAX >> 8) & 0xff;
  1761 +
  1762 + icarry = (al > 0xf9);
  1763 + if (((al & 0x0f) > 9 ) || af) {
  1764 + al = (al + 6) & 0x0f;
  1765 + ah = (ah + 1 + icarry) & 0xff;
  1766 + eflags |= CC_C | CC_A;
  1767 + } else {
  1768 + eflags &= ~(CC_C | CC_A);
  1769 + al &= 0x0f;
  1770 + }
  1771 + EAX = (EAX & ~0xffff) | al | (ah << 8);
  1772 + CC_SRC = eflags;
  1773 + FORCE_RET();
  1774 +}
  1775 +
  1776 +void helper_aas(void)
  1777 +{
  1778 + int icarry;
  1779 + int al, ah, af;
  1780 + int eflags;
  1781 +
  1782 + eflags = cc_table[CC_OP].compute_all();
  1783 + af = eflags & CC_A;
  1784 + al = EAX & 0xff;
  1785 + ah = (EAX >> 8) & 0xff;
  1786 +
  1787 + icarry = (al < 6);
  1788 + if (((al & 0x0f) > 9 ) || af) {
  1789 + al = (al - 6) & 0x0f;
  1790 + ah = (ah - 1 - icarry) & 0xff;
  1791 + eflags |= CC_C | CC_A;
  1792 + } else {
  1793 + eflags &= ~(CC_C | CC_A);
  1794 + al &= 0x0f;
  1795 + }
  1796 + EAX = (EAX & ~0xffff) | al | (ah << 8);
  1797 + CC_SRC = eflags;
  1798 + FORCE_RET();
  1799 +}
  1800 +
  1801 +void helper_daa(void)
  1802 +{
  1803 + int al, af, cf;
  1804 + int eflags;
  1805 +
  1806 + eflags = cc_table[CC_OP].compute_all();
  1807 + cf = eflags & CC_C;
  1808 + af = eflags & CC_A;
  1809 + al = EAX & 0xff;
  1810 +
  1811 + eflags = 0;
  1812 + if (((al & 0x0f) > 9 ) || af) {
  1813 + al = (al + 6) & 0xff;
  1814 + eflags |= CC_A;
  1815 + }
  1816 + if ((al > 0x9f) || cf) {
  1817 + al = (al + 0x60) & 0xff;
  1818 + eflags |= CC_C;
  1819 + }
  1820 + EAX = (EAX & ~0xff) | al;
  1821 + /* well, speed is not an issue here, so we compute the flags by hand */
  1822 + eflags |= (al == 0) << 6; /* zf */
  1823 + eflags |= parity_table[al]; /* pf */
  1824 + eflags |= (al & 0x80); /* sf */
  1825 + CC_SRC = eflags;
  1826 + FORCE_RET();
  1827 +}
  1828 +
  1829 +void helper_das(void)
  1830 +{
  1831 + int al, al1, af, cf;
  1832 + int eflags;
  1833 +
  1834 + eflags = cc_table[CC_OP].compute_all();
  1835 + cf = eflags & CC_C;
  1836 + af = eflags & CC_A;
  1837 + al = EAX & 0xff;
  1838 +
  1839 + eflags = 0;
  1840 + al1 = al;
  1841 + if (((al & 0x0f) > 9 ) || af) {
  1842 + eflags |= CC_A;
  1843 + if (al < 6 || cf)
  1844 + eflags |= CC_C;
  1845 + al = (al - 6) & 0xff;
  1846 + }
  1847 + if ((al1 > 0x99) || cf) {
  1848 + al = (al - 0x60) & 0xff;
  1849 + eflags |= CC_C;
  1850 + }
  1851 + EAX = (EAX & ~0xff) | al;
  1852 + /* well, speed is not an issue here, so we compute the flags by hand */
  1853 + eflags |= (al == 0) << 6; /* zf */
  1854 + eflags |= parity_table[al]; /* pf */
  1855 + eflags |= (al & 0x80); /* sf */
  1856 + CC_SRC = eflags;
  1857 + FORCE_RET();
  1858 +}
  1859 +
1656 void helper_cmpxchg8b(void) 1860 void helper_cmpxchg8b(void)
1657 { 1861 {
1658 uint64_t d; 1862 uint64_t d;
@@ -1845,15 +2049,14 @@ void helper_enter64_level(int level, int data64) @@ -1845,15 +2049,14 @@ void helper_enter64_level(int level, int data64)
1845 } 2049 }
1846 #endif 2050 #endif
1847 2051
1848 -void helper_lldt_T0(void) 2052 +void helper_lldt(int selector)
1849 { 2053 {
1850 - int selector;  
1851 SegmentCache *dt; 2054 SegmentCache *dt;
1852 uint32_t e1, e2; 2055 uint32_t e1, e2;
1853 int index, entry_limit; 2056 int index, entry_limit;
1854 target_ulong ptr; 2057 target_ulong ptr;
1855 2058
1856 - selector = T0 & 0xffff; 2059 + selector &= 0xffff;
1857 if ((selector & 0xfffc) == 0) { 2060 if ((selector & 0xfffc) == 0) {
1858 /* XXX: NULL selector case: invalid LDT */ 2061 /* XXX: NULL selector case: invalid LDT */
1859 env->ldt.base = 0; 2062 env->ldt.base = 0;
@@ -1893,15 +2096,14 @@ void helper_lldt_T0(void) @@ -1893,15 +2096,14 @@ void helper_lldt_T0(void)
1893 env->ldt.selector = selector; 2096 env->ldt.selector = selector;
1894 } 2097 }
1895 2098
1896 -void helper_ltr_T0(void) 2099 +void helper_ltr(int selector)
1897 { 2100 {
1898 - int selector;  
1899 SegmentCache *dt; 2101 SegmentCache *dt;
1900 uint32_t e1, e2; 2102 uint32_t e1, e2;
1901 int index, type, entry_limit; 2103 int index, type, entry_limit;
1902 target_ulong ptr; 2104 target_ulong ptr;
1903 2105
1904 - selector = T0 & 0xffff; 2106 + selector &= 0xffff;
1905 if ((selector & 0xfffc) == 0) { 2107 if ((selector & 0xfffc) == 0) {
1906 /* NULL selector case: invalid TR */ 2108 /* NULL selector case: invalid TR */
1907 env->tr.base = 0; 2109 env->tr.base = 0;
@@ -1950,7 +2152,7 @@ void helper_ltr_T0(void) @@ -1950,7 +2152,7 @@ void helper_ltr_T0(void)
1950 } 2152 }
1951 2153
1952 /* only works if protected mode and not VM86. seg_reg must be != R_CS */ 2154 /* only works if protected mode and not VM86. seg_reg must be != R_CS */
1953 -void load_seg(int seg_reg, int selector) 2155 +void helper_load_seg(int seg_reg, int selector)
1954 { 2156 {
1955 uint32_t e1, e2; 2157 uint32_t e1, e2;
1956 int cpl, dpl, rpl; 2158 int cpl, dpl, rpl;
@@ -2916,14 +3118,14 @@ void helper_rdmsr(void) @@ -2916,14 +3118,14 @@ void helper_rdmsr(void)
2916 } 3118 }
2917 #endif 3119 #endif
2918 3120
2919 -void helper_lsl(void) 3121 +void helper_lsl(uint32_t selector)
2920 { 3122 {
2921 - unsigned int selector, limit; 3123 + unsigned int limit;
2922 uint32_t e1, e2, eflags; 3124 uint32_t e1, e2, eflags;
2923 int rpl, dpl, cpl, type; 3125 int rpl, dpl, cpl, type;
2924 3126
  3127 + selector &= 0xffff;
2925 eflags = cc_table[CC_OP].compute_all(); 3128 eflags = cc_table[CC_OP].compute_all();
2926 - selector = T0 & 0xffff;  
2927 if (load_segment(&e1, &e2, selector) != 0) 3129 if (load_segment(&e1, &e2, selector) != 0)
2928 goto fail; 3130 goto fail;
2929 rpl = selector & 3; 3131 rpl = selector & 3;
@@ -2959,14 +3161,13 @@ void helper_lsl(void) @@ -2959,14 +3161,13 @@ void helper_lsl(void)
2959 CC_SRC = eflags | CC_Z; 3161 CC_SRC = eflags | CC_Z;
2960 } 3162 }
2961 3163
2962 -void helper_lar(void) 3164 +void helper_lar(uint32_t selector)
2963 { 3165 {
2964 - unsigned int selector;  
2965 uint32_t e1, e2, eflags; 3166 uint32_t e1, e2, eflags;
2966 int rpl, dpl, cpl, type; 3167 int rpl, dpl, cpl, type;
2967 3168
  3169 + selector &= 0xffff;
2968 eflags = cc_table[CC_OP].compute_all(); 3170 eflags = cc_table[CC_OP].compute_all();
2969 - selector = T0 & 0xffff;  
2970 if ((selector & 0xfffc) == 0) 3171 if ((selector & 0xfffc) == 0)
2971 goto fail; 3172 goto fail;
2972 if (load_segment(&e1, &e2, selector) != 0) 3173 if (load_segment(&e1, &e2, selector) != 0)
@@ -3006,14 +3207,13 @@ void helper_lar(void) @@ -3006,14 +3207,13 @@ void helper_lar(void)
3006 CC_SRC = eflags | CC_Z; 3207 CC_SRC = eflags | CC_Z;
3007 } 3208 }
3008 3209
3009 -void helper_verr(void) 3210 +void helper_verr(uint32_t selector)
3010 { 3211 {
3011 - unsigned int selector;  
3012 uint32_t e1, e2, eflags; 3212 uint32_t e1, e2, eflags;
3013 int rpl, dpl, cpl; 3213 int rpl, dpl, cpl;
3014 3214
  3215 + selector &= 0xffff;
3015 eflags = cc_table[CC_OP].compute_all(); 3216 eflags = cc_table[CC_OP].compute_all();
3016 - selector = T0 & 0xffff;  
3017 if ((selector & 0xfffc) == 0) 3217 if ((selector & 0xfffc) == 0)
3018 goto fail; 3218 goto fail;
3019 if (load_segment(&e1, &e2, selector) != 0) 3219 if (load_segment(&e1, &e2, selector) != 0)
@@ -3040,14 +3240,13 @@ void helper_verr(void) @@ -3040,14 +3240,13 @@ void helper_verr(void)
3040 CC_SRC = eflags | CC_Z; 3240 CC_SRC = eflags | CC_Z;
3041 } 3241 }
3042 3242
3043 -void helper_verw(void) 3243 +void helper_verw(uint32_t selector)
3044 { 3244 {
3045 - unsigned int selector;  
3046 uint32_t e1, e2, eflags; 3245 uint32_t e1, e2, eflags;
3047 int rpl, dpl, cpl; 3246 int rpl, dpl, cpl;
3048 3247
  3248 + selector &= 0xffff;
3049 eflags = cc_table[CC_OP].compute_all(); 3249 eflags = cc_table[CC_OP].compute_all();
3050 - selector = T0 & 0xffff;  
3051 if ((selector & 0xfffc) == 0) 3250 if ((selector & 0xfffc) == 0)
3052 goto fail; 3251 goto fail;
3053 if (load_segment(&e1, &e2, selector) != 0) 3252 if (load_segment(&e1, &e2, selector) != 0)
@@ -3484,6 +3683,44 @@ uint32_t helper_fnstcw(void) @@ -3484,6 +3683,44 @@ uint32_t helper_fnstcw(void)
3484 return env->fpuc; 3683 return env->fpuc;
3485 } 3684 }
3486 3685
  3686 +static void update_fp_status(void)
  3687 +{
  3688 + int rnd_type;
  3689 +
  3690 + /* set rounding mode */
  3691 + switch(env->fpuc & RC_MASK) {
  3692 + default:
  3693 + case RC_NEAR:
  3694 + rnd_type = float_round_nearest_even;
  3695 + break;
  3696 + case RC_DOWN:
  3697 + rnd_type = float_round_down;
  3698 + break;
  3699 + case RC_UP:
  3700 + rnd_type = float_round_up;
  3701 + break;
  3702 + case RC_CHOP:
  3703 + rnd_type = float_round_to_zero;
  3704 + break;
  3705 + }
  3706 + set_float_rounding_mode(rnd_type, &env->fp_status);
  3707 +#ifdef FLOATX80
  3708 + switch((env->fpuc >> 8) & 3) {
  3709 + case 0:
  3710 + rnd_type = 32;
  3711 + break;
  3712 + case 2:
  3713 + rnd_type = 64;
  3714 + break;
  3715 + case 3:
  3716 + default:
  3717 + rnd_type = 80;
  3718 + break;
  3719 + }
  3720 + set_floatx80_rounding_precision(rnd_type, &env->fp_status);
  3721 +#endif
  3722 +}
  3723 +
3487 void helper_fldcw(uint32_t val) 3724 void helper_fldcw(uint32_t val)
3488 { 3725 {
3489 env->fpuc = val; 3726 env->fpuc = val;
@@ -4207,38 +4444,33 @@ void helper_imulq_T0_T1(void) @@ -4207,38 +4444,33 @@ void helper_imulq_T0_T1(void)
4207 CC_SRC = ((int64_t)r1 != ((int64_t)r0 >> 63)); 4444 CC_SRC = ((int64_t)r1 != ((int64_t)r0 >> 63));
4208 } 4445 }
4209 4446
4210 -void helper_divq_EAX_T0(void) 4447 +void helper_divq_EAX(target_ulong t0)
4211 { 4448 {
4212 uint64_t r0, r1; 4449 uint64_t r0, r1;
4213 - if (T0 == 0) { 4450 + if (t0 == 0) {
4214 raise_exception(EXCP00_DIVZ); 4451 raise_exception(EXCP00_DIVZ);
4215 } 4452 }
4216 r0 = EAX; 4453 r0 = EAX;
4217 r1 = EDX; 4454 r1 = EDX;
4218 - if (div64(&r0, &r1, T0)) 4455 + if (div64(&r0, &r1, t0))
4219 raise_exception(EXCP00_DIVZ); 4456 raise_exception(EXCP00_DIVZ);
4220 EAX = r0; 4457 EAX = r0;
4221 EDX = r1; 4458 EDX = r1;
4222 } 4459 }
4223 4460
4224 -void helper_idivq_EAX_T0(void) 4461 +void helper_idivq_EAX(target_ulong t0)
4225 { 4462 {
4226 uint64_t r0, r1; 4463 uint64_t r0, r1;
4227 - if (T0 == 0) { 4464 + if (t0 == 0) {
4228 raise_exception(EXCP00_DIVZ); 4465 raise_exception(EXCP00_DIVZ);
4229 } 4466 }
4230 r0 = EAX; 4467 r0 = EAX;
4231 r1 = EDX; 4468 r1 = EDX;
4232 - if (idiv64(&r0, &r1, T0)) 4469 + if (idiv64(&r0, &r1, t0))
4233 raise_exception(EXCP00_DIVZ); 4470 raise_exception(EXCP00_DIVZ);
4234 EAX = r0; 4471 EAX = r0;
4235 EDX = r1; 4472 EDX = r1;
4236 } 4473 }
4237 -  
4238 -void helper_bswapq_T0(void)  
4239 -{  
4240 - T0 = bswap64(T0);  
4241 -}  
4242 #endif 4474 #endif
4243 4475
4244 void helper_hlt(void) 4476 void helper_hlt(void)
@@ -4249,7 +4481,7 @@ void helper_hlt(void) @@ -4249,7 +4481,7 @@ void helper_hlt(void)
4249 cpu_loop_exit(); 4481 cpu_loop_exit();
4250 } 4482 }
4251 4483
4252 -void helper_monitor(void) 4484 +void helper_monitor(target_ulong ptr)
4253 { 4485 {
4254 if ((uint32_t)ECX != 0) 4486 if ((uint32_t)ECX != 0)
4255 raise_exception(EXCP0D_GPF); 4487 raise_exception(EXCP0D_GPF);
@@ -4269,52 +4501,90 @@ void helper_mwait(void) @@ -4269,52 +4501,90 @@ void helper_mwait(void)
4269 } 4501 }
4270 } 4502 }
4271 4503
4272 -float approx_rsqrt(float a) 4504 +void helper_debug(void)
4273 { 4505 {
4274 - return 1.0 / sqrt(a); 4506 + env->exception_index = EXCP_DEBUG;
  4507 + cpu_loop_exit();
4275 } 4508 }
4276 4509
4277 -float approx_rcp(float a) 4510 +void helper_raise_interrupt(int intno, int next_eip_addend)
4278 { 4511 {
4279 - return 1.0 / a; 4512 + raise_interrupt(intno, 1, 0, next_eip_addend);
4280 } 4513 }
4281 4514
4282 -void update_fp_status(void) 4515 +void helper_raise_exception(int exception_index)
4283 { 4516 {
4284 - int rnd_type; 4517 + raise_exception(exception_index);
  4518 +}
4285 4519
4286 - /* set rounding mode */  
4287 - switch(env->fpuc & RC_MASK) {  
4288 - default:  
4289 - case RC_NEAR:  
4290 - rnd_type = float_round_nearest_even;  
4291 - break;  
4292 - case RC_DOWN:  
4293 - rnd_type = float_round_down;  
4294 - break;  
4295 - case RC_UP:  
4296 - rnd_type = float_round_up;  
4297 - break;  
4298 - case RC_CHOP:  
4299 - rnd_type = float_round_to_zero;  
4300 - break;  
4301 - }  
4302 - set_float_rounding_mode(rnd_type, &env->fp_status);  
4303 -#ifdef FLOATX80  
4304 - switch((env->fpuc >> 8) & 3) {  
4305 - case 0:  
4306 - rnd_type = 32;  
4307 - break;  
4308 - case 2:  
4309 - rnd_type = 64;  
4310 - break;  
4311 - case 3:  
4312 - default:  
4313 - rnd_type = 80;  
4314 - break; 4520 +void helper_cli(void)
  4521 +{
  4522 + env->eflags &= ~IF_MASK;
  4523 +}
  4524 +
  4525 +void helper_sti(void)
  4526 +{
  4527 + env->eflags |= IF_MASK;
  4528 +}
  4529 +
  4530 +#if 0
  4531 +/* vm86plus instructions */
  4532 +void helper_cli_vm(void)
  4533 +{
  4534 + env->eflags &= ~VIF_MASK;
  4535 +}
  4536 +
  4537 +void helper_sti_vm(void)
  4538 +{
  4539 + env->eflags |= VIF_MASK;
  4540 + if (env->eflags & VIP_MASK) {
  4541 + raise_exception(EXCP0D_GPF);
4315 } 4542 }
4316 - set_floatx80_rounding_precision(rnd_type, &env->fp_status); 4543 +}
4317 #endif 4544 #endif
  4545 +
  4546 +void helper_set_inhibit_irq(void)
  4547 +{
  4548 + env->hflags |= HF_INHIBIT_IRQ_MASK;
  4549 +}
  4550 +
  4551 +void helper_reset_inhibit_irq(void)
  4552 +{
  4553 + env->hflags &= ~HF_INHIBIT_IRQ_MASK;
  4554 +}
  4555 +
  4556 +void helper_boundw(void)
  4557 +{
  4558 + int low, high, v;
  4559 + low = ldsw(A0);
  4560 + high = ldsw(A0 + 2);
  4561 + v = (int16_t)T0;
  4562 + if (v < low || v > high) {
  4563 + raise_exception(EXCP05_BOUND);
  4564 + }
  4565 + FORCE_RET();
  4566 +}
  4567 +
  4568 +void helper_boundl(void)
  4569 +{
  4570 + int low, high, v;
  4571 + low = ldl(A0);
  4572 + high = ldl(A0 + 4);
  4573 + v = T0;
  4574 + if (v < low || v > high) {
  4575 + raise_exception(EXCP05_BOUND);
  4576 + }
  4577 + FORCE_RET();
  4578 +}
  4579 +
  4580 +static float approx_rsqrt(float a)
  4581 +{
  4582 + return 1.0 / sqrt(a);
  4583 +}
  4584 +
  4585 +static float approx_rcp(float a)
  4586 +{
  4587 + return 1.0 / a;
4318 } 4588 }
4319 4589
4320 #if !defined(CONFIG_USER_ONLY) 4590 #if !defined(CONFIG_USER_ONLY)
@@ -4391,10 +4661,10 @@ void helper_clgi(void) @@ -4391,10 +4661,10 @@ void helper_clgi(void)
4391 4661
4392 #if defined(CONFIG_USER_ONLY) 4662 #if defined(CONFIG_USER_ONLY)
4393 4663
4394 -void helper_vmrun(target_ulong addr) { } 4664 +void helper_vmrun(void) { }
4395 void helper_vmmcall(void) { } 4665 void helper_vmmcall(void) { }
4396 -void helper_vmload(target_ulong addr) { }  
4397 -void helper_vmsave(target_ulong addr) { } 4666 +void helper_vmload(void) { }
  4667 +void helper_vmsave(void) { }
4398 void helper_skinit(void) { } 4668 void helper_skinit(void) { }
4399 void helper_invlpga(void) { } 4669 void helper_invlpga(void) { }
4400 void vmexit(uint64_t exit_code, uint64_t exit_info_1) { } 4670 void vmexit(uint64_t exit_code, uint64_t exit_info_1) { }
@@ -4421,11 +4691,13 @@ static inline uint16_t cpu2vmcb_attrib(uint32_t cpu_attrib) @@ -4421,11 +4691,13 @@ static inline uint16_t cpu2vmcb_attrib(uint32_t cpu_attrib)
4421 | ((cpu_attrib & 0xf00000) >> 12); /* AVL, L, DB, G */ 4691 | ((cpu_attrib & 0xf00000) >> 12); /* AVL, L, DB, G */
4422 } 4692 }
4423 4693
4424 -void helper_vmrun(target_ulong addr) 4694 +void helper_vmrun(void)
4425 { 4695 {
  4696 + target_ulong addr;
4426 uint32_t event_inj; 4697 uint32_t event_inj;
4427 uint32_t int_ctl; 4698 uint32_t int_ctl;
4428 4699
  4700 + addr = EAX;
4429 if (loglevel & CPU_LOG_TB_IN_ASM) 4701 if (loglevel & CPU_LOG_TB_IN_ASM)
4430 fprintf(logfile,"vmrun! " TARGET_FMT_lx "\n", addr); 4702 fprintf(logfile,"vmrun! " TARGET_FMT_lx "\n", addr);
4431 4703
@@ -4592,8 +4864,10 @@ void helper_vmmcall(void) @@ -4592,8 +4864,10 @@ void helper_vmmcall(void)
4592 fprintf(logfile,"vmmcall!\n"); 4864 fprintf(logfile,"vmmcall!\n");
4593 } 4865 }
4594 4866
4595 -void helper_vmload(target_ulong addr) 4867 +void helper_vmload(void)
4596 { 4868 {
  4869 + target_ulong addr;
  4870 + addr = EAX;
4597 if (loglevel & CPU_LOG_TB_IN_ASM) 4871 if (loglevel & CPU_LOG_TB_IN_ASM)
4598 fprintf(logfile,"vmload! " TARGET_FMT_lx "\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n", 4872 fprintf(logfile,"vmload! " TARGET_FMT_lx "\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n",
4599 addr, ldq_phys(addr + offsetof(struct vmcb, save.fs.base)), 4873 addr, ldq_phys(addr + offsetof(struct vmcb, save.fs.base)),
@@ -4616,8 +4890,10 @@ void helper_vmload(target_ulong addr) @@ -4616,8 +4890,10 @@ void helper_vmload(target_ulong addr)
4616 env->sysenter_eip = ldq_phys(addr + offsetof(struct vmcb, save.sysenter_eip)); 4890 env->sysenter_eip = ldq_phys(addr + offsetof(struct vmcb, save.sysenter_eip));
4617 } 4891 }
4618 4892
4619 -void helper_vmsave(target_ulong addr) 4893 +void helper_vmsave(void)
4620 { 4894 {
  4895 + target_ulong addr;
  4896 + addr = EAX;
4621 if (loglevel & CPU_LOG_TB_IN_ASM) 4897 if (loglevel & CPU_LOG_TB_IN_ASM)
4622 fprintf(logfile,"vmsave! " TARGET_FMT_lx "\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n", 4898 fprintf(logfile,"vmsave! " TARGET_FMT_lx "\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n",
4623 addr, ldq_phys(addr + offsetof(struct vmcb, save.fs.base)), 4899 addr, ldq_phys(addr + offsetof(struct vmcb, save.fs.base)),
target-i386/helper.h
1 #define TCG_HELPER_PROTO 1 #define TCG_HELPER_PROTO
2 2
3 -void TCG_HELPER_PROTO helper_divl_EAX_T0(target_ulong t0);  
4 -void TCG_HELPER_PROTO helper_idivl_EAX_T0(target_ulong t0); 3 +void helper_divb_AL(target_ulong t0);
  4 +void helper_idivb_AL(target_ulong t0);
  5 +void helper_divw_AX(target_ulong t0);
  6 +void helper_idivw_AX(target_ulong t0);
  7 +void helper_divl_EAX(target_ulong t0);
  8 +void helper_idivl_EAX(target_ulong t0);
  9 +#ifdef TARGET_X86_64
  10 +void helper_divq_EAX(target_ulong t0);
  11 +void helper_idivq_EAX(target_ulong t0);
  12 +#endif
  13 +
  14 +void helper_aam(int base);
  15 +void helper_aad(int base);
  16 +void helper_aaa(void);
  17 +void helper_aas(void);
  18 +void helper_daa(void);
  19 +void helper_das(void);
  20 +
  21 +void helper_lsl(uint32_t selector);
  22 +void helper_lar(uint32_t selector);
  23 +void helper_verr(uint32_t selector);
  24 +void helper_verw(uint32_t selector);
  25 +void helper_lldt(int selector);
  26 +void helper_ltr(int selector);
  27 +void helper_load_seg(int seg_reg, int selector);
  28 +void helper_ljmp_protected_T0_T1(int next_eip);
  29 +void helper_lcall_real_T0_T1(int shift, int next_eip);
  30 +void helper_lcall_protected_T0_T1(int shift, int next_eip);
  31 +void helper_iret_real(int shift);
  32 +void helper_iret_protected(int shift, int next_eip);
  33 +void helper_lret_protected(int shift, int addend);
  34 +void helper_movl_crN_T0(int reg);
  35 +void helper_movl_drN_T0(int reg);
  36 +void helper_invlpg(target_ulong addr);
  37 +
  38 +void helper_enter_level(int level, int data32);
  39 +#ifdef TARGET_X86_64
  40 +void helper_enter64_level(int level, int data64);
  41 +#endif
  42 +void helper_sysenter(void);
  43 +void helper_sysexit(void);
  44 +#ifdef TARGET_X86_64
  45 +void helper_syscall(int next_eip_addend);
  46 +void helper_sysret(int dflag);
  47 +#endif
  48 +void helper_hlt(void);
  49 +void helper_monitor(target_ulong ptr);
  50 +void helper_mwait(void);
  51 +void helper_debug(void);
  52 +void helper_raise_interrupt(int intno, int next_eip_addend);
  53 +void helper_raise_exception(int exception_index);
  54 +void helper_cli(void);
  55 +void helper_sti(void);
  56 +void helper_set_inhibit_irq(void);
  57 +void helper_reset_inhibit_irq(void);
  58 +void helper_boundw(void);
  59 +void helper_boundl(void);
  60 +void helper_rsm(void);
  61 +void helper_single_step(void);
  62 +void helper_cpuid(void);
  63 +void helper_rdtsc(void);
  64 +void helper_rdpmc(void);
  65 +void helper_rdmsr(void);
  66 +void helper_wrmsr(void);
  67 +
  68 +void helper_vmrun(void);
  69 +void helper_vmmcall(void);
  70 +void helper_vmload(void);
  71 +void helper_vmsave(void);
  72 +void helper_stgi(void);
  73 +void helper_clgi(void);
  74 +void helper_skinit(void);
  75 +void helper_invlpga(void);
5 76
6 /* x86 FPU */ 77 /* x86 FPU */
7 78
target-i386/op.c
@@ -290,90 +290,6 @@ void OPPROTO op_imulq_T0_T1(void) @@ -290,90 +290,6 @@ void OPPROTO op_imulq_T0_T1(void)
290 } 290 }
291 #endif 291 #endif
292 292
293 -/* division, flags are undefined */  
294 -  
295 -void OPPROTO op_divb_AL_T0(void)  
296 -{  
297 - unsigned int num, den, q, r;  
298 -  
299 - num = (EAX & 0xffff);  
300 - den = (T0 & 0xff);  
301 - if (den == 0) {  
302 - raise_exception(EXCP00_DIVZ);  
303 - }  
304 - q = (num / den);  
305 - if (q > 0xff)  
306 - raise_exception(EXCP00_DIVZ);  
307 - q &= 0xff;  
308 - r = (num % den) & 0xff;  
309 - EAX = (EAX & ~0xffff) | (r << 8) | q;  
310 -}  
311 -  
312 -void OPPROTO op_idivb_AL_T0(void)  
313 -{  
314 - int num, den, q, r;  
315 -  
316 - num = (int16_t)EAX;  
317 - den = (int8_t)T0;  
318 - if (den == 0) {  
319 - raise_exception(EXCP00_DIVZ);  
320 - }  
321 - q = (num / den);  
322 - if (q != (int8_t)q)  
323 - raise_exception(EXCP00_DIVZ);  
324 - q &= 0xff;  
325 - r = (num % den) & 0xff;  
326 - EAX = (EAX & ~0xffff) | (r << 8) | q;  
327 -}  
328 -  
329 -void OPPROTO op_divw_AX_T0(void)  
330 -{  
331 - unsigned int num, den, q, r;  
332 -  
333 - num = (EAX & 0xffff) | ((EDX & 0xffff) << 16);  
334 - den = (T0 & 0xffff);  
335 - if (den == 0) {  
336 - raise_exception(EXCP00_DIVZ);  
337 - }  
338 - q = (num / den);  
339 - if (q > 0xffff)  
340 - raise_exception(EXCP00_DIVZ);  
341 - q &= 0xffff;  
342 - r = (num % den) & 0xffff;  
343 - EAX = (EAX & ~0xffff) | q;  
344 - EDX = (EDX & ~0xffff) | r;  
345 -}  
346 -  
347 -void OPPROTO op_idivw_AX_T0(void)  
348 -{  
349 - int num, den, q, r;  
350 -  
351 - num = (EAX & 0xffff) | ((EDX & 0xffff) << 16);  
352 - den = (int16_t)T0;  
353 - if (den == 0) {  
354 - raise_exception(EXCP00_DIVZ);  
355 - }  
356 - q = (num / den);  
357 - if (q != (int16_t)q)  
358 - raise_exception(EXCP00_DIVZ);  
359 - q &= 0xffff;  
360 - r = (num % den) & 0xffff;  
361 - EAX = (EAX & ~0xffff) | q;  
362 - EDX = (EDX & ~0xffff) | r;  
363 -}  
364 -  
365 -#ifdef TARGET_X86_64  
366 -void OPPROTO op_divq_EAX_T0(void)  
367 -{  
368 - helper_divq_EAX_T0();  
369 -}  
370 -  
371 -void OPPROTO op_idivq_EAX_T0(void)  
372 -{  
373 - helper_idivq_EAX_T0();  
374 -}  
375 -#endif  
376 -  
377 /* constant load & misc op */ 293 /* constant load & misc op */
378 294
379 /* XXX: consistent names */ 295 /* XXX: consistent names */
@@ -423,42 +339,6 @@ void OPPROTO op_addq_A0_AL(void) @@ -423,42 +339,6 @@ void OPPROTO op_addq_A0_AL(void)
423 339
424 #endif 340 #endif
425 341
426 -void OPPROTO op_hlt(void)  
427 -{  
428 - helper_hlt();  
429 -}  
430 -  
431 -void OPPROTO op_monitor(void)  
432 -{  
433 - helper_monitor();  
434 -}  
435 -  
436 -void OPPROTO op_mwait(void)  
437 -{  
438 - helper_mwait();  
439 -}  
440 -  
441 -void OPPROTO op_debug(void)  
442 -{  
443 - env->exception_index = EXCP_DEBUG;  
444 - cpu_loop_exit();  
445 -}  
446 -  
447 -void OPPROTO op_raise_interrupt(void)  
448 -{  
449 - int intno, next_eip_addend;  
450 - intno = PARAM1;  
451 - next_eip_addend = PARAM2;  
452 - raise_interrupt(intno, 1, 0, next_eip_addend);  
453 -}  
454 -  
455 -void OPPROTO op_raise_exception(void)  
456 -{  
457 - int exception_index;  
458 - exception_index = PARAM1;  
459 - raise_exception(exception_index);  
460 -}  
461 -  
462 void OPPROTO op_into(void) 342 void OPPROTO op_into(void)
463 { 343 {
464 int eflags; 344 int eflags;
@@ -469,83 +349,11 @@ void OPPROTO op_into(void) @@ -469,83 +349,11 @@ void OPPROTO op_into(void)
469 FORCE_RET(); 349 FORCE_RET();
470 } 350 }
471 351
472 -void OPPROTO op_cli(void)  
473 -{  
474 - env->eflags &= ~IF_MASK;  
475 -}  
476 -  
477 -void OPPROTO op_sti(void)  
478 -{  
479 - env->eflags |= IF_MASK;  
480 -}  
481 -  
482 -void OPPROTO op_set_inhibit_irq(void)  
483 -{  
484 - env->hflags |= HF_INHIBIT_IRQ_MASK;  
485 -}  
486 -  
487 -void OPPROTO op_reset_inhibit_irq(void)  
488 -{  
489 - env->hflags &= ~HF_INHIBIT_IRQ_MASK;  
490 -}  
491 -  
492 -void OPPROTO op_rsm(void)  
493 -{  
494 - helper_rsm();  
495 -}  
496 -  
497 -#if 0  
498 -/* vm86plus instructions */  
499 -void OPPROTO op_cli_vm(void)  
500 -{  
501 - env->eflags &= ~VIF_MASK;  
502 -}  
503 -  
504 -void OPPROTO op_sti_vm(void)  
505 -{  
506 - env->eflags |= VIF_MASK;  
507 - if (env->eflags & VIP_MASK) {  
508 - EIP = PARAM1;  
509 - raise_exception(EXCP0D_GPF);  
510 - }  
511 - FORCE_RET();  
512 -}  
513 -#endif  
514 -  
515 -void OPPROTO op_boundw(void)  
516 -{  
517 - int low, high, v;  
518 - low = ldsw(A0);  
519 - high = ldsw(A0 + 2);  
520 - v = (int16_t)T0;  
521 - if (v < low || v > high) {  
522 - raise_exception(EXCP05_BOUND);  
523 - }  
524 - FORCE_RET();  
525 -}  
526 -  
527 -void OPPROTO op_boundl(void)  
528 -{  
529 - int low, high, v;  
530 - low = ldl(A0);  
531 - high = ldl(A0 + 4);  
532 - v = T0;  
533 - if (v < low || v > high) {  
534 - raise_exception(EXCP05_BOUND);  
535 - }  
536 - FORCE_RET();  
537 -}  
538 -  
539 void OPPROTO op_cmpxchg8b(void) 352 void OPPROTO op_cmpxchg8b(void)
540 { 353 {
541 helper_cmpxchg8b(); 354 helper_cmpxchg8b();
542 } 355 }
543 356
544 -void OPPROTO op_single_step(void)  
545 -{  
546 - helper_single_step();  
547 -}  
548 -  
549 /* multiple size ops */ 357 /* multiple size ops */
550 358
551 #define ldul ldl 359 #define ldul ldl
@@ -680,197 +488,36 @@ void OPPROTO op_decq_ECX(void) @@ -680,197 +488,36 @@ void OPPROTO op_decq_ECX(void)
680 } 488 }
681 #endif 489 #endif
682 490
683 -void OPPROTO op_rdtsc(void)  
684 -{  
685 - helper_rdtsc();  
686 -}  
687 -  
688 -void OPPROTO op_rdpmc(void)  
689 -{  
690 - helper_rdpmc();  
691 -}  
692 -  
693 -void OPPROTO op_cpuid(void)  
694 -{  
695 - helper_cpuid();  
696 -}  
697 -  
698 -void OPPROTO op_enter_level(void)  
699 -{  
700 - helper_enter_level(PARAM1, PARAM2);  
701 -}  
702 -  
703 -#ifdef TARGET_X86_64  
704 -void OPPROTO op_enter64_level(void)  
705 -{  
706 - helper_enter64_level(PARAM1, PARAM2);  
707 -}  
708 -#endif  
709 -  
710 -void OPPROTO op_sysenter(void)  
711 -{  
712 - helper_sysenter();  
713 -}  
714 -  
715 -void OPPROTO op_sysexit(void)  
716 -{  
717 - helper_sysexit();  
718 -}  
719 -  
720 -#ifdef TARGET_X86_64  
721 -void OPPROTO op_syscall(void)  
722 -{  
723 - helper_syscall(PARAM1);  
724 -}  
725 -  
726 -void OPPROTO op_sysret(void)  
727 -{  
728 - helper_sysret(PARAM1);  
729 -}  
730 -#endif  
731 -  
732 -void OPPROTO op_rdmsr(void)  
733 -{  
734 - helper_rdmsr();  
735 -}  
736 -  
737 -void OPPROTO op_wrmsr(void)  
738 -{  
739 - helper_wrmsr();  
740 -}  
741 -  
742 /* bcd */ 491 /* bcd */
743 492
744 -/* XXX: exception */  
745 void OPPROTO op_aam(void) 493 void OPPROTO op_aam(void)
746 { 494 {
747 - int base = PARAM1;  
748 - int al, ah;  
749 - al = EAX & 0xff;  
750 - ah = al / base;  
751 - al = al % base;  
752 - EAX = (EAX & ~0xffff) | al | (ah << 8);  
753 - CC_DST = al; 495 + helper_aam(PARAM1);
754 } 496 }
755 497
756 void OPPROTO op_aad(void) 498 void OPPROTO op_aad(void)
757 { 499 {
758 - int base = PARAM1;  
759 - int al, ah;  
760 - al = EAX & 0xff;  
761 - ah = (EAX >> 8) & 0xff;  
762 - al = ((ah * base) + al) & 0xff;  
763 - EAX = (EAX & ~0xffff) | al;  
764 - CC_DST = al; 500 + helper_aad(PARAM1);
765 } 501 }
766 502
767 void OPPROTO op_aaa(void) 503 void OPPROTO op_aaa(void)
768 { 504 {
769 - int icarry;  
770 - int al, ah, af;  
771 - int eflags;  
772 -  
773 - eflags = cc_table[CC_OP].compute_all();  
774 - af = eflags & CC_A;  
775 - al = EAX & 0xff;  
776 - ah = (EAX >> 8) & 0xff;  
777 -  
778 - icarry = (al > 0xf9);  
779 - if (((al & 0x0f) > 9 ) || af) {  
780 - al = (al + 6) & 0x0f;  
781 - ah = (ah + 1 + icarry) & 0xff;  
782 - eflags |= CC_C | CC_A;  
783 - } else {  
784 - eflags &= ~(CC_C | CC_A);  
785 - al &= 0x0f;  
786 - }  
787 - EAX = (EAX & ~0xffff) | al | (ah << 8);  
788 - CC_SRC = eflags;  
789 - FORCE_RET(); 505 + helper_aaa();
790 } 506 }
791 507
792 void OPPROTO op_aas(void) 508 void OPPROTO op_aas(void)
793 { 509 {
794 - int icarry;  
795 - int al, ah, af;  
796 - int eflags;  
797 -  
798 - eflags = cc_table[CC_OP].compute_all();  
799 - af = eflags & CC_A;  
800 - al = EAX & 0xff;  
801 - ah = (EAX >> 8) & 0xff;  
802 -  
803 - icarry = (al < 6);  
804 - if (((al & 0x0f) > 9 ) || af) {  
805 - al = (al - 6) & 0x0f;  
806 - ah = (ah - 1 - icarry) & 0xff;  
807 - eflags |= CC_C | CC_A;  
808 - } else {  
809 - eflags &= ~(CC_C | CC_A);  
810 - al &= 0x0f;  
811 - }  
812 - EAX = (EAX & ~0xffff) | al | (ah << 8);  
813 - CC_SRC = eflags;  
814 - FORCE_RET(); 510 + helper_aas();
815 } 511 }
816 512
817 void OPPROTO op_daa(void) 513 void OPPROTO op_daa(void)
818 { 514 {
819 - int al, af, cf;  
820 - int eflags;  
821 -  
822 - eflags = cc_table[CC_OP].compute_all();  
823 - cf = eflags & CC_C;  
824 - af = eflags & CC_A;  
825 - al = EAX & 0xff;  
826 -  
827 - eflags = 0;  
828 - if (((al & 0x0f) > 9 ) || af) {  
829 - al = (al + 6) & 0xff;  
830 - eflags |= CC_A;  
831 - }  
832 - if ((al > 0x9f) || cf) {  
833 - al = (al + 0x60) & 0xff;  
834 - eflags |= CC_C;  
835 - }  
836 - EAX = (EAX & ~0xff) | al;  
837 - /* well, speed is not an issue here, so we compute the flags by hand */  
838 - eflags |= (al == 0) << 6; /* zf */  
839 - eflags |= parity_table[al]; /* pf */  
840 - eflags |= (al & 0x80); /* sf */  
841 - CC_SRC = eflags;  
842 - FORCE_RET(); 515 + helper_daa();
843 } 516 }
844 517
845 void OPPROTO op_das(void) 518 void OPPROTO op_das(void)
846 { 519 {
847 - int al, al1, af, cf;  
848 - int eflags;  
849 -  
850 - eflags = cc_table[CC_OP].compute_all();  
851 - cf = eflags & CC_C;  
852 - af = eflags & CC_A;  
853 - al = EAX & 0xff;  
854 -  
855 - eflags = 0;  
856 - al1 = al;  
857 - if (((al & 0x0f) > 9 ) || af) {  
858 - eflags |= CC_A;  
859 - if (al < 6 || cf)  
860 - eflags |= CC_C;  
861 - al = (al - 6) & 0xff;  
862 - }  
863 - if ((al1 > 0x99) || cf) {  
864 - al = (al - 0x60) & 0xff;  
865 - eflags |= CC_C;  
866 - }  
867 - EAX = (EAX & ~0xff) | al;  
868 - /* well, speed is not an issue here, so we compute the flags by hand */  
869 - eflags |= (al == 0) << 6; /* zf */  
870 - eflags |= parity_table[al]; /* pf */  
871 - eflags |= (al & 0x80); /* sf */  
872 - CC_SRC = eflags;  
873 - FORCE_RET(); 520 + helper_das();
874 } 521 }
875 522
876 /* segment handling */ 523 /* segment handling */
@@ -878,7 +525,7 @@ void OPPROTO op_das(void) @@ -878,7 +525,7 @@ void OPPROTO op_das(void)
878 /* never use it with R_CS */ 525 /* never use it with R_CS */
879 void OPPROTO op_movl_seg_T0(void) 526 void OPPROTO op_movl_seg_T0(void)
880 { 527 {
881 - load_seg(PARAM1, T0); 528 + helper_load_seg(PARAM1, T0);
882 } 529 }
883 530
884 /* faster VM86 version */ 531 /* faster VM86 version */
@@ -901,22 +548,22 @@ void OPPROTO op_movl_T0_seg(void) @@ -901,22 +548,22 @@ void OPPROTO op_movl_T0_seg(void)
901 548
902 void OPPROTO op_lsl(void) 549 void OPPROTO op_lsl(void)
903 { 550 {
904 - helper_lsl(); 551 + helper_lsl(T0);
905 } 552 }
906 553
907 void OPPROTO op_lar(void) 554 void OPPROTO op_lar(void)
908 { 555 {
909 - helper_lar(); 556 + helper_lar(T0);
910 } 557 }
911 558
912 void OPPROTO op_verr(void) 559 void OPPROTO op_verr(void)
913 { 560 {
914 - helper_verr(); 561 + helper_verr(T0);
915 } 562 }
916 563
917 void OPPROTO op_verw(void) 564 void OPPROTO op_verw(void)
918 { 565 {
919 - helper_verw(); 566 + helper_verw(T0);
920 } 567 }
921 568
922 void OPPROTO op_arpl(void) 569 void OPPROTO op_arpl(void)
@@ -969,16 +616,6 @@ void OPPROTO op_lret_protected(void) @@ -969,16 +616,6 @@ void OPPROTO op_lret_protected(void)
969 helper_lret_protected(PARAM1, PARAM2); 616 helper_lret_protected(PARAM1, PARAM2);
970 } 617 }
971 618
972 -void OPPROTO op_lldt_T0(void)  
973 -{  
974 - helper_lldt_T0();  
975 -}  
976 -  
977 -void OPPROTO op_ltr_T0(void)  
978 -{  
979 - helper_ltr_T0();  
980 -}  
981 -  
982 /* CR registers access. */ 619 /* CR registers access. */
983 void OPPROTO op_movl_crN_T0(void) 620 void OPPROTO op_movl_crN_T0(void)
984 { 621 {
@@ -1046,11 +683,6 @@ void OPPROTO op_lmsw_T0(void) @@ -1046,11 +683,6 @@ void OPPROTO op_lmsw_T0(void)
1046 helper_movl_crN_T0(0); 683 helper_movl_crN_T0(0);
1047 } 684 }
1048 685
1049 -void OPPROTO op_invlpg_A0(void)  
1050 -{  
1051 - helper_invlpg(A0);  
1052 -}  
1053 -  
1054 void OPPROTO op_movl_T0_env(void) 686 void OPPROTO op_movl_T0_env(void)
1055 { 687 {
1056 T0 = *(uint32_t *)((char *)env + PARAM1); 688 T0 = *(uint32_t *)((char *)env + PARAM1);
@@ -1282,16 +914,6 @@ void OPPROTO op_movl_T0_eflags_vm(void) @@ -1282,16 +914,6 @@ void OPPROTO op_movl_T0_eflags_vm(void)
1282 } 914 }
1283 #endif 915 #endif
1284 916
1285 -void OPPROTO op_cld(void)  
1286 -{  
1287 - DF = 1;  
1288 -}  
1289 -  
1290 -void OPPROTO op_std(void)  
1291 -{  
1292 - DF = -1;  
1293 -}  
1294 -  
1295 void OPPROTO op_clc(void) 917 void OPPROTO op_clc(void)
1296 { 918 {
1297 int eflags; 919 int eflags;
@@ -1422,45 +1044,3 @@ void OPPROTO op_com_dummy(void) @@ -1422,45 +1044,3 @@ void OPPROTO op_com_dummy(void)
1422 { 1044 {
1423 T0 = 0; 1045 T0 = 0;
1424 } 1046 }
1425 -  
1426 -/* Secure Virtual Machine ops */  
1427 -  
1428 -void OPPROTO op_vmrun(void)  
1429 -{  
1430 - helper_vmrun(EAX);  
1431 -}  
1432 -  
1433 -void OPPROTO op_vmmcall(void)  
1434 -{  
1435 - helper_vmmcall();  
1436 -}  
1437 -  
1438 -void OPPROTO op_vmload(void)  
1439 -{  
1440 - helper_vmload(EAX);  
1441 -}  
1442 -  
1443 -void OPPROTO op_vmsave(void)  
1444 -{  
1445 - helper_vmsave(EAX);  
1446 -}  
1447 -  
1448 -void OPPROTO op_stgi(void)  
1449 -{  
1450 - helper_stgi();  
1451 -}  
1452 -  
1453 -void OPPROTO op_clgi(void)  
1454 -{  
1455 - helper_clgi();  
1456 -}  
1457 -  
1458 -void OPPROTO op_skinit(void)  
1459 -{  
1460 - helper_skinit();  
1461 -}  
1462 -  
1463 -void OPPROTO op_invlpga(void)  
1464 -{  
1465 - helper_invlpga();  
1466 -}  
target-i386/translate.c
@@ -2275,7 +2275,10 @@ static void gen_enter(DisasContext *s, int esp_addend, int level) @@ -2275,7 +2275,10 @@ static void gen_enter(DisasContext *s, int esp_addend, int level)
2275 gen_op_mov_TN_reg(OT_LONG, 0, R_EBP); 2275 gen_op_mov_TN_reg(OT_LONG, 0, R_EBP);
2276 gen_op_st_T0_A0(ot + s->mem_index); 2276 gen_op_st_T0_A0(ot + s->mem_index);
2277 if (level) { 2277 if (level) {
2278 - gen_op_enter64_level(level, (ot == OT_QUAD)); 2278 + /* XXX: must save state */
  2279 + tcg_gen_helper_0_2(helper_enter64_level,
  2280 + tcg_const_i32(level),
  2281 + tcg_const_i32((ot == OT_QUAD)));
2279 } 2282 }
2280 gen_op_mov_reg_T1(ot, R_EBP); 2283 gen_op_mov_reg_T1(ot, R_EBP);
2281 gen_op_addl_T1_im( -esp_addend + (-opsize * level) ); 2284 gen_op_addl_T1_im( -esp_addend + (-opsize * level) );
@@ -2297,7 +2300,10 @@ static void gen_enter(DisasContext *s, int esp_addend, int level) @@ -2297,7 +2300,10 @@ static void gen_enter(DisasContext *s, int esp_addend, int level)
2297 gen_op_mov_TN_reg(OT_LONG, 0, R_EBP); 2300 gen_op_mov_TN_reg(OT_LONG, 0, R_EBP);
2298 gen_op_st_T0_A0(ot + s->mem_index); 2301 gen_op_st_T0_A0(ot + s->mem_index);
2299 if (level) { 2302 if (level) {
2300 - gen_op_enter_level(level, s->dflag); 2303 + /* XXX: must save state */
  2304 + tcg_gen_helper_0_2(helper_enter_level,
  2305 + tcg_const_i32(level),
  2306 + tcg_const_i32(s->dflag));
2301 } 2307 }
2302 gen_op_mov_reg_T1(ot, R_EBP); 2308 gen_op_mov_reg_T1(ot, R_EBP);
2303 gen_op_addl_T1_im( -esp_addend + (-opsize * level) ); 2309 gen_op_addl_T1_im( -esp_addend + (-opsize * level) );
@@ -2310,7 +2316,7 @@ static void gen_exception(DisasContext *s, int trapno, target_ulong cur_eip) @@ -2310,7 +2316,7 @@ static void gen_exception(DisasContext *s, int trapno, target_ulong cur_eip)
2310 if (s->cc_op != CC_OP_DYNAMIC) 2316 if (s->cc_op != CC_OP_DYNAMIC)
2311 gen_op_set_cc_op(s->cc_op); 2317 gen_op_set_cc_op(s->cc_op);
2312 gen_jmp_im(cur_eip); 2318 gen_jmp_im(cur_eip);
2313 - gen_op_raise_exception(trapno); 2319 + tcg_gen_helper_0_1(helper_raise_exception, tcg_const_i32(trapno));
2314 s->is_jmp = 3; 2320 s->is_jmp = 3;
2315 } 2321 }
2316 2322
@@ -2322,7 +2328,9 @@ static void gen_interrupt(DisasContext *s, int intno, @@ -2322,7 +2328,9 @@ static void gen_interrupt(DisasContext *s, int intno,
2322 if (s->cc_op != CC_OP_DYNAMIC) 2328 if (s->cc_op != CC_OP_DYNAMIC)
2323 gen_op_set_cc_op(s->cc_op); 2329 gen_op_set_cc_op(s->cc_op);
2324 gen_jmp_im(cur_eip); 2330 gen_jmp_im(cur_eip);
2325 - gen_op_raise_interrupt(intno, (int)(next_eip - cur_eip)); 2331 + tcg_gen_helper_0_2(helper_raise_interrupt,
  2332 + tcg_const_i32(intno),
  2333 + tcg_const_i32(next_eip - cur_eip));
2326 s->is_jmp = 3; 2334 s->is_jmp = 3;
2327 } 2335 }
2328 2336
@@ -2331,7 +2339,7 @@ static void gen_debug(DisasContext *s, target_ulong cur_eip) @@ -2331,7 +2339,7 @@ static void gen_debug(DisasContext *s, target_ulong cur_eip)
2331 if (s->cc_op != CC_OP_DYNAMIC) 2339 if (s->cc_op != CC_OP_DYNAMIC)
2332 gen_op_set_cc_op(s->cc_op); 2340 gen_op_set_cc_op(s->cc_op);
2333 gen_jmp_im(cur_eip); 2341 gen_jmp_im(cur_eip);
2334 - gen_op_debug(); 2342 + tcg_gen_helper_0_0(helper_debug);
2335 s->is_jmp = 3; 2343 s->is_jmp = 3;
2336 } 2344 }
2337 2345
@@ -2342,12 +2350,12 @@ static void gen_eob(DisasContext *s) @@ -2342,12 +2350,12 @@ static void gen_eob(DisasContext *s)
2342 if (s->cc_op != CC_OP_DYNAMIC) 2350 if (s->cc_op != CC_OP_DYNAMIC)
2343 gen_op_set_cc_op(s->cc_op); 2351 gen_op_set_cc_op(s->cc_op);
2344 if (s->tb->flags & HF_INHIBIT_IRQ_MASK) { 2352 if (s->tb->flags & HF_INHIBIT_IRQ_MASK) {
2345 - gen_op_reset_inhibit_irq(); 2353 + tcg_gen_helper_0_0(helper_reset_inhibit_irq);
2346 } 2354 }
2347 if (s->singlestep_enabled) { 2355 if (s->singlestep_enabled) {
2348 - gen_op_debug(); 2356 + tcg_gen_helper_0_0(helper_debug);
2349 } else if (s->tf) { 2357 } else if (s->tf) {
2350 - gen_op_single_step(); 2358 + tcg_gen_helper_0_0(helper_single_step);
2351 } else { 2359 } else {
2352 tcg_gen_exit_tb(0); 2360 tcg_gen_exit_tb(0);
2353 } 2361 }
@@ -3659,26 +3667,21 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -3659,26 +3667,21 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
3659 switch(ot) { 3667 switch(ot) {
3660 case OT_BYTE: 3668 case OT_BYTE:
3661 gen_jmp_im(pc_start - s->cs_base); 3669 gen_jmp_im(pc_start - s->cs_base);
3662 - gen_op_divb_AL_T0(); 3670 + tcg_gen_helper_0_1(helper_divb_AL, cpu_T[0]);
3663 break; 3671 break;
3664 case OT_WORD: 3672 case OT_WORD:
3665 gen_jmp_im(pc_start - s->cs_base); 3673 gen_jmp_im(pc_start - s->cs_base);
3666 - gen_op_divw_AX_T0(); 3674 + tcg_gen_helper_0_1(helper_divw_AX, cpu_T[0]);
3667 break; 3675 break;
3668 default: 3676 default:
3669 case OT_LONG: 3677 case OT_LONG:
3670 gen_jmp_im(pc_start - s->cs_base); 3678 gen_jmp_im(pc_start - s->cs_base);
3671 -#ifdef MACRO_TEST  
3672 - /* XXX: this is just a test */  
3673 - tcg_gen_macro_2(cpu_T[0], cpu_T[0], MACRO_TEST);  
3674 -#else  
3675 - tcg_gen_helper_0_1(helper_divl_EAX_T0, cpu_T[0]);  
3676 -#endif 3679 + tcg_gen_helper_0_1(helper_divl_EAX, cpu_T[0]);
3677 break; 3680 break;
3678 #ifdef TARGET_X86_64 3681 #ifdef TARGET_X86_64
3679 case OT_QUAD: 3682 case OT_QUAD:
3680 gen_jmp_im(pc_start - s->cs_base); 3683 gen_jmp_im(pc_start - s->cs_base);
3681 - gen_op_divq_EAX_T0(); 3684 + tcg_gen_helper_0_1(helper_divq_EAX, cpu_T[0]);
3682 break; 3685 break;
3683 #endif 3686 #endif
3684 } 3687 }
@@ -3687,21 +3690,21 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -3687,21 +3690,21 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
3687 switch(ot) { 3690 switch(ot) {
3688 case OT_BYTE: 3691 case OT_BYTE:
3689 gen_jmp_im(pc_start - s->cs_base); 3692 gen_jmp_im(pc_start - s->cs_base);
3690 - gen_op_idivb_AL_T0(); 3693 + tcg_gen_helper_0_1(helper_idivb_AL, cpu_T[0]);
3691 break; 3694 break;
3692 case OT_WORD: 3695 case OT_WORD:
3693 gen_jmp_im(pc_start - s->cs_base); 3696 gen_jmp_im(pc_start - s->cs_base);
3694 - gen_op_idivw_AX_T0(); 3697 + tcg_gen_helper_0_1(helper_idivw_AX, cpu_T[0]);
3695 break; 3698 break;
3696 default: 3699 default:
3697 case OT_LONG: 3700 case OT_LONG:
3698 gen_jmp_im(pc_start - s->cs_base); 3701 gen_jmp_im(pc_start - s->cs_base);
3699 - tcg_gen_helper_0_1(helper_idivl_EAX_T0, cpu_T[0]); 3702 + tcg_gen_helper_0_1(helper_idivl_EAX, cpu_T[0]);
3700 break; 3703 break;
3701 #ifdef TARGET_X86_64 3704 #ifdef TARGET_X86_64
3702 case OT_QUAD: 3705 case OT_QUAD:
3703 gen_jmp_im(pc_start - s->cs_base); 3706 gen_jmp_im(pc_start - s->cs_base);
3704 - gen_op_idivq_EAX_T0(); 3707 + tcg_gen_helper_0_1(helper_idivq_EAX, cpu_T[0]);
3705 break; 3708 break;
3706 #endif 3709 #endif
3707 } 3710 }
@@ -4088,7 +4091,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -4088,7 +4091,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
4088 /* If several instructions disable interrupts, only the 4091 /* If several instructions disable interrupts, only the
4089 _first_ does it */ 4092 _first_ does it */
4090 if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) 4093 if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK))
4091 - gen_op_set_inhibit_irq(); 4094 + tcg_gen_helper_0_0(helper_set_inhibit_irq);
4092 s->tf = 0; 4095 s->tf = 0;
4093 } 4096 }
4094 if (s->is_jmp) { 4097 if (s->is_jmp) {
@@ -4164,7 +4167,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -4164,7 +4167,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
4164 /* If several instructions disable interrupts, only the 4167 /* If several instructions disable interrupts, only the
4165 _first_ does it */ 4168 _first_ does it */
4166 if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) 4169 if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK))
4167 - gen_op_set_inhibit_irq(); 4170 + tcg_gen_helper_0_0(helper_set_inhibit_irq);
4168 s->tf = 0; 4171 s->tf = 0;
4169 } 4172 }
4170 if (s->is_jmp) { 4173 if (s->is_jmp) {
@@ -5471,10 +5474,12 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5471,10 +5474,12 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5471 s->cc_op = CC_OP_EFLAGS; 5474 s->cc_op = CC_OP_EFLAGS;
5472 break; 5475 break;
5473 case 0xfc: /* cld */ 5476 case 0xfc: /* cld */
5474 - gen_op_cld(); 5477 + tcg_gen_movi_i32(cpu_tmp2, 1);
  5478 + tcg_gen_st_i32(cpu_tmp2, cpu_env, offsetof(CPUState, df));
5475 break; 5479 break;
5476 case 0xfd: /* std */ 5480 case 0xfd: /* std */
5477 - gen_op_std(); 5481 + tcg_gen_movi_i32(cpu_tmp2, -1);
  5482 + tcg_gen_st_i32(cpu_tmp2, cpu_env, offsetof(CPUState, df));
5478 break; 5483 break;
5479 5484
5480 /************************/ 5485 /************************/
@@ -5670,13 +5675,13 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5670,13 +5675,13 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5670 case 0xfa: /* cli */ 5675 case 0xfa: /* cli */
5671 if (!s->vm86) { 5676 if (!s->vm86) {
5672 if (s->cpl <= s->iopl) { 5677 if (s->cpl <= s->iopl) {
5673 - gen_op_cli(); 5678 + tcg_gen_helper_0_0(helper_cli);
5674 } else { 5679 } else {
5675 gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); 5680 gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base);
5676 } 5681 }
5677 } else { 5682 } else {
5678 if (s->iopl == 3) { 5683 if (s->iopl == 3) {
5679 - gen_op_cli(); 5684 + tcg_gen_helper_0_0(helper_cli);
5680 } else { 5685 } else {
5681 gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); 5686 gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base);
5682 } 5687 }
@@ -5686,12 +5691,12 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5686,12 +5691,12 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5686 if (!s->vm86) { 5691 if (!s->vm86) {
5687 if (s->cpl <= s->iopl) { 5692 if (s->cpl <= s->iopl) {
5688 gen_sti: 5693 gen_sti:
5689 - gen_op_sti(); 5694 + tcg_gen_helper_0_0(helper_sti);
5690 /* interruptions are enabled only the first insn after sti */ 5695 /* interruptions are enabled only the first insn after sti */
5691 /* If several instructions disable interrupts, only the 5696 /* If several instructions disable interrupts, only the
5692 _first_ does it */ 5697 _first_ does it */
5693 if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) 5698 if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK))
5694 - gen_op_set_inhibit_irq(); 5699 + tcg_gen_helper_0_0(helper_set_inhibit_irq);
5695 /* give a chance to handle pending irqs */ 5700 /* give a chance to handle pending irqs */
5696 gen_jmp_im(s->pc - s->cs_base); 5701 gen_jmp_im(s->pc - s->cs_base);
5697 gen_eob(s); 5702 gen_eob(s);
@@ -5719,9 +5724,9 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5719,9 +5724,9 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5719 gen_lea_modrm(s, modrm, &reg_addr, &offset_addr); 5724 gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
5720 gen_jmp_im(pc_start - s->cs_base); 5725 gen_jmp_im(pc_start - s->cs_base);
5721 if (ot == OT_WORD) 5726 if (ot == OT_WORD)
5722 - gen_op_boundw(); 5727 + tcg_gen_helper_0_0(helper_boundw);
5723 else 5728 else
5724 - gen_op_boundl(); 5729 + tcg_gen_helper_0_0(helper_boundl);
5725 break; 5730 break;
5726 case 0x1c8 ... 0x1cf: /* bswap reg */ 5731 case 0x1c8 ... 0x1cf: /* bswap reg */
5727 reg = (b & 7) | REX_B(s); 5732 reg = (b & 7) | REX_B(s);
@@ -5800,10 +5805,10 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5800,10 +5805,10 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5800 int retval = 0; 5805 int retval = 0;
5801 if (b & 2) { 5806 if (b & 2) {
5802 retval = gen_svm_check_intercept_param(s, pc_start, SVM_EXIT_MSR, 0); 5807 retval = gen_svm_check_intercept_param(s, pc_start, SVM_EXIT_MSR, 0);
5803 - gen_op_rdmsr(); 5808 + tcg_gen_helper_0_0(helper_rdmsr);
5804 } else { 5809 } else {
5805 retval = gen_svm_check_intercept_param(s, pc_start, SVM_EXIT_MSR, 1); 5810 retval = gen_svm_check_intercept_param(s, pc_start, SVM_EXIT_MSR, 1);
5806 - gen_op_wrmsr(); 5811 + tcg_gen_helper_0_0(helper_wrmsr);
5807 } 5812 }
5808 if(retval) 5813 if(retval)
5809 gen_eob(s); 5814 gen_eob(s);
@@ -5813,11 +5818,11 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5813,11 +5818,11 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5813 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_RDTSC)) 5818 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_RDTSC))
5814 break; 5819 break;
5815 gen_jmp_im(pc_start - s->cs_base); 5820 gen_jmp_im(pc_start - s->cs_base);
5816 - gen_op_rdtsc(); 5821 + tcg_gen_helper_0_0(helper_rdtsc);
5817 break; 5822 break;
5818 case 0x133: /* rdpmc */ 5823 case 0x133: /* rdpmc */
5819 gen_jmp_im(pc_start - s->cs_base); 5824 gen_jmp_im(pc_start - s->cs_base);
5820 - gen_op_rdpmc(); 5825 + tcg_gen_helper_0_0(helper_rdpmc);
5821 break; 5826 break;
5822 case 0x134: /* sysenter */ 5827 case 0x134: /* sysenter */
5823 if (CODE64(s)) 5828 if (CODE64(s))
@@ -5830,7 +5835,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5830,7 +5835,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5830 s->cc_op = CC_OP_DYNAMIC; 5835 s->cc_op = CC_OP_DYNAMIC;
5831 } 5836 }
5832 gen_jmp_im(pc_start - s->cs_base); 5837 gen_jmp_im(pc_start - s->cs_base);
5833 - gen_op_sysenter(); 5838 + tcg_gen_helper_0_0(helper_sysenter);
5834 gen_eob(s); 5839 gen_eob(s);
5835 } 5840 }
5836 break; 5841 break;
@@ -5845,7 +5850,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5845,7 +5850,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5845 s->cc_op = CC_OP_DYNAMIC; 5850 s->cc_op = CC_OP_DYNAMIC;
5846 } 5851 }
5847 gen_jmp_im(pc_start - s->cs_base); 5852 gen_jmp_im(pc_start - s->cs_base);
5848 - gen_op_sysexit(); 5853 + tcg_gen_helper_0_0(helper_sysexit);
5849 gen_eob(s); 5854 gen_eob(s);
5850 } 5855 }
5851 break; 5856 break;
@@ -5857,7 +5862,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5857,7 +5862,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5857 s->cc_op = CC_OP_DYNAMIC; 5862 s->cc_op = CC_OP_DYNAMIC;
5858 } 5863 }
5859 gen_jmp_im(pc_start - s->cs_base); 5864 gen_jmp_im(pc_start - s->cs_base);
5860 - gen_op_syscall(s->pc - pc_start); 5865 + tcg_gen_helper_0_1(helper_syscall, tcg_const_i32(s->pc - pc_start));
5861 gen_eob(s); 5866 gen_eob(s);
5862 break; 5867 break;
5863 case 0x107: /* sysret */ 5868 case 0x107: /* sysret */
@@ -5869,7 +5874,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5869,7 +5874,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5869 s->cc_op = CC_OP_DYNAMIC; 5874 s->cc_op = CC_OP_DYNAMIC;
5870 } 5875 }
5871 gen_jmp_im(pc_start - s->cs_base); 5876 gen_jmp_im(pc_start - s->cs_base);
5872 - gen_op_sysret(s->dflag); 5877 + tcg_gen_helper_0_1(helper_sysret, tcg_const_i32(s->dflag));
5873 /* condition codes are modified only in long mode */ 5878 /* condition codes are modified only in long mode */
5874 if (s->lma) 5879 if (s->lma)
5875 s->cc_op = CC_OP_EFLAGS; 5880 s->cc_op = CC_OP_EFLAGS;
@@ -5880,7 +5885,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5880,7 +5885,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5880 case 0x1a2: /* cpuid */ 5885 case 0x1a2: /* cpuid */
5881 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_CPUID)) 5886 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_CPUID))
5882 break; 5887 break;
5883 - gen_op_cpuid(); 5888 + tcg_gen_helper_0_0(helper_cpuid);
5884 break; 5889 break;
5885 case 0xf4: /* hlt */ 5890 case 0xf4: /* hlt */
5886 if (s->cpl != 0) { 5891 if (s->cpl != 0) {
@@ -5891,7 +5896,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5891,7 +5896,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5891 if (s->cc_op != CC_OP_DYNAMIC) 5896 if (s->cc_op != CC_OP_DYNAMIC)
5892 gen_op_set_cc_op(s->cc_op); 5897 gen_op_set_cc_op(s->cc_op);
5893 gen_jmp_im(s->pc - s->cs_base); 5898 gen_jmp_im(s->pc - s->cs_base);
5894 - gen_op_hlt(); 5899 + tcg_gen_helper_0_0(helper_hlt);
5895 s->is_jmp = 3; 5900 s->is_jmp = 3;
5896 } 5901 }
5897 break; 5902 break;
@@ -5921,7 +5926,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5921,7 +5926,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5921 break; 5926 break;
5922 gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0); 5927 gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0);
5923 gen_jmp_im(pc_start - s->cs_base); 5928 gen_jmp_im(pc_start - s->cs_base);
5924 - gen_op_lldt_T0(); 5929 + tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]);
  5930 + tcg_gen_helper_0_1(helper_lldt, cpu_tmp2);
5925 } 5931 }
5926 break; 5932 break;
5927 case 1: /* str */ 5933 case 1: /* str */
@@ -5945,7 +5951,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -5945,7 +5951,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5945 break; 5951 break;
5946 gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0); 5952 gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0);
5947 gen_jmp_im(pc_start - s->cs_base); 5953 gen_jmp_im(pc_start - s->cs_base);
5948 - gen_op_ltr_T0(); 5954 + tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]);
  5955 + tcg_gen_helper_0_1(helper_ltr, cpu_tmp2);
5949 } 5956 }
5950 break; 5957 break;
5951 case 4: /* verr */ 5958 case 4: /* verr */
@@ -6008,7 +6015,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -6008,7 +6015,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
6008 gen_op_andl_A0_ffff(); 6015 gen_op_andl_A0_ffff();
6009 } 6016 }
6010 gen_add_A0_ds_seg(s); 6017 gen_add_A0_ds_seg(s);
6011 - gen_op_monitor(); 6018 + tcg_gen_helper_0_1(helper_monitor, cpu_A0);
6012 break; 6019 break;
6013 case 1: /* mwait */ 6020 case 1: /* mwait */
6014 if (!(s->cpuid_ext_features & CPUID_EXT_MONITOR) || 6021 if (!(s->cpuid_ext_features & CPUID_EXT_MONITOR) ||
@@ -6021,7 +6028,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -6021,7 +6028,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
6021 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_MWAIT)) 6028 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_MWAIT))
6022 break; 6029 break;
6023 gen_jmp_im(s->pc - s->cs_base); 6030 gen_jmp_im(s->pc - s->cs_base);
6024 - gen_op_mwait(); 6031 + tcg_gen_helper_0_0(helper_mwait);
6025 gen_eob(s); 6032 gen_eob(s);
6026 break; 6033 break;
6027 default: 6034 default:
@@ -6050,7 +6057,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -6050,7 +6057,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
6050 if (s->cc_op != CC_OP_DYNAMIC) 6057 if (s->cc_op != CC_OP_DYNAMIC)
6051 gen_op_set_cc_op(s->cc_op); 6058 gen_op_set_cc_op(s->cc_op);
6052 gen_jmp_im(s->pc - s->cs_base); 6059 gen_jmp_im(s->pc - s->cs_base);
6053 - gen_op_vmrun(); 6060 + tcg_gen_helper_0_0(helper_vmrun);
6054 s->cc_op = CC_OP_EFLAGS; 6061 s->cc_op = CC_OP_EFLAGS;
6055 gen_eob(s); 6062 gen_eob(s);
6056 break; 6063 break;
@@ -6058,37 +6065,37 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -6058,37 +6065,37 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
6058 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMMCALL)) 6065 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMMCALL))
6059 break; 6066 break;
6060 /* FIXME: cause #UD if hflags & SVM */ 6067 /* FIXME: cause #UD if hflags & SVM */
6061 - gen_op_vmmcall(); 6068 + tcg_gen_helper_0_0(helper_vmmcall);
6062 break; 6069 break;
6063 case 2: /* VMLOAD */ 6070 case 2: /* VMLOAD */
6064 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMLOAD)) 6071 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMLOAD))
6065 break; 6072 break;
6066 - gen_op_vmload(); 6073 + tcg_gen_helper_0_0(helper_vmload);
6067 break; 6074 break;
6068 case 3: /* VMSAVE */ 6075 case 3: /* VMSAVE */
6069 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMSAVE)) 6076 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_VMSAVE))
6070 break; 6077 break;
6071 - gen_op_vmsave(); 6078 + tcg_gen_helper_0_0(helper_vmsave);
6072 break; 6079 break;
6073 case 4: /* STGI */ 6080 case 4: /* STGI */
6074 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_STGI)) 6081 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_STGI))
6075 break; 6082 break;
6076 - gen_op_stgi(); 6083 + tcg_gen_helper_0_0(helper_stgi);
6077 break; 6084 break;
6078 case 5: /* CLGI */ 6085 case 5: /* CLGI */
6079 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_CLGI)) 6086 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_CLGI))
6080 break; 6087 break;
6081 - gen_op_clgi(); 6088 + tcg_gen_helper_0_0(helper_clgi);
6082 break; 6089 break;
6083 case 6: /* SKINIT */ 6090 case 6: /* SKINIT */
6084 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_SKINIT)) 6091 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_SKINIT))
6085 break; 6092 break;
6086 - gen_op_skinit(); 6093 + tcg_gen_helper_0_0(helper_skinit);
6087 break; 6094 break;
6088 case 7: /* INVLPGA */ 6095 case 7: /* INVLPGA */
6089 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_INVLPGA)) 6096 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_INVLPGA))
6090 break; 6097 break;
6091 - gen_op_invlpga(); 6098 + tcg_gen_helper_0_0(helper_invlpga);
6092 break; 6099 break;
6093 default: 6100 default:
6094 goto illegal_op; 6101 goto illegal_op;
@@ -6153,7 +6160,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -6153,7 +6160,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
6153 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_INVLPG)) 6160 if (gen_svm_check_intercept(s, pc_start, SVM_EXIT_INVLPG))
6154 break; 6161 break;
6155 gen_lea_modrm(s, modrm, &reg_addr, &offset_addr); 6162 gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
6156 - gen_op_invlpg_A0(); 6163 + tcg_gen_helper_0_1(helper_invlpg, cpu_A0);
6157 gen_jmp_im(s->pc - s->cs_base); 6164 gen_jmp_im(s->pc - s->cs_base);
6158 gen_eob(s); 6165 gen_eob(s);
6159 } 6166 }
@@ -6458,7 +6465,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) @@ -6458,7 +6465,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
6458 s->cc_op = CC_OP_DYNAMIC; 6465 s->cc_op = CC_OP_DYNAMIC;
6459 } 6466 }
6460 gen_jmp_im(s->pc - s->cs_base); 6467 gen_jmp_im(s->pc - s->cs_base);
6461 - gen_op_rsm(); 6468 + tcg_gen_helper_0_0(helper_rsm);
6462 gen_eob(s); 6469 gen_eob(s);
6463 break; 6470 break;
6464 case 0x10e ... 0x10f: 6471 case 0x10e ... 0x10f:
@@ -6855,9 +6862,6 @@ void optimize_flags_init(void) @@ -6855,9 +6862,6 @@ void optimize_flags_init(void)
6855 cpu_A0 = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG3, "A0"); 6862 cpu_A0 = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG3, "A0");
6856 cpu_tmp1 = tcg_global_reg2_new_hack(TCG_TYPE_I64, TCG_AREG1, TCG_AREG2, "tmp1"); 6863 cpu_tmp1 = tcg_global_reg2_new_hack(TCG_TYPE_I64, TCG_AREG1, TCG_AREG2, "tmp1");
6857 #endif 6864 #endif
6858 - /* the helpers are only registered to print debug info */  
6859 - TCG_HELPER(helper_divl_EAX_T0);  
6860 - TCG_HELPER(helper_idivl_EAX_T0);  
6861 } 6865 }
6862 6866
6863 /* CPU flags computation optimization: we move backward thru the 6867 /* CPU flags computation optimization: we move backward thru the