1418 op1 = op1_insn->op1;
1435 opt =
IR_OPT(IR_NOT, IR_BOOL);
1446 opt =
IR_OPT(IR_NOT, IR_BOOL);
1467 if (ctx->use_lists && ctx->use_lists[op1_insn->op1].count != 1) {
1469 }
else if (op2_insn->val.u64 == 0 && ctx->ir_base[op1_insn->op1].type == IR_BOOL) {
1470 opt =
IR_OPT(IR_NOT, IR_BOOL);
1471 op1 = op1_insn->op1;
1479 case 1:
val.i64 = op2_insn->val.i8;
break;
1480 case 2:
val.i64 = op2_insn->val.i16;
break;
1481 case 4:
val.i64 = op2_insn->val.i32;
break;
1482 default:
val.u64 = op2_insn->val.u64;
break;
1486 case 1:
val.u64 = op2_insn->val.u8;
break;
1487 case 2:
val.u64 = op2_insn->val.u16;
break;
1488 case 4:
val.u64 = op2_insn->val.u32;
break;
1489 default:
val.u64 = op2_insn->val.u64;
break;
1492 op1 = op1_insn->op1;
1514 if (ctx->use_lists && ctx->use_lists[op1_insn->op1].count != 1) {
1516 }
else if (op2_insn->val.u64 == 0 && ctx->ir_base[op1_insn->op1].type == IR_BOOL) {
1523 case 1:
val.i64 = op2_insn->val.i8;
break;
1524 case 2:
val.i64 = op2_insn->val.i16;
break;
1525 case 4:
val.i64 = op2_insn->val.i32;
break;
1526 default:
val.u64 = op2_insn->val.u64;
break;
1530 case 1:
val.u64 = op2_insn->val.u8;
break;
1531 case 2:
val.u64 = op2_insn->val.u16;
break;
1532 case 4:
val.u64 = op2_insn->val.u32;
break;
1533 default:
val.u64 = op2_insn->val.u64;
break;
1536 op1 = op1_insn->op1;
1555 opt = op1_insn->opt ^ 1;
1556 op1 = op1_insn->op1;
1557 op2 = op1_insn->op2;
1583 if (ctx->use_lists && ctx->use_lists[
op1].count == 1 && op2_insn->val.u64 == 0) {
1584 op1 = op1_insn->op1;
1585 op2 = op1_insn->op2;
1628 if (op2_insn->val.u64 == 0) {
1646 if (op1_insn->val.u64 == 0) {
1658 if (op1_insn->val.u64 == 0) {
1678 if (op2_insn->val.u64 == 0) {
1694 if (op2_insn->val.u64 == 0) {
1695 opt =
IR_OPT(IR_NE, IR_BOOL);
1711 if (op2_insn->val.u64 == 0) {
1727 if (op2_insn->val.u64 == 0) {
1728 opt =
IR_OPT(IR_EQ, IR_BOOL);
1739 op2 = op1_insn->op1;
1748 op2 = op2_insn->op1;
1755 if (op1_insn->op2 ==
op2) {
1766 if (op2_insn->op2 ==
op1) {
1777 if (op1_insn->op1 ==
op2) {
1780 }
else if (op1_insn->op2 ==
op2) {
1791 if (op2_insn->op1 ==
op1) {
1794 op1 = op2_insn->op2;
1797 }
else if (op2_insn->op2 ==
op1) {
1800 op1 = op2_insn->op1;
1811 if (op1_insn->op1 ==
op2) {
1814 op1 = op1_insn->op2;
1825 if (op2_insn->op1 ==
op1) {
1836 if (op1_insn->op1 == op2_insn->op1) {
1838 op1 = op1_insn->op2;
1839 op2 = op2_insn->op2;
1841 }
else if (op1_insn->op1 == op2_insn->op2) {
1843 op1 = op1_insn->op2;
1844 op2 = op2_insn->op1;
1846 }
else if (op1_insn->op2 == op2_insn->op1) {
1848 op1 = op1_insn->op1;
1849 op2 = op2_insn->op2;
1851 }
else if (op1_insn->op2 == op2_insn->op2) {
1853 op1 = op1_insn->op1;
1854 op2 = op2_insn->op1;
1872 op1 = op1_insn->op1;
1873 val.i64 = -op2_insn->val.i64;
1881 op1 = op1_insn->op1;
1882 val.f = -op2_insn->val.f;
1890 op1 = op1_insn->op1;
1891 val.d = -op2_insn->val.d;
1902 if (op2_insn->val.u64 == 0) {
1905 }
else if (op2_insn->val.u64 == 1) {
1916 if (op2_insn->val.i64 == 0) {
1919 }
else if (op2_insn->val.i64 == 1) {
1922 }
else if (op2_insn->val.i64 == -1) {
1933 if (op2_insn->val.d == 1.0) {
1936 }
else if (op2_insn->val.d == 2.0) {
1941 }
else if (op2_insn->val.d == -1.0) {
1952 if (op2_insn->val.f == 1.0) {
1955 }
else if (op2_insn->val.f == 2.0) {
1960 }
else if (op2_insn->val.f == -1.0) {
1974 if (op2_insn->val.u64 == 1) {
1985 if (op2_insn->val.i64 == 1) {
1988 }
else if (op2_insn->val.i64 == -1) {
2006 if (op2_insn->val.i64 == 1) {
2015 if (op2_insn->val.d == 1.0) {
2018 }
else if (op2_insn->val.d == -1.0) {
2029 if (op2_insn->val.f == 1.0) {
2032 }
else if (op2_insn->val.f == -1.0) {
2044 op1 = op1_insn->op1;
2045 op2 = op2_insn->op1;
2058 if (op2_insn->val.i8 == 0) {
2061 }
else if (op2_insn->val.i8 == -1) {
2070 if (op2_insn->val.i16 == 0) {
2073 }
else if (op2_insn->val.i16 == -1) {
2082 if (op2_insn->val.i32 == 0) {
2085 }
else if (op2_insn->val.i32 == -1) {
2094 if (op2_insn->val.i64 == 0) {
2097 }
else if (op2_insn->val.i64 == -1) {
2112 if (op2_insn->val.i8 == -1) {
2115 }
else if (op2_insn->val.i8 == 0) {
2124 if (op2_insn->val.i16 == -1) {
2127 }
else if (op2_insn->val.i16 == 0) {
2136 if (op2_insn->val.i32 == -1) {
2139 }
else if (op2_insn->val.i32 == -0) {
2148 if (op2_insn->val.i64 == -1) {
2151 }
else if (op2_insn->val.i64 == 0) {
2159 if (!op2_insn->val.b) {
2174 if (op2_insn->val.i8 == 0) {
2177 }
else if (op2_insn->val.i8 == -1) {
2189 if (op2_insn->val.i16 == 0) {
2192 }
else if (op2_insn->val.i16 == -1) {
2204 if (op2_insn->val.i32 == 0) {
2207 }
else if (op2_insn->val.i32 == -1) {
2219 if (op2_insn->val.i64 == 0) {
2222 }
else if (op2_insn->val.i64 == -1) {
2240 if (op2_insn->val.u64 == 0) {
2243 }
else if (op2_insn->val.u64 == 1) {
2285 if (op2_insn->val.u64 == 0) {
2309 if (op1_insn->val.u64 == 0) {
2323 if (op1_insn->val.i8 == 0 || op1_insn->val.i8 == -1) {
2336 if (op1_insn->val.i16 == 0 || op1_insn->val.i16 == -1) {
2349 if (op1_insn->val.i32 == 0 || op1_insn->val.i32 == -1) {
2362 if (op1_insn->val.i64 == 0 || op1_insn->val.i64 == -1) {
2375 if (op2_insn->val.u64 == 0) {
2389 if (op2_insn->val.u64 == 0) {
2402 IR_ASSERT(ctx->ir_base[op1_insn->op1].type == IR_FLOAT);
2411 ir_type src_type = ctx->ir_base[op1_insn->op1].type;
2418 if (src_type == dst_type) {
2428 ir_type src_type = ctx->ir_base[op1_insn->op1].type;
2431 if (src_type == dst_type) {
2434 opt =
IR_OPT(IR_BITCAST, dst_type);
2435 op1 = op1_insn->op1;
2438 opt =
IR_OPT(IR_TRUNC, dst_type);
2439 op1 = op1_insn->op1;
2442 opt =
IR_OPT(op1_insn->op, dst_type);
2443 op1 = op1_insn->op1;
2454 op1 = op1_insn->op1;
2463 ir_type src_type = ctx->ir_base[op1_insn->op1].type;
2465 if (src_type == dst_type) {
2468 op1 = op1_insn->op1;
2478 op1 = op1_insn->op1;
2484 op1 = op1_insn->op1;
2493 && !(ctx->ir_base[op1_insn->op2].val.u64
2494 & (1ULL << ((
ir_type_size[op1_insn->type] * 8) - 1)))) {
2506 && ctx->ir_base[op1_insn->op2].val.u64 != 0) {
2517 uint64_t mask = ctx->ir_base[op1_insn->op2].val.u64;
2521 op1 = op1_insn->op1;
2524 }
else if (
size == 2) {
2525 if (mask == 0xffff) {
2526 op1 = op1_insn->op1;
2529 }
else if (
size == 4) {
2530 if (mask == 0xffffffff) {
2531 op1 = op1_insn->op1;
2549 if ((src_size == 1 && op2_insn->val.u64 == 0xff)
2550 || (src_size == 2 && op2_insn->val.u64 == 0xffff)
2551 || (src_size == 4 && op2_insn->val.u64 == 0xffffffff)) {
2567 if ((src_size == 1 && op2_insn->val.u64 == 0xff)
2568 || (src_size == 2 && op2_insn->val.u64 == 0xffff)
2569 || (src_size == 4 && op2_insn->val.u64 == 0xffffffff)) {
2571 op1 = op1_insn->op1;
2581 if (((uint8_t)-1) >> ctx->ir_base[op1_insn->op2].val.u8 == op2_insn->val.u8) {
2592 if (((uint16_t)-1) >> ctx->ir_base[op1_insn->op2].val.u16 == op2_insn->val.u16) {
2603 if (((uint32_t)-1) >> ctx->ir_base[op1_insn->op2].val.u32 == op2_insn->val.u32) {
2614 if (((uint64_t)-1) >> ctx->ir_base[op1_insn->op2].val.u64 == op2_insn->val.u64) {
2633 IR_ASSERT(ctx->ir_base[op1_insn->op1].type == IR_FLOAT);
2634 if (op2_insn->val.d == (
double)(
float)op2_insn->val.d) {
2635 op1 = op1_insn->op1;
2651 val.u64 = ctx->ir_base[op1_insn->op2].val.u64 + op2_insn->val.u64;
2652 op1 = op1_insn->op1;
2666 val.i64 = ctx->ir_base[op1_insn->op2].val.u64 + op2_insn->val.u64;
2667 op1 = op1_insn->op1;
2682 val.u64 = op2_insn->val.u64 - ctx->ir_base[op1_insn->op2].val.u64;
2683 op1 = op1_insn->op1;
2688 val.u64 = ctx->ir_base[op1_insn->op1].val.u64 + op2_insn->val.u64;
2690 op2 = op1_insn->op2;
2704 val.i64 = op2_insn->val.u64 - ctx->ir_base[op1_insn->op2].val.u64;
2705 if (
val.i64 < 0 &&
val.i64 != INT64_MIN) {
2709 op1 = op1_insn->op1;
2714 val.i64 = ctx->ir_base[op1_insn->op1].val.u64 + op2_insn->val.u64;
2716 op2 = op1_insn->op2;
2731 val.u64 = ctx->ir_base[op1_insn->op2].val.u64 - op2_insn->val.u64;
2733 op1 = op1_insn->op1;
2747 val.i64 = ctx->ir_base[op1_insn->op2].val.u64 - op2_insn->val.u64;
2748 if (
val.i64 < 0 &&
val.i64 != INT64_MIN) {
2753 op1 = op1_insn->op1;
2768 val.u64 = op1_insn->val.u64 - ctx->ir_base[op2_insn->op2].val.u64;
2769 op2 = op2_insn->op1;
2783 val.i64 = op1_insn->val.u64 - ctx->ir_base[op2_insn->op2].val.u64;
2784 op2 = op2_insn->op1;
2799 val.u64 = ctx->ir_base[op1_insn->op2].val.u64 + op2_insn->val.u64;
2800 if (
val.i64 < 0 &&
val.i64 != INT64_MIN) {
2804 op1 = op1_insn->op1;
2809 val.u64 = ctx->ir_base[op1_insn->op1].val.u64 - op2_insn->val.u64;
2810 op2 = op1_insn->op2;
2824 val.i64 = ctx->ir_base[op1_insn->op2].val.u64 + op2_insn->val.u64;
2825 if (
val.i64 < 0 &&
val.i64 != INT64_MIN) {
2829 op1 = op1_insn->op1;
2834 val.i64 = ctx->ir_base[op1_insn->op1].val.u64 - op2_insn->val.u64;
2835 op2 = op1_insn->op2;
2850 val.u64 = op1_insn->val.u64 + ctx->ir_base[op2_insn->op2].val.u64;
2851 op2 = op2_insn->op1;
2856 val.u64 = op1_insn->val.u64 - ctx->ir_base[op2_insn->op1].val.u64;
2857 if (
val.i64 < 0 &&
val.i64 != INT64_MIN) {
2861 op1 = op2_insn->op2;
2875 val.i64 = op1_insn->val.u64 + ctx->ir_base[op2_insn->op2].val.u64;
2876 op2 = op2_insn->op1;
2881 val.i64 = op1_insn->val.u64 - ctx->ir_base[op2_insn->op1].val.u64;
2882 if (
val.i64 < 0 &&
val.i64 != INT64_MIN) {
2886 op1 = op2_insn->op2;
2901 val.u64 = ctx->ir_base[op1_insn->op2].val.u64 * op2_insn->val.u64;
2902 op1 = op1_insn->op1;
2916 val.i64 = ctx->ir_base[op1_insn->op2].val.u64 * op2_insn->val.u64;
2917 op1 = op1_insn->op1;
2936 val.u64 = ctx->ir_base[op1_insn->op2].val.u64 & op2_insn->val.u64;
2937 op1 = op1_insn->op1;
2956 val.u64 = ctx->ir_base[op1_insn->op2].val.u64 | op2_insn->val.u64;
2957 op1 = op1_insn->op1;
2976 val.u64 = ctx->ir_base[op1_insn->op2].val.u64 ^ op2_insn->val.u64;
2977 op1 = op1_insn->op1;
2989 if (op1_insn->op1 ==
op2 || op1_insn->op2 ==
op2) {
2997 if (op1_insn->op1 ==
op2) {
2999 }
else if (op1_insn->op2 ==
op2) {
3011 if (op1_insn->op1 == op2_insn->op1) {
3013 if (ctx->ir_base[op1_insn->op2].val.u64 + ctx->ir_base[op2_insn->op2].val.u64 ==
3016 op1 = op1_insn->op1;
3017 op2 = op1_insn->op2;
3018 opt = op1_insn->opt + 3;
3021 }
else if (ctx->ir_base[op2_insn->op2].op == IR_SUB
3023 && ctx->ir_base[op2_insn->op2].op2 == op1_insn->op2
3026 op1 = op1_insn->op1;
3027 op2 = op1_insn->op2;
3028 opt = op1_insn->opt + 3;
3030 }
else if (ctx->ir_base[op1_insn->op2].op == IR_SUB
3032 && ctx->ir_base[op1_insn->op2].op2 == op2_insn->op2
3035 op1 = op2_insn->op1;
3036 op2 = op2_insn->op2;
3037 opt = op2_insn->opt + 3;