From 000d203da89ffe222bb73a56ff1dc5cb4d7bbcb0 Mon Sep 17 00:00:00 2001 From: plucky Date: Tue, 14 Nov 2023 16:56:29 +0800 Subject: [PATCH] =?UTF-8?q?asm/rv32i:=20=E6=8C=87=E4=BB=A4=E9=9B=86?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0From=E7=BA=A6=E6=9D=9F?= =?UTF-8?q?=E6=94=B9=E4=B8=BAInto=E7=BA=A6=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根据标准库的建议,通常应优先使用Into而不是From,特别是在为泛型函数指定特征边界时,因为有的类型只实现了Into,而实现From会自动获得Into的实现,这是为了确保只实现了Into的类型也能够被使用。 Signed-off-by: plucky --- src/asm/rv32i.rs | 286 +++++++++++++++++++++++++---------------------- 1 file changed, 152 insertions(+), 134 deletions(-) diff --git a/src/asm/rv32i.rs b/src/asm/rv32i.rs index c888acd..56bc456 100644 --- a/src/asm/rv32i.rs +++ b/src/asm/rv32i.rs @@ -167,23 +167,31 @@ impl fmt::Debug for InsnRV32Priv { } } -pub fn lui>(rd: RegInteger, simm20: impl Into>) -> T { +pub fn lui(rd: RegInteger, simm20: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Lui(UType::new(OPCODE_LUI, rd, simm20.into())).into() } -pub fn auipc>(rd: RegInteger, simm20: impl Into>) -> T { +pub fn auipc(rd: RegInteger, simm20: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Auipc(UType::new(OPCODE_AUIPC, rd, simm20.into())).into() } -pub fn jal>(rd: RegInteger, offset: impl Into>) -> T { +pub fn jal(rd: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Jal(JType::new(OPCODE_JAL, rd, offset.into())).into() } -pub fn jalr>( - rd: RegInteger, - rs1: RegInteger, - offset: impl Into>, -) -> T { +pub fn jalr(rd: RegInteger, rs1: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Jalr(IType::new( OPCODE_JALR, FUNCT3_JALR_JALR, @@ -194,11 +202,10 @@ pub fn jalr>( .into() } -pub fn beq>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn beq(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Beq(BType::new( OPCODE_BRANCH, FUNCT3_BRANCH_BEQ, @@ -209,11 +216,10 @@ pub fn beq>( .into() } -pub fn bne>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn bne(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Bne(BType::new( OPCODE_BRANCH, FUNCT3_BRANCH_BNE, @@ -224,11 +230,10 @@ pub fn bne>( .into() } -pub fn blt>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn blt(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Blt(BType::new( OPCODE_BRANCH, FUNCT3_BRANCH_BLT, @@ -239,11 +244,10 @@ pub fn blt>( .into() } -pub fn bge>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn bge(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Bge(BType::new( OPCODE_BRANCH, FUNCT3_BRANCH_BGE, @@ -254,11 +258,10 @@ pub fn bge>( .into() } -pub fn bltu>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn bltu(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Bltu(BType::new( OPCODE_BRANCH, FUNCT3_BRANCH_BLTU, @@ -269,11 +272,10 @@ pub fn bltu>( .into() } -pub fn bgeu>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn bgeu(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Bgeu(BType::new( OPCODE_BRANCH, FUNCT3_BRANCH_BGEU, @@ -284,11 +286,10 @@ pub fn bgeu>( .into() } -pub fn lb>( - rd: RegInteger, - rs1: RegInteger, - offset: impl Into>, -) -> T { +pub fn lb(rd: RegInteger, rs1: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Lb(IType::new( OPCODE_LOAD, FUNCT3_LOAD_LB, @@ -299,11 +300,10 @@ pub fn lb>( .into() } -pub fn lh>( - rd: RegInteger, - rs1: RegInteger, - offset: impl Into>, -) -> T { +pub fn lh(rd: RegInteger, rs1: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Lh(IType::new( OPCODE_LOAD, FUNCT3_LOAD_LH, @@ -314,11 +314,10 @@ pub fn lh>( .into() } -pub fn lw>( - rd: RegInteger, - rs1: RegInteger, - offset: impl Into>, -) -> T { +pub fn lw(rd: RegInteger, rs1: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Lw(IType::new( OPCODE_LOAD, FUNCT3_LOAD_LW, @@ -329,11 +328,10 @@ pub fn lw>( .into() } -pub fn lbu>( - rd: RegInteger, - rs1: RegInteger, - offset: impl Into>, -) -> T { +pub fn lbu(rd: RegInteger, rs1: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Lbu(IType::new( OPCODE_LOAD, FUNCT3_LOAD_LBU, @@ -344,11 +342,10 @@ pub fn lbu>( .into() } -pub fn lhu>( - rd: RegInteger, - rs1: RegInteger, - offset: impl Into>, -) -> T { +pub fn lhu(rd: RegInteger, rs1: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Lhu(IType::new( OPCODE_LOAD, FUNCT3_LOAD_LHU, @@ -359,11 +356,10 @@ pub fn lhu>( .into() } -pub fn sb>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn sb(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Sb(SType::new( OPCODE_STORE, FUNCT3_STORE_SB, @@ -374,11 +370,10 @@ pub fn sb>( .into() } -pub fn sh>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn sh(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Sh(SType::new( OPCODE_STORE, FUNCT3_STORE_SH, @@ -389,11 +384,10 @@ pub fn sh>( .into() } -pub fn sw>( - rs1: RegInteger, - rs2: RegInteger, - offset: impl Into>, -) -> T { +pub fn sw(rs1: RegInteger, rs2: RegInteger, offset: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Sw(SType::new( OPCODE_STORE, FUNCT3_STORE_SW, @@ -404,7 +398,10 @@ pub fn sw>( .into() } -pub fn add>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn add(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Add(RType::new( OPCODE_OP, FUNCT3_OP_ADD_SUB, @@ -416,7 +413,10 @@ pub fn add>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) .into() } -pub fn sub>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn sub(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Sub(RType::new( OPCODE_OP, FUNCT3_OP_ADD_SUB, @@ -428,7 +428,10 @@ pub fn sub>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) .into() } -pub fn sll>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn sll(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Sll(RType::new( OPCODE_OP, FUNCT3_OP_SLL, @@ -440,7 +443,10 @@ pub fn sll>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) .into() } -pub fn slt>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn slt(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Slt(RType::new( OPCODE_OP, FUNCT3_OP_SLT, @@ -452,7 +458,10 @@ pub fn slt>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) .into() } -pub fn sltu>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn sltu(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Sltu(RType::new( OPCODE_OP, FUNCT3_OP_SLTU, @@ -464,7 +473,10 @@ pub fn sltu>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger .into() } -pub fn xor>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn xor(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Xor(RType::new( OPCODE_OP, FUNCT3_OP_XOR, @@ -476,7 +488,10 @@ pub fn xor>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) .into() } -pub fn srl>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn srl(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Srl(RType::new( OPCODE_OP, FUNCT3_OP_SRL_SRA, @@ -488,7 +503,10 @@ pub fn srl>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) .into() } -pub fn sra>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn sra(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Sra(RType::new( OPCODE_OP, FUNCT3_OP_SRL_SRA, @@ -500,7 +518,10 @@ pub fn sra>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) .into() } -pub fn or>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn or(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Or(RType::new( OPCODE_OP, FUNCT3_OP_OR, @@ -512,7 +533,10 @@ pub fn or>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) .into() } -pub fn and>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T { +pub fn and(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) -> T +where + InsnRV32I: Into, +{ InsnRV32I::And(RType::new( OPCODE_OP, FUNCT3_OP_AND, @@ -525,11 +549,10 @@ pub fn and>(rd: RegInteger, rs1: RegInteger, rs2: RegInteger) } /// Add sign-extended 12-bit immediate to source register, ignoring the arithmetic overflow. -pub fn addi>( - rd: RegInteger, - rs1: RegInteger, - simm12: impl Into>, -) -> T { +pub fn addi(rd: RegInteger, rs1: RegInteger, simm12: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Addi(IType::new( OPCODE_OP_IMM, FUNCT3_OP_ADD_SUB, @@ -541,11 +564,10 @@ pub fn addi>( } /// If signed value in source register is less than the sign-extended immediate, place the value 1 into destination. -pub fn slti>( - rd: RegInteger, - rs1: RegInteger, - simm12: impl Into>, -) -> T { +pub fn slti(rd: RegInteger, rs1: RegInteger, simm12: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Slti(IType::new( OPCODE_OP_IMM, FUNCT3_OP_SLT, @@ -557,11 +579,10 @@ pub fn slti>( } /// If unsigned value in source register is less than the sign-extended immediate, place the value 1 into destination. -pub fn sltiu>( - rd: RegInteger, - rs1: RegInteger, - simm12: impl Into>, -) -> T { +pub fn sltiu(rd: RegInteger, rs1: RegInteger, simm12: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Sltiu(IType::new( OPCODE_OP_IMM, FUNCT3_OP_SLTU, @@ -573,11 +594,10 @@ pub fn sltiu>( } /// Perform logical 'xor' on source register and sign-extended immediate. -pub fn xori>( - rd: RegInteger, - rs1: RegInteger, - simm12: impl Into>, -) -> T { +pub fn xori(rd: RegInteger, rs1: RegInteger, simm12: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Xori(IType::new( OPCODE_OP_IMM, FUNCT3_OP_XOR, @@ -589,11 +609,10 @@ pub fn xori>( } /// Perform logical 'or' on source register and sign-extended immediate. -pub fn ori>( - rd: RegInteger, - rs1: RegInteger, - simm12: impl Into>, -) -> T { +pub fn ori(rd: RegInteger, rs1: RegInteger, simm12: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Ori(IType::new( OPCODE_OP_IMM, FUNCT3_OP_OR, @@ -605,11 +624,10 @@ pub fn ori>( } /// Perform logical 'and' on source register and sign-extended immediate. -pub fn andi>( - rd: RegInteger, - rs1: RegInteger, - simm12: impl Into>, -) -> T { +pub fn andi(rd: RegInteger, rs1: RegInteger, simm12: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Andi(IType::new( OPCODE_OP_IMM, FUNCT3_OP_AND, @@ -620,11 +638,10 @@ pub fn andi>( .into() } -pub fn slli>( - rd: RegInteger, - rs1: RegInteger, - shamt: impl Into>, -) -> T { +pub fn slli(rd: RegInteger, rs1: RegInteger, shamt: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Slli(IType::new( OPCODE_OP_IMM, FUNCT3_OP_SLL, @@ -635,11 +652,10 @@ pub fn slli>( .into() } -pub fn srli>( - rd: RegInteger, - rs1: RegInteger, - shamt: impl Into>, -) -> T { +pub fn srli(rd: RegInteger, rs1: RegInteger, shamt: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Srli(IType::new( OPCODE_OP_IMM, FUNCT3_OP_SRL_SRA, @@ -650,11 +666,10 @@ pub fn srli>( .into() } -pub fn srai>( - rd: RegInteger, - rs1: RegInteger, - shamt: impl Into>, -) -> T { +pub fn srai(rd: RegInteger, rs1: RegInteger, shamt: impl Into>) -> T +where + InsnRV32I: Into, +{ InsnRV32I::Srai(IType::new( OPCODE_OP_IMM, FUNCT3_OP_SRL_SRA, @@ -669,7 +684,10 @@ pub mod pseudo { use super::{addi, InsnRV32I}; use crate::asm::RegInteger; - pub fn mv>(rd: RegInteger, rs: RegInteger) -> T { + pub fn mv(rd: RegInteger, rs: RegInteger) -> T + where + InsnRV32I: Into, + { addi(rd, rs, 0) } -- Gitee