@@ -503,146 +503,122 @@ pub fn jump_if_zero<F: PrimeField32>(condition_reg: usize, to_pc_imm: usize) ->
503503
504504/// LOADW instruction: Load word from memory
505505/// rd = MEM[rs1 + imm]
506- pub fn loadw < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : i32 ) -> Instruction < F > {
507- let imm_unsigned = ( imm & 0xFFFFFF ) as usize ;
508- let imm_sign = if imm < 0 { 1 } else { 0 } ;
509-
506+ pub fn loadw < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : u32 ) -> Instruction < F > {
510507 Instruction :: new (
511508 LoadStoreOpcode :: LOADW . global_opcode ( ) ,
512509 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rd) , // a: rd
513510 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs1) , // b: rs1
514- F :: from_canonical_usize ( imm_unsigned ) , // c: imm (lower 24 bits)
511+ F :: from_canonical_u32 ( imm & 0xFFFF ) , // c: imm (lower 16 bits)
515512 F :: ONE , // d: register address space
516513 F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for word)
517514 F :: ONE , // f: enabled
518- F :: from_canonical_usize ( imm_sign ) , // g: imm sign
515+ F :: from_canonical_u32 ( imm >> 16 ) , // g: imm (higher 16 bits)
519516 )
520517}
521518
522519/// STOREW instruction: Store word to memory
523520/// MEM[rs1 + imm] = rs2
524- pub fn storew < F : PrimeField32 > ( value : usize , base_address : usize , imm : i32 ) -> Instruction < F > {
525- let imm_unsigned = ( imm & 0xFFFFFF ) as usize ;
526- let imm_sign = if imm < 0 { 1 } else { 0 } ;
527-
521+ pub fn storew < F : PrimeField32 > ( value : usize , base_address : usize , imm : u32 ) -> Instruction < F > {
528522 Instruction :: new (
529523 LoadStoreOpcode :: STOREW . global_opcode ( ) ,
530524 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * value) , // a: rs2 (data to store)
531525 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * base_address) , // b: rs1 (base address)
532- F :: from_canonical_usize ( imm_unsigned ) , // c: imm (offset )
533- F :: ONE , // d: register address space
534- F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for word, same as LOADW )
535- F :: ONE , // f: enabled
536- F :: from_canonical_usize ( imm_sign ) , // g: imm sign
526+ F :: from_canonical_u32 ( imm & 0xFFFF ) , // c: imm (lower 16 bits )
527+ F :: ONE , // d: register address space
528+ F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for word)
529+ F :: ONE , // f: enabled
530+ F :: from_canonical_u32 ( imm >> 16 ) , // g: imm (higher 16 bits)
537531 )
538532}
539533
540534/// LOADB: load byte from memory
541535/// rd = MEM[rs1 + imm] (sign-extended)
542- pub fn loadb < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : i32 ) -> Instruction < F > {
543- let imm_unsigned = ( imm & 0xFFFFFF ) as usize ;
544- let imm_sign = if imm < 0 { 1 } else { 0 } ;
545-
536+ pub fn loadb < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : u32 ) -> Instruction < F > {
546537 Instruction :: new (
547538 LoadStoreOpcode :: LOADB . global_opcode ( ) ,
548539 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rd) , // a: rd
549540 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs1) , // b: rs1
550- F :: from_canonical_usize ( imm_unsigned ) , // c: imm (lower 24 bits)
541+ F :: from_canonical_u32 ( imm & 0xFFFF ) , // c: imm (lower 16 bits)
551542 F :: ONE , // d: register address space
552- F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for byte, same as word )
543+ F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for byte)
553544 F :: ONE , // f: enabled
554- F :: from_canonical_usize ( imm_sign ) , // g: imm sign
545+ F :: from_canonical_u32 ( imm >> 16 ) , // g: imm (higher 16 bits)
555546 )
556547}
557548
558549/// LOADBU instruction: Load byte unsigned from memory
559550/// rd = MEM[rs1 + imm] (zero-extended)
560- pub fn loadbu < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : i32 ) -> Instruction < F > {
561- let imm_unsigned = ( imm & 0xFFFFFF ) as usize ;
562- let imm_sign = if imm < 0 { 1 } else { 0 } ;
563-
551+ pub fn loadbu < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : u32 ) -> Instruction < F > {
564552 Instruction :: new (
565553 LoadStoreOpcode :: LOADBU . global_opcode ( ) ,
566554 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rd) , // a: rd
567555 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs1) , // b: rs1
568- F :: from_canonical_usize ( imm_unsigned ) , // c: imm (lower 24 bits)
556+ F :: from_canonical_u32 ( imm & 0xFFFF ) , // c: imm (lower 16 bits)
569557 F :: ONE , // d: register address space
570- F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for byte, same as word )
558+ F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for byte)
571559 F :: ONE , // f: enabled
572- F :: from_canonical_usize ( imm_sign ) , // g: imm sign
560+ F :: from_canonical_u32 ( imm >> 16 ) , // g: imm (higher 16 bits)
573561 )
574562}
575563
576564/// LOADH: load halfword from memory
577565/// rd = MEM[rs1 + imm] (sign-extended)
578566#[ allow( unused) ]
579- pub fn loadh < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : i32 ) -> Instruction < F > {
580- let imm_unsigned = ( imm & 0xFFFFFF ) as usize ;
581- let imm_sign = if imm < 0 { 1 } else { 0 } ;
582-
567+ pub fn loadh < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : u32 ) -> Instruction < F > {
583568 Instruction :: new (
584569 LoadStoreOpcode :: LOADH . global_opcode ( ) ,
585570 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rd) , // a: rd
586571 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs1) , // b: rs1
587- F :: from_canonical_usize ( imm_unsigned ) , // c: imm (lower 24 bits)
572+ F :: from_canonical_u32 ( imm & 0xFFFF ) , // c: imm (lower 16 bits)
588573 F :: ONE , // d: register address space
589- F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for byte, same as word )
574+ F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for halfword )
590575 F :: ONE , // f: enabled
591- F :: from_canonical_usize ( imm_sign ) , // g: imm sign
576+ F :: from_canonical_u32 ( imm >> 16 ) , // g: imm (higher 16 bits)
592577 )
593578}
594579
595580/// LOADHU instruction: Load halfword unsigned from memory
596581/// rd = MEM[rs1 + imm] (zero-extended)
597- pub fn loadhu < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : i32 ) -> Instruction < F > {
598- let imm_unsigned = ( imm & 0xFFFFFF ) as usize ;
599- let imm_sign = if imm < 0 { 1 } else { 0 } ;
600-
582+ pub fn loadhu < F : PrimeField32 > ( rd : usize , rs1 : usize , imm : u32 ) -> Instruction < F > {
601583 Instruction :: new (
602584 LoadStoreOpcode :: LOADHU . global_opcode ( ) ,
603585 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rd) , // a: rd
604586 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs1) , // b: rs1
605- F :: from_canonical_usize ( imm_unsigned ) , // c: imm (lower 24 bits)
587+ F :: from_canonical_u32 ( imm & 0xFFFF ) , // c: imm (lower 16 bits)
606588 F :: ONE , // d: register address space
607- F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for halfword, same as word )
589+ F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for halfword)
608590 F :: ONE , // f: enabled
609- F :: from_canonical_usize ( imm_sign ) , // g: imm sign
591+ F :: from_canonical_u32 ( imm >> 16 ) , // g: imm (higher 16 bits)
610592 )
611593}
612594
613595/// STOREB instruction: Store byte to memory
614596/// MEM[rs1 + imm] = rs2 (lowest byte)
615- pub fn storeb < F : PrimeField32 > ( rs2 : usize , rs1 : usize , imm : i32 ) -> Instruction < F > {
616- let imm_unsigned = ( imm & 0xFFFFFF ) as usize ;
617- let imm_sign = if imm < 0 { 1 } else { 0 } ;
618-
597+ pub fn storeb < F : PrimeField32 > ( rs2 : usize , rs1 : usize , imm : u32 ) -> Instruction < F > {
619598 Instruction :: new (
620599 LoadStoreOpcode :: STOREB . global_opcode ( ) ,
621600 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs2) , // a: rs2 (data to store)
622601 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs1) , // b: rs1 (base address)
623- F :: from_canonical_usize ( imm_unsigned ) , // c: imm (offset )
602+ F :: from_canonical_u32 ( imm & 0xFFFF ) , // c: imm (lower 16 bits )
624603 F :: ONE , // d: register address space
625- F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for byte, same as word )
604+ F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for byte)
626605 F :: ONE , // f: enabled
627- F :: from_canonical_usize ( imm_sign ) , // g: imm sign
606+ F :: from_canonical_u32 ( imm >> 16 ) , // g: imm (higher 16 bits)
628607 )
629608}
630609
631610/// STOREH instruction: Store halfword to memory
632611/// MEM[rs1 + imm] = rs2 (lowest halfword)
633- pub fn storeh < F : PrimeField32 > ( rs2 : usize , rs1 : usize , imm : i32 ) -> Instruction < F > {
634- let imm_unsigned = ( imm & 0xFFFFFF ) as usize ;
635- let imm_sign = if imm < 0 { 1 } else { 0 } ;
636-
612+ pub fn storeh < F : PrimeField32 > ( rs2 : usize , rs1 : usize , imm : u32 ) -> Instruction < F > {
637613 Instruction :: new (
638614 LoadStoreOpcode :: STOREH . global_opcode ( ) ,
639615 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs2) , // a: rs2 (data to store)
640616 F :: from_canonical_usize ( riscv:: RV32_REGISTER_NUM_LIMBS * rs1) , // b: rs1 (base address)
641- F :: from_canonical_usize ( imm_unsigned ) , // c: imm (offset )
617+ F :: from_canonical_u32 ( imm & 0xFFFF ) , // c: imm (lower 16 bits )
642618 F :: ONE , // d: register address space
643- F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for halfword, same as word )
619+ F :: from_canonical_usize ( 2 ) , // e: memory address space (2 for halfword)
644620 F :: ONE , // f: enabled
645- F :: from_canonical_usize ( imm_sign ) , // g: imm sign
621+ F :: from_canonical_u32 ( imm >> 16 ) , // g: imm (higher 16 bits)
646622 )
647623}
648624
0 commit comments