muldiv.h 3.2 KB
Newer Older
1
static inline make_EHelper(mul) {
2
  rtl_mul_lo(s, ddest, dsrc1, dsrc2);
3 4 5 6
  print_asm_template3(mul);
}

static inline make_EHelper(mulh) {
7
  rtl_imul_hi(s, ddest, dsrc1, dsrc2);
8 9 10 11
  print_asm_template3(mulh);
}

static inline make_EHelper(mulhu) {
12
  rtl_mul_hi(s, ddest, dsrc1, dsrc2);
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
  print_asm_template3(mulhu);
}

static inline make_EHelper(mulhsu) {
  // Algorithm:
  // We want to obtain ans = mulhsu(a, b).
  // Consider mulhu(a, b).
  // If a >= 0, then ans = mulhu(a, b);
  // If a = -x < 0, then a = 2^64 - x in two's complement
  // Then
  //   mulhu(a, b) = mulhu(2^64 -x , b) = ((2^64 - x)b) >> 64
  //               = ((2^64b) >> 64) + ((-xb) >> 64)
  //               = b + mulhsu(a, b) = b + ans
  // Therefore, ans = mulhu(a, b) - b
  //
  // In the end, ans = (a < 0 ? mulhu(a, b) - b : mulhu(a, b))
  //                 = mulhu(a, b) - (a < 0 ? b : 0)

  rtl_sari(s, s0, dsrc1, 63);
  rtl_and(s, s0, dsrc2, s0); // s0 = (id_src1->val < 0 ? id_src2->val : 0)
  rtl_mul_hi(s, s1, dsrc1, dsrc2);
34
  rtl_sub(s, ddest, s1, s0);
35 36 37 38 39

  print_asm_template3(mulhsu);
}

static inline make_EHelper(div) {
40 41 42 43 44
  //if (*dsrc2 == 0) {
  //  rtl_li(s, ddest, ~0lu);
  //} else if (*dsrc1 == 0x8000000000000000LL && *dsrc2 == -1) {
  //  rtl_mv(s, ddest, dsrc1);
  //} else {
45
    rtl_idiv_q(s, ddest, dsrc1, dsrc2);
46
  //}
47 48 49 50 51

  print_asm_template3(div);
}

static inline make_EHelper(divu) {
52 53 54
  //if (*dsrc2 == 0) {
  //  rtl_li(s, ddest, ~0lu);
  //} else {
55
    rtl_div_q(s, ddest, dsrc1, dsrc2);
56
  //}
57 58 59 60 61

  print_asm_template3(divu);
}

static inline make_EHelper(rem) {
62 63 64 65 66
  //if (*dsrc2 == 0) {
  //  rtl_mv(s, ddest, dsrc1);
  //} else if (*dsrc1 == 0x8000000000000000LL && *dsrc2 == -1) {
  //  rtl_mv(s, ddest, rz);
  //} else {
67
    rtl_idiv_r(s, ddest, dsrc1, dsrc2);
68
  //}
69 70 71 72 73

  print_asm_template3(rem);
}

static inline make_EHelper(remu) {
74 75 76
  //if (*dsrc2 == 0) {
  //  rtl_mv(s, ddest, dsrc1);
  //} else {
77
    rtl_div_r(s, ddest, dsrc1, dsrc2);
78
  //}
79 80 81 82 83 84

  print_asm_template3(remu);
}

static inline make_EHelper(mulw) {
  rtl_mul_lo(s, s0, dsrc1, dsrc2);
85
  rtl_sext(s, ddest, s0, 4);
86 87 88 89 90 91
  print_asm_template3(mulw);
}

static inline make_EHelper(divw) {
  rtl_sext(s, s0, dsrc1, 4);
  rtl_sext(s, s1, dsrc2, 4);
92 93 94 95 96
  //if (*s1 == 0) {
  //  rtl_li(s, s0, ~0lu);
  //} else if (*s0 == 0x80000000 && *s1 == -1) {
  //  //rtl_mv(s, s0, s0);
  //} else {
97
    rtl_idiv_q(s, s0, s0, s1);
98
  //}
99
  rtl_sext(s, ddest, s0, 4);
100 101 102 103 104 105 106

  print_asm_template3(divw);
}

static inline make_EHelper(remw) {
  rtl_sext(s, s0, dsrc1, 4);
  rtl_sext(s, s1, dsrc2, 4);
107 108 109 110 111
  //if (*s1 == 0) {
  //  //rtl_mv(s, s0, s0);
  //} else if (*s0 == 0x80000000 && *s1 == -1) {
  //  rtl_mv(s, s0, rz);
  //} else {
112
    rtl_idiv_r(s, s0, s0, s1);
113
  //}
114
  rtl_sext(s, ddest, s0, 4);
115 116 117 118 119

  print_asm_template3(remw);
}

static inline make_EHelper(divuw) {
120 121
  rtl_zext(s, s0, dsrc1, 4);
  rtl_zext(s, s1, dsrc2, 4);
122 123 124
  //if (*s1 == 0) {
  //  rtl_li(s, s0, ~0lu);
  //} else {
125
    rtl_div_q(s, s0, s0, s1);
126
  //}
127
  rtl_sext(s, ddest, s0, 4);
128 129 130 131 132

  print_asm_template3(divuw);
}

static inline make_EHelper(remuw) {
133 134
  rtl_zext(s, s0, dsrc1, 4);
  rtl_zext(s, s1, dsrc2, 4);
135 136 137
  //if (*s1 == 0) {
  //  //rtl_mv(s, s0, s0);
  //} else {
138
    rtl_div_r(s, s0, s0, s1);
139
  //}
140
  rtl_sext(s, ddest, s0, 4);
141 142 143

  print_asm_template3(remuw);
}