📄 arm2x86_dp.c
字号:
/* This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public License alongwith this program; if not, write to the Free Software Foundation, Inc.,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* * author teawater <c7code-uc@yahoo.com.cn> <teawater@gmail.com> */#include "armdefs.h"#include "arm2x86_self.h"uint8_t *get_op_andl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_andl_T0_T1"); T0 &= T1; OP_END ("get_op_andl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_eorl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_eorl_T0_T1"); T0 ^= T1; OP_END ("get_op_eorl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_subl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_subl_T0_T1"); T0 -= T1; OP_END ("get_op_subl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_subl_T0_T1_scv (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_subl_T0_T1_scv"); T2 = T0 - T1; //CFLAG_reg = (T0<T1)?1:0; CFLAG_reg = (T0 >= T1) ? 1 : 0; //chy 2006-02-12 chage ! to ~ //VFLAG_reg = !(T2 ^ T1); VFLAG_reg = ~(T2 ^ T1); VFLAG_reg &= (T0 ^ T1); VFLAG_reg >>= 31; T0 = T2; OP_END ("get_op_subl_T0_T1_scv"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_rsbl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_rsbl_T0_T1"); T0 = T1 - T0; OP_END ("get_op_rsbl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_rsbl_T0_T1_scv (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_rsbl_T0_T1_scv"); T2 = T1 - T0; //CFLAG_reg = (T1<T0)?1:0; CFLAG_reg = (T1 >= T0) ? 1 : 0; //chy 2006-02-12 chage ! to ~ //VFLAG_reg = !(T2 ^ T0); VFLAG_reg = ~(T2 ^ T0); VFLAG_reg &= (T0 ^ T1); VFLAG_reg >>= 31; T0 = T2; OP_END ("get_op_rsbl_T0_T1_scv"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_addl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_addl_T0_T1"); T0 += T1; OP_END ("get_op_addl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_addl_T0_T1_scv (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_addl_T0_T1_scv"); T2 = T0 + T1; CFLAG_reg = (T2 < T0); VFLAG_reg = ~(T0 ^ T1); VFLAG_reg &= (T2 ^ T1); VFLAG_reg >>= 31; T0 = T2; OP_END ("get_op_addl_T0_T1_scv"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_adcl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_adcl_T0_T1"); T0 += T1 + CFLAG_reg; OP_END ("get_op_adcl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_adcl_T0_T1_scv (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_adcl_T0_T1_scv"); T2 = T0 + T1 + CFLAG_reg; if (!CFLAG_reg) { CFLAG_reg = (T2 < T0); } else { CFLAG_reg = (T2 <= T0); } VFLAG_reg = ~(T0 ^ T1); VFLAG_reg &= (T2 ^ T1); VFLAG_reg >>= 31; T0 = T2; OP_END ("get_op_adcl_T0_T1_scv"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_sbcl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_sbcl_T0_T1"); //T0 -= (T1 + !CFLAG_reg); T0 = T0 - T1 + CFLAG_reg - 1; OP_END ("get_op_sbcl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_sbcl_T0_T1_scv (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_sbcl_T0_T1_scv"); T2 = T0 - T1 + CFLAG_reg - 1; if (!CFLAG_reg) { CFLAG_reg = (T0 > T1); } else { CFLAG_reg = (T0 >= T1); } //chy 2006-02-12 chage ! to ~ //VFLAG_reg = !(T2 ^ T1); VFLAG_reg = ~(T2 ^ T1); VFLAG_reg &= (T0 ^ T1); VFLAG_reg >>= 31; T0 = T2; OP_END ("get_op_sbcl_T0_T1_scv"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_rscl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_rscl_T0_T1"); //T0 = T1 - T0 - !CFLAG_reg; T0 = T1 - T0 + CFLAG_reg - 1; OP_END ("get_op_rscl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_rscl_T0_T1_scv (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_rscl_T0_T1_scv"); T0 += !CFLAG_reg; T2 = T1 - T0; //CFLAG_reg = (T1<T0)?1:0; //CFLAG_reg = (T1 >= T0)?1:0; if (!CFLAG_reg) { CFLAG_reg = (T1 > T0); } else { CFLAG_reg = (T1 >= T0); } //chy 2006-02-12 chage ! to ~ //VFLAG_reg = !(T2 ^ T0); VFLAG_reg = ~(T2 ^ T0); VFLAG_reg &= (T0 ^ T1); VFLAG_reg >>= 31; T0 = T2; OP_END ("get_op_rscl_T0_T1_scv"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_orrl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_orrl_T0_T1"); T0 |= T1; OP_END ("get_op_orrl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_movl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_movl_T0_T1"); T0 = T1; OP_END ("get_op_movl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_bicl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_bicl_T0_T1"); T0 &= ~T1; OP_END ("get_op_bicl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_notl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_notl_T0_T1"); T0 = ~T1; OP_END ("get_op_notl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_addl_T1_im (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_addl_T1_im"); T1 += INT32_MAX; OP_END ("get_op_addl_T1_im"); *len = end - begin; if (*len <= sizeof (ULONG_MAX)) { return (NULL); } else { *len -= sizeof (ULONG_MAX); } return ((uint8_t *) begin);}uint8_t *get_op_subl_T1_T2 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_subl_T1_T2"); T1 -= T2; OP_END ("get_op_subl_T1_T2"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_addl_T1_T2 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_addl_T1_T2"); T1 += T2; OP_END ("get_op_addl_T1_T2"); *len = end - begin; return ((uint8_t *) begin);}//teawater add for xscale(arm v5) 2005.09.01------------------------------------uint8_t *get_op_clzl_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_clzl_T0_T1"); //chy 2006-02-12 fix a bug if(T1){ for (T0 = 0; (T1 & 0x80000000) == 0; T1 <<= 1) { T0++; } } OP_END ("get_op_clzl_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_qaddl_T0_T1_sq (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_qaddl_T0_T1_sq"); T2 = T0 + T1; QFLAG_reg = ~(T0 ^ T1); QFLAG_reg &= (T2 ^ T1); QFLAG_reg >>= 31; T0 = T2; if (QFLAG_reg) { T0 = (T0 >> 31) ? 0x7fffffff : 0x80000000; } OP_END ("get_op_qaddl_T0_T1_sq"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_qsubl_T0_T1_sq (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_qsubl_T0_T1_sq"); T2 = T0 - T1; //chy 2006-02-12 chage ! to ~ //QFLAG_reg = !(T2 ^ T1); QFLAG_reg = ~(T2 ^ T1); QFLAG_reg &= (T0 ^ T1); QFLAG_reg >>= 31; T0 = T2; if (QFLAG_reg) { T0 = (T0 >> 31) ? 0x7fffffff : 0x80000000; } OP_END ("get_op_qsubl_T0_T1_sq"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_addl_T0_T1_sq (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_addl_T0_T1_sq"); T2 = T0 + T1; QFLAG_reg = ~(T0 ^ T1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -