[VE] Add vector logical instructions

Add VAND/VOR/VXOE/VEQV/VLDZ/VPCNT/VBRV/VSEQ instrucitons and regression
tests.

Reviewed By: simoll

Differential Revision: https://reviews.llvm.org/D90141
This commit is contained in:
Kazushi (Jam) Marukawa 2020-10-26 18:58:22 +09:00
parent cfefef50c1
commit 83cb423c6e
9 changed files with 304 additions and 0 deletions

View File

@ -494,6 +494,34 @@ multiclass RVDIVm<string opcStr, bits<8>opc, RegisterClass VRC,
let cs = 1, cy = 0, vz = ? in
defm iv : RVmm<opcStr, ", $sy, $vz", opc, VRC, RCM, (ins SIMM:$sy, VRC:$vz)>;
}
// Generic RV multiclass with 2 arguments for logical operations.
// e.g. VAND, VOR, VXOR, and etc.
let VE_VLIndex = 3 in
multiclass RVLm<string opcStr, bits<8>opc, RegisterClass ScaRC,
RegisterClass RC, RegisterClass RCM> {
let cy = 0, sy = 0, vy = ?, vz = ? in
defm vv : RVmm<opcStr, ", $vy, $vz", opc, RC, RCM, (ins RC:$vy, RC:$vz)>;
let cs = 1, vz = ? in
defm rv : RVmm<opcStr, ", $sy, $vz", opc, RC, RCM, (ins ScaRC:$sy, RC:$vz)>;
let cs = 1, cy = 0, vz = ? in
defm mv : RVmm<opcStr, ", $sy, $vz", opc, RC, RCM, (ins mimm:$sy, RC:$vz)>;
}
// Generic RV multiclass with 1 argument.
// e.g. VLDZ, VPCNT, and VBRV.
let VE_VLIndex = 2 in
multiclass RV1m<string opcStr, bits<8>opc, RegisterClass RC,
RegisterClass RCM> {
let cy = 0, sy = 0, vz = ? in
defm v : RVmm<opcStr, ", $vz", opc, RC, RCM, (ins RC:$vz)>;
}
// Generic RV multiclass with no argument.
// e.g. VSEQ.
let VE_VLIndex = 1 in
multiclass RV0m<string opcStr, bits<8>opc, RegisterClass RC,
RegisterClass RCM> {
let cy = 0, sy = 0 in
defm "" : RVmm<opcStr, "", opc, RC, RCM, (ins)>;
}
// Section 8.10.1 - VADD (Vector Add)
let cx = 0, cx2 = 0 in
@ -670,3 +698,55 @@ def : MnemonicAlias<"pvmins.lo.zx", "pvmins.lo">;
defm VMAXSL : RVm<"vmaxs.l", 0x9a, V64, I64, VM>;
let cs2 = 1 in
defm VMINSL : RVm<"vmins.l", 0x9a, V64, I64, VM>;
//-----------------------------------------------------------------------------
// Section 8.11 - Vector Logical Operation Instructions
//-----------------------------------------------------------------------------
// Section 8.11.1 - VAND (Vector And)
let cx = 0, cx2 = 0 in defm VAND : RVLm<"vand", 0xc4, I64, V64, VM>;
let cx = 0, cx2 = 1 in defm PVANDLO : RVLm<"pvand.lo", 0xc4, I32, V64, VM>;
let cx = 1, cx2 = 0 in defm PVANDUP : RVLm<"pvand.up", 0xc4, F32, V64, VM>;
let cx = 1, cx2 = 1 in defm PVAND : RVLm<"pvand", 0xc4, I64, V64, VM512>;
// Section 8.11.2 - VOR (Vector Or)
let cx = 0, cx2 = 0 in defm VOR : RVLm<"vor", 0xc5, I64, V64, VM>;
let cx = 0, cx2 = 1 in defm PVORLO : RVLm<"pvor.lo", 0xc5, I32, V64, VM>;
let cx = 1, cx2 = 0 in defm PVORUP : RVLm<"pvor.up", 0xc5, F32, V64, VM>;
let cx = 1, cx2 = 1 in defm PVOR : RVLm<"pvor", 0xc5, I64, V64, VM512>;
// Section 8.11.3 - VXOR (Vector Exclusive Or)
let cx = 0, cx2 = 0 in defm VXOR : RVLm<"vxor", 0xc6, I64, V64, VM>;
let cx = 0, cx2 = 1 in defm PVXORLO : RVLm<"pvxor.lo", 0xc6, I32, V64, VM>;
let cx = 1, cx2 = 0 in defm PVXORUP : RVLm<"pvxor.up", 0xc6, F32, V64, VM>;
let cx = 1, cx2 = 1 in defm PVXOR : RVLm<"pvxor", 0xc6, I64, V64, VM512>;
// Section 8.11.4 - VEQV (Vector Equivalence)
let cx = 0, cx2 = 0 in defm VEQV : RVLm<"veqv", 0xc7, I64, V64, VM>;
let cx = 0, cx2 = 1 in defm PVEQVLO : RVLm<"pveqv.lo", 0xc7, I32, V64, VM>;
let cx = 1, cx2 = 0 in defm PVEQVUP : RVLm<"pveqv.up", 0xc7, F32, V64, VM>;
let cx = 1, cx2 = 1 in defm PVEQV : RVLm<"pveqv", 0xc7, I64, V64, VM512>;
// Section 8.11.5 - VLDZ (Vector Leading Zero Count)
let cx = 0, cx2 = 0 in defm VLDZ : RV1m<"vldz", 0xe7, V64, VM>;
let cx = 0, cx2 = 1 in defm PVLDZLO : RV1m<"pvldz.lo", 0xe7, V64, VM>;
let cx = 1, cx2 = 0 in defm PVLDZUP : RV1m<"pvldz.up", 0xe7, V64, VM>;
let cx = 1, cx2 = 1 in defm PVLDZ : RV1m<"pvldz", 0xe7, V64, VM512>;
// Section 8.11.6 - VPCNT (Vector Population Count)
let cx = 0, cx2 = 0 in defm VPCNT : RV1m<"vpcnt", 0xac, V64, VM>;
let cx = 0, cx2 = 1 in defm PVPCNTLO : RV1m<"pvpcnt.lo", 0xac, V64, VM>;
let cx = 1, cx2 = 0 in defm PVPCNTUP : RV1m<"pvpcnt.up", 0xac, V64, VM>;
let cx = 1, cx2 = 1 in defm PVPCNT : RV1m<"pvpcnt", 0xac, V64, VM512>;
// Section 8.11.7 - VBRV (Vector Bit Reverse)
let cx = 0, cx2 = 0 in defm VBRV : RV1m<"vbrv", 0xf7, V64, VM>;
let cx = 0, cx2 = 1 in defm PVBRVLO : RV1m<"pvbrv.lo", 0xf7, V64, VM>;
let cx = 1, cx2 = 0 in defm PVBRVUP : RV1m<"pvbrv.up", 0xf7, V64, VM>;
let cx = 1, cx2 = 1 in defm PVBRV : RV1m<"pvbrv", 0xf7, V64, VM512>;
// Section 8.11.8 - VSEQ (Vector Sequential Number)
let cx = 0, cx2 = 0 in defm VSEQ : RV0m<"vseq", 0x99, V64, VM>;
let cx = 0, cx2 = 1 in defm PVSEQLO : RV0m<"pvseq.lo", 0x99, V64, VM>;
let cx = 1, cx2 = 0 in defm PVSEQUP : RV0m<"pvseq.up", 0x99, V64, VM>;
let cx = 1, cx2 = 1 in defm PVSEQ : RV0m<"pvseq", 0x99, V64, VM512>;

28
llvm/test/MC/VE/VAND.s Normal file
View File

@ -0,0 +1,28 @@
# RUN: llvm-mc -triple=ve --show-encoding < %s \
# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \
# RUN: | FileCheck %s --check-prefixes=CHECK-INST
# CHECK-INST: vand %v11, %s20, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x94,0x20,0xc4]
vand %v11, %s20, %v22
# CHECK-INST: vand %vix, %vix, %vix
# CHECK-ENCODING: encoding: [0x00,0xff,0xff,0xff,0x00,0x00,0x00,0xc4]
vand %vix, %vix, %vix
# CHECK-INST: pvand.lo %vix, (22)0, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0xff,0x00,0x56,0x60,0xc4]
pvand.lo %vix, (22)0, %v22
# CHECK-INST: pvand.lo %v11, (63)1, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x3f,0x6b,0xc4]
pvand.lo %v11, (63)1, %v22, %vm11
# CHECK-INST: pvand.up %v11, %vix, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0xff,0x0b,0x00,0x00,0x8b,0xc4]
pvand.up %v11, %vix, %v22, %vm11
# CHECK-INST: pvand %v12, %v20, %v22, %vm12
# CHECK-ENCODING: encoding: [0x00,0x16,0x14,0x0c,0x00,0x00,0xcc,0xc4]
pvand %v12, %v20, %v22, %vm12

28
llvm/test/MC/VE/VBRV.s Normal file
View File

@ -0,0 +1,28 @@
# RUN: llvm-mc -triple=ve --show-encoding < %s \
# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \
# RUN: | FileCheck %s --check-prefixes=CHECK-INST
# CHECK-INST: vbrv %v11, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x00,0x00,0xf7]
vbrv %v11, %v22
# CHECK-INST: vbrv %vix, %vix
# CHECK-ENCODING: encoding: [0x00,0xff,0x00,0xff,0x00,0x00,0x00,0xf7]
vbrv %vix, %vix
# CHECK-INST: pvbrv.lo %vix, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0xff,0x00,0x00,0x40,0xf7]
pvbrv.lo %vix, %v22
# CHECK-INST: pvbrv.lo %v11, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x00,0x4b,0xf7]
pvbrv.lo %v11, %v22, %vm11
# CHECK-INST: pvbrv.up %v11, %vix, %vm11
# CHECK-ENCODING: encoding: [0x00,0xff,0x00,0x0b,0x00,0x00,0x8b,0xf7]
pvbrv.up %v11, %vix, %vm11
# CHECK-INST: pvbrv %v12, %v20, %vm12
# CHECK-ENCODING: encoding: [0x00,0x14,0x00,0x0c,0x00,0x00,0xcc,0xf7]
pvbrv %v12, %v20, %vm12

28
llvm/test/MC/VE/VEQV.s Normal file
View File

@ -0,0 +1,28 @@
# RUN: llvm-mc -triple=ve --show-encoding < %s \
# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \
# RUN: | FileCheck %s --check-prefixes=CHECK-INST
# CHECK-INST: veqv %v11, %s20, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x94,0x20,0xc7]
veqv %v11, %s20, %v22
# CHECK-INST: veqv %vix, %vix, %vix
# CHECK-ENCODING: encoding: [0x00,0xff,0xff,0xff,0x00,0x00,0x00,0xc7]
veqv %vix, %vix, %vix
# CHECK-INST: pveqv.lo %vix, (22)1, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0xff,0x00,0x16,0x60,0xc7]
pveqv.lo %vix, (22)1, %v22
# CHECK-INST: pveqv.lo %v11, (63)0, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x7f,0x6b,0xc7]
pveqv.lo %v11, (63)0, %v22, %vm11
# CHECK-INST: pveqv.up %v11, %vix, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0xff,0x0b,0x00,0x00,0x8b,0xc7]
pveqv.up %v11, %vix, %v22, %vm11
# CHECK-INST: pveqv %v12, %v20, %v22, %vm12
# CHECK-ENCODING: encoding: [0x00,0x16,0x14,0x0c,0x00,0x00,0xcc,0xc7]
pveqv %v12, %v20, %v22, %vm12

28
llvm/test/MC/VE/VLDZ.s Normal file
View File

@ -0,0 +1,28 @@
# RUN: llvm-mc -triple=ve --show-encoding < %s \
# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \
# RUN: | FileCheck %s --check-prefixes=CHECK-INST
# CHECK-INST: vldz %v11, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x00,0x00,0xe7]
vldz %v11, %v22
# CHECK-INST: vldz %vix, %vix
# CHECK-ENCODING: encoding: [0x00,0xff,0x00,0xff,0x00,0x00,0x00,0xe7]
vldz %vix, %vix
# CHECK-INST: pvldz.lo %vix, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0xff,0x00,0x00,0x40,0xe7]
pvldz.lo %vix, %v22
# CHECK-INST: pvldz.lo %v11, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x00,0x4b,0xe7]
pvldz.lo %v11, %v22, %vm11
# CHECK-INST: pvldz.up %v11, %vix, %vm11
# CHECK-ENCODING: encoding: [0x00,0xff,0x00,0x0b,0x00,0x00,0x8b,0xe7]
pvldz.up %v11, %vix, %vm11
# CHECK-INST: pvldz %v12, %v20, %vm12
# CHECK-ENCODING: encoding: [0x00,0x14,0x00,0x0c,0x00,0x00,0xcc,0xe7]
pvldz %v12, %v20, %vm12

28
llvm/test/MC/VE/VOR.s Normal file
View File

@ -0,0 +1,28 @@
# RUN: llvm-mc -triple=ve --show-encoding < %s \
# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \
# RUN: | FileCheck %s --check-prefixes=CHECK-INST
# CHECK-INST: vor %v11, %s20, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x94,0x20,0xc5]
vor %v11, %s20, %v22
# CHECK-INST: vor %vix, %vix, %vix
# CHECK-ENCODING: encoding: [0x00,0xff,0xff,0xff,0x00,0x00,0x00,0xc5]
vor %vix, %vix, %vix
# CHECK-INST: pvor.lo %vix, (22)1, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0xff,0x00,0x16,0x60,0xc5]
pvor.lo %vix, (22)1, %v22
# CHECK-INST: pvor.lo %v11, (63)0, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x7f,0x6b,0xc5]
pvor.lo %v11, (63)0, %v22, %vm11
# CHECK-INST: pvor.up %v11, %vix, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0xff,0x0b,0x00,0x00,0x8b,0xc5]
pvor.up %v11, %vix, %v22, %vm11
# CHECK-INST: pvor %v12, %v20, %v22, %vm12
# CHECK-ENCODING: encoding: [0x00,0x16,0x14,0x0c,0x00,0x00,0xcc,0xc5]
pvor %v12, %v20, %v22, %vm12

28
llvm/test/MC/VE/VPCNT.s Normal file
View File

@ -0,0 +1,28 @@
# RUN: llvm-mc -triple=ve --show-encoding < %s \
# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \
# RUN: | FileCheck %s --check-prefixes=CHECK-INST
# CHECK-INST: vpcnt %v11, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x00,0x00,0xac]
vpcnt %v11, %v22
# CHECK-INST: vpcnt %vix, %vix
# CHECK-ENCODING: encoding: [0x00,0xff,0x00,0xff,0x00,0x00,0x00,0xac]
vpcnt %vix, %vix
# CHECK-INST: pvpcnt.lo %vix, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0xff,0x00,0x00,0x40,0xac]
pvpcnt.lo %vix, %v22
# CHECK-INST: pvpcnt.lo %v11, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x00,0x4b,0xac]
pvpcnt.lo %v11, %v22, %vm11
# CHECK-INST: pvpcnt.up %v11, %vix, %vm11
# CHECK-ENCODING: encoding: [0x00,0xff,0x00,0x0b,0x00,0x00,0x8b,0xac]
pvpcnt.up %v11, %vix, %vm11
# CHECK-INST: pvpcnt %v12, %v20, %vm12
# CHECK-ENCODING: encoding: [0x00,0x14,0x00,0x0c,0x00,0x00,0xcc,0xac]
pvpcnt %v12, %v20, %vm12

28
llvm/test/MC/VE/VSEQ.s Normal file
View File

@ -0,0 +1,28 @@
# RUN: llvm-mc -triple=ve --show-encoding < %s \
# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \
# RUN: | FileCheck %s --check-prefixes=CHECK-INST
# CHECK-INST: vseq %v11
# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x99]
vseq %v11
# CHECK-INST: vseq %vix
# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x99]
vseq %vix
# CHECK-INST: pvseq.lo %vix
# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0xff,0x00,0x00,0x40,0x99]
pvseq.lo %vix
# CHECK-INST: pvseq.lo %v11, %vm11
# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x00,0x00,0x4b,0x99]
pvseq.lo %v11, %vm11
# CHECK-INST: pvseq.up %v11, %vm11
# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0b,0x00,0x00,0x8b,0x99]
pvseq.up %v11, %vm11
# CHECK-INST: pvseq %v12, %vm12
# CHECK-ENCODING: encoding: [0x00,0x00,0x00,0x0c,0x00,0x00,0xcc,0x99]
pvseq %v12, %vm12

28
llvm/test/MC/VE/VXOR.s Normal file
View File

@ -0,0 +1,28 @@
# RUN: llvm-mc -triple=ve --show-encoding < %s \
# RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
# RUN: llvm-mc -triple=ve -filetype=obj < %s | llvm-objdump -d - \
# RUN: | FileCheck %s --check-prefixes=CHECK-INST
# CHECK-INST: vxor %v11, %s20, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x94,0x20,0xc6]
vxor %v11, %s20, %v22
# CHECK-INST: vxor %vix, %vix, %vix
# CHECK-ENCODING: encoding: [0x00,0xff,0xff,0xff,0x00,0x00,0x00,0xc6]
vxor %vix, %vix, %vix
# CHECK-INST: pvxor.lo %vix, (22)0, %v22
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0xff,0x00,0x56,0x60,0xc6]
pvxor.lo %vix, (22)0, %v22
# CHECK-INST: pvxor.lo %v11, (63)1, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0x00,0x0b,0x00,0x3f,0x6b,0xc6]
pvxor.lo %v11, (63)1, %v22, %vm11
# CHECK-INST: pvxor.up %v11, %vix, %v22, %vm11
# CHECK-ENCODING: encoding: [0x00,0x16,0xff,0x0b,0x00,0x00,0x8b,0xc6]
pvxor.up %v11, %vix, %v22, %vm11
# CHECK-INST: pvxor %v12, %v20, %v22, %vm12
# CHECK-ENCODING: encoding: [0x00,0x16,0x14,0x0c,0x00,0x00,0xcc,0xc6]
pvxor %v12, %v20, %v22, %vm12