def _1reg_simm6_inst(self, op1, reg, imm): """ レジスタオペランド1個とリテラル(simm6)1個持つ形式の命令 (op1 = 0b101, 0b110, 0b111) """ pd, rd = self.is_reg(reg) pv, val = self.is_immediate(imm) if not pd: raise OperandError(reg, "destination register error") if (not pv) or (val > 0b111111): raise OperandError(imm, "immediate operand error") word = ((op1 << 9) | (rd << 6) | (val << 0)) self.append(word)
def _load_inst(self, op1, op2, dest, src): """ ロード命令 (lda/ldp, %rd, [%rs]) %rd <- mem[%rs] """ rd, rs = 0, 0 # レジスタ番号 pd, ps = False, False # オペランドがレジスタかどうか pd, rd = self.is_reg(dest) ps, rs = self.is_ind_addr(src) if not pd: raise OperandError(dest, "destination register error") if not ps: raise OperandError(src, "source register error") word = ((op1 << 9) | (rd << 6) | (op2 << 3) | (rs << 0)) self.append(word)
def _2reg_inst(self, op1, op2, dest, src): """ レジスタオペランドを2個持つ形式の命令 (op1 = 0b000, 0b001, 0b010) """ rd, rs = 0, 0 # レジスタ番号 pd, ps = False, False # オペランドがレジスタかどうか pd, rd = self.is_reg(dest) ps, rs = self.is_reg(src) if not pd: raise OperandError(dest, "destination register error") if not ps: raise OperandError(src, "source register error") word = ((op1 << 9) | (rd << 6) | (op2 << 3) | (rs << 0)) self.append(word)
def _store_inst(self, op1, op2, dest, src): """ ストア命令 (sta/stp, [%rd], %rs) mem[%rd] <- %rs """ rd, rs = 0, 0 # レジスタ番号 pd, ps = False, False # オペランドがレジスタかどうか pd, rd = self.is_ind_addr(dest) ps, rs = self.is_reg(src) if not pd: raise OperandError(dest, "destination register error") if not ps: raise OperandError(src, "source register error") word = ((op1 << 9) | (rd << 6) | (op2 << 3) | (rs << 0)) self.append(word)
def _branch(self, op1, cond, disp): """ 条件分岐命令。分岐条件と相対分岐アドレス """ pv, val = self.is_immediate(disp) if (not pv) or (val > 0b111111): raise OperandError(disp, "branch target address too far") word = ((op1 << 9) | (cond << 6) | (val << 0)) self.append(word)
def _ret_inst(self, op1, op2, reg): """ レジスタオペランド1個のみを持つ形式の命令 (op1 = 0b011, op2 = 0b1xxxxx) """ pd, rd = self.is_reg(reg) if not pd: raise OperandError(reg, "destination register error") word = ((op1 << 9) | (rd << 6) | (op2 << 0)) self.append(word)