Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 1 | /* |
| 2 | * x86 condition code helpers |
| 3 | * |
| 4 | * Copyright (c) 2003 Fabrice Bellard |
| 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
| 18 | */ |
| 19 | |
| 20 | #include "cpu.h" |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 21 | #include "helper.h" |
| 22 | |
| 23 | const uint8_t parity_table[256] = { |
| 24 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 25 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 26 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 27 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 28 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 29 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 30 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 31 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 32 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 33 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 34 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 35 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 36 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 37 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 38 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 39 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 40 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 41 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 42 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 43 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 44 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 45 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 46 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 47 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 48 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 49 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 50 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 51 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 52 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 53 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 54 | CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, |
| 55 | 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, |
| 56 | }; |
| 57 | |
| 58 | #define SHIFT 0 |
| 59 | #include "cc_helper_template.h" |
| 60 | #undef SHIFT |
| 61 | |
| 62 | #define SHIFT 1 |
| 63 | #include "cc_helper_template.h" |
| 64 | #undef SHIFT |
| 65 | |
| 66 | #define SHIFT 2 |
| 67 | #include "cc_helper_template.h" |
| 68 | #undef SHIFT |
| 69 | |
| 70 | #ifdef TARGET_X86_64 |
| 71 | |
| 72 | #define SHIFT 3 |
| 73 | #include "cc_helper_template.h" |
| 74 | #undef SHIFT |
| 75 | |
| 76 | #endif |
| 77 | |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 78 | target_ulong helper_cc_compute_all(target_ulong dst, target_ulong src1, |
| 79 | target_ulong src2, int op) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 80 | { |
| 81 | switch (op) { |
| 82 | default: /* should never happen */ |
| 83 | return 0; |
| 84 | |
| 85 | case CC_OP_EFLAGS: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 86 | return src1; |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 87 | |
| 88 | case CC_OP_MULB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 89 | return compute_all_mulb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 90 | case CC_OP_MULW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 91 | return compute_all_mulw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 92 | case CC_OP_MULL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 93 | return compute_all_mull(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 94 | |
| 95 | case CC_OP_ADDB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 96 | return compute_all_addb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 97 | case CC_OP_ADDW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 98 | return compute_all_addw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 99 | case CC_OP_ADDL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 100 | return compute_all_addl(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 101 | |
| 102 | case CC_OP_ADCB: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 103 | return compute_all_adcb(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 104 | case CC_OP_ADCW: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 105 | return compute_all_adcw(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 106 | case CC_OP_ADCL: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 107 | return compute_all_adcl(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 108 | |
| 109 | case CC_OP_SUBB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 110 | return compute_all_subb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 111 | case CC_OP_SUBW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 112 | return compute_all_subw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 113 | case CC_OP_SUBL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 114 | return compute_all_subl(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 115 | |
| 116 | case CC_OP_SBBB: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 117 | return compute_all_sbbb(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 118 | case CC_OP_SBBW: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 119 | return compute_all_sbbw(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 120 | case CC_OP_SBBL: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 121 | return compute_all_sbbl(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 122 | |
| 123 | case CC_OP_LOGICB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 124 | return compute_all_logicb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 125 | case CC_OP_LOGICW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 126 | return compute_all_logicw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 127 | case CC_OP_LOGICL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 128 | return compute_all_logicl(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 129 | |
| 130 | case CC_OP_INCB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 131 | return compute_all_incb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 132 | case CC_OP_INCW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 133 | return compute_all_incw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 134 | case CC_OP_INCL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 135 | return compute_all_incl(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 136 | |
| 137 | case CC_OP_DECB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 138 | return compute_all_decb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 139 | case CC_OP_DECW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 140 | return compute_all_decw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 141 | case CC_OP_DECL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 142 | return compute_all_decl(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 143 | |
| 144 | case CC_OP_SHLB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 145 | return compute_all_shlb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 146 | case CC_OP_SHLW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 147 | return compute_all_shlw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 148 | case CC_OP_SHLL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 149 | return compute_all_shll(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 150 | |
| 151 | case CC_OP_SARB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 152 | return compute_all_sarb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 153 | case CC_OP_SARW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 154 | return compute_all_sarw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 155 | case CC_OP_SARL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 156 | return compute_all_sarl(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 157 | |
Richard Henderson | bc4b43d | 2013-01-23 16:44:37 -0800 | [diff] [blame] | 158 | case CC_OP_BMILGB: |
| 159 | return compute_all_bmilgb(dst, src1); |
| 160 | case CC_OP_BMILGW: |
| 161 | return compute_all_bmilgw(dst, src1); |
| 162 | case CC_OP_BMILGL: |
| 163 | return compute_all_bmilgl(dst, src1); |
| 164 | |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 165 | #ifdef TARGET_X86_64 |
| 166 | case CC_OP_MULQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 167 | return compute_all_mulq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 168 | case CC_OP_ADDQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 169 | return compute_all_addq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 170 | case CC_OP_ADCQ: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 171 | return compute_all_adcq(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 172 | case CC_OP_SUBQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 173 | return compute_all_subq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 174 | case CC_OP_SBBQ: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 175 | return compute_all_sbbq(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 176 | case CC_OP_LOGICQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 177 | return compute_all_logicq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 178 | case CC_OP_INCQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 179 | return compute_all_incq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 180 | case CC_OP_DECQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 181 | return compute_all_decq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 182 | case CC_OP_SHLQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 183 | return compute_all_shlq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 184 | case CC_OP_SARQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 185 | return compute_all_sarq(dst, src1); |
Richard Henderson | bc4b43d | 2013-01-23 16:44:37 -0800 | [diff] [blame] | 186 | case CC_OP_BMILGQ: |
| 187 | return compute_all_bmilgq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 188 | #endif |
| 189 | } |
| 190 | } |
| 191 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 192 | uint32_t cpu_cc_compute_all(CPUX86State *env, int op) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 193 | { |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 194 | return helper_cc_compute_all(CC_DST, CC_SRC, CC_SRC2, op); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 195 | } |
| 196 | |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 197 | target_ulong helper_cc_compute_c(target_ulong dst, target_ulong src1, |
| 198 | target_ulong src2, int op) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 199 | { |
| 200 | switch (op) { |
| 201 | default: /* should never happen */ |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 202 | case CC_OP_LOGICB: |
| 203 | case CC_OP_LOGICW: |
| 204 | case CC_OP_LOGICL: |
| 205 | case CC_OP_LOGICQ: |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 206 | return 0; |
| 207 | |
| 208 | case CC_OP_EFLAGS: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 209 | case CC_OP_SARB: |
| 210 | case CC_OP_SARW: |
| 211 | case CC_OP_SARL: |
| 212 | case CC_OP_SARQ: |
| 213 | return src1 & 1; |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 214 | |
| 215 | case CC_OP_INCB: |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 216 | case CC_OP_INCW: |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 217 | case CC_OP_INCL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 218 | case CC_OP_INCQ: |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 219 | case CC_OP_DECB: |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 220 | case CC_OP_DECW: |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 221 | case CC_OP_DECL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 222 | case CC_OP_DECQ: |
| 223 | return src1; |
| 224 | |
| 225 | case CC_OP_MULB: |
| 226 | case CC_OP_MULW: |
| 227 | case CC_OP_MULL: |
| 228 | case CC_OP_MULQ: |
| 229 | return src1 != 0; |
| 230 | |
| 231 | case CC_OP_ADDB: |
| 232 | return compute_c_addb(dst, src1); |
| 233 | case CC_OP_ADDW: |
| 234 | return compute_c_addw(dst, src1); |
| 235 | case CC_OP_ADDL: |
| 236 | return compute_c_addl(dst, src1); |
| 237 | |
| 238 | case CC_OP_ADCB: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 239 | return compute_c_adcb(dst, src1, src2); |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 240 | case CC_OP_ADCW: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 241 | return compute_c_adcw(dst, src1, src2); |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 242 | case CC_OP_ADCL: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 243 | return compute_c_adcl(dst, src1, src2); |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 244 | |
| 245 | case CC_OP_SUBB: |
| 246 | return compute_c_subb(dst, src1); |
| 247 | case CC_OP_SUBW: |
| 248 | return compute_c_subw(dst, src1); |
| 249 | case CC_OP_SUBL: |
| 250 | return compute_c_subl(dst, src1); |
| 251 | |
| 252 | case CC_OP_SBBB: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 253 | return compute_c_sbbb(dst, src1, src2); |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 254 | case CC_OP_SBBW: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 255 | return compute_c_sbbw(dst, src1, src2); |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 256 | case CC_OP_SBBL: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 257 | return compute_c_sbbl(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 258 | |
| 259 | case CC_OP_SHLB: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 260 | return compute_c_shlb(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 261 | case CC_OP_SHLW: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 262 | return compute_c_shlw(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 263 | case CC_OP_SHLL: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 264 | return compute_c_shll(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 265 | |
Richard Henderson | bc4b43d | 2013-01-23 16:44:37 -0800 | [diff] [blame] | 266 | case CC_OP_BMILGB: |
| 267 | return compute_c_bmilgb(dst, src1); |
| 268 | case CC_OP_BMILGW: |
| 269 | return compute_c_bmilgw(dst, src1); |
| 270 | case CC_OP_BMILGL: |
| 271 | return compute_c_bmilgl(dst, src1); |
| 272 | |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 273 | #ifdef TARGET_X86_64 |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 274 | case CC_OP_ADDQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 275 | return compute_c_addq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 276 | case CC_OP_ADCQ: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 277 | return compute_c_adcq(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 278 | case CC_OP_SUBQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 279 | return compute_c_subq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 280 | case CC_OP_SBBQ: |
Richard Henderson | 988c3eb | 2013-01-23 16:03:16 -0800 | [diff] [blame] | 281 | return compute_c_sbbq(dst, src1, src2); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 282 | case CC_OP_SHLQ: |
Richard Henderson | 8601c0b | 2013-01-23 16:06:38 -0800 | [diff] [blame] | 283 | return compute_c_shlq(dst, src1); |
Richard Henderson | bc4b43d | 2013-01-23 16:44:37 -0800 | [diff] [blame] | 284 | case CC_OP_BMILGQ: |
| 285 | return compute_c_bmilgq(dst, src1); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 286 | #endif |
| 287 | } |
| 288 | } |
| 289 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 290 | void helper_write_eflags(CPUX86State *env, target_ulong t0, |
| 291 | uint32_t update_mask) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 292 | { |
| 293 | cpu_load_eflags(env, t0, update_mask); |
| 294 | } |
| 295 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 296 | target_ulong helper_read_eflags(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 297 | { |
| 298 | uint32_t eflags; |
| 299 | |
Richard Henderson | db9f259 | 2013-01-23 16:10:49 -0800 | [diff] [blame] | 300 | eflags = cpu_cc_compute_all(env, CC_OP); |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 301 | eflags |= (DF & DF_MASK); |
| 302 | eflags |= env->eflags & ~(VM_MASK | RF_MASK); |
| 303 | return eflags; |
| 304 | } |
| 305 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 306 | void helper_clts(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 307 | { |
| 308 | env->cr[0] &= ~CR0_TS_MASK; |
| 309 | env->hflags &= ~HF_TS_MASK; |
| 310 | } |
| 311 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 312 | void helper_reset_rf(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 313 | { |
| 314 | env->eflags &= ~RF_MASK; |
| 315 | } |
| 316 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 317 | void helper_cli(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 318 | { |
| 319 | env->eflags &= ~IF_MASK; |
| 320 | } |
| 321 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 322 | void helper_sti(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 323 | { |
| 324 | env->eflags |= IF_MASK; |
| 325 | } |
| 326 | |
H. Peter Anvin | a9321a4 | 2012-09-26 13:18:43 -0700 | [diff] [blame] | 327 | void helper_clac(CPUX86State *env) |
| 328 | { |
| 329 | env->eflags &= ~AC_MASK; |
| 330 | } |
| 331 | |
| 332 | void helper_stac(CPUX86State *env) |
| 333 | { |
| 334 | env->eflags |= AC_MASK; |
| 335 | } |
| 336 | |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 337 | #if 0 |
| 338 | /* vm86plus instructions */ |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 339 | void helper_cli_vm(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 340 | { |
| 341 | env->eflags &= ~VIF_MASK; |
| 342 | } |
| 343 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 344 | void helper_sti_vm(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 345 | { |
| 346 | env->eflags |= VIF_MASK; |
| 347 | if (env->eflags & VIP_MASK) { |
| 348 | raise_exception(env, EXCP0D_GPF); |
| 349 | } |
| 350 | } |
| 351 | #endif |
| 352 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 353 | void helper_set_inhibit_irq(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 354 | { |
| 355 | env->hflags |= HF_INHIBIT_IRQ_MASK; |
| 356 | } |
| 357 | |
Blue Swirl | f0967a1 | 2012-04-29 12:45:34 +0000 | [diff] [blame] | 358 | void helper_reset_inhibit_irq(CPUX86State *env) |
Blue Swirl | 5918fff | 2012-04-29 12:21:21 +0000 | [diff] [blame] | 359 | { |
| 360 | env->hflags &= ~HF_INHIBIT_IRQ_MASK; |
| 361 | } |