diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoB.td b/llvm/lib/Target/RISCV/RISCVInstrInfoB.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoB.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoB.td @@ -224,6 +224,12 @@ def XNOR : ALU_rr<0b0100000, 0b100, "xnor">, Sched<[]>; } // Predicates = [HasStdExtZbbOrZbp] +let Predicates = [HasStdExtZba] in { +def SH1ADD : ALU_rr<0b0010000, 0b010, "sh1add">, Sched<[]>; +def SH2ADD : ALU_rr<0b0010000, 0b100, "sh2add">, Sched<[]>; +def SH3ADD : ALU_rr<0b0010000, 0b110, "sh3add">, Sched<[]>; +} // Predicates = [HasStdExtZba] + let Predicates = [HasStdExtZbb] in { def SLO : ALU_rr<0b0010000, 0b001, "slo">, Sched<[]>; def SRO : ALU_rr<0b0010000, 0b101, "sro">, Sched<[]>; @@ -372,6 +378,9 @@ let Predicates = [HasStdExtZba, IsRV64] in { def SLLIUW : RVBShift_ri<0b00001, 0b001, OPC_OP_IMM_32, "slli.uw">, Sched<[]>; def ADDUW : ALUW_rr<0b0000100, 0b000, "add.uw">, Sched<[]>; +def SH1ADDUW : ALUW_rr<0b0010000, 0b010, "sh1add.uw">, Sched<[]>; +def SH2ADDUW : ALUW_rr<0b0010000, 0b100, "sh2add.uw">, Sched<[]>; +def SH3ADDUW : ALUW_rr<0b0010000, 0b110, "sh3add.uw">, Sched<[]>; } // Predicates = [HasStdExtZbb, IsRV64] let Predicates = [HasStdExtZbb, IsRV64] in { diff --git a/llvm/test/MC/RISCV/rv32zba-invalid.s b/llvm/test/MC/RISCV/rv32zba-invalid.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/rv32zba-invalid.s @@ -0,0 +1,8 @@ +# RUN: not llvm-mc -triple riscv32 -mattr=+experimental-b,experimental-zba < %s 2>&1 | FileCheck %s + +# Too few operands +sh1add t0, t1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction +# Too few operands +sh2add t0, t1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction +# Too few operands +sh3add t0, t1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction diff --git a/llvm/test/MC/RISCV/rv32zba-valid.s b/llvm/test/MC/RISCV/rv32zba-valid.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/rv32zba-valid.s @@ -0,0 +1,23 @@ +# With B extension: +# RUN: llvm-mc %s -triple=riscv32 -mattr=+experimental-b -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+experimental-b < %s \ +# RUN: | llvm-objdump --mattr=+experimental-b -d -r - \ +# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s + +# With Bitmanip base extension: +# RUN: llvm-mc %s -triple=riscv32 -mattr=+experimental-zba -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+experimental-zba < %s \ +# RUN: | llvm-objdump --mattr=+experimental-zba -d -r - \ +# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s + +# CHECK-ASM-AND-OBJ: sh1add t0, t1, t2 +# CHECK-ASM: encoding: [0xb3,0x22,0x73,0x20] +sh1add t0, t1, t2 +# CHECK-ASM-AND-OBJ: sh2add t0, t1, t2 +# CHECK-ASM: encoding: [0xb3,0x42,0x73,0x20] +sh2add t0, t1, t2 +# CHECK-ASM-AND-OBJ: sh3add t0, t1, t2 +# CHECK-ASM: encoding: [0xb3,0x62,0x73,0x20] +sh3add t0, t1, t2 diff --git a/llvm/test/MC/RISCV/rv64zba-invalid.s b/llvm/test/MC/RISCV/rv64zba-invalid.s --- a/llvm/test/MC/RISCV/rv64zba-invalid.s +++ b/llvm/test/MC/RISCV/rv64zba-invalid.s @@ -7,3 +7,9 @@ slli.uw t0, t1, -1 # CHECK: :[[@LINE]]:17: error: immediate must be an integer in the range [0, 63] # Too few operands add.uw t0, t1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction +# Too few operands +sh1add.uw t0, t1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction +# Too few operands +sh2add.uw t0, t1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction +# Too few operands +sh3add.uw t0, t1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction diff --git a/llvm/test/MC/RISCV/rv64zba-valid.s b/llvm/test/MC/RISCV/rv64zba-valid.s --- a/llvm/test/MC/RISCV/rv64zba-valid.s +++ b/llvm/test/MC/RISCV/rv64zba-valid.s @@ -18,3 +18,12 @@ # CHECK-ASM-AND-OBJ: add.uw t0, t1, t2 # CHECK-ASM: encoding: [0xbb,0x02,0x73,0x08] add.uw t0, t1, t2 +# CHECK-ASM-AND-OBJ: sh1add.uw t0, t1, t2 +# CHECK-ASM: encoding: [0xbb,0x22,0x73,0x20] +sh1add.uw t0, t1, t2 +# CHECK-ASM-AND-OBJ: sh2add.uw t0, t1, t2 +# CHECK-ASM: encoding: [0xbb,0x42,0x73,0x20] +sh2add.uw t0, t1, t2 +# CHECK-ASM-AND-OBJ: sh3add.uw t0, t1, t2 +# CHECK-ASM: encoding: [0xbb,0x62,0x73,0x20] +sh3add.uw t0, t1, t2