From 592d8fa4368939cc771327e4bb6712bc598a4f39 Mon Sep 17 00:00:00 2001 From: Daniel Almeida Date: Sun, 12 Nov 2023 02:54:39 +0000 Subject: [PATCH] nak: sm50: remove encode_alu() and friends This method was too complex. Remove it as we have now rewritten all other methods not to rely on it. Part-of: --- src/nouveau/compiler/nak/encode_sm50.rs | 159 ------------------------ 1 file changed, 159 deletions(-) diff --git a/src/nouveau/compiler/nak/encode_sm50.rs b/src/nouveau/compiler/nak/encode_sm50.rs index 7508893416c..aa459f9ad1d 100644 --- a/src/nouveau/compiler/nak/encode_sm50.rs +++ b/src/nouveau/compiler/nak/encode_sm50.rs @@ -69,52 +69,6 @@ enum ALUSrc { CBuf(ALUCBufRef), } -#[derive(Clone, Copy)] -struct ALUModifierInfo { - abs_bit: Option, - neg_bit: Option, -} - -#[derive(Clone, Copy)] -struct ALUSrcsModifier { - src0_opt: Option, - src1_opt: Option, - src2_opt: Option, -} - -enum ALUEncodingType { - Variant1, - Variant2, - Variant3, - Variant4, -} - -struct ALUEncodingInfo { - opcode: u16, - encoding_type: ALUEncodingType, - reg_modifier: Option, - imm24_modifier: Option, - cbuf_modifier: Option, - // TODO - //imm32_modifier: Option, - imm32_behavior_opt: Option, -} - -impl ALUEncodingInfo { - fn get_modifier(&self, src1: &ALUSrc) -> Option<&ALUSrcsModifier> { - match src1 { - ALUSrc::Imm32(_) => self.imm24_modifier.as_ref(), - ALUSrc::None | ALUSrc::Reg(_) => self.reg_modifier.as_ref(), - ALUSrc::CBuf(_) => self.cbuf_modifier.as_ref(), - } - } -} - -struct ALUImm32Behavior { - opcode: u16, - prefer_imm32: bool, -} - fn src_mod_has_abs(src_mod: SrcMod) -> bool { match src_mod { SrcMod::None | SrcMod::FNeg | SrcMod::INeg | SrcMod::BNot => false, @@ -507,119 +461,6 @@ impl SM50Instr { } } - fn encode_alu( - &mut self, - encoding_info: ALUEncodingInfo, - dst: Option, - src0: ALUSrc, - src1: ALUSrc, - src2: ALUSrc, - ) -> bool { - if let Some(dst) = dst { - self.set_dst(dst); - } - - let (src0, src2) = if src0.is_none_or_reg_zero() && !src2.is_none() { - (src2, src0) - } else { - (src0, src2) - }; - - let modifier = encoding_info - .get_modifier(&src1) - .expect("Invalid src1 type"); - - let src0_abs_bit = modifier.src0_opt.as_ref().and_then(|x| x.abs_bit); - let src0_neg_bit = modifier.src0_opt.as_ref().and_then(|x| x.neg_bit); - let src1_abs_bit = modifier.src1_opt.as_ref().and_then(|x| x.abs_bit); - let src1_neg_bit = modifier.src1_opt.as_ref().and_then(|x| x.neg_bit); - let src2_abs_bit = modifier.src2_opt.as_ref().and_then(|x| x.abs_bit); - let src2_neg_bit = modifier.src2_opt.as_ref().and_then(|x| x.neg_bit); - - self.set_alu_reg_src(8..16, src0_abs_bit, src0_neg_bit, &src0); - let form = match &src1 { - ALUSrc::Reg(reg1) => { - match &src2 { - ALUSrc::None => { - self.set_alu_reg( - 20..28, - src1_abs_bit, - src1_neg_bit, - reg1, - ); - } - ALUSrc::Reg(reg2) => { - self.set_alu_reg( - 20..28, - src1_abs_bit, - src1_neg_bit, - reg1, - ); - self.set_alu_reg( - 39..47, - src2_abs_bit, - src2_neg_bit, - reg2, - ); - } - ALUSrc::Imm32(imm) => { - panic!("src2 cannot be of type Imm32!") - } - ALUSrc::CBuf(cb) => { - // TODO: Check if that truely don't exist. - panic!("src2 cannot be of type cbuf!") - } - } - - match encoding_info.encoding_type { - ALUEncodingType::Variant1 => 0x58, - ALUEncodingType::Variant2 => 0x5a, - ALUEncodingType::Variant3 => 0x5b, - ALUEncodingType::Variant4 => 0x5c, - } - } - ALUSrc::Imm32(imm) => { - // FIXME: There is no encoding for 3 sources. - assert!(src2.is_none_or_reg_zero()); - - if let Some(imm32_behavior) = encoding_info.imm32_behavior_opt { - if imm32_behavior.prefer_imm32 || *imm > 0xfffff { - self.set_opcode(imm32_behavior.opcode); - self.set_src_imm32(20..52, *imm); - - return true; - } - } - - self.set_src_imm_i20(20..39, 56, *imm); - - match encoding_info.encoding_type { - ALUEncodingType::Variant1 => 0x30, - ALUEncodingType::Variant2 => 0x34, - ALUEncodingType::Variant3 => 0x36, - ALUEncodingType::Variant4 => 0x38, - } - } - ALUSrc::CBuf(cb) => { - self.set_alu_cb(20..39, src1_abs_bit, src1_neg_bit, cb); - self.set_alu_reg_src(39..47, src2_abs_bit, src2_neg_bit, &src2); - - match encoding_info.encoding_type { - ALUEncodingType::Variant1 => 0x48, - ALUEncodingType::Variant2 => 0x4a, - ALUEncodingType::Variant3 => 0x4b, - ALUEncodingType::Variant4 => 0x4c, - } - } - _ => panic!("Invalid instruction form"), - }; - - self.set_field(48..56, encoding_info.opcode); - self.set_field(56..64, form); - - false - } - fn encode_mov(&mut self, op: &OpMov) { match &op.src.src_ref { SrcRef::Zero | SrcRef::Reg(_) => {