use super::super::instructions::{Operand, PtxInstruction, PtxOp, RoundingMode};
use super::super::registers::VirtualReg;
use super::super::types::PtxType;
use super::KernelBuilder;
impl<'a> KernelBuilder<'a> {
pub fn add_u32_inplace(&mut self, dst: VirtualReg, imm: u32) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Add, PtxType::U32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(dst))
.src(Operand::ImmU64(imm as u64)),
);
}
pub fn add_u32_reg_inplace(&mut self, dst: VirtualReg, src: VirtualReg) {
self.registers.extend_live_range(dst);
self.registers.extend_live_range(src);
self.instructions.push(
PtxInstruction::new(PtxOp::Add, PtxType::U32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(dst))
.src(Operand::Reg(src)),
);
}
pub fn add_f32_inplace(&mut self, dst: VirtualReg, src: VirtualReg) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Add, PtxType::F32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(dst))
.src(Operand::Reg(src))
.rounding(RoundingMode::Rn),
);
}
pub fn shr_u32_inplace(&mut self, dst: VirtualReg, imm: u32) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Shr, PtxType::B32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(dst))
.src(Operand::ImmU64(imm as u64)),
);
}
pub fn fma_f32_inplace(&mut self, dst: VirtualReg, a: VirtualReg, b: VirtualReg) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Fma, PtxType::F32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(a))
.src(Operand::Reg(b))
.src(Operand::Reg(dst))
.rounding(RoundingMode::Rn),
);
}
pub fn max_f32_inplace(&mut self, dst: VirtualReg, src: VirtualReg) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Max, PtxType::F32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(dst))
.src(Operand::Reg(src)),
);
}
pub fn mov_f32_reg(&mut self, dst: VirtualReg, src: VirtualReg) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Mov, PtxType::F32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(src)),
);
}
pub fn mov_u32_reg(&mut self, dst: VirtualReg, src: VirtualReg) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Mov, PtxType::U32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(src)),
);
}
pub fn mov_u64_reg(&mut self, dst: VirtualReg, src: VirtualReg) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Mov, PtxType::U64)
.dst(Operand::Reg(dst))
.src(Operand::Reg(src)),
);
}
pub fn mul_f32_inplace(&mut self, dst: VirtualReg, src: VirtualReg) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Mul, PtxType::F32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(dst))
.src(Operand::Reg(src))
.rounding(RoundingMode::Rn),
);
}
pub fn div_f32_inplace(&mut self, dst: VirtualReg, src: VirtualReg) {
self.registers.extend_live_range(dst);
self.instructions.push(
PtxInstruction::new(PtxOp::Div, PtxType::F32)
.dst(Operand::Reg(dst))
.src(Operand::Reg(dst))
.src(Operand::Reg(src))
.rounding(RoundingMode::Rn),
);
}
}