# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass machine-combiner -verify-machineinstrs  -o - %s | FileCheck %s

---
name:            madd_addwi
alignment:       4
tracksRegLiveness: true
body:             |
  bb.0.entry:
    liveins: $w0, $w1

    ; CHECK-LABEL: name: madd_addwi
    ; CHECK: liveins: $w0, $w1
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
    ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = nsw MOVi32imm 79
    ; CHECK-NEXT: [[MADDWrrr:%[0-9]+]]:gpr32common = nsw MADDWrrr [[COPY1]], [[COPY]], [[MOVi32imm]]
    ; CHECK-NEXT: $w0 = COPY [[MADDWrrr]]
    ; CHECK-NEXT: RET_ReallyLR implicit $w0
    %0:gpr32 = COPY $w0
    %1:gpr32 = COPY $w1
    %2:gpr32common = nsw MADDWrrr %1:gpr32, %0:gpr32, $wzr
    %3:gpr32sp = nsw ADDWri killed %2:gpr32common, 79, 0
    $w0 = COPY %3:gpr32sp
    RET_ReallyLR implicit $w0
...
---
name:            madd_addxi
alignment:       4
tracksRegLiveness: true
body:             |
  bb.0.entry:
    liveins: $x0, $x1

    ; CHECK-LABEL: name: madd_addxi
    ; CHECK: liveins: $x0, $x1
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
    ; CHECK-NEXT: [[MOVi64imm:%[0-9]+]]:gpr64 = nsw MOVi64imm 79
    ; CHECK-NEXT: [[MADDXrrr:%[0-9]+]]:gpr64common = nsw MADDXrrr [[COPY1]], [[COPY]], [[MOVi64imm]]
    ; CHECK-NEXT: $x0 = COPY [[MADDXrrr]]
    ; CHECK-NEXT: RET_ReallyLR implicit $x0
    %0:gpr64 = COPY $x0
    %1:gpr64 = COPY $x1
    %2:gpr64common = nsw MADDXrrr %1:gpr64, %0:gpr64, $xzr
    %3:gpr64sp = nsw ADDXri killed %2:gpr64common, 79, 0
    $x0 = COPY %3:gpr64sp
    RET_ReallyLR implicit $x0
...
---
name:            madd_subwi
alignment:       4
tracksRegLiveness: true
body:             |
  bb.0.entry:
    liveins: $w0, $w1

    ; CHECK-LABEL: name: madd_subwi
    ; CHECK: liveins: $w0, $w1
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
    ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = nsw MOVi32imm -1
    ; CHECK-NEXT: [[MADDWrrr:%[0-9]+]]:gpr32 = nsw MADDWrrr [[COPY1]], [[COPY]], [[MOVi32imm]]
    ; CHECK-NEXT: $w0 = COPY [[MADDWrrr]]
    ; CHECK-NEXT: RET_ReallyLR implicit $w0
    %0:gpr32 = COPY $w0
    %1:gpr32 = COPY $w1
    %2:gpr32common = nsw MADDWrrr %1:gpr32, %0:gpr32, $wzr
    %3:gpr32 = nsw SUBSWri killed %2:gpr32common, 1, 0, implicit-def dead $nzcv
    $w0 = COPY %3:gpr32
    RET_ReallyLR implicit $w0
...
---
name:            madd_subxi
alignment:       4
tracksRegLiveness: true
body:             |
  bb.0.entry:
    liveins: $x0, $x1

    ; CHECK-LABEL: name: madd_subxi
    ; CHECK: liveins: $x0, $x1
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
    ; CHECK-NEXT: [[MOVi64imm:%[0-9]+]]:gpr64 = nsw MOVi64imm -1
    ; CHECK-NEXT: [[MADDXrrr:%[0-9]+]]:gpr64 = nsw MADDXrrr [[COPY1]], [[COPY]], [[MOVi64imm]]
    ; CHECK-NEXT: $x0 = COPY [[MADDXrrr]]
    ; CHECK-NEXT: RET_ReallyLR implicit $x0
    %0:gpr64 = COPY $x0
    %1:gpr64 = COPY $x1
    %2:gpr64common = nsw MADDXrrr %1:gpr64, %0:gpr64, $xzr
    %3:gpr64 = nsw SUBSXri killed %2:gpr64common, 1, 0, implicit-def dead $nzcv
    $x0 = COPY %3:gpr64
    RET_ReallyLR implicit $x0
...
---
name:            madd_addorwi
alignment:       4
tracksRegLiveness: true
body:             |
  bb.0.entry:
    liveins: $w0, $w1

    ; CHECK-LABEL: name: madd_addorwi
    ; CHECK: liveins: $w0, $w1
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
    ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = nsw MOVi32imm 16773120
    ; CHECK-NEXT: [[MADDWrrr:%[0-9]+]]:gpr32common = nsw MADDWrrr [[COPY1]], [[COPY]], [[MOVi32imm]]
    ; CHECK-NEXT: $w0 = COPY [[MADDWrrr]]
    ; CHECK-NEXT: RET_ReallyLR implicit $w0
    %0:gpr32 = COPY $w0
    %1:gpr32 = COPY $w1
    %2:gpr32common = nsw MADDWrrr %1:gpr32, %0:gpr32, $wzr
    %3:gpr32sp = nsw ADDWri killed %2:gpr32common, 4095, 12
    $w0 = COPY %3:gpr32sp
    RET_ReallyLR implicit $w0
...
---
name:            madd_addorxi
alignment:       4
tracksRegLiveness: true
body:             |
  bb.0.entry:
    liveins: $x0, $x1

    ; CHECK-LABEL: name: madd_addorxi
    ; CHECK: liveins: $x0, $x1
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
    ; CHECK-NEXT: [[MOVi64imm:%[0-9]+]]:gpr64 = nsw MOVi64imm 16773120
    ; CHECK-NEXT: [[MADDXrrr:%[0-9]+]]:gpr64common = nsw MADDXrrr [[COPY1]], [[COPY]], [[MOVi64imm]]
    ; CHECK-NEXT: $x0 = COPY [[MADDXrrr]]
    ; CHECK-NEXT: RET_ReallyLR implicit $x0
    %0:gpr64 = COPY $x0
    %1:gpr64 = COPY $x1
    %2:gpr64common = nsw MADDXrrr %1:gpr64, %0:gpr64, $xzr
    %3:gpr64sp = nsw ADDXri killed %2:gpr64common, 4095, 12
    $x0 = COPY %3:gpr64sp
    RET_ReallyLR implicit $x0
...
