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:
|