@@ -786,6 +786,34 @@ const char *handle_alu_reg(Parser *p, const char *opcode, size_t opcode_len) {
786786 return NULL ;
787787}
788788
789+ const char * handle_ext (Parser * p , const char * opcode , size_t opcode_len ) {
790+ int d , s1 , s2 ;
791+
792+ skip_trailing (p );
793+ if ((d = parse_reg (p )) == -1 ) return "Invalid rd" ;
794+ skip_trailing (p );
795+ if (!consume_if (p , ',' )) return "Expected ," ;
796+
797+ skip_trailing (p );
798+ if ((s1 = parse_reg (p )) == -1 ) return "Invalid rs1" ;
799+ skip_trailing (p );
800+
801+ if (str_eq_case (opcode , opcode_len , "zext.b" )) {
802+ asm_emit (ANDI (d , s1 , 255 ), p -> startline );
803+ } else if (str_eq_case (opcode , opcode_len , "zext.h" )) {
804+ asm_emit (SLLI (d , s1 , 16 ), p -> startline );
805+ asm_emit (SRLI (d , d , 16 ), p -> startline );
806+ } else if (str_eq_case (opcode , opcode_len , "sext.b" )) {
807+ asm_emit (SLLI (d , s1 , 24 ), p -> startline );
808+ asm_emit (SRAI (d , d , 24 ), p -> startline );
809+ } else if (str_eq_case (opcode , opcode_len , "sext.h" )) {
810+ asm_emit (SLLI (d , s1 , 16 ), p -> startline );
811+ asm_emit (SRAI (d , d , 16 ), p -> startline );
812+ }
813+
814+ return NULL ;
815+ }
816+
789817const char * handle_alu_imm (Parser * p , const char * opcode , size_t opcode_len ) {
790818 Parser orig = * p ;
791819 int d , s1 ;
@@ -1092,7 +1120,7 @@ const char *handle_upper(Parser *p, const char *opcode, size_t opcode_len) {
10921120 } else if (!parse_numeric (p , & simm )) return "Invalid immediate" ;
10931121 // the immediate can either be signed or unsigned 20 bit
10941122 if (simm < -524288 || simm > 1048575 ) return "Out of bounds immediate" ;
1095-
1123+
10961124 if (str_eq_case (opcode , opcode_len , "lui" )) inst = LUI (d , simm );
10971125 else if (str_eq_case (opcode , opcode_len , "auipc" )) inst = AUIPC (d , simm );
10981126
@@ -1247,6 +1275,7 @@ OpcodeHandling opcode_types[] = {
12471275 },
12481276 {handle_alu_imm ,
12491277 {"addi" , "slti" , "sltiu" , "andi" , "ori" , "xori" , "slli" , "srli" , "srai" }},
1278+ {handle_ext , {"sext.b" , "sext.h" , "zext.b" , "zext.h" }},
12501279 {handle_ldst , {"lb" , "lh" , "lw" , "lbu" , "lhu" , "sb" , "sh" , "sw" }},
12511280 {handle_branch ,
12521281 {"beq" , "bne" , "blt" , "bge" , "bltu" , "bgeu" , "bgt" , "ble" , "bgtu" ,
0 commit comments