Revision f75b56c1

b/elf.h
243 243
#define R_386_GOTOFF	9
244 244
#define R_386_GOTPC	10
245 245
#define R_386_NUM	11
246
/* Not a dynamic reloc, so not included in R_386_NUM.  Used in TCG.  */
247
#define R_386_PC8	23
246 248

  
247 249
#define R_MIPS_NONE		0
248 250
#define R_MIPS_16		1
b/tcg/i386/tcg-target.c
61 61
    case R_386_PC32:
62 62
        *(uint32_t *)code_ptr = value - (long)code_ptr;
63 63
        break;
64
    case R_386_PC8:
65
        value -= (long)code_ptr;
66
        if (value != (int8_t)value) {
67
            tcg_abort();
68
        }
69
        *(uint8_t *)code_ptr = value;
70
        break;
64 71
    default:
65 72
        tcg_abort();
66 73
    }
......
305 312
        tgen_arithi(s, ARITH_ADD, reg, val, 0);
306 313
}
307 314

  
308
static void tcg_out_jxx(TCGContext *s, int opc, int label_index)
315
/* Use SMALL != 0 to force a short forward branch.  */
316
static void tcg_out_jxx(TCGContext *s, int opc, int label_index, int small)
309 317
{
310 318
    int32_t val, val1;
311 319
    TCGLabel *l = &s->labels[label_index];
......
314 322
        val = l->u.value - (tcg_target_long)s->code_ptr;
315 323
        val1 = val - 2;
316 324
        if ((int8_t)val1 == val1) {
317
            if (opc == -1)
325
            if (opc == -1) {
318 326
                tcg_out8(s, 0xeb);
319
            else
327
            } else {
320 328
                tcg_out8(s, 0x70 + opc);
329
            }
321 330
            tcg_out8(s, val1);
322 331
        } else {
332
            if (small) {
333
                tcg_abort();
334
            }
323 335
            if (opc == -1) {
324 336
                tcg_out8(s, 0xe9);
325 337
                tcg_out32(s, val - 5);
......
329 341
                tcg_out32(s, val - 6);
330 342
            }
331 343
        }
344
    } else if (small) {
345
        if (opc == -1) {
346
            tcg_out8(s, 0xeb);
347
        } else {
348
            tcg_out8(s, 0x70 + opc);
349
        }
350
        tcg_out_reloc(s, s->code_ptr, R_386_PC8, label_index, -1);
351
        s->code_ptr += 1;
332 352
    } else {
333 353
        if (opc == -1) {
334 354
            tcg_out8(s, 0xe9);
......
343 363

  
344 364
static void tcg_out_brcond(TCGContext *s, int cond, 
345 365
                           TCGArg arg1, TCGArg arg2, int const_arg2,
346
                           int label_index)
366
                           int label_index, int small)
347 367
{
348 368
    if (const_arg2) {
349 369
        if (arg2 == 0) {
......
355 375
    } else {
356 376
        tcg_out_modrm(s, 0x01 | (ARITH_CMP << 3), arg2, arg1);
357 377
    }
358
    tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index);
378
    tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index, small);
359 379
}
360 380

  
361 381
/* XXX: we implement it at the target level to avoid having to
362 382
   handle cross basic blocks temporaries */
363
static void tcg_out_brcond2(TCGContext *s,
364
                            const TCGArg *args, const int *const_args)
383
static void tcg_out_brcond2(TCGContext *s, const TCGArg *args,
384
                            const int *const_args, int small)
365 385
{
366 386
    int label_next;
367 387
    label_next = gen_new_label();
368 388
    switch(args[4]) {
369 389
    case TCG_COND_EQ:
370
        tcg_out_brcond(s, TCG_COND_NE, args[0], args[2], const_args[2], label_next);
371
        tcg_out_brcond(s, TCG_COND_EQ, args[1], args[3], const_args[3], args[5]);
390
        tcg_out_brcond(s, TCG_COND_NE, args[0], args[2], const_args[2],
391
                       label_next, 1);
392
        tcg_out_brcond(s, TCG_COND_EQ, args[1], args[3], const_args[3],
393
                       args[5], small);
372 394
        break;
373 395
    case TCG_COND_NE:
374
        tcg_out_brcond(s, TCG_COND_NE, args[0], args[2], const_args[2], args[5]);
375
        tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3], args[5]);
396
        tcg_out_brcond(s, TCG_COND_NE, args[0], args[2], const_args[2],
397
                       args[5], small);
398
        tcg_out_brcond(s, TCG_COND_NE, args[1], args[3], const_args[3],
399
                       args[5], small);
376 400
        break;
377 401
    case TCG_COND_LT:
378
        tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_args[3], args[5]);
379
        tcg_out_jxx(s, JCC_JNE, label_next);
380
        tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_args[2], args[5]);
402
        tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_args[3],
403
                       args[5], small);
404
        tcg_out_jxx(s, JCC_JNE, label_next, 1);
405
        tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_args[2],
406
                       args[5], small);
381 407
        break;
382 408
    case TCG_COND_LE:
383
        tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_args[3], args[5]);
384
        tcg_out_jxx(s, JCC_JNE, label_next);
385
        tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_args[2], args[5]);
409
        tcg_out_brcond(s, TCG_COND_LT, args[1], args[3], const_args[3],
410
                       args[5], small);
411
        tcg_out_jxx(s, JCC_JNE, label_next, 1);
412
        tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_args[2],
413
                       args[5], small);
386 414
        break;
387 415
    case TCG_COND_GT:
388
        tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_args[3], args[5]);
389
        tcg_out_jxx(s, JCC_JNE, label_next);
390
        tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_args[2], args[5]);
416
        tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_args[3],
417
                       args[5], small);
418
        tcg_out_jxx(s, JCC_JNE, label_next, 1);
419
        tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_args[2],
420
                       args[5], small);
391 421
        break;
392 422
    case TCG_COND_GE:
393
        tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_args[3], args[5]);
394
        tcg_out_jxx(s, JCC_JNE, label_next);
395
        tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_args[2], args[5]);
423
        tcg_out_brcond(s, TCG_COND_GT, args[1], args[3], const_args[3],
424
                       args[5], small);
425
        tcg_out_jxx(s, JCC_JNE, label_next, 1);
426
        tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_args[2],
427
                       args[5], small);
396 428
        break;
397 429
    case TCG_COND_LTU:
398
        tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_args[3], args[5]);
399
        tcg_out_jxx(s, JCC_JNE, label_next);
400
        tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_args[2], args[5]);
430
        tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_args[3],
431
                       args[5], small);
432
        tcg_out_jxx(s, JCC_JNE, label_next, 1);
433
        tcg_out_brcond(s, TCG_COND_LTU, args[0], args[2], const_args[2],
434
                       args[5], small);
401 435
        break;
402 436
    case TCG_COND_LEU:
403
        tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_args[3], args[5]);
404
        tcg_out_jxx(s, JCC_JNE, label_next);
405
        tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_args[2], args[5]);
437
        tcg_out_brcond(s, TCG_COND_LTU, args[1], args[3], const_args[3],
438
                       args[5], small);
439
        tcg_out_jxx(s, JCC_JNE, label_next, 1);
440
        tcg_out_brcond(s, TCG_COND_LEU, args[0], args[2], const_args[2],
441
                       args[5], small);
406 442
        break;
407 443
    case TCG_COND_GTU:
408
        tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_args[3], args[5]);
409
        tcg_out_jxx(s, JCC_JNE, label_next);
410
        tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_args[2], args[5]);
444
        tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_args[3],
445
                       args[5], small);
446
        tcg_out_jxx(s, JCC_JNE, label_next, 1);
447
        tcg_out_brcond(s, TCG_COND_GTU, args[0], args[2], const_args[2],
448
                       args[5], small);
411 449
        break;
412 450
    case TCG_COND_GEU:
413
        tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_args[3], args[5]);
414
        tcg_out_jxx(s, JCC_JNE, label_next);
415
        tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_args[2], args[5]);
451
        tcg_out_brcond(s, TCG_COND_GTU, args[1], args[3], const_args[3],
452
                       args[5], small);
453
        tcg_out_jxx(s, JCC_JNE, label_next, 1);
454
        tcg_out_brcond(s, TCG_COND_GEU, args[0], args[2], const_args[2],
455
                       args[5], small);
416 456
        break;
417 457
    default:
418 458
        tcg_abort();
......
913 953
        }
914 954
        break;
915 955
    case INDEX_op_br:
916
        tcg_out_jxx(s, JCC_JMP, args[0]);
956
        tcg_out_jxx(s, JCC_JMP, args[0], 0);
917 957
        break;
918 958
    case INDEX_op_movi_i32:
919 959
        tcg_out_movi(s, TCG_TYPE_I32, args[0], args[1]);
......
1044 1084
            tcg_out_modrm(s, 0x01 | (ARITH_SBB << 3), args[5], args[1]);
1045 1085
        break;
1046 1086
    case INDEX_op_brcond_i32:
1047
        tcg_out_brcond(s, args[2], args[0], args[1], const_args[1], args[3]);
1087
        tcg_out_brcond(s, args[2], args[0], args[1], const_args[1],
1088
                       args[3], 0);
1048 1089
        break;
1049 1090
    case INDEX_op_brcond2_i32:
1050
        tcg_out_brcond2(s, args, const_args);
1091
        tcg_out_brcond2(s, args, const_args, 0);
1051 1092
        break;
1052 1093

  
1053 1094
    case INDEX_op_bswap16_i32:

Also available in: Unified diff