Revision 436ff2d2 target-i386/translate.c
b/target-i386/translate.c | ||
---|---|---|
213 | 213 |
[CC_OP_ADCX] = USES_CC_DST | USES_CC_SRC, |
214 | 214 |
[CC_OP_ADOX] = USES_CC_SRC | USES_CC_SRC2, |
215 | 215 |
[CC_OP_ADCOX] = USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, |
216 |
[CC_OP_CLR] = 0, |
|
216 | 217 |
}; |
217 | 218 |
|
218 | 219 |
static void set_cc_op(DisasContext *s, CCOp op) |
... | ... | |
906 | 907 |
if (s->cc_op == CC_OP_EFLAGS) { |
907 | 908 |
return; |
908 | 909 |
} |
910 |
if (s->cc_op == CC_OP_CLR) { |
|
911 |
tcg_gen_movi_tl(cpu_cc_src, CC_Z); |
|
912 |
set_cc_op(s, CC_OP_EFLAGS); |
|
913 |
return; |
|
914 |
} |
|
909 | 915 |
|
910 | 916 |
TCGV_UNUSED(zero); |
911 | 917 |
dst = cpu_cc_dst; |
... | ... | |
974 | 980 |
.reg2 = t1, .mask = -1, .use_reg2 = true }; |
975 | 981 |
|
976 | 982 |
case CC_OP_LOGICB ... CC_OP_LOGICQ: |
983 |
case CC_OP_CLR: |
|
977 | 984 |
return (CCPrepare) { .cond = TCG_COND_NEVER, .mask = -1 }; |
978 | 985 |
|
979 | 986 |
case CC_OP_INCB ... CC_OP_INCQ: |
... | ... | |
1040 | 1047 |
case CC_OP_ADCOX: |
1041 | 1048 |
return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src, |
1042 | 1049 |
.mask = CC_S }; |
1050 |
case CC_OP_CLR: |
|
1051 |
return (CCPrepare) { .cond = TCG_COND_NEVER, .mask = -1 }; |
|
1043 | 1052 |
default: |
1044 | 1053 |
{ |
1045 | 1054 |
int size = (s->cc_op - CC_OP_ADDB) & 3; |
... | ... | |
1057 | 1066 |
case CC_OP_ADCOX: |
1058 | 1067 |
return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src2, |
1059 | 1068 |
.mask = -1, .no_setcond = true }; |
1060 |
|
|
1069 |
case CC_OP_CLR: |
|
1070 |
return (CCPrepare) { .cond = TCG_COND_NEVER, .mask = -1 }; |
|
1061 | 1071 |
default: |
1062 | 1072 |
gen_compute_eflags(s); |
1063 | 1073 |
return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src, |
... | ... | |
1078 | 1088 |
case CC_OP_ADCOX: |
1079 | 1089 |
return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src, |
1080 | 1090 |
.mask = CC_Z }; |
1091 |
case CC_OP_CLR: |
|
1092 |
return (CCPrepare) { .cond = TCG_COND_ALWAYS, .mask = -1 }; |
|
1081 | 1093 |
default: |
1082 | 1094 |
{ |
1083 | 1095 |
int size = (s->cc_op - CC_OP_ADDB) & 3; |
... | ... | |
4890 | 4902 |
} else if (op == OP_XORL && rm == reg) { |
4891 | 4903 |
xor_zero: |
4892 | 4904 |
/* xor reg, reg optimisation */ |
4905 |
set_cc_op(s, CC_OP_CLR); |
|
4893 | 4906 |
gen_op_movl_T0_0(); |
4894 |
set_cc_op(s, CC_OP_LOGICB + ot); |
|
4895 | 4907 |
gen_op_mov_reg_T0(ot, reg); |
4896 |
gen_op_update1_cc(); |
|
4897 | 4908 |
break; |
4898 | 4909 |
} else { |
4899 | 4910 |
opreg = rm; |
Also available in: Unified diff