reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -O0 -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s

--- |
  target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"

  define void @xor_s32_gpr() { ret void }
  define void @xor_s64_gpr() { ret void }
  define void @xor_constant_n1_s32_gpr() { ret void }
  define void @xor_constant_n1_s64_gpr() { ret void }
  define void @xor_constant_n1_s32_gpr_2bb() { ret void }

...

---
# Check that we select a 32-bit GPR G_XOR into EORWrr on GPR32.
# Also check that we constrain the register class of the COPY to GPR32.
name:            xor_s32_gpr
legalized:       true
regBankSelected: true

registers:
  - { id: 0, class: gpr }
  - { id: 1, class: gpr }
  - { id: 2, class: gpr }

body:             |
  bb.0:
    liveins: $w0, $w1

    ; CHECK-LABEL: name: xor_s32_gpr
    ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
    ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
    ; CHECK: [[EORWrr:%[0-9]+]]:gpr32 = EORWrr [[COPY]], [[COPY1]]
    ; CHECK: $w0 = COPY [[EORWrr]]
    %0(s32) = COPY $w0
    %1(s32) = COPY $w1
    %2(s32) = G_XOR %0, %1
    $w0 = COPY %2(s32)
...

---
# Same as xor_s64_gpr, for 64-bit operations.
name:            xor_s64_gpr
legalized:       true
regBankSelected: true

registers:
  - { id: 0, class: gpr }
  - { id: 1, class: gpr }
  - { id: 2, class: gpr }

body:             |
  bb.0:
    liveins: $x0, $x1

    ; CHECK-LABEL: name: xor_s64_gpr
    ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
    ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
    ; CHECK: [[EORXrr:%[0-9]+]]:gpr64 = EORXrr [[COPY]], [[COPY1]]
    ; CHECK: $x0 = COPY [[EORXrr]]
    %0(s64) = COPY $x0
    %1(s64) = COPY $x1
    %2(s64) = G_XOR %0, %1
    $x0 = COPY %2(s64)
...

---
# Check that we select a 32-bit GPR G_XOR into EORWrr on GPR32.
# Also check that we constrain the register class of the COPY to GPR32.
name:            xor_constant_n1_s32_gpr
legalized:       true
regBankSelected: true

registers:
  - { id: 0, class: gpr }
  - { id: 1, class: gpr }
  - { id: 2, class: gpr }

body:             |
  bb.0:
    liveins: $w0

    ; CHECK-LABEL: name: xor_constant_n1_s32_gpr
    ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
    ; CHECK: [[ORNWrr:%[0-9]+]]:gpr32 = ORNWrr $wzr, [[COPY]]
    ; CHECK: $w0 = COPY [[ORNWrr]]
    %0(s32) = COPY $w0
    %1(s32) = G_CONSTANT i32 -1
    %2(s32) = G_XOR %0, %1
    $w0 = COPY %2(s32)
...

---
# Same as xor_constant_n1_s64_gpr, for 64-bit operations.
name:            xor_constant_n1_s64_gpr
legalized:       true
regBankSelected: true

registers:
  - { id: 0, class: gpr }
  - { id: 1, class: gpr }
  - { id: 2, class: gpr }

body:             |
  bb.0:
    liveins: $x0

    ; CHECK-LABEL: name: xor_constant_n1_s64_gpr
    ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
    ; CHECK: [[ORNXrr:%[0-9]+]]:gpr64 = ORNXrr $xzr, [[COPY]]
    ; CHECK: $x0 = COPY [[ORNXrr]]
    %0(s64) = COPY $x0
    %1(s64) = G_CONSTANT i64 -1
    %2(s64) = G_XOR %0, %1
    $x0 = COPY %2(s64)
...

---
# Check that we can obtain constants from other basic blocks.
name:            xor_constant_n1_s32_gpr_2bb
legalized:       true
regBankSelected: true

registers:
  - { id: 0, class: gpr }
  - { id: 1, class: gpr }
  - { id: 2, class: gpr }


body:             |
  ; CHECK-LABEL: name: xor_constant_n1_s32_gpr_2bb
  ; CHECK: bb.0:
  ; CHECK:   successors: %bb.1(0x80000000)
  ; CHECK:   B %bb.1
  ; CHECK: bb.1:
  ; CHECK:   [[COPY:%[0-9]+]]:gpr32 = COPY $w0
  ; CHECK:   [[ORNWrr:%[0-9]+]]:gpr32 = ORNWrr $wzr, [[COPY]]
  ; CHECK:   $w0 = COPY [[ORNWrr]]
  bb.0:
    liveins: $w0, $w1
    successors: %bb.1
    %1(s32) = G_CONSTANT i32 -1
    G_BR %bb.1
  bb.1:
    %0(s32) = COPY $w0
    %2(s32) = G_XOR %0, %1
    $w0 = COPY %2(s32)
...