diff --git a/llvm/test/CodeGen/PowerPC/memset-tail.ll b/llvm/test/CodeGen/PowerPC/memset-tail.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/memset-tail.ll @@ -0,0 +1,366 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -verify-machineinstrs -mcpu=pwr8 \ +; RUN: -mtriple=powerpc64-unknown-aix < %s | FileCheck %s --check-prefix=P8-BE +; RUN: llc -verify-machineinstrs -mcpu=pwr9 \ +; RUN: -mtriple=powerpc64-unknown-aix < %s | FileCheck %s --check-prefix=P9-BE +; RUN: llc -verify-machineinstrs -mcpu=pwr10 \ +; RUN: -mtriple=powerpc64-unknown-aix < %s | FileCheck %s --check-prefix=P10-BE +; RUN: llc -verify-machineinstrs -mcpu=pwr8 \ +; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s --check-prefix=P8-LE +; RUN: llc -verify-machineinstrs -mcpu=pwr9 \ +; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s --check-prefix=P9-LE +; RUN: llc -verify-machineinstrs -mcpu=pwr10 \ +; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s --check-prefix=P10-LE + +define dso_local void @memsetTail8(ptr nocapture noundef writeonly %p) local_unnamed_addr { +; P8-BE-LABEL: memsetTail8: +; P8-BE: # %bb.0: # %entry +; P8-BE-NEXT: vspltisb 2, 15 +; P8-BE-NEXT: lis 4, 3855 +; P8-BE-NEXT: ori 4, 4, 3855 +; P8-BE-NEXT: rldimi 4, 4, 32, 0 +; P8-BE-NEXT: stxvw4x 34, 0, 3 +; P8-BE-NEXT: std 4, 16(3) +; P8-BE-NEXT: blr +; +; P9-BE-LABEL: memsetTail8: +; P9-BE: # %bb.0: # %entry +; P9-BE-NEXT: lis 4, 3855 +; P9-BE-NEXT: xxspltib 0, 15 +; P9-BE-NEXT: ori 4, 4, 3855 +; P9-BE-NEXT: stxv 0, 0(3) +; P9-BE-NEXT: rldimi 4, 4, 32, 0 +; P9-BE-NEXT: std 4, 16(3) +; P9-BE-NEXT: blr +; +; P10-BE-LABEL: memsetTail8: +; P10-BE: # %bb.0: # %entry +; P10-BE-NEXT: pli 4, 252645135 +; P10-BE-NEXT: rldimi 4, 4, 32, 0 +; P10-BE-NEXT: std 4, 16(3) +; P10-BE-NEXT: xxspltib 0, 15 +; P10-BE-NEXT: stxv 0, 0(3) +; P10-BE-NEXT: blr +; +; P8-LE-LABEL: memsetTail8: +; P8-LE: # %bb.0: # %entry +; P8-LE-NEXT: lis 4, 3855 +; P8-LE-NEXT: vspltisb 2, 15 +; P8-LE-NEXT: ori 4, 4, 3855 +; P8-LE-NEXT: rldimi 4, 4, 32, 0 +; P8-LE-NEXT: std 4, 16(3) +; P8-LE-NEXT: stxvd2x 34, 0, 3 +; P8-LE-NEXT: blr +; +; P9-LE-LABEL: memsetTail8: +; P9-LE: # %bb.0: # %entry +; P9-LE-NEXT: lis 4, 3855 +; P9-LE-NEXT: xxspltib 0, 15 +; P9-LE-NEXT: ori 4, 4, 3855 +; P9-LE-NEXT: stxv 0, 0(3) +; P9-LE-NEXT: rldimi 4, 4, 32, 0 +; P9-LE-NEXT: std 4, 16(3) +; P9-LE-NEXT: blr +; +; P10-LE-LABEL: memsetTail8: +; P10-LE: # %bb.0: # %entry +; P10-LE-NEXT: pli 4, 252645135 +; P10-LE-NEXT: rldimi 4, 4, 32, 0 +; P10-LE-NEXT: std 4, 16(3) +; P10-LE-NEXT: xxspltib 0, 15 +; P10-LE-NEXT: stxv 0, 0(3) +; P10-LE-NEXT: blr +entry: + tail call void @llvm.memset.p0.i64(ptr %p, i8 15, i64 24, i1 false) + ret void +} + +define dso_local void @memsetTail7(ptr nocapture noundef writeonly %p) local_unnamed_addr { +; P8-BE-LABEL: memsetTail7: +; P8-BE: # %bb.0: # %entry +; P8-BE-NEXT: lis 4, 3855 +; P8-BE-NEXT: vspltisb 2, 15 +; P8-BE-NEXT: li 5, 15 +; P8-BE-NEXT: ori 4, 4, 3855 +; P8-BE-NEXT: rldimi 4, 4, 32, 0 +; P8-BE-NEXT: stdx 4, 3, 5 +; P8-BE-NEXT: stxvw4x 34, 0, 3 +; P8-BE-NEXT: blr +; +; P9-BE-LABEL: memsetTail7: +; P9-BE: # %bb.0: # %entry +; P9-BE-NEXT: lis 4, 3855 +; P9-BE-NEXT: li 5, 15 +; P9-BE-NEXT: ori 4, 4, 3855 +; P9-BE-NEXT: rldimi 4, 4, 32, 0 +; P9-BE-NEXT: stdx 4, 3, 5 +; P9-BE-NEXT: xxspltib 0, 15 +; P9-BE-NEXT: stxv 0, 0(3) +; P9-BE-NEXT: blr +; +; P10-BE-LABEL: memsetTail7: +; P10-BE: # %bb.0: # %entry +; P10-BE-NEXT: pli 4, 252645135 +; P10-BE-NEXT: rldimi 4, 4, 32, 0 +; P10-BE-NEXT: pstd 4, 15(3), 0 +; P10-BE-NEXT: xxspltib 0, 15 +; P10-BE-NEXT: stxv 0, 0(3) +; P10-BE-NEXT: blr +; +; P8-LE-LABEL: memsetTail7: +; P8-LE: # %bb.0: # %entry +; P8-LE-NEXT: lis 4, 3855 +; P8-LE-NEXT: vspltisb 2, 15 +; P8-LE-NEXT: li 5, 15 +; P8-LE-NEXT: ori 4, 4, 3855 +; P8-LE-NEXT: rldimi 4, 4, 32, 0 +; P8-LE-NEXT: stdx 4, 3, 5 +; P8-LE-NEXT: stxvd2x 34, 0, 3 +; P8-LE-NEXT: blr +; +; P9-LE-LABEL: memsetTail7: +; P9-LE: # %bb.0: # %entry +; P9-LE-NEXT: lis 4, 3855 +; P9-LE-NEXT: li 5, 15 +; P9-LE-NEXT: ori 4, 4, 3855 +; P9-LE-NEXT: rldimi 4, 4, 32, 0 +; P9-LE-NEXT: stdx 4, 3, 5 +; P9-LE-NEXT: xxspltib 0, 15 +; P9-LE-NEXT: stxv 0, 0(3) +; P9-LE-NEXT: blr +; +; P10-LE-LABEL: memsetTail7: +; P10-LE: # %bb.0: # %entry +; P10-LE-NEXT: pli 4, 252645135 +; P10-LE-NEXT: rldimi 4, 4, 32, 0 +; P10-LE-NEXT: pstd 4, 15(3), 0 +; P10-LE-NEXT: xxspltib 0, 15 +; P10-LE-NEXT: stxv 0, 0(3) +; P10-LE-NEXT: blr +entry: + tail call void @llvm.memset.p0.i64(ptr %p, i8 15, i64 23, i1 false) + ret void +} + +define dso_local void @memsetTail4(ptr nocapture noundef writeonly %p) local_unnamed_addr { +; P8-BE-LABEL: memsetTail4: +; P8-BE: # %bb.0: # %entry +; P8-BE-NEXT: vspltisb 2, 15 +; P8-BE-NEXT: lis 4, 3855 +; P8-BE-NEXT: ori 4, 4, 3855 +; P8-BE-NEXT: stw 4, 16(3) +; P8-BE-NEXT: stxvw4x 34, 0, 3 +; P8-BE-NEXT: blr +; +; P9-BE-LABEL: memsetTail4: +; P9-BE: # %bb.0: # %entry +; P9-BE-NEXT: lis 4, 3855 +; P9-BE-NEXT: ori 4, 4, 3855 +; P9-BE-NEXT: stw 4, 16(3) +; P9-BE-NEXT: xxspltib 0, 15 +; P9-BE-NEXT: stxv 0, 0(3) +; P9-BE-NEXT: blr +; +; P10-BE-LABEL: memsetTail4: +; P10-BE: # %bb.0: # %entry +; P10-BE-NEXT: pli 4, 252645135 +; P10-BE-NEXT: stw 4, 16(3) +; P10-BE-NEXT: xxspltib 0, 15 +; P10-BE-NEXT: stxv 0, 0(3) +; P10-BE-NEXT: blr +; +; P8-LE-LABEL: memsetTail4: +; P8-LE: # %bb.0: # %entry +; P8-LE-NEXT: vspltisb 2, 15 +; P8-LE-NEXT: lis 4, 3855 +; P8-LE-NEXT: ori 4, 4, 3855 +; P8-LE-NEXT: stw 4, 16(3) +; P8-LE-NEXT: stxvd2x 34, 0, 3 +; P8-LE-NEXT: blr +; +; P9-LE-LABEL: memsetTail4: +; P9-LE: # %bb.0: # %entry +; P9-LE-NEXT: lis 4, 3855 +; P9-LE-NEXT: ori 4, 4, 3855 +; P9-LE-NEXT: stw 4, 16(3) +; P9-LE-NEXT: xxspltib 0, 15 +; P9-LE-NEXT: stxv 0, 0(3) +; P9-LE-NEXT: blr +; +; P10-LE-LABEL: memsetTail4: +; P10-LE: # %bb.0: # %entry +; P10-LE-NEXT: pli 4, 252645135 +; P10-LE-NEXT: stw 4, 16(3) +; P10-LE-NEXT: xxspltib 0, 15 +; P10-LE-NEXT: stxv 0, 0(3) +; P10-LE-NEXT: blr +entry: + tail call void @llvm.memset.p0.i32(ptr %p, i8 15, i32 20, i1 false) + ret void +} + +define dso_local void @memsetTail3(ptr nocapture noundef writeonly %p) local_unnamed_addr { +; P8-BE-LABEL: memsetTail3: +; P8-BE: # %bb.0: # %entry +; P8-BE-NEXT: vspltisb 2, 15 +; P8-BE-NEXT: lis 4, 3855 +; P8-BE-NEXT: ori 4, 4, 3855 +; P8-BE-NEXT: stxvw4x 34, 0, 3 +; P8-BE-NEXT: stw 4, 15(3) +; P8-BE-NEXT: blr +; +; P9-BE-LABEL: memsetTail3: +; P9-BE: # %bb.0: # %entry +; P9-BE-NEXT: lis 4, 3855 +; P9-BE-NEXT: ori 4, 4, 3855 +; P9-BE-NEXT: stw 4, 15(3) +; P9-BE-NEXT: xxspltib 0, 15 +; P9-BE-NEXT: stxv 0, 0(3) +; P9-BE-NEXT: blr +; +; P10-BE-LABEL: memsetTail3: +; P10-BE: # %bb.0: # %entry +; P10-BE-NEXT: pli 4, 252645135 +; P10-BE-NEXT: stw 4, 15(3) +; P10-BE-NEXT: xxspltib 0, 15 +; P10-BE-NEXT: stxv 0, 0(3) +; P10-BE-NEXT: blr +; +; P8-LE-LABEL: memsetTail3: +; P8-LE: # %bb.0: # %entry +; P8-LE-NEXT: vspltisb 2, 15 +; P8-LE-NEXT: lis 4, 3855 +; P8-LE-NEXT: ori 4, 4, 3855 +; P8-LE-NEXT: stw 4, 15(3) +; P8-LE-NEXT: stxvd2x 34, 0, 3 +; P8-LE-NEXT: blr +; +; P9-LE-LABEL: memsetTail3: +; P9-LE: # %bb.0: # %entry +; P9-LE-NEXT: lis 4, 3855 +; P9-LE-NEXT: ori 4, 4, 3855 +; P9-LE-NEXT: stw 4, 15(3) +; P9-LE-NEXT: xxspltib 0, 15 +; P9-LE-NEXT: stxv 0, 0(3) +; P9-LE-NEXT: blr +; +; P10-LE-LABEL: memsetTail3: +; P10-LE: # %bb.0: # %entry +; P10-LE-NEXT: pli 4, 252645135 +; P10-LE-NEXT: stw 4, 15(3) +; P10-LE-NEXT: xxspltib 0, 15 +; P10-LE-NEXT: stxv 0, 0(3) +; P10-LE-NEXT: blr +entry: + tail call void @llvm.memset.p0.i64(ptr %p, i8 15, i64 19, i1 false) + ret void +} + +define dso_local void @memsetTail2(ptr nocapture noundef writeonly %p) local_unnamed_addr { +; P8-BE-LABEL: memsetTail2: +; P8-BE: # %bb.0: # %entry +; P8-BE-NEXT: xxleqv 0, 0, 0 +; P8-BE-NEXT: li 4, -1 +; P8-BE-NEXT: sth 4, 16(3) +; P8-BE-NEXT: stxvw4x 0, 0, 3 +; P8-BE-NEXT: blr +; +; P9-BE-LABEL: memsetTail2: +; P9-BE: # %bb.0: # %entry +; P9-BE-NEXT: li 4, -1 +; P9-BE-NEXT: xxleqv 0, 0, 0 +; P9-BE-NEXT: sth 4, 16(3) +; P9-BE-NEXT: stxv 0, 0(3) +; P9-BE-NEXT: blr +; +; P10-BE-LABEL: memsetTail2: +; P10-BE: # %bb.0: # %entry +; P10-BE-NEXT: li 4, -1 +; P10-BE-NEXT: xxleqv 0, 0, 0 +; P10-BE-NEXT: sth 4, 16(3) +; P10-BE-NEXT: stxv 0, 0(3) +; P10-BE-NEXT: blr +; +; P8-LE-LABEL: memsetTail2: +; P8-LE: # %bb.0: # %entry +; P8-LE-NEXT: xxleqv 0, 0, 0 +; P8-LE-NEXT: li 4, -1 +; P8-LE-NEXT: sth 4, 16(3) +; P8-LE-NEXT: stxvd2x 0, 0, 3 +; P8-LE-NEXT: blr +; +; P9-LE-LABEL: memsetTail2: +; P9-LE: # %bb.0: # %entry +; P9-LE-NEXT: li 4, -1 +; P9-LE-NEXT: xxleqv 0, 0, 0 +; P9-LE-NEXT: sth 4, 16(3) +; P9-LE-NEXT: stxv 0, 0(3) +; P9-LE-NEXT: blr +; +; P10-LE-LABEL: memsetTail2: +; P10-LE: # %bb.0: # %entry +; P10-LE-NEXT: li 4, -1 +; P10-LE-NEXT: xxleqv 0, 0, 0 +; P10-LE-NEXT: sth 4, 16(3) +; P10-LE-NEXT: stxv 0, 0(3) +; P10-LE-NEXT: blr +entry: + tail call void @llvm.memset.p0.i64(ptr %p, i8 -1, i64 18, i1 false) + ret void +} + +define dso_local void @memsetTail1(ptr nocapture noundef writeonly %p) local_unnamed_addr { +; P8-BE-LABEL: memsetTail1: +; P8-BE: # %bb.0: # %entry +; P8-BE-NEXT: xxleqv 0, 0, 0 +; P8-BE-NEXT: li 4, -1 +; P8-BE-NEXT: stb 4, 16(3) +; P8-BE-NEXT: stxvw4x 0, 0, 3 +; P8-BE-NEXT: blr +; +; P9-BE-LABEL: memsetTail1: +; P9-BE: # %bb.0: # %entry +; P9-BE-NEXT: li 4, -1 +; P9-BE-NEXT: xxleqv 0, 0, 0 +; P9-BE-NEXT: stb 4, 16(3) +; P9-BE-NEXT: stxv 0, 0(3) +; P9-BE-NEXT: blr +; +; P10-BE-LABEL: memsetTail1: +; P10-BE: # %bb.0: # %entry +; P10-BE-NEXT: li 4, -1 +; P10-BE-NEXT: xxleqv 0, 0, 0 +; P10-BE-NEXT: stb 4, 16(3) +; P10-BE-NEXT: stxv 0, 0(3) +; P10-BE-NEXT: blr +; +; P8-LE-LABEL: memsetTail1: +; P8-LE: # %bb.0: # %entry +; P8-LE-NEXT: xxleqv 0, 0, 0 +; P8-LE-NEXT: li 4, -1 +; P8-LE-NEXT: stb 4, 16(3) +; P8-LE-NEXT: stxvd2x 0, 0, 3 +; P8-LE-NEXT: blr +; +; P9-LE-LABEL: memsetTail1: +; P9-LE: # %bb.0: # %entry +; P9-LE-NEXT: li 4, -1 +; P9-LE-NEXT: xxleqv 0, 0, 0 +; P9-LE-NEXT: stb 4, 16(3) +; P9-LE-NEXT: stxv 0, 0(3) +; P9-LE-NEXT: blr +; +; P10-LE-LABEL: memsetTail1: +; P10-LE: # %bb.0: # %entry +; P10-LE-NEXT: li 4, -1 +; P10-LE-NEXT: xxleqv 0, 0, 0 +; P10-LE-NEXT: stb 4, 16(3) +; P10-LE-NEXT: stxv 0, 0(3) +; P10-LE-NEXT: blr +entry: + tail call void @llvm.memset.p0.i64(ptr %p, i8 -1, i64 17, i1 false) + ret void +} + +declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1 immarg) +declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)