Commit 07d2c595580fecadb0e4113ae1be3e6421b91956

Authored by bellard
1 parent cad3a37d

moved eflags computation outside op.c

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4472 c046a42c-6fe2-441c-8c8c-71466251a162
target-i386/helper.c
@@ -5239,3 +5239,82 @@ void helper_movq(uint64_t *d, uint64_t *s) @@ -5239,3 +5239,82 @@ void helper_movq(uint64_t *d, uint64_t *s)
5239 #undef SHIFT 5239 #undef SHIFT
5240 5240
5241 #endif 5241 #endif
  5242 +
  5243 +static int compute_all_eflags(void)
  5244 +{
  5245 + return CC_SRC;
  5246 +}
  5247 +
  5248 +static int compute_c_eflags(void)
  5249 +{
  5250 + return CC_SRC & CC_C;
  5251 +}
  5252 +
  5253 +CCTable cc_table[CC_OP_NB] = {
  5254 + [CC_OP_DYNAMIC] = { /* should never happen */ },
  5255 +
  5256 + [CC_OP_EFLAGS] = { compute_all_eflags, compute_c_eflags },
  5257 +
  5258 + [CC_OP_MULB] = { compute_all_mulb, compute_c_mull },
  5259 + [CC_OP_MULW] = { compute_all_mulw, compute_c_mull },
  5260 + [CC_OP_MULL] = { compute_all_mull, compute_c_mull },
  5261 +
  5262 + [CC_OP_ADDB] = { compute_all_addb, compute_c_addb },
  5263 + [CC_OP_ADDW] = { compute_all_addw, compute_c_addw },
  5264 + [CC_OP_ADDL] = { compute_all_addl, compute_c_addl },
  5265 +
  5266 + [CC_OP_ADCB] = { compute_all_adcb, compute_c_adcb },
  5267 + [CC_OP_ADCW] = { compute_all_adcw, compute_c_adcw },
  5268 + [CC_OP_ADCL] = { compute_all_adcl, compute_c_adcl },
  5269 +
  5270 + [CC_OP_SUBB] = { compute_all_subb, compute_c_subb },
  5271 + [CC_OP_SUBW] = { compute_all_subw, compute_c_subw },
  5272 + [CC_OP_SUBL] = { compute_all_subl, compute_c_subl },
  5273 +
  5274 + [CC_OP_SBBB] = { compute_all_sbbb, compute_c_sbbb },
  5275 + [CC_OP_SBBW] = { compute_all_sbbw, compute_c_sbbw },
  5276 + [CC_OP_SBBL] = { compute_all_sbbl, compute_c_sbbl },
  5277 +
  5278 + [CC_OP_LOGICB] = { compute_all_logicb, compute_c_logicb },
  5279 + [CC_OP_LOGICW] = { compute_all_logicw, compute_c_logicw },
  5280 + [CC_OP_LOGICL] = { compute_all_logicl, compute_c_logicl },
  5281 +
  5282 + [CC_OP_INCB] = { compute_all_incb, compute_c_incl },
  5283 + [CC_OP_INCW] = { compute_all_incw, compute_c_incl },
  5284 + [CC_OP_INCL] = { compute_all_incl, compute_c_incl },
  5285 +
  5286 + [CC_OP_DECB] = { compute_all_decb, compute_c_incl },
  5287 + [CC_OP_DECW] = { compute_all_decw, compute_c_incl },
  5288 + [CC_OP_DECL] = { compute_all_decl, compute_c_incl },
  5289 +
  5290 + [CC_OP_SHLB] = { compute_all_shlb, compute_c_shlb },
  5291 + [CC_OP_SHLW] = { compute_all_shlw, compute_c_shlw },
  5292 + [CC_OP_SHLL] = { compute_all_shll, compute_c_shll },
  5293 +
  5294 + [CC_OP_SARB] = { compute_all_sarb, compute_c_sarl },
  5295 + [CC_OP_SARW] = { compute_all_sarw, compute_c_sarl },
  5296 + [CC_OP_SARL] = { compute_all_sarl, compute_c_sarl },
  5297 +
  5298 +#ifdef TARGET_X86_64
  5299 + [CC_OP_MULQ] = { compute_all_mulq, compute_c_mull },
  5300 +
  5301 + [CC_OP_ADDQ] = { compute_all_addq, compute_c_addq },
  5302 +
  5303 + [CC_OP_ADCQ] = { compute_all_adcq, compute_c_adcq },
  5304 +
  5305 + [CC_OP_SUBQ] = { compute_all_subq, compute_c_subq },
  5306 +
  5307 + [CC_OP_SBBQ] = { compute_all_sbbq, compute_c_sbbq },
  5308 +
  5309 + [CC_OP_LOGICQ] = { compute_all_logicq, compute_c_logicq },
  5310 +
  5311 + [CC_OP_INCQ] = { compute_all_incq, compute_c_incl },
  5312 +
  5313 + [CC_OP_DECQ] = { compute_all_decq, compute_c_incl },
  5314 +
  5315 + [CC_OP_SHLQ] = { compute_all_shlq, compute_c_shlq },
  5316 +
  5317 + [CC_OP_SARQ] = { compute_all_sarq, compute_c_sarl },
  5318 +#endif
  5319 +};
  5320 +
target-i386/helper_template.h
@@ -50,6 +50,223 @@ @@ -50,6 +50,223 @@
50 #error unhandled operand size 50 #error unhandled operand size
51 #endif 51 #endif
52 52
  53 +/* dynamic flags computation */
  54 +
  55 +static int glue(compute_all_add, SUFFIX)(void)
  56 +{
  57 + int cf, pf, af, zf, sf, of;
  58 + target_long src1, src2;
  59 + src1 = CC_SRC;
  60 + src2 = CC_DST - CC_SRC;
  61 + cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1;
  62 + pf = parity_table[(uint8_t)CC_DST];
  63 + af = (CC_DST ^ src1 ^ src2) & 0x10;
  64 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  65 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  66 + of = lshift((src1 ^ src2 ^ -1) & (src1 ^ CC_DST), 12 - DATA_BITS) & CC_O;
  67 + return cf | pf | af | zf | sf | of;
  68 +}
  69 +
  70 +static int glue(compute_c_add, SUFFIX)(void)
  71 +{
  72 + int cf;
  73 + target_long src1;
  74 + src1 = CC_SRC;
  75 + cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1;
  76 + return cf;
  77 +}
  78 +
  79 +static int glue(compute_all_adc, SUFFIX)(void)
  80 +{
  81 + int cf, pf, af, zf, sf, of;
  82 + target_long src1, src2;
  83 + src1 = CC_SRC;
  84 + src2 = CC_DST - CC_SRC - 1;
  85 + cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1;
  86 + pf = parity_table[(uint8_t)CC_DST];
  87 + af = (CC_DST ^ src1 ^ src2) & 0x10;
  88 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  89 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  90 + of = lshift((src1 ^ src2 ^ -1) & (src1 ^ CC_DST), 12 - DATA_BITS) & CC_O;
  91 + return cf | pf | af | zf | sf | of;
  92 +}
  93 +
  94 +static int glue(compute_c_adc, SUFFIX)(void)
  95 +{
  96 + int cf;
  97 + target_long src1;
  98 + src1 = CC_SRC;
  99 + cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1;
  100 + return cf;
  101 +}
  102 +
  103 +static int glue(compute_all_sub, SUFFIX)(void)
  104 +{
  105 + int cf, pf, af, zf, sf, of;
  106 + target_long src1, src2;
  107 + src1 = CC_DST + CC_SRC;
  108 + src2 = CC_SRC;
  109 + cf = (DATA_TYPE)src1 < (DATA_TYPE)src2;
  110 + pf = parity_table[(uint8_t)CC_DST];
  111 + af = (CC_DST ^ src1 ^ src2) & 0x10;
  112 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  113 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  114 + of = lshift((src1 ^ src2) & (src1 ^ CC_DST), 12 - DATA_BITS) & CC_O;
  115 + return cf | pf | af | zf | sf | of;
  116 +}
  117 +
  118 +static int glue(compute_c_sub, SUFFIX)(void)
  119 +{
  120 + int cf;
  121 + target_long src1, src2;
  122 + src1 = CC_DST + CC_SRC;
  123 + src2 = CC_SRC;
  124 + cf = (DATA_TYPE)src1 < (DATA_TYPE)src2;
  125 + return cf;
  126 +}
  127 +
  128 +static int glue(compute_all_sbb, SUFFIX)(void)
  129 +{
  130 + int cf, pf, af, zf, sf, of;
  131 + target_long src1, src2;
  132 + src1 = CC_DST + CC_SRC + 1;
  133 + src2 = CC_SRC;
  134 + cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2;
  135 + pf = parity_table[(uint8_t)CC_DST];
  136 + af = (CC_DST ^ src1 ^ src2) & 0x10;
  137 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  138 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  139 + of = lshift((src1 ^ src2) & (src1 ^ CC_DST), 12 - DATA_BITS) & CC_O;
  140 + return cf | pf | af | zf | sf | of;
  141 +}
  142 +
  143 +static int glue(compute_c_sbb, SUFFIX)(void)
  144 +{
  145 + int cf;
  146 + target_long src1, src2;
  147 + src1 = CC_DST + CC_SRC + 1;
  148 + src2 = CC_SRC;
  149 + cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2;
  150 + return cf;
  151 +}
  152 +
  153 +static int glue(compute_all_logic, SUFFIX)(void)
  154 +{
  155 + int cf, pf, af, zf, sf, of;
  156 + cf = 0;
  157 + pf = parity_table[(uint8_t)CC_DST];
  158 + af = 0;
  159 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  160 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  161 + of = 0;
  162 + return cf | pf | af | zf | sf | of;
  163 +}
  164 +
  165 +static int glue(compute_c_logic, SUFFIX)(void)
  166 +{
  167 + return 0;
  168 +}
  169 +
  170 +static int glue(compute_all_inc, SUFFIX)(void)
  171 +{
  172 + int cf, pf, af, zf, sf, of;
  173 + target_long src1, src2;
  174 + src1 = CC_DST - 1;
  175 + src2 = 1;
  176 + cf = CC_SRC;
  177 + pf = parity_table[(uint8_t)CC_DST];
  178 + af = (CC_DST ^ src1 ^ src2) & 0x10;
  179 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  180 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  181 + of = ((CC_DST & DATA_MASK) == SIGN_MASK) << 11;
  182 + return cf | pf | af | zf | sf | of;
  183 +}
  184 +
  185 +#if DATA_BITS == 32
  186 +static int glue(compute_c_inc, SUFFIX)(void)
  187 +{
  188 + return CC_SRC;
  189 +}
  190 +#endif
  191 +
  192 +static int glue(compute_all_dec, SUFFIX)(void)
  193 +{
  194 + int cf, pf, af, zf, sf, of;
  195 + target_long src1, src2;
  196 + src1 = CC_DST + 1;
  197 + src2 = 1;
  198 + cf = CC_SRC;
  199 + pf = parity_table[(uint8_t)CC_DST];
  200 + af = (CC_DST ^ src1 ^ src2) & 0x10;
  201 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  202 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  203 + of = ((CC_DST & DATA_MASK) == ((target_ulong)SIGN_MASK - 1)) << 11;
  204 + return cf | pf | af | zf | sf | of;
  205 +}
  206 +
  207 +static int glue(compute_all_shl, SUFFIX)(void)
  208 +{
  209 + int cf, pf, af, zf, sf, of;
  210 + cf = (CC_SRC >> (DATA_BITS - 1)) & CC_C;
  211 + pf = parity_table[(uint8_t)CC_DST];
  212 + af = 0; /* undefined */
  213 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  214 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  215 + /* of is defined if shift count == 1 */
  216 + of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O;
  217 + return cf | pf | af | zf | sf | of;
  218 +}
  219 +
  220 +static int glue(compute_c_shl, SUFFIX)(void)
  221 +{
  222 + return (CC_SRC >> (DATA_BITS - 1)) & CC_C;
  223 +}
  224 +
  225 +#if DATA_BITS == 32
  226 +static int glue(compute_c_sar, SUFFIX)(void)
  227 +{
  228 + return CC_SRC & 1;
  229 +}
  230 +#endif
  231 +
  232 +static int glue(compute_all_sar, SUFFIX)(void)
  233 +{
  234 + int cf, pf, af, zf, sf, of;
  235 + cf = CC_SRC & 1;
  236 + pf = parity_table[(uint8_t)CC_DST];
  237 + af = 0; /* undefined */
  238 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  239 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  240 + /* of is defined if shift count == 1 */
  241 + of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O;
  242 + return cf | pf | af | zf | sf | of;
  243 +}
  244 +
  245 +#if DATA_BITS == 32
  246 +static int glue(compute_c_mul, SUFFIX)(void)
  247 +{
  248 + int cf;
  249 + cf = (CC_SRC != 0);
  250 + return cf;
  251 +}
  252 +#endif
  253 +
  254 +/* NOTE: we compute the flags like the P4. On olders CPUs, only OF and
  255 + CF are modified and it is slower to do that. */
  256 +static int glue(compute_all_mul, SUFFIX)(void)
  257 +{
  258 + int cf, pf, af, zf, sf, of;
  259 + cf = (CC_SRC != 0);
  260 + pf = parity_table[(uint8_t)CC_DST];
  261 + af = 0; /* undefined */
  262 + zf = ((DATA_TYPE)CC_DST == 0) << 6;
  263 + sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
  264 + of = cf << 11;
  265 + return cf | pf | af | zf | sf | of;
  266 +}
  267 +
  268 +/* shifts */
  269 +
53 target_ulong glue(helper_rcl, SUFFIX)(target_ulong t0, target_ulong t1) 270 target_ulong glue(helper_rcl, SUFFIX)(target_ulong t0, target_ulong t1)
54 { 271 {
55 int count, eflags; 272 int count, eflags;
target-i386/op.c
@@ -752,84 +752,6 @@ void OPPROTO op_salc(void) @@ -752,84 +752,6 @@ void OPPROTO op_salc(void)
752 EAX = (EAX & ~0xff) | ((-cf) & 0xff); 752 EAX = (EAX & ~0xff) | ((-cf) & 0xff);
753 } 753 }
754 754
755 -static int compute_all_eflags(void)  
756 -{  
757 - return CC_SRC;  
758 -}  
759 -  
760 -static int compute_c_eflags(void)  
761 -{  
762 - return CC_SRC & CC_C;  
763 -}  
764 -  
765 -CCTable cc_table[CC_OP_NB] = {  
766 - [CC_OP_DYNAMIC] = { /* should never happen */ },  
767 -  
768 - [CC_OP_EFLAGS] = { compute_all_eflags, compute_c_eflags },  
769 -  
770 - [CC_OP_MULB] = { compute_all_mulb, compute_c_mull },  
771 - [CC_OP_MULW] = { compute_all_mulw, compute_c_mull },  
772 - [CC_OP_MULL] = { compute_all_mull, compute_c_mull },  
773 -  
774 - [CC_OP_ADDB] = { compute_all_addb, compute_c_addb },  
775 - [CC_OP_ADDW] = { compute_all_addw, compute_c_addw },  
776 - [CC_OP_ADDL] = { compute_all_addl, compute_c_addl },  
777 -  
778 - [CC_OP_ADCB] = { compute_all_adcb, compute_c_adcb },  
779 - [CC_OP_ADCW] = { compute_all_adcw, compute_c_adcw },  
780 - [CC_OP_ADCL] = { compute_all_adcl, compute_c_adcl },  
781 -  
782 - [CC_OP_SUBB] = { compute_all_subb, compute_c_subb },  
783 - [CC_OP_SUBW] = { compute_all_subw, compute_c_subw },  
784 - [CC_OP_SUBL] = { compute_all_subl, compute_c_subl },  
785 -  
786 - [CC_OP_SBBB] = { compute_all_sbbb, compute_c_sbbb },  
787 - [CC_OP_SBBW] = { compute_all_sbbw, compute_c_sbbw },  
788 - [CC_OP_SBBL] = { compute_all_sbbl, compute_c_sbbl },  
789 -  
790 - [CC_OP_LOGICB] = { compute_all_logicb, compute_c_logicb },  
791 - [CC_OP_LOGICW] = { compute_all_logicw, compute_c_logicw },  
792 - [CC_OP_LOGICL] = { compute_all_logicl, compute_c_logicl },  
793 -  
794 - [CC_OP_INCB] = { compute_all_incb, compute_c_incl },  
795 - [CC_OP_INCW] = { compute_all_incw, compute_c_incl },  
796 - [CC_OP_INCL] = { compute_all_incl, compute_c_incl },  
797 -  
798 - [CC_OP_DECB] = { compute_all_decb, compute_c_incl },  
799 - [CC_OP_DECW] = { compute_all_decw, compute_c_incl },  
800 - [CC_OP_DECL] = { compute_all_decl, compute_c_incl },  
801 -  
802 - [CC_OP_SHLB] = { compute_all_shlb, compute_c_shlb },  
803 - [CC_OP_SHLW] = { compute_all_shlw, compute_c_shlw },  
804 - [CC_OP_SHLL] = { compute_all_shll, compute_c_shll },  
805 -  
806 - [CC_OP_SARB] = { compute_all_sarb, compute_c_sarl },  
807 - [CC_OP_SARW] = { compute_all_sarw, compute_c_sarl },  
808 - [CC_OP_SARL] = { compute_all_sarl, compute_c_sarl },  
809 -  
810 -#ifdef TARGET_X86_64  
811 - [CC_OP_MULQ] = { compute_all_mulq, compute_c_mull },  
812 -  
813 - [CC_OP_ADDQ] = { compute_all_addq, compute_c_addq },  
814 -  
815 - [CC_OP_ADCQ] = { compute_all_adcq, compute_c_adcq },  
816 -  
817 - [CC_OP_SUBQ] = { compute_all_subq, compute_c_subq },  
818 -  
819 - [CC_OP_SBBQ] = { compute_all_sbbq, compute_c_sbbq },  
820 -  
821 - [CC_OP_LOGICQ] = { compute_all_logicq, compute_c_logicq },  
822 -  
823 - [CC_OP_INCQ] = { compute_all_incq, compute_c_incl },  
824 -  
825 - [CC_OP_DECQ] = { compute_all_decq, compute_c_incl },  
826 -  
827 - [CC_OP_SHLQ] = { compute_all_shlq, compute_c_shlq },  
828 -  
829 - [CC_OP_SARQ] = { compute_all_sarq, compute_c_sarl },  
830 -#endif  
831 -};  
832 -  
833 void OPPROTO op_fcomi_dummy(void) 755 void OPPROTO op_fcomi_dummy(void)
834 { 756 {
835 T0 = 0; 757 T0 = 0;
target-i386/ops_template.h
@@ -51,221 +51,6 @@ @@ -51,221 +51,6 @@
51 #error unhandled operand size 51 #error unhandled operand size
52 #endif 52 #endif
53 53
54 -/* dynamic flags computation */  
55 -  
56 -static int glue(compute_all_add, SUFFIX)(void)  
57 -{  
58 - int cf, pf, af, zf, sf, of;  
59 - target_long src1, src2;  
60 - src1 = CC_SRC;  
61 - src2 = CC_DST - CC_SRC;  
62 - cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1;  
63 - pf = parity_table[(uint8_t)CC_DST];  
64 - af = (CC_DST ^ src1 ^ src2) & 0x10;  
65 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
66 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
67 - of = lshift((src1 ^ src2 ^ -1) & (src1 ^ CC_DST), 12 - DATA_BITS) & CC_O;  
68 - return cf | pf | af | zf | sf | of;  
69 -}  
70 -  
71 -static int glue(compute_c_add, SUFFIX)(void)  
72 -{  
73 - int cf;  
74 - target_long src1;  
75 - src1 = CC_SRC;  
76 - cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1;  
77 - return cf;  
78 -}  
79 -  
80 -static int glue(compute_all_adc, SUFFIX)(void)  
81 -{  
82 - int cf, pf, af, zf, sf, of;  
83 - target_long src1, src2;  
84 - src1 = CC_SRC;  
85 - src2 = CC_DST - CC_SRC - 1;  
86 - cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1;  
87 - pf = parity_table[(uint8_t)CC_DST];  
88 - af = (CC_DST ^ src1 ^ src2) & 0x10;  
89 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
90 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
91 - of = lshift((src1 ^ src2 ^ -1) & (src1 ^ CC_DST), 12 - DATA_BITS) & CC_O;  
92 - return cf | pf | af | zf | sf | of;  
93 -}  
94 -  
95 -static int glue(compute_c_adc, SUFFIX)(void)  
96 -{  
97 - int cf;  
98 - target_long src1;  
99 - src1 = CC_SRC;  
100 - cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1;  
101 - return cf;  
102 -}  
103 -  
104 -static int glue(compute_all_sub, SUFFIX)(void)  
105 -{  
106 - int cf, pf, af, zf, sf, of;  
107 - target_long src1, src2;  
108 - src1 = CC_DST + CC_SRC;  
109 - src2 = CC_SRC;  
110 - cf = (DATA_TYPE)src1 < (DATA_TYPE)src2;  
111 - pf = parity_table[(uint8_t)CC_DST];  
112 - af = (CC_DST ^ src1 ^ src2) & 0x10;  
113 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
114 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
115 - of = lshift((src1 ^ src2) & (src1 ^ CC_DST), 12 - DATA_BITS) & CC_O;  
116 - return cf | pf | af | zf | sf | of;  
117 -}  
118 -  
119 -static int glue(compute_c_sub, SUFFIX)(void)  
120 -{  
121 - int cf;  
122 - target_long src1, src2;  
123 - src1 = CC_DST + CC_SRC;  
124 - src2 = CC_SRC;  
125 - cf = (DATA_TYPE)src1 < (DATA_TYPE)src2;  
126 - return cf;  
127 -}  
128 -  
129 -static int glue(compute_all_sbb, SUFFIX)(void)  
130 -{  
131 - int cf, pf, af, zf, sf, of;  
132 - target_long src1, src2;  
133 - src1 = CC_DST + CC_SRC + 1;  
134 - src2 = CC_SRC;  
135 - cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2;  
136 - pf = parity_table[(uint8_t)CC_DST];  
137 - af = (CC_DST ^ src1 ^ src2) & 0x10;  
138 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
139 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
140 - of = lshift((src1 ^ src2) & (src1 ^ CC_DST), 12 - DATA_BITS) & CC_O;  
141 - return cf | pf | af | zf | sf | of;  
142 -}  
143 -  
144 -static int glue(compute_c_sbb, SUFFIX)(void)  
145 -{  
146 - int cf;  
147 - target_long src1, src2;  
148 - src1 = CC_DST + CC_SRC + 1;  
149 - src2 = CC_SRC;  
150 - cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2;  
151 - return cf;  
152 -}  
153 -  
154 -static int glue(compute_all_logic, SUFFIX)(void)  
155 -{  
156 - int cf, pf, af, zf, sf, of;  
157 - cf = 0;  
158 - pf = parity_table[(uint8_t)CC_DST];  
159 - af = 0;  
160 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
161 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
162 - of = 0;  
163 - return cf | pf | af | zf | sf | of;  
164 -}  
165 -  
166 -static int glue(compute_c_logic, SUFFIX)(void)  
167 -{  
168 - return 0;  
169 -}  
170 -  
171 -static int glue(compute_all_inc, SUFFIX)(void)  
172 -{  
173 - int cf, pf, af, zf, sf, of;  
174 - target_long src1, src2;  
175 - src1 = CC_DST - 1;  
176 - src2 = 1;  
177 - cf = CC_SRC;  
178 - pf = parity_table[(uint8_t)CC_DST];  
179 - af = (CC_DST ^ src1 ^ src2) & 0x10;  
180 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
181 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
182 - of = ((CC_DST & DATA_MASK) == SIGN_MASK) << 11;  
183 - return cf | pf | af | zf | sf | of;  
184 -}  
185 -  
186 -#if DATA_BITS == 32  
187 -static int glue(compute_c_inc, SUFFIX)(void)  
188 -{  
189 - return CC_SRC;  
190 -}  
191 -#endif  
192 -  
193 -static int glue(compute_all_dec, SUFFIX)(void)  
194 -{  
195 - int cf, pf, af, zf, sf, of;  
196 - target_long src1, src2;  
197 - src1 = CC_DST + 1;  
198 - src2 = 1;  
199 - cf = CC_SRC;  
200 - pf = parity_table[(uint8_t)CC_DST];  
201 - af = (CC_DST ^ src1 ^ src2) & 0x10;  
202 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
203 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
204 - of = ((CC_DST & DATA_MASK) == ((target_ulong)SIGN_MASK - 1)) << 11;  
205 - return cf | pf | af | zf | sf | of;  
206 -}  
207 -  
208 -static int glue(compute_all_shl, SUFFIX)(void)  
209 -{  
210 - int cf, pf, af, zf, sf, of;  
211 - cf = (CC_SRC >> (DATA_BITS - 1)) & CC_C;  
212 - pf = parity_table[(uint8_t)CC_DST];  
213 - af = 0; /* undefined */  
214 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
215 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
216 - /* of is defined if shift count == 1 */  
217 - of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O;  
218 - return cf | pf | af | zf | sf | of;  
219 -}  
220 -  
221 -static int glue(compute_c_shl, SUFFIX)(void)  
222 -{  
223 - return (CC_SRC >> (DATA_BITS - 1)) & CC_C;  
224 -}  
225 -  
226 -#if DATA_BITS == 32  
227 -static int glue(compute_c_sar, SUFFIX)(void)  
228 -{  
229 - return CC_SRC & 1;  
230 -}  
231 -#endif  
232 -  
233 -static int glue(compute_all_sar, SUFFIX)(void)  
234 -{  
235 - int cf, pf, af, zf, sf, of;  
236 - cf = CC_SRC & 1;  
237 - pf = parity_table[(uint8_t)CC_DST];  
238 - af = 0; /* undefined */  
239 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
240 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
241 - /* of is defined if shift count == 1 */  
242 - of = lshift(CC_SRC ^ CC_DST, 12 - DATA_BITS) & CC_O;  
243 - return cf | pf | af | zf | sf | of;  
244 -}  
245 -  
246 -#if DATA_BITS == 32  
247 -static int glue(compute_c_mul, SUFFIX)(void)  
248 -{  
249 - int cf;  
250 - cf = (CC_SRC != 0);  
251 - return cf;  
252 -}  
253 -#endif  
254 -  
255 -/* NOTE: we compute the flags like the P4. On olders CPUs, only OF and  
256 - CF are modified and it is slower to do that. */  
257 -static int glue(compute_all_mul, SUFFIX)(void)  
258 -{  
259 - int cf, pf, af, zf, sf, of;  
260 - cf = (CC_SRC != 0);  
261 - pf = parity_table[(uint8_t)CC_DST];  
262 - af = 0; /* undefined */  
263 - zf = ((DATA_TYPE)CC_DST == 0) << 6;  
264 - sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;  
265 - of = cf << 11;  
266 - return cf | pf | af | zf | sf | of;  
267 -}  
268 -  
269 /* various optimized jumps cases */ 54 /* various optimized jumps cases */
270 55
271 void OPPROTO glue(op_jb_sub, SUFFIX)(void) 56 void OPPROTO glue(op_jb_sub, SUFFIX)(void)