Revision 04acd307

b/target-alpha/cpu.h
275 275
    /* temporary fixed-point registers
276 276
     * used to emulate 64 bits target on 32 bits hosts
277 277
     */
278
    target_ulong t0, t1, t2;
278
    target_ulong t0, t1;
279 279
#endif
280 280
    /* */
281 281
    double ft0, ft1, ft2;
b/target-alpha/exec.h
34 34
/* no registers can be used */
35 35
#define T0 (env->t0)
36 36
#define T1 (env->t1)
37
#define T2 (env->t2)
38 37

  
39 38
#else
40 39

  
41 40
register uint64_t T0 asm(AREG1);
42 41
register uint64_t T1 asm(AREG2);
43
register uint64_t T2 asm(AREG3);
44 42

  
45 43
#endif /* TARGET_LONG_BITS > HOST_LONG_BITS */
46 44

  
b/target-alpha/helper.h
11 11
DEF_HELPER(uint64_t, helper_rc, (void))
12 12
DEF_HELPER(uint64_t, helper_rs, (void))
13 13

  
14
DEF_HELPER(uint64_t, helper_addqv, (uint64_t, uint64_t))
15
DEF_HELPER(uint64_t, helper_addlv, (uint64_t, uint64_t))
16
DEF_HELPER(uint64_t, helper_subqv, (uint64_t, uint64_t))
17
DEF_HELPER(uint64_t, helper_sublv, (uint64_t, uint64_t))
18
DEF_HELPER(uint64_t, helper_mullv, (uint64_t, uint64_t))
19
DEF_HELPER(uint64_t, helper_mulqv, (uint64_t, uint64_t))
20
DEF_HELPER(uint64_t, helper_umulh, (uint64_t, uint64_t))
21

  
14 22
DEF_HELPER(uint64_t, helper_ctpop, (uint64_t))
15 23
DEF_HELPER(uint64_t, helper_ctlz, (uint64_t))
16 24
DEF_HELPER(uint64_t, helper_cttz, (uint64_t))
......
32 40
DEF_HELPER(uint64_t, helper_mskqh, (int64_t, uint64_t))
33 41
DEF_HELPER(uint64_t, helper_insqh, (int64_t, uint64_t))
34 42

  
43
DEF_HELPER(uint64_t, helper_cmpbge, (uint64_t, uint64_t))
b/target-alpha/op.c
161 161
    RETURN();
162 162
}
163 163

  
164
/* Arithmetic */
165
void OPPROTO op_addqv (void)
166
{
167
    helper_addqv();
168
    RETURN();
169
}
170

  
171
void OPPROTO op_addlv (void)
172
{
173
    helper_addlv();
174
    RETURN();
175
}
176

  
177
void OPPROTO op_subqv (void)
178
{
179
    helper_subqv();
180
    RETURN();
181
}
182

  
183
void OPPROTO op_sublv (void)
184
{
185
    helper_sublv();
186
    RETURN();
187
}
188

  
189
void OPPROTO op_mullv (void)
190
{
191
    helper_mullv();
192
    RETURN();
193
}
194

  
195
void OPPROTO op_mulqv (void)
196
{
197
    helper_mulqv();
198
    RETURN();
199
}
200

  
201
void OPPROTO op_umulh (void)
202
{
203
    uint64_t tl, th;
204

  
205
    mulu64(&tl, &th, T0, T1);
206
    T0 = th;
207
    RETURN();
208
}
209

  
210 164
/* Tests */
211
void OPPROTO op_cmpbge (void)
212
{
213
    helper_cmpbge();
214
    RETURN();
215
}
216

  
217 165
#if 0 // Qemu does not know how to do this...
218 166
void OPPROTO op_bcond (void)
219 167
{
b/target-alpha/op_helper.c
163 163
    return tmp;
164 164
}
165 165

  
166
void helper_addqv (void)
166
uint64_t helper_addqv (uint64_t op1, uint64_t op2)
167 167
{
168
    T2 = T0;
169
    T0 += T1;
170
    if (unlikely((T2 ^ T1 ^ (-1ULL)) & (T2 ^ T0) & (1ULL << 63))) {
168
    uint64_t tmp = op1;
169
    op1 += op2;
170
    if (unlikely((tmp ^ op2 ^ (-1ULL)) & (tmp ^ op1) & (1ULL << 63))) {
171 171
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
172 172
    }
173
    return op1;
173 174
}
174 175

  
175
void helper_addlv (void)
176
uint64_t helper_addlv (uint64_t op1, uint64_t op2)
176 177
{
177
    T2 = T0;
178
    T0 = (uint32_t)(T0 + T1);
179
    if (unlikely((T2 ^ T1 ^ (-1UL)) & (T2 ^ T0) & (1UL << 31))) {
178
    uint64_t tmp = op1;
179
    op1 = (uint32_t)(op1 + op2);
180
    if (unlikely((tmp ^ op2 ^ (-1UL)) & (tmp ^ op1) & (1UL << 31))) {
180 181
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
181 182
    }
183
    return op1;
182 184
}
183 185

  
184
void helper_subqv (void)
186
uint64_t helper_subqv (uint64_t op1, uint64_t op2)
185 187
{
186
    T2 = T0;
187
    T0 -= T1;
188
    if (unlikely(((~T2) ^ T0 ^ (-1ULL)) & ((~T2) ^ T1) & (1ULL << 63))) {
188
    uint64_t tmp = op1;
189
    op1 -= op2;
190
    if (unlikely(((~tmp) ^ op1 ^ (-1ULL)) & ((~tmp) ^ op2) & (1ULL << 63))) {
189 191
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
190 192
    }
193
    return op1;
191 194
}
192 195

  
193
void helper_sublv (void)
196
uint64_t helper_sublv (uint64_t op1, uint64_t op2)
194 197
{
195
    T2 = T0;
196
    T0 = (uint32_t)(T0 - T1);
197
    if (unlikely(((~T2) ^ T0 ^ (-1UL)) & ((~T2) ^ T1) & (1UL << 31))) {
198
    uint64_t tmp = op1;
199
    op1 = (uint32_t)(op1 - op2);
200
    if (unlikely(((~tmp) ^ op1 ^ (-1UL)) & ((~tmp) ^ op2) & (1UL << 31))) {
198 201
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
199 202
    }
203
    return op1;
200 204
}
201 205

  
202
void helper_mullv (void)
206
uint64_t helper_mullv (uint64_t op1, uint64_t op2)
203 207
{
204
    int64_t res = (int64_t)T0 * (int64_t)T1;
208
    int64_t res = (int64_t)op1 * (int64_t)op2;
205 209

  
206 210
    if (unlikely((int32_t)res != res)) {
207 211
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
208 212
    }
209
    T0 = (int64_t)((int32_t)res);
213
    return (int64_t)((int32_t)res);
210 214
}
211 215

  
212
void helper_mulqv ()
216
uint64_t helper_mulqv (uint64_t op1, uint64_t op2)
213 217
{
214 218
    uint64_t tl, th;
215 219

  
216
    muls64(&tl, &th, T0, T1);
220
    muls64(&tl, &th, op1, op2);
217 221
    /* If th != 0 && th != -1, then we had an overflow */
218 222
    if (unlikely((th + 1) > 1)) {
219 223
        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);
220 224
    }
221
    T0 = tl;
225
    return tl;
226
}
227

  
228
uint64_t helper_umulh (uint64_t op1, uint64_t op2)
229
{
230
    uint64_t tl, th;
231

  
232
    mulu64(&tl, &th, op1, op2);
233
    return th;
222 234
}
223 235

  
224 236
uint64_t helper_ctpop (uint64_t arg)
......
340 352
    return byte_zap(val, ~((0xFF << (mask & 7)) >> 8));
341 353
}
342 354

  
343
void helper_cmpbge (void)
355
uint64_t helper_cmpbge (uint64_t op1, uint64_t op2)
344 356
{
345 357
    uint8_t opa, opb, res;
346 358
    int i;
347 359

  
348 360
    res = 0;
349 361
    for (i = 0; i < 7; i++) {
350
        opa = T0 >> (i * 8);
351
        opb = T1 >> (i * 8);
362
        opa = op1 >> (i * 8);
363
        opb = op2 >> (i * 8);
352 364
        if (opa >= opb)
353 365
            res |= 1 << i;
354 366
    }
355
    T0 = res;
367
    return res;
356 368
}
357 369

  
358 370
void helper_cmov_fir (int freg)
b/target-alpha/op_helper.h
21 21
void helper_call_pal (uint32_t palcode);
22 22
void helper_load_fpcr (void);
23 23
void helper_store_fpcr (void);
24
void helper_addqv (void);
25
void helper_addlv (void);
26
void helper_subqv (void);
27
void helper_sublv (void);
28
void helper_mullv (void);
29
void helper_mulqv (void);
30
void helper_cmpbge (void);
31 24
void helper_cmov_fir (int freg);
32 25

  
33 26
double helper_ldff_raw (target_ulong ea);
b/target-alpha/translate.c
51 51
static TCGv cpu_pc;
52 52

  
53 53
/* dyngen register indexes */
54
static TCGv cpu_T[3];
54
static TCGv cpu_T[2];
55 55

  
56 56
/* register names */
57 57
static char cpu_reg_names[10*4+21*5];
......
74 74
                                  offsetof(CPUState, t0), "T0");
75 75
    cpu_T[1] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
76 76
                                  offsetof(CPUState, t1), "T1");
77
    cpu_T[2] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
78
                                  offsetof(CPUState, t2), "T2");
79 77
#else
80 78
    cpu_T[0] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG1, "T0");
81 79
    cpu_T[1] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG2, "T1");
82
    cpu_T[2] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG3, "T2");
83 80
#endif
84 81

  
85 82
    p = cpu_reg_names;
......
367 364
    _gen_op_bcond(ctx);
368 365
}
369 366

  
370
static always_inline void gen_arith3 (DisasContext *ctx,
371
                                      void (*gen_arith_op)(void),
372
                                      int ra, int rb, int rc,
373
                                      int islit, uint8_t lit)
374
{
375
    if (ra != 31)
376
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
377
    else
378
        tcg_gen_movi_i64(cpu_T[0], 0);
379
    if (islit)
380
        tcg_gen_movi_i64(cpu_T[1], lit);
381
    else
382
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
383
    (*gen_arith_op)();
384
    if (rc != 31)
385
        tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
386
}
387

  
388 367
static always_inline void gen_cmov (DisasContext *ctx,
389 368
                                    TCGCond inv_cond,
390 369
                                    int ra, int rb, int rc,
......
525 504
        tcg_gen_movi_i64(cpu_ir[rc], 0);
526 505
}
527 506

  
528
/* Code to call byte manipulation helpers, used by:
529
   INSWH, INSLH, INSQH, INSBL, INSWL, INSLL, INSQL,
530
   MSKWH, MSKLH, MSKQH, MSKBL, MSKWL, MSKLL, MSKQL,
531
   ZAP, ZAPNOT
532

  
533
   WARNING: it assumes that when ra31 is used, the result is 0.
534
*/
535
static always_inline void gen_byte_manipulation(void *helper,
536
                                                int ra, int rb, int rc,
537
                                                int islit, uint8_t lit)
507
/* Code to call arith3 helpers */
508
static always_inline void gen_arith3_helper(void *helper,
509
                                            int ra, int rb, int rc,
510
                                            int islit, uint8_t lit)
538 511
{
539 512
    if (unlikely(rc == 31))
540 513
        return;
......
546 519
            tcg_temp_free(tmp);
547 520
        } else
548 521
            tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
549
    } else
550
        tcg_gen_movi_i64(cpu_ir[rc], 0);
522
    } else {
523
        TCGv tmp1 = tcg_const_i64(0);
524
        if (islit) {
525
            TCGv tmp2 = tcg_const_i64(lit);
526
            tcg_gen_helper_1_2(helper, cpu_ir[rc], tmp1, tmp2);
527
            tcg_temp_free(tmp2);
528
        } else
529
            tcg_gen_helper_1_2(helper, cpu_ir[rc], tmp1, cpu_ir[rb]);
530
        tcg_temp_free(tmp1);
531
    }
551 532
}
552 533

  
553 534
static always_inline void gen_cmp(TCGCond cond,
......
791 772
            break;
792 773
        case 0x0F:
793 774
            /* CMPBGE */
794
            gen_arith3(ctx, &gen_op_cmpbge, ra, rb, rc, islit, lit);
775
            gen_arith3_helper(helper_cmpbge, ra, rb, rc, islit, lit);
795 776
            break;
796 777
        case 0x12:
797 778
            /* S8ADDL */
......
957 938
            break;
958 939
        case 0x40:
959 940
            /* ADDL/V */
960
            gen_arith3(ctx, &gen_op_addlv, ra, rb, rc, islit, lit);
941
            gen_arith3_helper(helper_addlv, ra, rb, rc, islit, lit);
961 942
            break;
962 943
        case 0x49:
963 944
            /* SUBL/V */
964
            gen_arith3(ctx, &gen_op_sublv, ra, rb, rc, islit, lit);
945
            gen_arith3_helper(helper_sublv, ra, rb, rc, islit, lit);
965 946
            break;
966 947
        case 0x4D:
967 948
            /* CMPLT */
......
969 950
            break;
970 951
        case 0x60:
971 952
            /* ADDQ/V */
972
            gen_arith3(ctx, &gen_op_addqv, ra, rb, rc, islit, lit);
953
            gen_arith3_helper(helper_addqv, ra, rb, rc, islit, lit);
973 954
            break;
974 955
        case 0x69:
975 956
            /* SUBQ/V */
976
            gen_arith3(ctx, &gen_op_subqv, ra, rb, rc, islit, lit);
957
            gen_arith3_helper(helper_subqv, ra, rb, rc, islit, lit);
977 958
            break;
978 959
        case 0x6D:
979 960
            /* CMPLE */
......
1138 1119
        switch (fn7) {
1139 1120
        case 0x02:
1140 1121
            /* MSKBL */
1141
            gen_byte_manipulation(helper_mskbl, ra, rb, rc, islit, lit);
1122
            gen_arith3_helper(helper_mskbl, ra, rb, rc, islit, lit);
1142 1123
            break;
1143 1124
        case 0x06:
1144 1125
            /* EXTBL */
......
1146 1127
            break;
1147 1128
        case 0x0B:
1148 1129
            /* INSBL */
1149
            gen_byte_manipulation(helper_insbl, ra, rb, rc, islit, lit);
1130
            gen_arith3_helper(helper_insbl, ra, rb, rc, islit, lit);
1150 1131
            break;
1151 1132
        case 0x12:
1152 1133
            /* MSKWL */
1153
            gen_byte_manipulation(helper_mskwl, ra, rb, rc, islit, lit);
1134
            gen_arith3_helper(helper_mskwl, ra, rb, rc, islit, lit);
1154 1135
            break;
1155 1136
        case 0x16:
1156 1137
            /* EXTWL */
......
1158 1139
            break;
1159 1140
        case 0x1B:
1160 1141
            /* INSWL */
1161
            gen_byte_manipulation(helper_inswl, ra, rb, rc, islit, lit);
1142
            gen_arith3_helper(helper_inswl, ra, rb, rc, islit, lit);
1162 1143
            break;
1163 1144
        case 0x22:
1164 1145
            /* MSKLL */
1165
            gen_byte_manipulation(helper_mskll, ra, rb, rc, islit, lit);
1146
            gen_arith3_helper(helper_mskll, ra, rb, rc, islit, lit);
1166 1147
            break;
1167 1148
        case 0x26:
1168 1149
            /* EXTLL */
......
1170 1151
            break;
1171 1152
        case 0x2B:
1172 1153
            /* INSLL */
1173
            gen_byte_manipulation(helper_insll, ra, rb, rc, islit, lit);
1154
            gen_arith3_helper(helper_insll, ra, rb, rc, islit, lit);
1174 1155
            break;
1175 1156
        case 0x30:
1176 1157
            /* ZAP */
1177
            gen_byte_manipulation(helper_zap, ra, rb, rc, islit, lit);
1158
            gen_arith3_helper(helper_zap, ra, rb, rc, islit, lit);
1178 1159
            break;
1179 1160
        case 0x31:
1180 1161
            /* ZAPNOT */
1181
            gen_byte_manipulation(helper_zapnot, ra, rb, rc, islit, lit);
1162
            gen_arith3_helper(helper_zapnot, ra, rb, rc, islit, lit);
1182 1163
            break;
1183 1164
        case 0x32:
1184 1165
            /* MSKQL */
1185
            gen_byte_manipulation(helper_mskql, ra, rb, rc, islit, lit);
1166
            gen_arith3_helper(helper_mskql, ra, rb, rc, islit, lit);
1186 1167
            break;
1187 1168
        case 0x34:
1188 1169
            /* SRL */
......
1222 1203
            break;
1223 1204
        case 0x3B:
1224 1205
            /* INSQL */
1225
            gen_byte_manipulation(helper_insql, ra, rb, rc, islit, lit);
1206
            gen_arith3_helper(helper_insql, ra, rb, rc, islit, lit);
1226 1207
            break;
1227 1208
        case 0x3C:
1228 1209
            /* SRA */
......
1242 1223
            break;
1243 1224
        case 0x52:
1244 1225
            /* MSKWH */
1245
            gen_byte_manipulation(helper_mskwh, ra, rb, rc, islit, lit);
1226
            gen_arith3_helper(helper_mskwh, ra, rb, rc, islit, lit);
1246 1227
            break;
1247 1228
        case 0x57:
1248 1229
            /* INSWH */
1249
            gen_byte_manipulation(helper_inswh, ra, rb, rc, islit, lit);
1230
            gen_arith3_helper(helper_inswh, ra, rb, rc, islit, lit);
1250 1231
            break;
1251 1232
        case 0x5A:
1252 1233
            /* EXTWH */
......
1254 1235
            break;
1255 1236
        case 0x62:
1256 1237
            /* MSKLH */
1257
            gen_byte_manipulation(helper_msklh, ra, rb, rc, islit, lit);
1238
            gen_arith3_helper(helper_msklh, ra, rb, rc, islit, lit);
1258 1239
            break;
1259 1240
        case 0x67:
1260 1241
            /* INSLH */
1261
            gen_byte_manipulation(helper_inslh, ra, rb, rc, islit, lit);
1242
            gen_arith3_helper(helper_inslh, ra, rb, rc, islit, lit);
1262 1243
            break;
1263 1244
        case 0x6A:
1264 1245
            /* EXTLH */
......
1266 1247
            break;
1267 1248
        case 0x72:
1268 1249
            /* MSKQH */
1269
            gen_byte_manipulation(helper_mskqh, ra, rb, rc, islit, lit);
1250
            gen_arith3_helper(helper_mskqh, ra, rb, rc, islit, lit);
1270 1251
            break;
1271 1252
        case 0x77:
1272 1253
            /* INSQH */
1273
            gen_byte_manipulation(helper_insqh, ra, rb, rc, islit, lit);
1254
            gen_arith3_helper(helper_insqh, ra, rb, rc, islit, lit);
1274 1255
            break;
1275 1256
        case 0x7A:
1276 1257
            /* EXTQH */
......
1309 1290
            break;
1310 1291
        case 0x30:
1311 1292
            /* UMULH */
1312
            gen_arith3(ctx, &gen_op_umulh, ra, rb, rc, islit, lit);
1293
            gen_arith3_helper(helper_umulh, ra, rb, rc, islit, lit);
1313 1294
            break;
1314 1295
        case 0x40:
1315 1296
            /* MULL/V */
1316
            gen_arith3(ctx, &gen_op_mullv, ra, rb, rc, islit, lit);
1297
            gen_arith3_helper(helper_mullv, ra, rb, rc, islit, lit);
1317 1298
            break;
1318 1299
        case 0x60:
1319 1300
            /* MULQ/V */
1320
            gen_arith3(ctx, &gen_op_mulqv, ra, rb, rc, islit, lit);
1301
            gen_arith3_helper(helper_mulqv, ra, rb, rc, islit, lit);
1321 1302
            break;
1322 1303
        default:
1323 1304
            goto invalid_opc;

Also available in: Unified diff