funct) ¥ CUSTOMX_OPCODE(X) | ¥ (rd << (7)) | ¥ (0x7 << (7+5)) | ¥ (rs1 << (7+5+3)) | ¥ (rs2 << (7+5+3+5)) | ¥ (EXTRACT(funct, 7, 0) << (7+5+3+5+5)) // Standard macro that passes rd, rs1, and rs2 via registers #define ROCC_INSTRUCTION(X, rd, rs1, rs2, funct) ¥ ROCC_INSTRUCTION_R_R_R(X, rd, rs1, rs2, funct, 10, 11, 12) // rd, rs1, and rs2 are data // rd_n, rs_1, and rs2_n are the register numbers to use #define ROCC_INSTRUCTION_R_R_R(X, rd, rs1, rs2, funct, rd_n, rs1_n, rs2_n) { ¥ register uint64_t rd_ asm ("x" # rd_n); ¥ register uint64_t rs1_ asm ("x" # rs1_n) = (uint64_t) rs1; ¥ register uint64_t rs2_ asm ("x" # rs2_n) = (uint64_t) rs2; ¥ asm volatile ( ¥ ".word " STR(CUSTOMX(X, rd_n, rs1_n, rs2_n, funct)) "¥n¥t" ¥ : "=r" (rd_) ¥ : [_rs1] "r" (rs1_), [_rs2] "r" (rs2_)); ¥ rd = rd_; ¥ }