universal-hashes icon indicating copy to clipboard operation
universal-hashes copied to clipboard

Add backend for 32 bit targets with wide multiplication?

Open newpavlov opened this issue 4 years ago • 3 comments

Currently polyval (and thus crates built on top of it) uses 32-bit soft backend which was written with targets without wide multiplication in mind. However, this code can be quite inefficient for targets which do support wide multiplication, such as:

  • WASM32: u32s can be extended to 64 bits and multiplied using i64.mul.
  • RISC-V: wide multiplication is implemented by combining MULHU and MUL operations (hardware may fuse them later into a single instruction).

Also it may be worth to add a soft backend for 64-bit targets without wide multiplication? Though right now I can't name a target for which it could be useful.

newpavlov avatar Jul 19 '21 15:07 newpavlov

The current 32-bit backend is largely targeted at things like microcontrollers and should probably be gated on thumb* and other microcontroller targets specifically.

tarcieri avatar Jul 20 '21 13:07 tarcieri

According to the comment it may be also useful on i386 targets, no? I guess we can make the 32-bit wide backend default and enable the 32-bit nonwide one only for selected targets.

What are your thoughts about the potential 64-bit nonwide backend?

newpavlov avatar Jul 20 '21 13:07 newpavlov

According to the comment it may be also useful on i386 targets, no?

Wasn't aware Rust even supported those!

What are your thoughts about the potential 64-bit nonwide backend?

I think it's ok to add additional backends (or perhaps decompose the existing backends into separate target-specific codepaths) as long as there's a reasonable performance justification.

tarcieri avatar Jul 20 '21 13:07 tarcieri