diff options
author | Quentin Colombet <qcolombet@apple.com> | 2016-10-11 00:21:11 +0000 |
---|---|---|
committer | Quentin Colombet <qcolombet@apple.com> | 2016-10-11 00:21:11 +0000 |
commit | 0e5312787e81c837d1e2a2347145ea0b27c22bf8 (patch) | |
tree | 142cd35e585b48cd86cd75030ed649fd7c7787fa | |
parent | f75dcbef200540dab900e34396a542619d762f0a (diff) | |
download | bcm5719-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.cpp | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect.mir | 32 |
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 |