; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,NDD ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,+prefer-ndd-imm -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,IMM,IMMONLY ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,+prefer-ndd-mem -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,MEM,MEMONLY ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,+prefer-ndd-imm,+prefer-ndd-mem -verify-machineinstrs | FileCheck %s --check-prefixes=CHECK,IMM,MEM,BOTH ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -verify-machineinstrs | FileCheck --check-prefix=NF %s ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ndd,nf -x86-enable-apx-for-relocation=true -verify-machineinstrs | FileCheck --check-prefix=NF %s define i8 @dec8r(i8 noundef %a) { ; CHECK-LABEL: dec8r: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: decb %dil, %al ; CHECK-NEXT: retq ; ; NF-LABEL: dec8r: ; NF: # %bb.0: # %entry ; NF-NEXT: {nf} decb %dil, %al ; NF-NEXT: retq entry: %dec = sub i8 %a, 1 ret i8 %dec } define i16 @dec16r(i16 noundef %a) { ; CHECK-LABEL: dec16r: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: decw %di, %ax ; CHECK-NEXT: retq ; ; NF-LABEL: dec16r: ; NF: # %bb.0: # %entry ; NF-NEXT: {nf} decw %di, %ax ; NF-NEXT: retq entry: %dec = sub i16 %a, 1 ret i16 %dec } define i32 @dec32r(i32 noundef %a) { ; CHECK-LABEL: dec32r: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: decl %edi, %eax ; CHECK-NEXT: retq ; ; NF-LABEL: dec32r: ; NF: # %bb.0: # %entry ; NF-NEXT: {nf} decl %edi, %eax ; NF-NEXT: retq entry: %dec = sub i32 %a, 1 ret i32 %dec } define i64 @dec64r(i64 noundef %a) { ; NDD-LABEL: dec64r: ; NDD: # %bb.0: # %entry ; NDD-NEXT: leaq -1(%rdi), %rax ; NDD-NEXT: retq ; ; IMM-LABEL: dec64r: ; IMM: # %bb.0: # %entry ; IMM-NEXT: decq %rdi, %rax ; IMM-NEXT: retq ; ; MEMONLY-LABEL: dec64r: ; MEMONLY: # %bb.0: # %entry ; MEMONLY-NEXT: leaq -1(%rdi), %rax ; MEMONLY-NEXT: retq ; ; NF-LABEL: dec64r: ; NF: # %bb.0: # %entry ; NF-NEXT: leaq -1(%rdi), %rax ; NF-NEXT: retq entry: %dec = sub i64 %a, 1 ret i64 %dec } define i8 @dec8m(ptr %ptr) { ; NDD-LABEL: dec8m: ; NDD: # %bb.0: # %entry ; NDD-NEXT: movzbl (%rdi), %eax ; NDD-NEXT: decb %al ; NDD-NEXT: retq ; ; IMMONLY-LABEL: dec8m: ; IMMONLY: # %bb.0: # %entry ; IMMONLY-NEXT: movzbl (%rdi), %eax ; IMMONLY-NEXT: decb %al ; IMMONLY-NEXT: retq ; ; MEM-LABEL: dec8m: ; MEM: # %bb.0: # %entry ; MEM-NEXT: decb (%rdi), %al ; MEM-NEXT: retq ; ; NF-LABEL: dec8m: ; NF: # %bb.0: # %entry ; NF-NEXT: movzbl (%rdi), %eax ; NF-NEXT: decb %al ; NF-NEXT: retq entry: %a = load i8, ptr %ptr %dec = sub i8 %a, 1 ret i8 %dec } define i16 @dec16m(ptr %ptr) { ; NDD-LABEL: dec16m: ; NDD: # %bb.0: # %entry ; NDD-NEXT: movzwl (%rdi), %eax ; NDD-NEXT: decw %ax ; NDD-NEXT: retq ; ; IMMONLY-LABEL: dec16m: ; IMMONLY: # %bb.0: # %entry ; IMMONLY-NEXT: movzwl (%rdi), %eax ; IMMONLY-NEXT: decw %ax ; IMMONLY-NEXT: retq ; ; MEM-LABEL: dec16m: ; MEM: # %bb.0: # %entry ; MEM-NEXT: decw (%rdi), %ax ; MEM-NEXT: retq ; ; NF-LABEL: dec16m: ; NF: # %bb.0: # %entry ; NF-NEXT: movzwl (%rdi), %eax ; NF-NEXT: decw %ax ; NF-NEXT: retq entry: %a = load i16, ptr %ptr %dec = sub i16 %a, 1 ret i16 %dec } define i32 @dec32m(ptr %ptr) { ; NDD-LABEL: dec32m: ; NDD: # %bb.0: # %entry ; NDD-NEXT: movl (%rdi), %eax ; NDD-NEXT: decl %eax ; NDD-NEXT: retq ; ; IMMONLY-LABEL: dec32m: ; IMMONLY: # %bb.0: # %entry ; IMMONLY-NEXT: movl (%rdi), %eax ; IMMONLY-NEXT: decl %eax ; IMMONLY-NEXT: retq ; ; MEM-LABEL: dec32m: ; MEM: # %bb.0: # %entry ; MEM-NEXT: decl (%rdi), %eax ; MEM-NEXT: retq ; ; NF-LABEL: dec32m: ; NF: # %bb.0: # %entry ; NF-NEXT: movl (%rdi), %eax ; NF-NEXT: decl %eax ; NF-NEXT: retq entry: %a = load i32, ptr %ptr %dec = sub i32 %a, 1 ret i32 %dec } define i64 @dec64m(ptr %ptr) { ; NDD-LABEL: dec64m: ; NDD: # %bb.0: # %entry ; NDD-NEXT: movq (%rdi), %rax ; NDD-NEXT: decq %rax ; NDD-NEXT: retq ; ; IMMONLY-LABEL: dec64m: ; IMMONLY: # %bb.0: # %entry ; IMMONLY-NEXT: movq (%rdi), %rax ; IMMONLY-NEXT: decq %rax ; IMMONLY-NEXT: retq ; ; MEMONLY-LABEL: dec64m: ; MEMONLY: # %bb.0: # %entry ; MEMONLY-NEXT: movq (%rdi), %rax ; MEMONLY-NEXT: decq %rax ; MEMONLY-NEXT: retq ; ; BOTH-LABEL: dec64m: ; BOTH: # %bb.0: # %entry ; BOTH-NEXT: decq (%rdi), %rax ; BOTH-NEXT: retq ; ; NF-LABEL: dec64m: ; NF: # %bb.0: # %entry ; NF-NEXT: movq (%rdi), %rax ; NF-NEXT: decq %rax ; NF-NEXT: retq entry: %a = load i64, ptr %ptr %dec = sub i64 %a, 1 ret i64 %dec } define void @dec8m_legacy(ptr %ptr) { ; CHECK-LABEL: dec8m_legacy: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: decb (%rdi) ; CHECK-NEXT: retq ; ; NF-LABEL: dec8m_legacy: ; NF: # %bb.0: # %entry ; NF-NEXT: decb (%rdi) ; NF-NEXT: retq entry: %a = load i8, ptr %ptr %dec = sub i8 %a, 1 store i8 %dec, ptr %ptr ret void } define void @dec16m_legacy(ptr %ptr) { ; CHECK-LABEL: dec16m_legacy: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: decw (%rdi) ; CHECK-NEXT: retq ; ; NF-LABEL: dec16m_legacy: ; NF: # %bb.0: # %entry ; NF-NEXT: decw (%rdi) ; NF-NEXT: retq entry: %a = load i16, ptr %ptr %dec = sub i16 %a, 1 store i16 %dec, ptr %ptr ret void } define void @dec32m_legacy(ptr %ptr) { ; CHECK-LABEL: dec32m_legacy: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: decl (%rdi) ; CHECK-NEXT: retq ; ; NF-LABEL: dec32m_legacy: ; NF: # %bb.0: # %entry ; NF-NEXT: decl (%rdi) ; NF-NEXT: retq entry: %a = load i32, ptr %ptr %dec = sub i32 %a, 1 store i32 %dec, ptr %ptr ret void } define void @dec64m_legacy(ptr %ptr) { ; CHECK-LABEL: dec64m_legacy: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: decq (%rdi) ; CHECK-NEXT: retq ; ; NF-LABEL: dec64m_legacy: ; NF: # %bb.0: # %entry ; NF-NEXT: decq (%rdi) ; NF-NEXT: retq entry: %a = load i64, ptr %ptr %dec = sub i64 %a, 1 store i64 %dec, ptr %ptr ret void }