diff options
| author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2016-07-29 16:56:20 +0000 | 
|---|---|---|
| committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2016-07-29 16:56:20 +0000 | 
| commit | 784e3423e69c60348ef9d4742c32c3232c9b8739 (patch) | |
| tree | 99711cd5826447cc584bc41eada39e1817dfdf5a | |
| parent | 7adfac56b3345f9815663f24c6ca5e5a68bfae4e (diff) | |
| download | bcm5719-llvm-784e3423e69c60348ef9d4742c32c3232c9b8739.tar.gz bcm5719-llvm-784e3423e69c60348ef9d4742c32c3232c9b8739.zip | |
[GlobalISel] Add G_XOR.
llvm-svn: 277172
| -rw-r--r-- | llvm/include/llvm/Target/GenericOpcodes.td | 8 | ||||
| -rw-r--r-- | llvm/include/llvm/Target/TargetOpcodes.def | 3 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 2 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll | 23 | 
4 files changed, 36 insertions, 0 deletions
| diff --git a/llvm/include/llvm/Target/GenericOpcodes.td b/llvm/include/llvm/Target/GenericOpcodes.td index 6f78a5e388d..83d004bd921 100644 --- a/llvm/include/llvm/Target/GenericOpcodes.td +++ b/llvm/include/llvm/Target/GenericOpcodes.td @@ -76,6 +76,14 @@ def G_OR : Instruction {    let isCommutable = 1;  } +// Generic bitwise xor. +def G_XOR : Instruction { +  let OutOperandList = (outs unknown:$dst); +  let InOperandList = (ins unknown:$src1, unknown:$src2); +  let hasSideEffects = 0; +  let isCommutable = 1; +} +  //------------------------------------------------------------------------------  // Memory ops  //------------------------------------------------------------------------------ diff --git a/llvm/include/llvm/Target/TargetOpcodes.def b/llvm/include/llvm/Target/TargetOpcodes.def index bc52fe0c84c..d892beca120 100644 --- a/llvm/include/llvm/Target/TargetOpcodes.def +++ b/llvm/include/llvm/Target/TargetOpcodes.def @@ -168,6 +168,9 @@ HANDLE_TARGET_OPCODE(G_AND)  /// Generic Bitwise-OR instruction.  HANDLE_TARGET_OPCODE(G_OR) +/// Generic Bitwise-OR instruction. +HANDLE_TARGET_OPCODE(G_XOR) +  /// Generic instruction to materialize the address of an alloca or other  /// stack-based object.  HANDLE_TARGET_OPCODE(G_FRAME_INDEX) diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 3f47c9a6882..e085ca79723 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -199,6 +199,8 @@ bool IRTranslator::translate(const Instruction &Inst) {      return translateBinaryOp(TargetOpcode::G_AND, Inst);    case Instruction::Or:      return translateBinaryOp(TargetOpcode::G_OR, Inst); +  case Instruction::Xor: +    return translateBinaryOp(TargetOpcode::G_XOR, Inst);    // Branch operations.    case Instruction::Br: diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll index b51a0e56a0a..8282a227aca 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-irtranslator.ll @@ -81,6 +81,29 @@ define i32 @ori32(i32 %arg1, i32 %arg2) {    ret i32 %res  } +; Tests for xor. +; CHECK-LABEL: name: xori64 +; CHECK: [[ARG1:%[0-9]+]](64) = COPY %x0 +; CHECK-NEXT: [[ARG2:%[0-9]+]](64) = COPY %x1 +; CHECK-NEXT: [[RES:%[0-9]+]](64) = G_XOR s64 [[ARG1]], [[ARG2]] +; CHECK-NEXT: %x0 = COPY [[RES]] +; CHECK-NEXT: RET_ReallyLR implicit %x0 +define i64 @xori64(i64 %arg1, i64 %arg2) { +  %res = xor i64 %arg1, %arg2 +  ret i64 %res +} + +; CHECK-LABEL: name: xori32 +; CHECK: [[ARG1:%[0-9]+]](32) = COPY %w0 +; CHECK-NEXT: [[ARG2:%[0-9]+]](32) = COPY %w1 +; CHECK-NEXT: [[RES:%[0-9]+]](32) = G_XOR s32 [[ARG1]], [[ARG2]] +; CHECK-NEXT: %w0 = COPY [[RES]] +; CHECK-NEXT: RET_ReallyLR implicit %w0 +define i32 @xori32(i32 %arg1, i32 %arg2) { +  %res = xor i32 %arg1, %arg2 +  ret i32 %res +} +  ; Tests for and.  ; CHECK-LABEL: name: andi64  ; CHECK: [[ARG1:%[0-9]+]](64) = COPY %x0 | 

