compute.h 4.3 KB
Newer Older
1
static inline make_EHelper(add) {
2
  rtl_add(s, ddest, dsrc1, dsrc2);
3 4 5 6
  print_asm_template3(add);
}

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

static inline make_EHelper(sll) {
12
  rtl_shl(s, ddest, dsrc1, dsrc2);
13 14 15 16
  print_asm_template3(sll);
}

static inline make_EHelper(sra) {
17
  rtl_sar(s, ddest, dsrc1, dsrc2);
18
  print_asm_template3(sra);
19 20 21 22 23 24 25 26 27
}

static inline make_EHelper(srl) {
  // the LSB of funct7 may be "1" due to the shift amount can be >= 32
  // this rule is disabled when a compressed inst comes in
  if ((s->isa.instr.r.funct7 & ~0x1) == 32 && s->isa.instr.r.opcode1_0 == 0x3) {
    exec_sra(s);
    return;
  }
28
  rtl_shr(s, ddest, dsrc1, dsrc2);
29 30 31 32
  print_asm_template3(srl);
}

static inline make_EHelper(slt) {
33
  rtl_setrelop(s, RELOP_LT, ddest, dsrc1, dsrc2);
34 35 36 37
  print_asm_template3(slt);
}

static inline make_EHelper(sltu) {
38
  rtl_setrelop(s, RELOP_LTU, ddest, dsrc1, dsrc2);
39 40 41 42
  print_asm_template3(sltu);
}

static inline make_EHelper(xor) {
43
  rtl_xor(s, ddest, dsrc1, dsrc2);
44 45 46 47
  print_asm_template3(xor);
}

static inline make_EHelper(or) {
48
  rtl_or(s, ddest, dsrc1, dsrc2);
49 50 51 52
  print_asm_template3(or);
}

static inline make_EHelper(and) {
53
  rtl_and(s, ddest, dsrc1, dsrc2);
54 55 56
  print_asm_template3(and);
}

57
static inline make_EHelper(addi) {
58
  rtl_addi(s, ddest, dsrc1, id_src2->imm);
59 60 61 62
  print_asm_template3(addi);
}

static inline make_EHelper(slli) {
63
  rtl_shli(s, ddest, dsrc1, id_src2->imm);
64 65 66
  print_asm_template3(slli);
}

67
static inline make_EHelper(srai) {
68
  rtl_sari(s, ddest, dsrc1, id_src2->imm);
69 70 71
  print_asm_template3(srai);
}

72 73 74 75
static inline make_EHelper(srli) {
  // the LSB of funct7 may be "1" due to the shift amount can be >= 32
  // this rule is disabled when a compressed inst comes in
  if ((s->isa.instr.r.funct7 & ~0x1) == 32 && s->isa.instr.r.opcode1_0 == 0x3) {
76
    exec_srai(s);
77
  } else {
78
    rtl_shri(s, ddest, dsrc1, id_src2->imm);
79 80 81 82 83
    print_asm_template3(srli);
  }
}

static inline make_EHelper(slti) {
84
  rtl_setrelopi(s, RELOP_LT, ddest, dsrc1, id_src2->imm);
85 86 87 88
  print_asm_template3(slti);
}

static inline make_EHelper(sltui) {
89
  rtl_setrelopi(s, RELOP_LTU, ddest, dsrc1, id_src2->imm);
90 91 92 93
  print_asm_template3(sltui);
}

static inline make_EHelper(xori) {
94
  rtl_xori(s, ddest, dsrc1, id_src2->imm);
95 96 97 98
  print_asm_template3(xori);
}

static inline make_EHelper(ori) {
99
  rtl_ori(s, ddest, dsrc1, id_src2->imm);
100 101 102 103
  print_asm_template3(ori);
}

static inline make_EHelper(andi) {
104
  rtl_andi(s, ddest, dsrc1, id_src2->imm);
105 106 107
  print_asm_template3(andi);
}

108
static inline make_EHelper(auipc) {
109
  rtl_li(s, ddest, id_src2->imm + cpu.pc);
110
  print_asm("auipc " FMT_WORD ",%s", *s0, id_dest->str);
111 112 113
}

static inline make_EHelper(lui) {
114
  rtl_li(s, ddest, id_src2->imm);
115
  print_asm("lui " FMT_WORD ",%s", *s0, id_dest->str);
116 117 118 119
}

static inline make_EHelper(addw) {
  rtl_add(s, s0, dsrc1, dsrc2);
120
  rtl_sext(s, ddest, s0, 4);
121 122 123 124 125
  print_asm_template3(addw);
}

static inline make_EHelper(subw) {
  rtl_sub(s, s0, dsrc1, dsrc2);
126
  rtl_sext(s, ddest, s0, 4);
127 128 129 130
  print_asm_template3(subw);
}

static inline make_EHelper(sllw) {
131 132 133
  rtl_andi(s, s0, dsrc2, 0x1f);
  rtl_shl(s, s0, dsrc1, s0);
  rtl_sext(s, ddest, s0, 4);
134 135 136 137
  print_asm_template3(sllw);
}

static inline make_EHelper(srlw) {
138
  rtl_andi(s, s0, dsrc2, 0x1f);
139 140 141
  assert((s->isa.instr.r.funct7 & 0x1) == 0);
  if (s->isa.instr.r.funct7 == 32) {
    // sraw
142 143
    rtl_sext(s, s1, dsrc1, 4);
    rtl_sar(s, s0, s1, s0);
144 145 146 147
    print_asm_template3(sraw);
  }
  else {
    // srlw
148
    rtl_zext(s, s1, dsrc1, 4);
149
    rtl_shr(s, s0, s1, s0);
150 151
    print_asm_template3(srlw);
  }
152
  rtl_sext(s, ddest, s0, 4);
153 154 155 156 157
}

static inline make_EHelper(sraw) {
  exec_srlw(s);
}
158 159 160

static inline make_EHelper(addiw) {
  rtl_addi(s, s0, dsrc1, id_src2->imm);
161
  rtl_sext(s, ddest, s0, 4);
162 163 164 165 166
  print_asm_template3(addiw);
}

static inline make_EHelper(slliw) {
  rtl_shli(s, s0, dsrc1, id_src2->imm & 0x1f);
167
  rtl_sext(s, ddest, s0, 4);
168 169 170 171 172 173 174
  print_asm_template3(slliw);
}

static inline make_EHelper(srliw) {
  assert((s->isa.instr.r.funct7 & 0x1) == 0);
  if (s->isa.instr.r.funct7 == 32) {
    // sraw
175 176
    rtl_sext(s, s0, dsrc1, 4);
    rtl_sari(s, s0, s0, id_src2->imm & 0x1f);
177 178 179 180
    print_asm_template3(sraiw);
  }
  else {
    // srlw
181
    rtl_zext(s, s0, dsrc1, 4);
182
    rtl_shri(s, s0, s0, id_src2->imm & 0x1f);
183 184 185
    print_asm_template3(srliw);
  }

186
  rtl_sext(s, ddest, s0, 4);
187
}