/[qemu]/qemu/target-i386/op.c
ViewVC logotype

Diff of /qemu/target-i386/op.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.7 by bellard, Sun Nov 23 23:09:40 2003 UTC revision 1.8 by bellard, Tue Dec 2 22:01:31 2003 UTC
# Line 169  void OPPROTO op_bswapl_T0(void) Line 169  void OPPROTO op_bswapl_T0(void)
169  }  }
170    
171  /* multiply/divide */  /* multiply/divide */
172    
173    /* XXX: add eflags optimizations */
174    /* XXX: add non P4 style flags */
175    
176  void OPPROTO op_mulb_AL_T0(void)  void OPPROTO op_mulb_AL_T0(void)
177  {  {
178      unsigned int res;      unsigned int res;
179      res = (uint8_t)EAX * (uint8_t)T0;      res = (uint8_t)EAX * (uint8_t)T0;
180      EAX = (EAX & 0xffff0000) | res;      EAX = (EAX & 0xffff0000) | res;
181        CC_DST = res;
182      CC_SRC = (res & 0xff00);      CC_SRC = (res & 0xff00);
183  }  }
184    
# Line 182  void OPPROTO op_imulb_AL_T0(void) Line 187  void OPPROTO op_imulb_AL_T0(void)
187      int res;      int res;
188      res = (int8_t)EAX * (int8_t)T0;      res = (int8_t)EAX * (int8_t)T0;
189      EAX = (EAX & 0xffff0000) | (res & 0xffff);      EAX = (EAX & 0xffff0000) | (res & 0xffff);
190        CC_DST = res;
191      CC_SRC = (res != (int8_t)res);      CC_SRC = (res != (int8_t)res);
192  }  }
193    
# Line 191  void OPPROTO op_mulw_AX_T0(void) Line 197  void OPPROTO op_mulw_AX_T0(void)
197      res = (uint16_t)EAX * (uint16_t)T0;      res = (uint16_t)EAX * (uint16_t)T0;
198      EAX = (EAX & 0xffff0000) | (res & 0xffff);      EAX = (EAX & 0xffff0000) | (res & 0xffff);
199      EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff);      EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff);
200        CC_DST = res;
201      CC_SRC = res >> 16;      CC_SRC = res >> 16;
202  }  }
203    
# Line 200  void OPPROTO op_imulw_AX_T0(void) Line 207  void OPPROTO op_imulw_AX_T0(void)
207      res = (int16_t)EAX * (int16_t)T0;      res = (int16_t)EAX * (int16_t)T0;
208      EAX = (EAX & 0xffff0000) | (res & 0xffff);      EAX = (EAX & 0xffff0000) | (res & 0xffff);
209      EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff);      EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff);
210        CC_DST = res;
211      CC_SRC = (res != (int16_t)res);      CC_SRC = (res != (int16_t)res);
212  }  }
213    
# Line 209  void OPPROTO op_mull_EAX_T0(void) Line 217  void OPPROTO op_mull_EAX_T0(void)
217      res = (uint64_t)((uint32_t)EAX) * (uint64_t)((uint32_t)T0);      res = (uint64_t)((uint32_t)EAX) * (uint64_t)((uint32_t)T0);
218      EAX = res;      EAX = res;
219      EDX = res >> 32;      EDX = res >> 32;
220        CC_DST = res;
221      CC_SRC = res >> 32;      CC_SRC = res >> 32;
222  }  }
223    
# Line 218  void OPPROTO op_imull_EAX_T0(void) Line 227  void OPPROTO op_imull_EAX_T0(void)
227      res = (int64_t)((int32_t)EAX) * (int64_t)((int32_t)T0);      res = (int64_t)((int32_t)EAX) * (int64_t)((int32_t)T0);
228      EAX = res;      EAX = res;
229      EDX = res >> 32;      EDX = res >> 32;
230        CC_DST = res;
231      CC_SRC = (res != (int32_t)res);      CC_SRC = (res != (int32_t)res);
232  }  }
233    
# Line 226  void OPPROTO op_imulw_T0_T1(void) Line 236  void OPPROTO op_imulw_T0_T1(void)
236      int res;      int res;
237      res = (int16_t)T0 * (int16_t)T1;      res = (int16_t)T0 * (int16_t)T1;
238      T0 = res;      T0 = res;
239        CC_DST = res;
240      CC_SRC = (res != (int16_t)res);      CC_SRC = (res != (int16_t)res);
241  }  }
242    
# Line 234  void OPPROTO op_imull_T0_T1(void) Line 245  void OPPROTO op_imull_T0_T1(void)
245      int64_t res;      int64_t res;
246      res = (int64_t)((int32_t)T0) * (int64_t)((int32_t)T1);      res = (int64_t)((int32_t)T0) * (int64_t)((int32_t)T1);
247      T0 = res;      T0 = res;
248        CC_DST = res;
249      CC_SRC = (res != (int32_t)res);      CC_SRC = (res != (int32_t)res);
250  }  }
251    
# Line 1293  static int compute_c_eflags(void) Line 1305  static int compute_c_eflags(void)
1305      return CC_SRC & CC_C;      return CC_SRC & CC_C;
1306  }  }
1307    
 static int compute_c_mul(void)  
 {  
     int cf;  
     cf = (CC_SRC != 0);  
     return cf;  
 }  
   
 static int compute_all_mul(void)  
 {  
     int cf, pf, af, zf, sf, of;  
     cf = (CC_SRC != 0);  
     pf = 0; /* undefined */  
     af = 0; /* undefined */  
     zf = 0; /* undefined */  
     sf = 0; /* undefined */  
     of = cf << 11;  
     return cf | pf | af | zf | sf | of;  
 }  
       
1308  CCTable cc_table[CC_OP_NB] = {  CCTable cc_table[CC_OP_NB] = {
1309      [CC_OP_DYNAMIC] = { /* should never happen */ },      [CC_OP_DYNAMIC] = { /* should never happen */ },
1310    
1311      [CC_OP_EFLAGS] = { compute_all_eflags, compute_c_eflags },      [CC_OP_EFLAGS] = { compute_all_eflags, compute_c_eflags },
1312    
1313      [CC_OP_MUL] = { compute_all_mul, compute_c_mul },      [CC_OP_MULB] = { compute_all_mulb, compute_c_mull },
1314        [CC_OP_MULW] = { compute_all_mulw, compute_c_mull },
1315        [CC_OP_MULL] = { compute_all_mull, compute_c_mull },
1316    
1317      [CC_OP_ADDB] = { compute_all_addb, compute_c_addb },      [CC_OP_ADDB] = { compute_all_addb, compute_c_addb },
1318      [CC_OP_ADDW] = { compute_all_addw, compute_c_addw  },      [CC_OP_ADDW] = { compute_all_addw, compute_c_addw  },

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.8

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26