11#[ cfg( test) ]  
22use  stdarch_test:: assert_instr; 
33
4+ use  crate :: arch:: asm; 
5+ 
46unsafe  extern  "unadjusted"  { 
57    #[ link_name = "llvm.riscv.aes64es" ]  
68    fn  _aes64es ( rs1 :  i64 ,  rs2 :  i64 )  -> i64 ; 
@@ -14,15 +16,6 @@ unsafe extern "unadjusted" {
1416    #[ link_name = "llvm.riscv.aes64dsm" ]  
1517    fn  _aes64dsm ( rs1 :  i64 ,  rs2 :  i64 )  -> i64 ; 
1618
17-     #[ link_name = "llvm.riscv.aes64ks1i" ]  
18-     fn  _aes64ks1i ( rs1 :  i64 ,  rnum :  i32 )  -> i64 ; 
19- 
20-     #[ link_name = "llvm.riscv.aes64ks2" ]  
21-     fn  _aes64ks2 ( rs1 :  i64 ,  rs2 :  i64 )  -> i64 ; 
22- 
23-     #[ link_name = "llvm.riscv.aes64im" ]  
24-     fn  _aes64im ( rs1 :  i64 )  -> i64 ; 
25- 
2619    #[ link_name = "llvm.riscv.sha512sig0" ]  
2720    fn  _sha512sig0 ( rs1 :  i64 )  -> i64 ; 
2821
@@ -135,13 +128,23 @@ pub fn aes64dsm(rs1: u64, rs2: u64) -> u64 {
135128/// The `RNUM` parameter is expected to be a constant value inside the range of `0..=10`. 
136129//#[target_feature(enable = "zkne", enable = "zknd")] // TODO: zkne_or_zknd 
137130#[ rustc_legacy_const_generics( 1 ) ]  
138- #[ cfg_attr( test,  assert_instr( aes64ks1i,  RNUM  = 0 ) ) ]  
131+ #[ cfg_attr( test,  assert_instr( aes64ks1i,  RNUM  = 0 ) ) ]    // REMOVE if anything goes wrong 
139132#[ inline]  
140133#[ unstable( feature = "riscv_ext_intrinsics" ,  issue = "114544" ) ]  
141134pub  fn  aes64ks1i < const  RNUM :  u8 > ( rs1 :  u64 )  -> u64  { 
142135    static_assert ! ( RNUM  <= 10 ) ; 
143136
144-     unsafe  {  _aes64ks1i ( rs1 as  i64 ,  RNUM  as  i32 )  as  u64  } 
137+     unsafe  { 
138+         let  rd:  u64 ; 
139+         asm ! ( 
140+             ".insn i 0x13, 0x1, {}, {}, {}" , 
141+             lateout( reg)  rd, 
142+             in( reg)  rs1, 
143+             const  0x310  + RNUM  as  u16 , 
144+             options( pure,  nomem,  nostack) 
145+         ) ; 
146+         rd
147+     } 
145148} 
146149
147150/// This instruction implements part of the KeySchedule operation for the AES Block cipher. 
@@ -156,11 +159,15 @@ pub fn aes64ks1i<const RNUM: u8>(rs1: u64) -> u64 {
156159/// 
157160/// Section: 3.11 
158161//#[target_feature(enable = "zkne", enable = "zknd")] // TODO: zkne_or_zknd 
159- #[ cfg_attr( test,  assert_instr( aes64ks2) ) ]  
162+ #[ cfg_attr( test,  assert_instr( aes64ks2) ) ]    // REMOVE if anything goes wrong 
160163#[ inline]  
161164#[ unstable( feature = "riscv_ext_intrinsics" ,  issue = "114544" ) ]  
162165pub  fn  aes64ks2 ( rs1 :  u64 ,  rs2 :  u64 )  -> u64  { 
163-     unsafe  {  _aes64ks2 ( rs1 as  i64 ,  rs2 as  i64 )  as  u64  } 
166+     unsafe  { 
167+         let  rd:  u64 ; 
168+         asm ! ( ".insn r 0x33, 0x0, 0x3f, {}, {}, {}" ,  lateout( reg)  rd,  in( reg)  rs1,  in( reg)  rs2,  options( pure,  nomem,  nostack) ) ; 
169+         rd
170+     } 
164171} 
165172
166173/// This instruction accelerates the inverse MixColumns step of the AES Block Cipher, and is used to aid creation of 
@@ -177,11 +184,15 @@ pub fn aes64ks2(rs1: u64, rs2: u64) -> u64 {
177184/// 
178185/// Section: 3.9 
179186//#[target_feature(enable = "zkne", enable = "zknd")] // TODO: zkne_or_zknd 
180- #[ cfg_attr( test,  assert_instr( aes64im) ) ]  
187+ #[ cfg_attr( test,  assert_instr( aes64im) ) ]    // REMOVE if anything goes wrong 
181188#[ inline]  
182189#[ unstable( feature = "riscv_ext_intrinsics" ,  issue = "114544" ) ]  
183190pub  fn  aes64im ( rs1 :  u64 )  -> u64  { 
184-     unsafe  {  _aes64im ( rs1 as  i64 )  as  u64  } 
191+     unsafe  { 
192+         let  rd:  u64 ; 
193+         asm ! ( ".insn i 0x13, 0x1, {}, {}, 0x300" ,  lateout( reg)  rd,  in( reg)  rs1,  options( pure,  nomem,  nostack) ) ; 
194+         rd
195+     } 
185196} 
186197
187198/// Implements the Sigma0 transformation function as used in the SHA2-512 hash function \[49\] 
0 commit comments