From dfbc9c83a910c79cb3cc34dbfaed3c436e1b6ecb Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Tue, 17 Sep 2019 04:23:23 +1000 Subject: cmd/internal/obj/riscv: add load, store and multiplication instructions Add support for assembling load, store and multiplication instructions. Based on the riscv-go port. Updates #27532 Change-Id: Ia7b6e60ae45416a82f240e7b7fc101a36ce18886 Reviewed-on: https://go-review.googlesource.com/c/go/+/195917 Reviewed-by: Cherry Zhang --- src/cmd/internal/obj/riscv/obj.go | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'src/cmd/internal') diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index 3ce8cb8982..e97be4b69e 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -215,6 +215,12 @@ func validateII(p *obj.Prog) { wantIntRegAddr(p, "to", &p.To) } +func validateSI(p *obj.Prog) { + wantImm(p, "from", p.From, 12) + wantIntReg(p, "reg", p.Reg) + wantIntRegAddr(p, "to", &p.To) +} + func validateRaw(p *obj.Prog) { // Treat the raw value specially as a 32-bit unsigned integer. // Nobody wants to enter negative machine code. @@ -263,6 +269,21 @@ func encodeII(p *obj.Prog) uint32 { return encodeI(p, regIAddr(p.To)) } +// encodeS encodes an S-type RISC-V instruction. +func encodeS(p *obj.Prog, rs2 uint32) uint32 { + imm := immI(p.From, 12) + rs1 := regIAddr(p.To) + i := encode(p.As) + if i == nil { + panic("encodeS: could not encode instruction") + } + return (imm>>5)<<25 | rs2<<20 | rs1<<15 | i.funct3<<12 | (imm&0x1f)<<7 | i.opcode +} + +func encodeSI(p *obj.Prog) uint32 { + return encodeS(p, regI(p.Reg)) +} + // encodeRaw encodes a raw instruction value. func encodeRaw(p *obj.Prog) uint32 { // Treat the raw value specially as a 32-bit unsigned integer. @@ -299,6 +320,8 @@ var ( iIEncoding = encoding{encode: encodeII, validate: validateII, length: 4} + sIEncoding = encoding{encode: encodeSI, validate: validateSI, length: 4} + // rawEncoding encodes a raw instruction byte sequence. rawEncoding = encoding{encode: encodeRaw, validate: validateRaw, length: 4} @@ -338,6 +361,36 @@ var encodingForAs = [ALAST & obj.AMask]encoding{ ASUB & obj.AMask: rIIIEncoding, ASRA & obj.AMask: rIIIEncoding, + // 2.6: Load and Store Instructions + ALW & obj.AMask: iIEncoding, + ALWU & obj.AMask: iIEncoding, + ALH & obj.AMask: iIEncoding, + ALHU & obj.AMask: iIEncoding, + ALB & obj.AMask: iIEncoding, + ALBU & obj.AMask: iIEncoding, + ASW & obj.AMask: sIEncoding, + ASH & obj.AMask: sIEncoding, + ASB & obj.AMask: sIEncoding, + + // 5.3: Load and Store Instructions (RV64I) + ALD & obj.AMask: iIEncoding, + ASD & obj.AMask: sIEncoding, + + // 7.1: Multiplication Operations + AMUL & obj.AMask: rIIIEncoding, + AMULH & obj.AMask: rIIIEncoding, + AMULHU & obj.AMask: rIIIEncoding, + AMULHSU & obj.AMask: rIIIEncoding, + AMULW & obj.AMask: rIIIEncoding, + ADIV & obj.AMask: rIIIEncoding, + ADIVU & obj.AMask: rIIIEncoding, + AREM & obj.AMask: rIIIEncoding, + AREMU & obj.AMask: rIIIEncoding, + ADIVW & obj.AMask: rIIIEncoding, + ADIVUW & obj.AMask: rIIIEncoding, + AREMW & obj.AMask: rIIIEncoding, + AREMUW & obj.AMask: rIIIEncoding, + // Escape hatch AWORD & obj.AMask: rawEncoding, -- cgit v1.3