MinimaArch 指令集 MA32I 指令列表

0 阅读4分钟

已使用的操作码:

opcodeopcode.hexopfmtdesc
b0000010h02op32iI32位立即数操作
b0010010h12op32R32位操作
b1000010h42loadI加载指令
b1000110h46loaduI无符号加载指令
b1010010h52storeS存储指令
b1100010h62luiU加载高位立即数
b1100110h66auipcU加载PC相对高位立即数
b1110010h72jalJ跳转并链接
b1110110h76jalr&branchJALR&B跳转并链接寄存器&分支指令

MA32I 的指令:

opcode = b0000010

fmt = I

funct3imm[11]instdescexec
b000b0addi.w立即数加法x[rd] = x[rs1] + sext(imm);
b001b0slli.w立即数左移x[rd] = x[rs1] << zext(imm[4:0]);
b010b0slti.w立即数小于x[rd] = x[rs1] < sext(imm) ? 1 : 0;
b011b0sltui.w立即数无符号小于x[rd] = x[rs1] <_u sext(imm) ? 1 : 0;
b100b0xori.w立即数异或x[rd] = x[rs1] ^ sext(imm);
b101b0srli.w立即数右移x[rd] = x[rs1] >> zext(imm[4:0]);
b101b1srai.w立即数算数右移x[rd] = x[rs1] >>> zext(imm[4:0]);
b110b0ori.w立即数或x[rd] = x[rs1] | sext(imm);
b111b0andi.w立即数与x[rd] = x[rs1] & sext(imm);

opcode = b0010010

fmt = R

funct7funct3instdescexec
b0000000b000add.w加法x[rd] = x[rs1] + x[rs2];
b0000000b001sll.w左移x[rd] = x[rs1] << x[rs2][4:0];
b0000000b010slt.w小于x[rd] = x[rs1] < x[rs2] ? 1 : 0;
b0000000b011sltu.w无符号小于x[rd] = x[rs1] <_u x[rs2] ? 1 : 0;
b0000000b100xor.w异或x[rd] = x[rs1] ^ x[rs2];
b0000000b101srl.w右移x[rd] = x[rs1] >> x[rs2][4:0];
b0000000b110or.wx[rd] = x[rs1] | x[rs2];
b0000000b111and.wx[rd] = x[rs1] & x[rs2];
b1000000b000sub.w减法x[rd] = x[rs1] - x[rs2];
b1000000b101sra.w算数右移x[rd] = x[rs1] >>> x[rs2][4:0];
opcodefunct3instfmtdescexec
b1000010b000lbI加载字节x[rd] = sext(mem[x[rs1] + sext(imm)][7:0]);
b1000010b001lhI加载半字x[rd] = sext(mem[x[rs1] + sext(imm)][15:0]);
b1000010b010lwI加载字x[rd] = sext(mem[x[rs1] + sext(imm)][31:0]);
b1000110b000lbuI无符号加载字节x[rd] = zext(mem[x[rs1] + sext(imm)][7:0]);
b1000110b001lhuI无符号加载半字x[rd] = zext(mem[x[rs1] + sext(imm)][15:0]);
b1010010b000sbS存储字节mem[x[rs1] + sext(imm)][7:0] = x[rs2];
b1010010b001shS存储半字mem[x[rs1] + sext(imm)][15:0] = x[rs2];
b1010010b010swS存储字mem[x[rs1] + sext(imm)][31:0] = x[rs2];
opcodeinstfmtdescexec
b1100010luiU加载高位立即数x[rd] = sext(imm);
b1100110auipcU加载PC相对高位立即数x[rd] = pc + sext(imm);
b1110010jalJ跳转并链接pc = pc + sext(imm);

opcode = b1110110

funct3instfmtdescexec
b000jalrJALR跳转并链接寄存器pc = x[rs1] + sext(imm);
b010beqB等于时跳转if(x[rs1] == x[rs2]) pc = pc + sext(imm);
b011bneB不等于时跳转if(x[rs1] != x[rs2]) pc = pc + sext(imm);
b100bltB小于时跳转if(x[rs1] < x[rs2]) pc = pc + sext(imm);
b101bgeB大于等于时跳转if(x[rs1] >= x[rs2]) pc = pc + sext(imm);
b110bltuB无符号小于时跳转if(x[rs1] <_u x[rs2]) pc = pc + sext(imm);
b111bgeuB无符号大于等于时跳转if(x[rs1] >=_u x[rs2]) pc = pc + sext(imm);

MA32I 共计 37 条指令,使用了 9 个操作码,预留空间为 93.0%119128\frac{119}{128})。

关于指令格式,请参考本人写的第一篇文章。