summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuentin Colombet <qcolombet@apple.com>2016-10-11 00:21:11 +0000
committerQuentin Colombet <qcolombet@apple.com>2016-10-11 00:21:11 +0000
commit0e5312787e81c837d1e2a2347145ea0b27c22bf8 (patch)
tree142cd35e585b48cd86cd75030ed649fd7c7787fa
parentf75dcbef200540dab900e34396a542619d762f0a (diff)
downloadbcm5719-llvm-0e5312787e81c837d1e2a2347145ea0b27c22bf8.tar.gz
bcm5719-llvm-0e5312787e81c837d1e2a2347145ea0b27c22bf8.zip
[AArch64][InstructionSelector] Teach the selector how to handle vector OR.
This only adds the support for 64-bit vector OR. Adding more sizes is not difficult, but it requires a bigger refactoring because ORs work on any size, not necessarly the ones that match the width of the register width. Right now, this is not expressed in the legalization, so don't bother pushing the refactoring yet. llvm-svn: 283831
-rw-r--r--llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp2
-rw-r--r--llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir32
2 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
index b534f248e40..c8a00199e27 100644
--- a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp
@@ -175,6 +175,8 @@ static unsigned selectBinaryOp(unsigned GenericOpc, unsigned RegBankID,
return AArch64::FMULDrr;
case TargetOpcode::G_FDIV:
return AArch64::FDIVDrr;
+ case TargetOpcode::G_OR:
+ return AArch64::ORRv8i8;
default:
return GenericOpc;
}
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir
index 8f280ecf88a..d4b81b920af 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir
@@ -15,6 +15,7 @@
define void @or_s32_gpr() { ret void }
define void @or_s64_gpr() { ret void }
+ define void @or_v2s32_fpr() { ret void }
define void @xor_s32_gpr() { ret void }
define void @xor_s64_gpr() { ret void }
@@ -255,6 +256,37 @@ body: |
...
---
+# 64-bit G_OR on vector registers.
+# CHECK-LABEL: name: or_v2s32_fpr
+name: or_v2s32_fpr
+legalized: true
+regBankSelected: true
+#
+# CHECK: registers:
+# CHECK-NEXT: - { id: 0, class: fpr64 }
+# CHECK-NEXT: - { id: 1, class: fpr64 }
+# CHECK-NEXT: - { id: 2, class: fpr64 }
+registers:
+ - { id: 0, class: fpr }
+ - { id: 1, class: fpr }
+ - { id: 2, class: fpr }
+
+# CHECK: body:
+# CHECK: %0 = COPY %d0
+# CHECK: %1 = COPY %d1
+# The actual OR does not matter as long as it is operating
+# on 64-bit width vector.
+# CHECK: %2 = ORRv8i8 %0, %1
+body: |
+ bb.0:
+ liveins: %d0, %d1
+
+ %0(<2 x s32>) = COPY %d0
+ %1(<2 x s32>) = COPY %d1
+ %2(<2 x s32>) = G_OR %0, %1
+...
+
+---
# Same as add_s32_gpr, for G_XOR operations.
# CHECK-LABEL: name: xor_s32_gpr
name: xor_s32_gpr
OpenPOWER on IntegriCloud