llvm-project/llvm/test/CodeGen/PowerPC/fp128-bitcast-after-operation.ll
Chen Zheng eb7d16ea25 [PowerPC] make expensive mflr be away from its user in the function prologue
mflr is kind of expensive on Power version smaller than 10, so we should
schedule the store for the mflr's def away from mflr.

In epilogue, the expensive mtlr has no user for its def, so it doesn't
matter that the load and the mtlr are back-to-back.

Reviewed By: RolandF

Differential Revision: https://reviews.llvm.org/D137423
2022-11-14 21:14:20 -05:00

244 lines
7.5 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=PPC64-P8,PPC64-P8-LE
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=PPC64,PPC64-LE
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=PPC64-P8,PPC64-P8-BE
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=PPC64,PPC64-BE
; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s -check-prefix=PPC32
define i128 @test_abs(ppc_fp128 %x) nounwind {
; PPC64-P8-LABEL: test_abs:
; PPC64-P8: # %bb.0: # %entry
; PPC64-P8-NEXT: mffprd 3, 1
; PPC64-P8-NEXT: mffprd 4, 2
; PPC64-P8-NEXT: rldicr 5, 3, 0, 0
; PPC64-P8-NEXT: xor 3, 3, 5
; PPC64-P8-NEXT: xor 4, 4, 5
; PPC64-P8-NEXT: blr
;
; PPC64-LABEL: test_abs:
; PPC64: # %bb.0: # %entry
; PPC64-NEXT: stfd 1, -16(1)
; PPC64-NEXT: stfd 2, -8(1)
; PPC64-NEXT: ld 3, -16(1)
; PPC64-NEXT: ld 4, -8(1)
; PPC64-NEXT: rldicr 5, 3, 0, 0
; PPC64-NEXT: xor 3, 3, 5
; PPC64-NEXT: xor 4, 4, 5
; PPC64-NEXT: blr
;
; PPC32-LABEL: test_abs:
; PPC32: # %bb.0: # %entry
; PPC32-NEXT: stwu 1, -32(1)
; PPC32-NEXT: stfd 1, 24(1)
; PPC32-NEXT: stfd 2, 16(1)
; PPC32-NEXT: lwz 3, 24(1)
; PPC32-NEXT: lwz 5, 16(1)
; PPC32-NEXT: rlwinm 7, 3, 0, 0, 0
; PPC32-NEXT: lwz 4, 28(1)
; PPC32-NEXT: xor 3, 3, 7
; PPC32-NEXT: lwz 6, 20(1)
; PPC32-NEXT: xor 5, 5, 7
; PPC32-NEXT: addi 1, 1, 32
; PPC32-NEXT: blr
entry:
%0 = tail call ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128 %x)
%1 = bitcast ppc_fp128 %0 to i128
ret i128 %1
}
define i128 @test_neg(ppc_fp128 %x) nounwind {
; PPC64-P8-LABEL: test_neg:
; PPC64-P8: # %bb.0: # %entry
; PPC64-P8-NEXT: li 3, 1
; PPC64-P8-NEXT: mffprd 4, 2
; PPC64-P8-NEXT: mffprd 5, 1
; PPC64-P8-NEXT: rldic 6, 3, 63, 0
; PPC64-P8-NEXT: xor 4, 4, 6
; PPC64-P8-NEXT: xor 3, 5, 6
; PPC64-P8-NEXT: blr
;
; PPC64-LABEL: test_neg:
; PPC64: # %bb.0: # %entry
; PPC64-NEXT: stfd 2, -8(1)
; PPC64-NEXT: stfd 1, -16(1)
; PPC64-NEXT: li 3, 1
; PPC64-NEXT: ld 4, -8(1)
; PPC64-NEXT: ld 5, -16(1)
; PPC64-NEXT: rldic 6, 3, 63, 0
; PPC64-NEXT: xor 3, 5, 6
; PPC64-NEXT: xor 4, 4, 6
; PPC64-NEXT: blr
;
; PPC32-LABEL: test_neg:
; PPC32: # %bb.0: # %entry
; PPC32-NEXT: stwu 1, -32(1)
; PPC32-NEXT: stfd 1, 24(1)
; PPC32-NEXT: stfd 2, 16(1)
; PPC32-NEXT: lwz 5, 16(1)
; PPC32-NEXT: lwz 3, 24(1)
; PPC32-NEXT: lwz 4, 28(1)
; PPC32-NEXT: xoris 5, 5, 32768
; PPC32-NEXT: lwz 6, 20(1)
; PPC32-NEXT: xoris 3, 3, 32768
; PPC32-NEXT: addi 1, 1, 32
; PPC32-NEXT: blr
entry:
%0 = fsub ppc_fp128 0xM80000000000000000000000000000000, %x
%1 = bitcast ppc_fp128 %0 to i128
ret i128 %1
}
define i128 @test_copysign(ppc_fp128 %x, ppc_fp128 %y) nounwind {
; PPC64-P8-LE-LABEL: test_copysign:
; PPC64-P8-LE: # %bb.0: # %entry
; PPC64-P8-LE-NEXT: mflr 0
; PPC64-P8-LE-NEXT: stdu 1, -32(1)
; PPC64-P8-LE-NEXT: std 0, 48(1)
; PPC64-P8-LE-NEXT: bl copysignl
; PPC64-P8-LE-NEXT: nop
; PPC64-P8-LE-NEXT: mffprd 3, 1
; PPC64-P8-LE-NEXT: mffprd 4, 2
; PPC64-P8-LE-NEXT: addi 1, 1, 32
; PPC64-P8-LE-NEXT: ld 0, 16(1)
; PPC64-P8-LE-NEXT: mtlr 0
; PPC64-P8-LE-NEXT: blr
;
; PPC64-LE-LABEL: test_copysign:
; PPC64-LE: # %bb.0: # %entry
; PPC64-LE-NEXT: mflr 0
; PPC64-LE-NEXT: stdu 1, -48(1)
; PPC64-LE-NEXT: std 0, 64(1)
; PPC64-LE-NEXT: bl copysignl
; PPC64-LE-NEXT: nop
; PPC64-LE-NEXT: stfd 1, 32(1)
; PPC64-LE-NEXT: stfd 2, 40(1)
; PPC64-LE-NEXT: ld 3, 32(1)
; PPC64-LE-NEXT: ld 4, 40(1)
; PPC64-LE-NEXT: addi 1, 1, 48
; PPC64-LE-NEXT: ld 0, 16(1)
; PPC64-LE-NEXT: mtlr 0
; PPC64-LE-NEXT: blr
;
; PPC64-P8-BE-LABEL: test_copysign:
; PPC64-P8-BE: # %bb.0: # %entry
; PPC64-P8-BE-NEXT: mflr 0
; PPC64-P8-BE-NEXT: stdu 1, -112(1)
; PPC64-P8-BE-NEXT: std 0, 128(1)
; PPC64-P8-BE-NEXT: bl copysignl
; PPC64-P8-BE-NEXT: nop
; PPC64-P8-BE-NEXT: mffprd 3, 1
; PPC64-P8-BE-NEXT: mffprd 4, 2
; PPC64-P8-BE-NEXT: addi 1, 1, 112
; PPC64-P8-BE-NEXT: ld 0, 16(1)
; PPC64-P8-BE-NEXT: mtlr 0
; PPC64-P8-BE-NEXT: blr
;
; PPC64-BE-LABEL: test_copysign:
; PPC64-BE: # %bb.0: # %entry
; PPC64-BE-NEXT: mflr 0
; PPC64-BE-NEXT: stdu 1, -128(1)
; PPC64-BE-NEXT: std 0, 144(1)
; PPC64-BE-NEXT: bl copysignl
; PPC64-BE-NEXT: nop
; PPC64-BE-NEXT: stfd 1, 112(1)
; PPC64-BE-NEXT: stfd 2, 120(1)
; PPC64-BE-NEXT: ld 3, 112(1)
; PPC64-BE-NEXT: ld 4, 120(1)
; PPC64-BE-NEXT: addi 1, 1, 128
; PPC64-BE-NEXT: ld 0, 16(1)
; PPC64-BE-NEXT: mtlr 0
; PPC64-BE-NEXT: blr
;
; PPC32-LABEL: test_copysign:
; PPC32: # %bb.0: # %entry
; PPC32-NEXT: mflr 0
; PPC32-NEXT: stwu 1, -96(1)
; PPC32-NEXT: stw 0, 100(1)
; PPC32-NEXT: stfd 1, 40(1)
; PPC32-NEXT: lwz 3, 44(1)
; PPC32-NEXT: stfd 2, 32(1)
; PPC32-NEXT: stw 3, 60(1)
; PPC32-NEXT: lwz 3, 40(1)
; PPC32-NEXT: stfd 3, 72(1)
; PPC32-NEXT: stw 3, 56(1)
; PPC32-NEXT: lwz 3, 36(1)
; PPC32-NEXT: stfd 4, 64(1)
; PPC32-NEXT: stw 3, 52(1)
; PPC32-NEXT: lwz 3, 32(1)
; PPC32-NEXT: lfd 1, 56(1)
; PPC32-NEXT: stw 3, 48(1)
; PPC32-NEXT: lwz 3, 76(1)
; PPC32-NEXT: lfd 2, 48(1)
; PPC32-NEXT: stw 3, 92(1)
; PPC32-NEXT: lwz 3, 72(1)
; PPC32-NEXT: stw 3, 88(1)
; PPC32-NEXT: lwz 3, 68(1)
; PPC32-NEXT: lfd 3, 88(1)
; PPC32-NEXT: stw 3, 84(1)
; PPC32-NEXT: lwz 3, 64(1)
; PPC32-NEXT: stw 3, 80(1)
; PPC32-NEXT: lfd 4, 80(1)
; PPC32-NEXT: bl copysignl
; PPC32-NEXT: stfd 1, 16(1)
; PPC32-NEXT: stfd 2, 24(1)
; PPC32-NEXT: lwz 3, 16(1)
; PPC32-NEXT: lwz 4, 20(1)
; PPC32-NEXT: lwz 5, 24(1)
; PPC32-NEXT: lwz 6, 28(1)
; PPC32-NEXT: lwz 0, 100(1)
; PPC32-NEXT: addi 1, 1, 96
; PPC32-NEXT: mtlr 0
; PPC32-NEXT: blr
entry:
%0 = tail call ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128 %x, ppc_fp128 %y)
%1 = bitcast ppc_fp128 %0 to i128
ret i128 %1
}
define i128 @test_copysign_const(ppc_fp128 %x) nounwind {
; PPC64-P8-LABEL: test_copysign_const:
; PPC64-P8: # %bb.0: # %entry
; PPC64-P8-NEXT: mffprd 3, 1
; PPC64-P8-NEXT: li 4, 16399
; PPC64-P8-NEXT: li 5, 3019
; PPC64-P8-NEXT: rldicr 6, 3, 0, 0
; PPC64-P8-NEXT: rldic 3, 4, 48, 1
; PPC64-P8-NEXT: rldic 4, 5, 52, 0
; PPC64-P8-NEXT: or 3, 6, 3
; PPC64-P8-NEXT: xor 4, 6, 4
; PPC64-P8-NEXT: blr
;
; PPC64-LABEL: test_copysign_const:
; PPC64: # %bb.0: # %entry
; PPC64-NEXT: stfd 1, -8(1)
; PPC64-NEXT: li 4, 16399
; PPC64-NEXT: li 5, 3019
; PPC64-NEXT: ld 3, -8(1)
; PPC64-NEXT: rldicr 6, 3, 0, 0
; PPC64-NEXT: rldic 3, 4, 48, 1
; PPC64-NEXT: rldic 4, 5, 52, 0
; PPC64-NEXT: or 3, 6, 3
; PPC64-NEXT: xor 4, 6, 4
; PPC64-NEXT: blr
;
; PPC32-LABEL: test_copysign_const:
; PPC32: # %bb.0: # %entry
; PPC32-NEXT: stwu 1, -32(1)
; PPC32-NEXT: stfd 1, 24(1)
; PPC32-NEXT: li 6, 0
; PPC32-NEXT: lwz 3, 24(1)
; PPC32-NEXT: rlwinm 4, 3, 0, 0, 0
; PPC32-NEXT: oris 3, 4, 16399
; PPC32-NEXT: xoris 5, 4, 48304
; PPC32-NEXT: li 4, 0
; PPC32-NEXT: addi 1, 1, 32
; PPC32-NEXT: blr
entry:
%0 = tail call ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128 0xM400F000000000000BCB0000000000000, ppc_fp128 %x)
%1 = bitcast ppc_fp128 %0 to i128
ret i128 %1
}
declare ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128)
declare ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128, ppc_fp128)