Skip to content

Commit

Permalink
ureg: Reuse meta types between registers with the same field layout.
Browse files Browse the repository at this point in the history
This makes it trivial for the optimizer to realize that a generic method
operating on different registers with the same fields can be
deduplicated, since they now use the exact same generic type parameters.

(While testing PR #81, I noticed that the optimizer was
intermittently creating multiple copies of inline(never) functions with
the register address hard-coded; this change makes that impossible).

Codegen diff:

--- /tmp/old-9f68fe1b8c2218acce41fac1d49b76f9c55f4b73   2023-02-21 23:58:34.453745653 -0800
+++ /tmp/new-070db26dd29cb3804a14c2c8b760843c3d0c34cd   2023-02-21 23:59:17.069261052 -0800
@@ -23,10 +23,10 @@
   [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
   [ 1] .text             PROGBITS        00000000 001000 001acf 00 AXM  0   0 16
    00     .text
 target/riscv32imc-unknown-none-elf/debug/deps/hmac384-53a16658694a446f
-  [ 1] .text             PROGBITS        00000000 001000 002dcc 00 AXM  0   0 16
+  [ 1] .text             PROGBITS        00000000 001000 002d8c 00 AXM  0   0 16
    00     .text
 target/riscv32imc-unknown-none-elf/debug/deps/ecc384-29620b311093f9b3
-  [ 1] .text             PROGBITS        00000000 001000 0042f0 00 AXM  0   0 16
+  [ 1] .text             PROGBITS        00000000 001000 004390 00 AXM  0   0 16
    00     .text
 target/riscv32imc-unknown-none-elf/debug/deps/doe-a6c703fbbd8279c3
   [ 1] .text             PROGBITS        00000000 001000 0001b0 00  AX  0   0  2

I looked at the disassembly for the ecc size regression, and this seems
to be optimizer heuristics causing spooky action at a distance; the
optimizer removed some of the keyvault code from the original
Ecc384::sign() (I guess it figured out that the test-case didn't invoke
it?), but not the new one.
  • Loading branch information
korran committed Feb 22, 2023
1 parent 6d6c055 commit 541bd7b
Show file tree
Hide file tree
Showing 11 changed files with 372 additions and 1,532 deletions.
40 changes: 4 additions & 36 deletions registers/src/doe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -207,40 +207,8 @@ pub mod enums {
}
pub mod meta {
//! Additional metadata needed by ureg.
#[derive(Clone, Copy)]
pub struct Iv();
impl ureg::RegType for Iv {
type Raw = u32;
}
impl ureg::ReadableReg for Iv {
type ReadVal = u32;
}
impl ureg::WritableReg for Iv {
type WriteVal = u32;
}
impl ureg::ResettableReg for Iv {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct Ctrl();
impl ureg::RegType for Ctrl {
type Raw = u32;
}
impl ureg::ReadableReg for Ctrl {
type ReadVal = crate::doe::regs::CtrlReadVal;
}
impl ureg::WritableReg for Ctrl {
type WriteVal = crate::doe::regs::CtrlWriteVal;
}
impl ureg::ResettableReg for Ctrl {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct Status();
impl ureg::RegType for Status {
type Raw = u32;
}
impl ureg::ReadableReg for Status {
type ReadVal = crate::doe::regs::StatusReadVal;
}
pub type Iv = ureg::ReadWriteReg32<0, u32, u32>;
pub type Ctrl =
ureg::ReadWriteReg32<0, crate::doe::regs::CtrlReadVal, crate::doe::regs::CtrlWriteVal>;
pub type Status = ureg::ReadOnlyReg32<crate::doe::regs::StatusReadVal>;
}
283 changes: 38 additions & 245 deletions registers/src/ecc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -938,249 +938,42 @@ pub mod enums {
}
pub mod meta {
//! Additional metadata needed by ureg.
#[derive(Clone, Copy)]
pub struct Name();
impl ureg::RegType for Name {
type Raw = u32;
}
impl ureg::ReadableReg for Name {
type ReadVal = u32;
}
#[derive(Clone, Copy)]
pub struct Version();
impl ureg::RegType for Version {
type Raw = u32;
}
impl ureg::ReadableReg for Version {
type ReadVal = u32;
}
#[derive(Clone, Copy)]
pub struct Ctrl();
impl ureg::RegType for Ctrl {
type Raw = u32;
}
impl ureg::WritableReg for Ctrl {
type WriteVal = crate::ecc::regs::CtrlWriteVal;
}
impl ureg::ResettableReg for Ctrl {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct Status();
impl ureg::RegType for Status {
type Raw = u32;
}
impl ureg::ReadableReg for Status {
type ReadVal = crate::ecc::regs::StatusReadVal;
}
#[derive(Clone, Copy)]
pub struct Scaconfig();
impl ureg::RegType for Scaconfig {
type Raw = u32;
}
impl ureg::WritableReg for Scaconfig {
type WriteVal = crate::ecc::regs::ScaconfigWriteVal;
}
impl ureg::ResettableReg for Scaconfig {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct Seed();
impl ureg::RegType for Seed {
type Raw = u32;
}
impl ureg::WritableReg for Seed {
type WriteVal = u32;
}
impl ureg::ResettableReg for Seed {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct Msg();
impl ureg::RegType for Msg {
type Raw = u32;
}
impl ureg::WritableReg for Msg {
type WriteVal = u32;
}
impl ureg::ResettableReg for Msg {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct Privkey();
impl ureg::RegType for Privkey {
type Raw = u32;
}
impl ureg::ReadableReg for Privkey {
type ReadVal = u32;
}
impl ureg::WritableReg for Privkey {
type WriteVal = u32;
}
impl ureg::ResettableReg for Privkey {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct PubkeyX();
impl ureg::RegType for PubkeyX {
type Raw = u32;
}
impl ureg::ReadableReg for PubkeyX {
type ReadVal = u32;
}
impl ureg::WritableReg for PubkeyX {
type WriteVal = u32;
}
impl ureg::ResettableReg for PubkeyX {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct PubkeyY();
impl ureg::RegType for PubkeyY {
type Raw = u32;
}
impl ureg::ReadableReg for PubkeyY {
type ReadVal = u32;
}
impl ureg::WritableReg for PubkeyY {
type WriteVal = u32;
}
impl ureg::ResettableReg for PubkeyY {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct SignR();
impl ureg::RegType for SignR {
type Raw = u32;
}
impl ureg::ReadableReg for SignR {
type ReadVal = u32;
}
impl ureg::WritableReg for SignR {
type WriteVal = u32;
}
impl ureg::ResettableReg for SignR {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct SignS();
impl ureg::RegType for SignS {
type Raw = u32;
}
impl ureg::ReadableReg for SignS {
type ReadVal = u32;
}
impl ureg::WritableReg for SignS {
type WriteVal = u32;
}
impl ureg::ResettableReg for SignS {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct VerifyR();
impl ureg::RegType for VerifyR {
type Raw = u32;
}
impl ureg::ReadableReg for VerifyR {
type ReadVal = u32;
}
#[derive(Clone, Copy)]
pub struct Iv();
impl ureg::RegType for Iv {
type Raw = u32;
}
impl ureg::WritableReg for Iv {
type WriteVal = u32;
}
impl ureg::ResettableReg for Iv {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct KvRdPkeyCtrl();
impl ureg::RegType for KvRdPkeyCtrl {
type Raw = u32;
}
impl ureg::ReadableReg for KvRdPkeyCtrl {
type ReadVal = crate::regs::KvReadCtrlRegReadVal;
}
impl ureg::WritableReg for KvRdPkeyCtrl {
type WriteVal = crate::regs::KvReadCtrlRegWriteVal;
}
impl ureg::ResettableReg for KvRdPkeyCtrl {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct KvRdPkeyStatus();
impl ureg::RegType for KvRdPkeyStatus {
type Raw = u32;
}
impl ureg::ReadableReg for KvRdPkeyStatus {
type ReadVal = crate::regs::KvStatusRegReadVal;
}
#[derive(Clone, Copy)]
pub struct KvRdSeedCtrl();
impl ureg::RegType for KvRdSeedCtrl {
type Raw = u32;
}
impl ureg::ReadableReg for KvRdSeedCtrl {
type ReadVal = crate::regs::KvReadCtrlRegReadVal;
}
impl ureg::WritableReg for KvRdSeedCtrl {
type WriteVal = crate::regs::KvReadCtrlRegWriteVal;
}
impl ureg::ResettableReg for KvRdSeedCtrl {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct KvRdSeedStatus();
impl ureg::RegType for KvRdSeedStatus {
type Raw = u32;
}
impl ureg::ReadableReg for KvRdSeedStatus {
type ReadVal = crate::regs::KvStatusRegReadVal;
}
#[derive(Clone, Copy)]
pub struct KvRdMsgCtrl();
impl ureg::RegType for KvRdMsgCtrl {
type Raw = u32;
}
impl ureg::ReadableReg for KvRdMsgCtrl {
type ReadVal = crate::regs::KvReadCtrlRegReadVal;
}
impl ureg::WritableReg for KvRdMsgCtrl {
type WriteVal = crate::regs::KvReadCtrlRegWriteVal;
}
impl ureg::ResettableReg for KvRdMsgCtrl {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct KvRdMsgStatus();
impl ureg::RegType for KvRdMsgStatus {
type Raw = u32;
}
impl ureg::ReadableReg for KvRdMsgStatus {
type ReadVal = crate::regs::KvStatusRegReadVal;
}
#[derive(Clone, Copy)]
pub struct KvWrPkeyCtrl();
impl ureg::RegType for KvWrPkeyCtrl {
type Raw = u32;
}
impl ureg::ReadableReg for KvWrPkeyCtrl {
type ReadVal = crate::regs::KvWriteCtrlRegReadVal;
}
impl ureg::WritableReg for KvWrPkeyCtrl {
type WriteVal = crate::regs::KvWriteCtrlRegWriteVal;
}
impl ureg::ResettableReg for KvWrPkeyCtrl {
const RESET_VAL: Self::Raw = 0;
}
#[derive(Clone, Copy)]
pub struct KvWrPkeyStatus();
impl ureg::RegType for KvWrPkeyStatus {
type Raw = u32;
}
impl ureg::ReadableReg for KvWrPkeyStatus {
type ReadVal = crate::regs::KvStatusRegReadVal;
}
pub type Name = ureg::ReadOnlyReg32<u32>;
pub type Version = ureg::ReadOnlyReg32<u32>;
pub type Ctrl = ureg::WriteOnlyReg32<0, crate::ecc::regs::CtrlWriteVal>;
pub type Status = ureg::ReadOnlyReg32<crate::ecc::regs::StatusReadVal>;
pub type Scaconfig = ureg::WriteOnlyReg32<0, crate::ecc::regs::ScaconfigWriteVal>;
pub type Seed = ureg::WriteOnlyReg32<0, u32>;
pub type Msg = ureg::WriteOnlyReg32<0, u32>;
pub type Privkey = ureg::ReadWriteReg32<0, u32, u32>;
pub type PubkeyX = ureg::ReadWriteReg32<0, u32, u32>;
pub type PubkeyY = ureg::ReadWriteReg32<0, u32, u32>;
pub type SignR = ureg::ReadWriteReg32<0, u32, u32>;
pub type SignS = ureg::ReadWriteReg32<0, u32, u32>;
pub type VerifyR = ureg::ReadOnlyReg32<u32>;
pub type Iv = ureg::WriteOnlyReg32<0, u32>;
pub type KvRdPkeyCtrl = ureg::ReadWriteReg32<
0,
crate::regs::KvReadCtrlRegReadVal,
crate::regs::KvReadCtrlRegWriteVal,
>;
pub type KvRdPkeyStatus = ureg::ReadOnlyReg32<crate::regs::KvStatusRegReadVal>;
pub type KvRdSeedCtrl = ureg::ReadWriteReg32<
0,
crate::regs::KvReadCtrlRegReadVal,
crate::regs::KvReadCtrlRegWriteVal,
>;
pub type KvRdSeedStatus = ureg::ReadOnlyReg32<crate::regs::KvStatusRegReadVal>;
pub type KvRdMsgCtrl = ureg::ReadWriteReg32<
0,
crate::regs::KvReadCtrlRegReadVal,
crate::regs::KvReadCtrlRegWriteVal,
>;
pub type KvRdMsgStatus = ureg::ReadOnlyReg32<crate::regs::KvStatusRegReadVal>;
pub type KvWrPkeyCtrl = ureg::ReadWriteReg32<
0,
crate::regs::KvWriteCtrlRegReadVal,
crate::regs::KvWriteCtrlRegWriteVal,
>;
pub type KvWrPkeyStatus = ureg::ReadOnlyReg32<crate::regs::KvStatusRegReadVal>;
}
Loading

0 comments on commit 541bd7b

Please sign in to comment.