denser (but slower?) clmulrh

This commit is contained in:
Romain Dolbeau 2021-02-17 04:07:57 -05:00
parent 89ae52037f
commit 6ae644e743
2 changed files with 25 additions and 28 deletions

View file

@ -4,9 +4,13 @@ package vexriscv.plugin
import spinal.core._ import spinal.core._
import vexriscv.{Stageable, DecoderService, VexRiscv} import vexriscv.{Stageable, DecoderService, VexRiscv}
object BitManipZbcPlugin { object BitManipZbcPlugin {
object BitManipZbcCtrlEnum extends SpinalEnum(binarySequential) { object BitManipZbcCtrlclmulEnum extends SpinalEnum(binarySequential) {
val CTRL_CLMUL, CTRL_CLMULR, CTRL_CLMULH = newElement() val CTRL_CLMUL, CTRL_CLMULRH = newElement()
} }
object BitManipZbcCtrlEnum extends SpinalEnum(binarySequential) {
val CTRL_clmul = newElement()
}
object BitManipZbcCtrlclmul extends Stageable(BitManipZbcCtrlclmulEnum())
object BitManipZbcCtrl extends Stageable(BitManipZbcCtrlEnum()) object BitManipZbcCtrl extends Stageable(BitManipZbcCtrlEnum())
// Prologue // Prologue
@ -46,7 +50,7 @@ object BitManipZbcPlugin {
x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 ^ x8 ^ x9 ^ x10 ^ x11 ^ x12 ^ x13 ^ x14 ^ x15 ^ x16 ^ x17 ^ x18 ^ x19 ^ x20 ^ x21 ^ x22 ^ x23 ^ x24 ^ x25 ^ x26 ^ x27 ^ x28 ^ x29 ^ x30 ^ x31 // return value x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 ^ x8 ^ x9 ^ x10 ^ x11 ^ x12 ^ x13 ^ x14 ^ x15 ^ x16 ^ x17 ^ x18 ^ x19 ^ x20 ^ x21 ^ x22 ^ x23 ^ x24 ^ x25 ^ x26 ^ x27 ^ x28 ^ x29 ^ x30 ^ x31 // return value
} }
def fun_clmulr(rs1:Bits, rs2:Bits) : Bits = { def fun_clmulrh(rs1:Bits, rs2:Bits, isH: Bool) : Bits = {
val x0 = (((rs2 & B"32'x00000001") =/= B"32'x00000000") ? (rs1 |>> 31) | (B"32'x00000000")) val x0 = (((rs2 & B"32'x00000001") =/= B"32'x00000000") ? (rs1 |>> 31) | (B"32'x00000000"))
val x1 = (((rs2 & B"32'x00000002") =/= B"32'x00000000") ? (rs1 |>> 30) | (B"32'x00000000")) val x1 = (((rs2 & B"32'x00000002") =/= B"32'x00000000") ? (rs1 |>> 30) | (B"32'x00000000"))
val x2 = (((rs2 & B"32'x00000004") =/= B"32'x00000000") ? (rs1 |>> 29) | (B"32'x00000000")) val x2 = (((rs2 & B"32'x00000004") =/= B"32'x00000000") ? (rs1 |>> 29) | (B"32'x00000000"))
@ -79,11 +83,9 @@ object BitManipZbcPlugin {
val x29 = (((rs2 & B"32'x20000000") =/= B"32'x00000000") ? (rs1 |>> 2) | (B"32'x00000000")) val x29 = (((rs2 & B"32'x20000000") =/= B"32'x00000000") ? (rs1 |>> 2) | (B"32'x00000000"))
val x30 = (((rs2 & B"32'x40000000") =/= B"32'x00000000") ? (rs1 |>> 1) | (B"32'x00000000")) val x30 = (((rs2 & B"32'x40000000") =/= B"32'x00000000") ? (rs1 |>> 1) | (B"32'x00000000"))
val x31 = (((rs2 & B"32'x80000000") =/= B"32'x00000000") ? (rs1 |>> 0) | (B"32'x00000000")) val x31 = (((rs2 & B"32'x80000000") =/= B"32'x00000000") ? (rs1 |>> 0) | (B"32'x00000000"))
x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 ^ x8 ^ x9 ^ x10 ^ x11 ^ x12 ^ x13 ^ x14 ^ x15 ^ x16 ^ x17 ^ x18 ^ x19 ^ x20 ^ x21 ^ x22 ^ x23 ^ x24 ^ x25 ^ x26 ^ x27 ^ x28 ^ x29 ^ x30 ^ x31 // return value val r = x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 ^ x8 ^ x9 ^ x10 ^ x11 ^ x12 ^ x13 ^ x14 ^ x15 ^ x16 ^ x17 ^ x18 ^ x19 ^ x20 ^ x21 ^ x22 ^ x23 ^ x24 ^ x25 ^ x26 ^ x27 ^ x28 ^ x29 ^ x30 ^ x31
}
def fun_clmulh(rs1:Bits, rs2:Bits) : Bits = { isH ? (r |>> 1) | (r) // return value
val r = fun_clmulr(rs1, rs2) |>> 1
r // return value
} }
// End prologue // End prologue
@ -145,14 +147,12 @@ class BitManipZbcPlugin(earlyInjection : Boolean = true) extends Plugin[VexRiscv
IS_BitManipZbc -> True IS_BitManipZbc -> True
) )
def CLMUL_KEY = M"0000101----------001-----0110011" def CLMUL_KEY = M"0000101----------001-----0110011"
def CLMULR_KEY = M"0000101----------010-----0110011" def CLMULRH_KEY = M"0000101----------01------0110011"
def CLMULH_KEY = M"0000101----------011-----0110011"
val decoderService = pipeline.service(classOf[DecoderService]) val decoderService = pipeline.service(classOf[DecoderService])
decoderService.addDefault(IS_BitManipZbc, False) decoderService.addDefault(IS_BitManipZbc, False)
decoderService.add(List( decoderService.add(List(
CLMUL_KEY -> (binaryActions ++ List(BitManipZbcCtrl -> BitManipZbcCtrlEnum.CTRL_CLMUL)), CLMUL_KEY -> (binaryActions ++ List(BitManipZbcCtrl -> BitManipZbcCtrlEnum.CTRL_clmul, BitManipZbcCtrlclmul -> BitManipZbcCtrlclmulEnum.CTRL_CLMUL)),
CLMULR_KEY -> (binaryActions ++ List(BitManipZbcCtrl -> BitManipZbcCtrlEnum.CTRL_CLMULR)), CLMULRH_KEY -> (binaryActions ++ List(BitManipZbcCtrl -> BitManipZbcCtrlEnum.CTRL_clmul, BitManipZbcCtrlclmul -> BitManipZbcCtrlclmulEnum.CTRL_CLMULRH))
CLMULH_KEY -> (binaryActions ++ List(BitManipZbcCtrl -> BitManipZbcCtrlEnum.CTRL_CLMULH))
)) ))
} // override def setup } // override def setup
override def build(pipeline: VexRiscv): Unit = { override def build(pipeline: VexRiscv): Unit = {
@ -160,11 +160,11 @@ class BitManipZbcPlugin(earlyInjection : Boolean = true) extends Plugin[VexRiscv
import pipeline.config._ import pipeline.config._
execute plug new Area{ execute plug new Area{
import execute._ import execute._
insert(BitManipZbc_FINAL_OUTPUT) := input(BitManipZbcCtrl).mux( val val_clmul = input(BitManipZbcCtrlclmul).mux(
BitManipZbcCtrlEnum.CTRL_CLMUL -> fun_clmul(input(SRC1),input(SRC2)).asBits, BitManipZbcCtrlclmulEnum.CTRL_CLMUL -> fun_clmul(input(SRC1),input(SRC2)).asBits,
BitManipZbcCtrlEnum.CTRL_CLMULR -> fun_clmulr(input(SRC1),input(SRC2)).asBits, BitManipZbcCtrlclmulEnum.CTRL_CLMULRH -> fun_clmulrh(input(SRC1),input(SRC2), input(INSTRUCTION)(12)).asBits
BitManipZbcCtrlEnum.CTRL_CLMULH -> fun_clmulh(input(SRC1),input(SRC2)).asBits ) // mux clmul
) // primary mux insert(BitManipZbc_FINAL_OUTPUT) := val_clmul.asBits
} // execute plug newArea } // execute plug newArea
val injectionStage = if(earlyInjection) execute else memory val injectionStage = if(earlyInjection) execute else memory
injectionStage plug new Area { injectionStage plug new Area {

View file

@ -1,10 +1,9 @@
I CLMUL CLMUL 0000101----------001-----0110011 clmul Zbc Zkg I CLMUL CLMUL 0000101----------001-----0110011 clmul Zbc Zkg
I CLMULR CLMULR 0000101----------010-----0110011 clmulr Zbc Zkg I CLMULRH CLMULRH 0000101----------01------0110011 clmul Zbc Zkg
I CLMULH CLMULH 0000101----------011-----0110011 clmulh Zbc Zkg
S CLMUL "fun_clmul(input(SRC1),input(SRC2))" S CLMUL "fun_clmul(input(SRC1),input(SRC2))"
S CLMULR "fun_clmulr(input(SRC1),input(SRC2))" S CLMULRH "fun_clmulrh(input(SRC1),input(SRC2), input(INSTRUCTION)(12))"
S CLMULH "fun_clmulh(input(SRC1),input(SRC2))"
P """ P """
def fun_clmul(rs1:Bits, rs2:Bits) : Bits = { def fun_clmul(rs1:Bits, rs2:Bits) : Bits = {
@ -43,7 +42,7 @@ P """
x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 ^ x8 ^ x9 ^ x10 ^ x11 ^ x12 ^ x13 ^ x14 ^ x15 ^ x16 ^ x17 ^ x18 ^ x19 ^ x20 ^ x21 ^ x22 ^ x23 ^ x24 ^ x25 ^ x26 ^ x27 ^ x28 ^ x29 ^ x30 ^ x31 // return value x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 ^ x8 ^ x9 ^ x10 ^ x11 ^ x12 ^ x13 ^ x14 ^ x15 ^ x16 ^ x17 ^ x18 ^ x19 ^ x20 ^ x21 ^ x22 ^ x23 ^ x24 ^ x25 ^ x26 ^ x27 ^ x28 ^ x29 ^ x30 ^ x31 // return value
} }
def fun_clmulr(rs1:Bits, rs2:Bits) : Bits = { def fun_clmulrh(rs1:Bits, rs2:Bits, isH: Bool) : Bits = {
val x0 = (((rs2 & B"32'x00000001") =/= B"32'x00000000") ? (rs1 |>> 31) | (B"32'x00000000")) val x0 = (((rs2 & B"32'x00000001") =/= B"32'x00000000") ? (rs1 |>> 31) | (B"32'x00000000"))
val x1 = (((rs2 & B"32'x00000002") =/= B"32'x00000000") ? (rs1 |>> 30) | (B"32'x00000000")) val x1 = (((rs2 & B"32'x00000002") =/= B"32'x00000000") ? (rs1 |>> 30) | (B"32'x00000000"))
val x2 = (((rs2 & B"32'x00000004") =/= B"32'x00000000") ? (rs1 |>> 29) | (B"32'x00000000")) val x2 = (((rs2 & B"32'x00000004") =/= B"32'x00000000") ? (rs1 |>> 29) | (B"32'x00000000"))
@ -76,10 +75,8 @@ P """
val x29 = (((rs2 & B"32'x20000000") =/= B"32'x00000000") ? (rs1 |>> 2) | (B"32'x00000000")) val x29 = (((rs2 & B"32'x20000000") =/= B"32'x00000000") ? (rs1 |>> 2) | (B"32'x00000000"))
val x30 = (((rs2 & B"32'x40000000") =/= B"32'x00000000") ? (rs1 |>> 1) | (B"32'x00000000")) val x30 = (((rs2 & B"32'x40000000") =/= B"32'x00000000") ? (rs1 |>> 1) | (B"32'x00000000"))
val x31 = (((rs2 & B"32'x80000000") =/= B"32'x00000000") ? (rs1 |>> 0) | (B"32'x00000000")) val x31 = (((rs2 & B"32'x80000000") =/= B"32'x00000000") ? (rs1 |>> 0) | (B"32'x00000000"))
x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 ^ x8 ^ x9 ^ x10 ^ x11 ^ x12 ^ x13 ^ x14 ^ x15 ^ x16 ^ x17 ^ x18 ^ x19 ^ x20 ^ x21 ^ x22 ^ x23 ^ x24 ^ x25 ^ x26 ^ x27 ^ x28 ^ x29 ^ x30 ^ x31 // return value val r = x0 ^ x1 ^ x2 ^ x3 ^ x4 ^ x5 ^ x6 ^ x7 ^ x8 ^ x9 ^ x10 ^ x11 ^ x12 ^ x13 ^ x14 ^ x15 ^ x16 ^ x17 ^ x18 ^ x19 ^ x20 ^ x21 ^ x22 ^ x23 ^ x24 ^ x25 ^ x26 ^ x27 ^ x28 ^ x29 ^ x30 ^ x31
}
def fun_clmulh(rs1:Bits, rs2:Bits) : Bits = { isH ? (r |>> 1) | (r) // return value
val r = fun_clmulr(rs1, rs2) |>> 1
r // return value
} }
""" """