#define X -1
OPC( 0, ADD, 0b01100, 0, 0, R, R1, 0, R2, X1 + X2, X3, 1, 0, PC + 4)
OPC( 1, SUB, 0b01100, 0, 32, R, R1, 0, R2, X1 - X2, X3, 1, 0, PC + 4)
OPC( 2, XOR, 0b01100, 4, 0, R, R1, 0, R2, X1 ^ X2, X3, 1, 0, PC + 4)
OPC( 3, OR, 0b01100, 6, 0, R, R1, 0, R2, X1 | X2, X3, 1, 0, PC + 4)
OPC( 4, AND, 0b01100, 7, 0, R, R1, 0, R2, X1 & X2, X3, 1, 0, PC + 4)
OPC( 5, SLT, 0b01100, 2, 0, R, R1, 0, R2, X1 - X2, LT, 1, 0, PC + 4)
OPC( 6, SLTU, 0b01100, 3, 0, R, R1, 0, R2, X1 - X2, LTU, 1, 0, PC + 4)
OPC( 7, ADDI, 0b00100, 0, X, I, R1, 0, IM, X1 + X2, X3, 1, 0, PC + 4)
OPC( 8, XORI, 0b00100, 4, X, I, R1, 0, IM, X1 ^ X2, X3, 1, 0, PC + 4)
OPC( 9, ORI, 0b00100, 6, X, I, R1, 0, IM, X1 | X2, X3, 1, 0, PC + 4)
OPC( 10, ANDI, 0b00100, 7, X, I, R1, 0, IM, X1 & X2, X3, 1, 0, PC + 4)
OPC( 11, SLTI, 0b00100, 2, X, I, R1, 0, IM, X1 - X2, LT, 1, 0, PC + 4)
OPC( 13, SLTIU, 0b00100, 3, X, I, R1, 0, IM, X1 - X2, LTU, 1, 0, PC + 4)
OPC( 14, LB, 0b00000, 0, X, I, R1+IM, 1, MM, GET(1, 8), X3, 1, 0, PC + 4)
OPC( 15, LH, 0b00000, 1, X, I, R1+IM, 1, MM, GET(1, 16), X3, 1, 0, PC + 4)
OPC( 16, LW, 0b00000, 2, X, I, R1+IM, 1, MM, GET(0, 32), X3, 1, 0, PC + 4)
OPC( 17, LBU, 0b00000, 4, X, I, R1+IM, 1, MM, GET(0, 8), X3, 1, 0, PC + 4)
OPC( 18, LHU, 0b00000, 5, X, I, R1+IM, 1, MM, GET(0, 16), X3, 1, 0, PC + 4)
OPC( 19, SB, 0b01000, 0, X, S, R1+IM, 1, MS, PUT(8), X3, 0, 1, PC + 4)
OPC( 20, SH, 0b01000, 1, X, S, R1+IM, 1, MS, PUT(16), X3, 0, 1, PC + 4)
OPC( 21, SW, 0b01000, 2, X, S, R1+IM, 0, R2, PUT(32), X3, 0, 1, PC + 4)
OPC( 22, BEQ, 0b11000, 0, X, B, R1, 0, R2, X1 - X2, EQ, 0, 0, BR_TRUE)
OPC( 23, BNE, 0b11000, 1, X, B, R1, 0, R2, X1 - X2, EQ, 0, 0, BR_FALSE)
OPC( 24, BLT, 0b11000, 4, X, B, R1, 0, R2, X1 - X2, LT, 0, 0, BR_TRUE)
OPC( 25, BGE, 0b11000, 5, X, B, R1, 0, R2, X1 - X2, LT, 0, 0, BR_FALSE)
OPC( 26, BLTU, 0b11000, 6, X, B, R1, 0, R2, X1 - X2, LTU, 0, 0, BR_TRUE)
OPC( 27, BGEU, 0b11000, 7, X, B, R1, 0, R2, X1 - X2, LTU, 0, 0, BR_FALSE)
OPC( 28, JAL, 0b11011, X, X, J, R1, 0, R2, PC + 4, X3, 1, 0, PC + IM)
OPC( 29, JALR, 0b11001, 0, X, I, R1, 0, R2, PC + 4, X3, 1, 0, R1 + IM)
OPC( 30, LUI, 0b01101, X, X, U, R1, 0, R2, IM, X3, 1, 0, PC + 4)
OPC( 31, AUIPC, 0b00101, X, X, U, R1, 0, R2, PC + IM, X3, 1, 0, PC + 4)
OPM( 32, MUL, 0b01100, 0, 1, R, R1, R2, 0, 0, 0)
OPM( 33, MULH, 0b01100, 1, 1, R, R1, R2, 1, 1, 1)
OPM( 34, MULSU, 0b01100, 2, 1, R, R1, R2, 1, 0, 1)
OPM( 35, MULU, 0b01100, 3, 1, R, R1, R2, 0, 0, 1)
OPM( 36, SLL, 0b01100, 1, 0, R, R1, V2, 0, 0, 0)
OPM( 37, SLLI, 0b00100, 1, 0, I, R1, V2, 0, 0, 0)
OPD( 42, DIV, 0b01100, 4, 1, R, R1, R2, 1, 0)
OPD( 43, DIVU, 0b01100, 5, 1, R, R1, R2, 0, 0)
OPD( 44, REM, 0b01100, 6, 1, R, R1, R2, 1, 1)
OPD( 45, REMU, 0b01100, 7, 1, R, R1, R2, 0, 1)
OPD( 46, SRL, 0b01100, 5, 0, R, R1, V2, 0, 0)
OPD( 47, SRA, 0b01100, 5, 32, R, R1, V2, 2, 0)
OPD( 48, SRLI, 0b00100, 5, 0, I, R1, V2, 0, 0)
OPD( 49, SRAI, 0b00100, 5, 32, I, R1, V2, 2, 0)
#undef X