; PC64LE-LABEL: constrained_vector_ceil_v1f32:
; PC64LE: # %bb.0: # %entry
; PC64LE-NEXT: addis 3, 2, .LCPI103_0@toc@ha
-; PC64LE-NEXT: lfs 0, .LCPI103_0@toc@l(3)
-; PC64LE-NEXT: xsrdpip 0, 0
-; PC64LE-NEXT: xscvdpspn 0, 0
-; PC64LE-NEXT: xxsldwi 34, 0, 0, 1
+; PC64LE-NEXT: addi 3, 3, .LCPI103_0@toc@l
+; PC64LE-NEXT: lfiwzx 0, 0, 3
+; PC64LE-NEXT: xxpermdi 34, 0, 0, 2
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_ceil_v1f32:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI103_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI103_0@toc@l(3)
-; PC64LE9-NEXT: xsrdpip 0, 0
-; PC64LE9-NEXT: xscvdpspn 0, 0
-; PC64LE9-NEXT: xxsldwi 34, 0, 0, 1
+; PC64LE9-NEXT: addi 3, 3, .LCPI103_0@toc@l
+; PC64LE9-NEXT: lfiwzx 0, 0, 3
+; PC64LE9-NEXT: xxpermdi 34, 0, 0, 2
; PC64LE9-NEXT: blr
entry:
%ceil = call <1 x float> @llvm.experimental.constrained.ceil.v1f32(
; PC64LE-NEXT: addis 3, 2, .LCPI104_0@toc@ha
; PC64LE-NEXT: addi 3, 3, .LCPI104_0@toc@l
; PC64LE-NEXT: lxvd2x 0, 0, 3
-; PC64LE-NEXT: xxswapd 0, 0
-; PC64LE-NEXT: xvrdpip 34, 0
+; PC64LE-NEXT: xxswapd 34, 0
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_ceil_v2f64:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI104_0@toc@ha
; PC64LE9-NEXT: addi 3, 3, .LCPI104_0@toc@l
-; PC64LE9-NEXT: lxvx 0, 0, 3
-; PC64LE9-NEXT: xvrdpip 34, 0
+; PC64LE9-NEXT: lxvx 34, 0, 3
; PC64LE9-NEXT: blr
entry:
%ceil = call <2 x double> @llvm.experimental.constrained.ceil.v2f64(
define <3 x float> @constrained_vector_ceil_v3f32() #0 {
; PC64LE-LABEL: constrained_vector_ceil_v3f32:
; PC64LE: # %bb.0: # %entry
-; PC64LE-NEXT: addis 3, 2, .LCPI105_2@toc@ha
-; PC64LE-NEXT: addis 4, 2, .LCPI105_1@toc@ha
-; PC64LE-NEXT: lfs 0, .LCPI105_2@toc@l(3)
-; PC64LE-NEXT: lfs 1, .LCPI105_1@toc@l(4)
; PC64LE-NEXT: addis 3, 2, .LCPI105_0@toc@ha
-; PC64LE-NEXT: xsrdpip 0, 0
-; PC64LE-NEXT: lfs 2, .LCPI105_0@toc@l(3)
-; PC64LE-NEXT: addis 3, 2, .LCPI105_3@toc@ha
-; PC64LE-NEXT: xsrdpip 1, 1
-; PC64LE-NEXT: addi 3, 3, .LCPI105_3@toc@l
-; PC64LE-NEXT: xsrdpip 2, 2
-; PC64LE-NEXT: xscvdpspn 0, 0
-; PC64LE-NEXT: xscvdpspn 1, 1
-; PC64LE-NEXT: xxsldwi 34, 0, 0, 1
-; PC64LE-NEXT: xscvdpspn 0, 2
-; PC64LE-NEXT: xxsldwi 35, 1, 1, 1
-; PC64LE-NEXT: vmrglw 2, 3, 2
-; PC64LE-NEXT: lvx 3, 0, 3
-; PC64LE-NEXT: xxsldwi 36, 0, 0, 1
-; PC64LE-NEXT: vperm 2, 4, 2, 3
+; PC64LE-NEXT: addi 3, 3, .LCPI105_0@toc@l
+; PC64LE-NEXT: lvx 2, 0, 3
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_ceil_v3f32:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI105_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI105_0@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI105_1@toc@ha
-; PC64LE9-NEXT: lfs 1, .LCPI105_1@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI105_2@toc@ha
-; PC64LE9-NEXT: xsrdpip 0, 0
-; PC64LE9-NEXT: lfs 2, .LCPI105_2@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI105_3@toc@ha
-; PC64LE9-NEXT: addi 3, 3, .LCPI105_3@toc@l
-; PC64LE9-NEXT: xsrdpip 1, 1
-; PC64LE9-NEXT: xsrdpip 2, 2
-; PC64LE9-NEXT: xscvdpspn 0, 0
-; PC64LE9-NEXT: xscvdpspn 1, 1
-; PC64LE9-NEXT: xscvdpspn 2, 2
-; PC64LE9-NEXT: xxsldwi 36, 0, 0, 1
-; PC64LE9-NEXT: xxsldwi 35, 1, 1, 1
-; PC64LE9-NEXT: xxsldwi 34, 2, 2, 1
-; PC64LE9-NEXT: vmrglw 2, 3, 2
-; PC64LE9-NEXT: lxvx 35, 0, 3
-; PC64LE9-NEXT: vperm 2, 4, 2, 3
+; PC64LE9-NEXT: addi 3, 3, .LCPI105_0@toc@l
+; PC64LE9-NEXT: lxvx 34, 0, 3
; PC64LE9-NEXT: blr
entry:
%ceil = call <3 x float> @llvm.experimental.constrained.ceil.v3f32(
define <3 x double> @constrained_vector_ceil_v3f64() #0 {
; PC64LE-LABEL: constrained_vector_ceil_v3f64:
; PC64LE: # %bb.0: # %entry
-; PC64LE-NEXT: addis 3, 2, .LCPI106_1@toc@ha
-; PC64LE-NEXT: addi 3, 3, .LCPI106_1@toc@l
-; PC64LE-NEXT: lxvd2x 0, 0, 3
; PC64LE-NEXT: addis 3, 2, .LCPI106_0@toc@ha
; PC64LE-NEXT: lfs 1, .LCPI106_0@toc@l(3)
-; PC64LE-NEXT: xxswapd 0, 0
-; PC64LE-NEXT: xsrdpip 3, 1
-; PC64LE-NEXT: xvrdpip 2, 0
-; PC64LE-NEXT: xxswapd 1, 2
-; PC64LE-NEXT: # kill: def $f2 killed $f2 killed $vsl2
-; PC64LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
+; PC64LE-NEXT: fmr 2, 1
+; PC64LE-NEXT: fmr 3, 1
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_ceil_v3f64:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI106_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI106_0@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI106_1@toc@ha
-; PC64LE9-NEXT: addi 3, 3, .LCPI106_1@toc@l
-; PC64LE9-NEXT: xsrdpip 3, 0
-; PC64LE9-NEXT: lxvx 0, 0, 3
-; PC64LE9-NEXT: xvrdpip 2, 0
-; PC64LE9-NEXT: xxswapd 1, 2
-; PC64LE9-NEXT: # kill: def $f1 killed $f1 killed $vsl1
-; PC64LE9-NEXT: # kill: def $f2 killed $f2 killed $vsl2
+; PC64LE9-NEXT: lfs 1, .LCPI106_0@toc@l(3)
+; PC64LE9-NEXT: fmr 2, 1
+; PC64LE9-NEXT: fmr 3, 1
; PC64LE9-NEXT: blr
entry:
%ceil = call <3 x double> @llvm.experimental.constrained.ceil.v3f64(
; PC64LE-LABEL: constrained_vector_floor_v1f32:
; PC64LE: # %bb.0: # %entry
; PC64LE-NEXT: addis 3, 2, .LCPI107_0@toc@ha
-; PC64LE-NEXT: lfs 0, .LCPI107_0@toc@l(3)
-; PC64LE-NEXT: xsrdpim 0, 0
-; PC64LE-NEXT: xscvdpspn 0, 0
-; PC64LE-NEXT: xxsldwi 34, 0, 0, 1
+; PC64LE-NEXT: addi 3, 3, .LCPI107_0@toc@l
+; PC64LE-NEXT: lfiwzx 0, 0, 3
+; PC64LE-NEXT: xxpermdi 34, 0, 0, 2
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_floor_v1f32:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI107_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI107_0@toc@l(3)
-; PC64LE9-NEXT: xsrdpim 0, 0
-; PC64LE9-NEXT: xscvdpspn 0, 0
-; PC64LE9-NEXT: xxsldwi 34, 0, 0, 1
+; PC64LE9-NEXT: addi 3, 3, .LCPI107_0@toc@l
+; PC64LE9-NEXT: lfiwzx 0, 0, 3
+; PC64LE9-NEXT: xxpermdi 34, 0, 0, 2
; PC64LE9-NEXT: blr
entry:
%floor = call <1 x float> @llvm.experimental.constrained.floor.v1f32(
; PC64LE-NEXT: addis 3, 2, .LCPI108_0@toc@ha
; PC64LE-NEXT: addi 3, 3, .LCPI108_0@toc@l
; PC64LE-NEXT: lxvd2x 0, 0, 3
-; PC64LE-NEXT: xxswapd 0, 0
-; PC64LE-NEXT: xvrdpim 34, 0
+; PC64LE-NEXT: xxswapd 34, 0
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_floor_v2f64:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI108_0@toc@ha
; PC64LE9-NEXT: addi 3, 3, .LCPI108_0@toc@l
-; PC64LE9-NEXT: lxvx 0, 0, 3
-; PC64LE9-NEXT: xvrdpim 34, 0
+; PC64LE9-NEXT: lxvx 34, 0, 3
; PC64LE9-NEXT: blr
entry:
%floor = call <2 x double> @llvm.experimental.constrained.floor.v2f64(
define <3 x float> @constrained_vector_floor_v3f32() #0 {
; PC64LE-LABEL: constrained_vector_floor_v3f32:
; PC64LE: # %bb.0: # %entry
-; PC64LE-NEXT: addis 3, 2, .LCPI109_2@toc@ha
-; PC64LE-NEXT: addis 4, 2, .LCPI109_1@toc@ha
-; PC64LE-NEXT: lfs 0, .LCPI109_2@toc@l(3)
-; PC64LE-NEXT: lfs 1, .LCPI109_1@toc@l(4)
; PC64LE-NEXT: addis 3, 2, .LCPI109_0@toc@ha
-; PC64LE-NEXT: xsrdpim 0, 0
-; PC64LE-NEXT: lfs 2, .LCPI109_0@toc@l(3)
-; PC64LE-NEXT: addis 3, 2, .LCPI109_3@toc@ha
-; PC64LE-NEXT: xsrdpim 1, 1
-; PC64LE-NEXT: addi 3, 3, .LCPI109_3@toc@l
-; PC64LE-NEXT: xsrdpim 2, 2
-; PC64LE-NEXT: xscvdpspn 0, 0
-; PC64LE-NEXT: xscvdpspn 1, 1
-; PC64LE-NEXT: xxsldwi 34, 0, 0, 1
-; PC64LE-NEXT: xscvdpspn 0, 2
-; PC64LE-NEXT: xxsldwi 35, 1, 1, 1
-; PC64LE-NEXT: vmrglw 2, 3, 2
-; PC64LE-NEXT: lvx 3, 0, 3
-; PC64LE-NEXT: xxsldwi 36, 0, 0, 1
-; PC64LE-NEXT: vperm 2, 4, 2, 3
+; PC64LE-NEXT: addi 3, 3, .LCPI109_0@toc@l
+; PC64LE-NEXT: lvx 2, 0, 3
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_floor_v3f32:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI109_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI109_0@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI109_1@toc@ha
-; PC64LE9-NEXT: lfs 1, .LCPI109_1@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI109_2@toc@ha
-; PC64LE9-NEXT: xsrdpim 0, 0
-; PC64LE9-NEXT: lfs 2, .LCPI109_2@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI109_3@toc@ha
-; PC64LE9-NEXT: addi 3, 3, .LCPI109_3@toc@l
-; PC64LE9-NEXT: xsrdpim 1, 1
-; PC64LE9-NEXT: xsrdpim 2, 2
-; PC64LE9-NEXT: xscvdpspn 0, 0
-; PC64LE9-NEXT: xscvdpspn 1, 1
-; PC64LE9-NEXT: xscvdpspn 2, 2
-; PC64LE9-NEXT: xxsldwi 36, 0, 0, 1
-; PC64LE9-NEXT: xxsldwi 35, 1, 1, 1
-; PC64LE9-NEXT: xxsldwi 34, 2, 2, 1
-; PC64LE9-NEXT: vmrglw 2, 3, 2
-; PC64LE9-NEXT: lxvx 35, 0, 3
-; PC64LE9-NEXT: vperm 2, 4, 2, 3
+; PC64LE9-NEXT: addi 3, 3, .LCPI109_0@toc@l
+; PC64LE9-NEXT: lxvx 34, 0, 3
; PC64LE9-NEXT: blr
entry:
%floor = call <3 x float> @llvm.experimental.constrained.floor.v3f32(
define <3 x double> @constrained_vector_floor_v3f64() #0 {
; PC64LE-LABEL: constrained_vector_floor_v3f64:
; PC64LE: # %bb.0: # %entry
-; PC64LE-NEXT: addis 3, 2, .LCPI110_1@toc@ha
-; PC64LE-NEXT: addi 3, 3, .LCPI110_1@toc@l
-; PC64LE-NEXT: lxvd2x 0, 0, 3
; PC64LE-NEXT: addis 3, 2, .LCPI110_0@toc@ha
; PC64LE-NEXT: lfs 1, .LCPI110_0@toc@l(3)
-; PC64LE-NEXT: xxswapd 0, 0
-; PC64LE-NEXT: xsrdpim 3, 1
-; PC64LE-NEXT: xvrdpim 2, 0
-; PC64LE-NEXT: xxswapd 1, 2
-; PC64LE-NEXT: # kill: def $f2 killed $f2 killed $vsl2
-; PC64LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
+; PC64LE-NEXT: fmr 2, 1
+; PC64LE-NEXT: fmr 3, 1
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_floor_v3f64:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI110_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI110_0@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI110_1@toc@ha
-; PC64LE9-NEXT: addi 3, 3, .LCPI110_1@toc@l
-; PC64LE9-NEXT: xsrdpim 3, 0
-; PC64LE9-NEXT: lxvx 0, 0, 3
-; PC64LE9-NEXT: xvrdpim 2, 0
-; PC64LE9-NEXT: xxswapd 1, 2
-; PC64LE9-NEXT: # kill: def $f1 killed $f1 killed $vsl1
-; PC64LE9-NEXT: # kill: def $f2 killed $f2 killed $vsl2
+; PC64LE9-NEXT: lfs 1, .LCPI110_0@toc@l(3)
+; PC64LE9-NEXT: fmr 2, 1
+; PC64LE9-NEXT: fmr 3, 1
; PC64LE9-NEXT: blr
entry:
%floor = call <3 x double> @llvm.experimental.constrained.floor.v3f64(
; PC64LE-LABEL: constrained_vector_round_v1f32:
; PC64LE: # %bb.0: # %entry
; PC64LE-NEXT: addis 3, 2, .LCPI111_0@toc@ha
-; PC64LE-NEXT: lfs 0, .LCPI111_0@toc@l(3)
-; PC64LE-NEXT: xsrdpi 0, 0
-; PC64LE-NEXT: xscvdpspn 0, 0
-; PC64LE-NEXT: xxsldwi 34, 0, 0, 1
+; PC64LE-NEXT: addi 3, 3, .LCPI111_0@toc@l
+; PC64LE-NEXT: lfiwzx 0, 0, 3
+; PC64LE-NEXT: xxpermdi 34, 0, 0, 2
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_round_v1f32:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI111_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI111_0@toc@l(3)
-; PC64LE9-NEXT: xsrdpi 0, 0
-; PC64LE9-NEXT: xscvdpspn 0, 0
-; PC64LE9-NEXT: xxsldwi 34, 0, 0, 1
+; PC64LE9-NEXT: addi 3, 3, .LCPI111_0@toc@l
+; PC64LE9-NEXT: lfiwzx 0, 0, 3
+; PC64LE9-NEXT: xxpermdi 34, 0, 0, 2
; PC64LE9-NEXT: blr
entry:
%round = call <1 x float> @llvm.experimental.constrained.round.v1f32(
; PC64LE-NEXT: addis 3, 2, .LCPI112_0@toc@ha
; PC64LE-NEXT: addi 3, 3, .LCPI112_0@toc@l
; PC64LE-NEXT: lxvd2x 0, 0, 3
-; PC64LE-NEXT: xxswapd 0, 0
-; PC64LE-NEXT: xvrdpi 34, 0
+; PC64LE-NEXT: xxswapd 34, 0
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_round_v2f64:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI112_0@toc@ha
; PC64LE9-NEXT: addi 3, 3, .LCPI112_0@toc@l
-; PC64LE9-NEXT: lxvx 0, 0, 3
-; PC64LE9-NEXT: xvrdpi 34, 0
+; PC64LE9-NEXT: lxvx 34, 0, 3
; PC64LE9-NEXT: blr
entry:
%round = call <2 x double> @llvm.experimental.constrained.round.v2f64(
define <3 x float> @constrained_vector_round_v3f32() #0 {
; PC64LE-LABEL: constrained_vector_round_v3f32:
; PC64LE: # %bb.0: # %entry
-; PC64LE-NEXT: addis 3, 2, .LCPI113_2@toc@ha
-; PC64LE-NEXT: addis 4, 2, .LCPI113_1@toc@ha
-; PC64LE-NEXT: lfs 0, .LCPI113_2@toc@l(3)
-; PC64LE-NEXT: lfs 1, .LCPI113_1@toc@l(4)
; PC64LE-NEXT: addis 3, 2, .LCPI113_0@toc@ha
-; PC64LE-NEXT: xsrdpi 0, 0
-; PC64LE-NEXT: lfs 2, .LCPI113_0@toc@l(3)
-; PC64LE-NEXT: addis 3, 2, .LCPI113_3@toc@ha
-; PC64LE-NEXT: xsrdpi 1, 1
-; PC64LE-NEXT: addi 3, 3, .LCPI113_3@toc@l
-; PC64LE-NEXT: xsrdpi 2, 2
-; PC64LE-NEXT: xscvdpspn 0, 0
-; PC64LE-NEXT: xscvdpspn 1, 1
-; PC64LE-NEXT: xxsldwi 34, 0, 0, 1
-; PC64LE-NEXT: xscvdpspn 0, 2
-; PC64LE-NEXT: xxsldwi 35, 1, 1, 1
-; PC64LE-NEXT: vmrglw 2, 3, 2
-; PC64LE-NEXT: lvx 3, 0, 3
-; PC64LE-NEXT: xxsldwi 36, 0, 0, 1
-; PC64LE-NEXT: vperm 2, 4, 2, 3
+; PC64LE-NEXT: addi 3, 3, .LCPI113_0@toc@l
+; PC64LE-NEXT: lvx 2, 0, 3
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_round_v3f32:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI113_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI113_0@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI113_1@toc@ha
-; PC64LE9-NEXT: lfs 1, .LCPI113_1@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI113_2@toc@ha
-; PC64LE9-NEXT: xsrdpi 0, 0
-; PC64LE9-NEXT: lfs 2, .LCPI113_2@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI113_3@toc@ha
-; PC64LE9-NEXT: addi 3, 3, .LCPI113_3@toc@l
-; PC64LE9-NEXT: xsrdpi 1, 1
-; PC64LE9-NEXT: xsrdpi 2, 2
-; PC64LE9-NEXT: xscvdpspn 0, 0
-; PC64LE9-NEXT: xscvdpspn 1, 1
-; PC64LE9-NEXT: xscvdpspn 2, 2
-; PC64LE9-NEXT: xxsldwi 36, 0, 0, 1
-; PC64LE9-NEXT: xxsldwi 35, 1, 1, 1
-; PC64LE9-NEXT: xxsldwi 34, 2, 2, 1
-; PC64LE9-NEXT: vmrglw 2, 3, 2
-; PC64LE9-NEXT: lxvx 35, 0, 3
-; PC64LE9-NEXT: vperm 2, 4, 2, 3
+; PC64LE9-NEXT: addi 3, 3, .LCPI113_0@toc@l
+; PC64LE9-NEXT: lxvx 34, 0, 3
; PC64LE9-NEXT: blr
entry:
%round = call <3 x float> @llvm.experimental.constrained.round.v3f32(
define <3 x double> @constrained_vector_round_v3f64() #0 {
; PC64LE-LABEL: constrained_vector_round_v3f64:
; PC64LE: # %bb.0: # %entry
-; PC64LE-NEXT: addis 3, 2, .LCPI114_1@toc@ha
-; PC64LE-NEXT: addi 3, 3, .LCPI114_1@toc@l
-; PC64LE-NEXT: lxvd2x 0, 0, 3
+; PC64LE-NEXT: addis 4, 2, .LCPI114_1@toc@ha
; PC64LE-NEXT: addis 3, 2, .LCPI114_0@toc@ha
+; PC64LE-NEXT: lfs 2, .LCPI114_1@toc@l(4)
; PC64LE-NEXT: lfs 1, .LCPI114_0@toc@l(3)
-; PC64LE-NEXT: xxswapd 0, 0
-; PC64LE-NEXT: xsrdpi 3, 1
-; PC64LE-NEXT: xvrdpi 2, 0
-; PC64LE-NEXT: xxswapd 1, 2
-; PC64LE-NEXT: # kill: def $f2 killed $f2 killed $vsl2
-; PC64LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
+; PC64LE-NEXT: fmr 3, 2
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_round_v3f64:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI114_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI114_0@toc@l(3)
+; PC64LE9-NEXT: lfs 1, .LCPI114_0@toc@l(3)
; PC64LE9-NEXT: addis 3, 2, .LCPI114_1@toc@ha
-; PC64LE9-NEXT: addi 3, 3, .LCPI114_1@toc@l
-; PC64LE9-NEXT: xsrdpi 3, 0
-; PC64LE9-NEXT: lxvx 0, 0, 3
-; PC64LE9-NEXT: xvrdpi 2, 0
-; PC64LE9-NEXT: xxswapd 1, 2
-; PC64LE9-NEXT: # kill: def $f1 killed $f1 killed $vsl1
-; PC64LE9-NEXT: # kill: def $f2 killed $f2 killed $vsl2
+; PC64LE9-NEXT: lfs 2, .LCPI114_1@toc@l(3)
+; PC64LE9-NEXT: fmr 3, 2
; PC64LE9-NEXT: blr
entry:
%round = call <3 x double> @llvm.experimental.constrained.round.v3f64(
; PC64LE-LABEL: constrained_vector_trunc_v1f32:
; PC64LE: # %bb.0: # %entry
; PC64LE-NEXT: addis 3, 2, .LCPI115_0@toc@ha
-; PC64LE-NEXT: lfs 0, .LCPI115_0@toc@l(3)
-; PC64LE-NEXT: xsrdpiz 0, 0
-; PC64LE-NEXT: xscvdpspn 0, 0
-; PC64LE-NEXT: xxsldwi 34, 0, 0, 1
+; PC64LE-NEXT: addi 3, 3, .LCPI115_0@toc@l
+; PC64LE-NEXT: lfiwzx 0, 0, 3
+; PC64LE-NEXT: xxpermdi 34, 0, 0, 2
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_trunc_v1f32:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI115_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI115_0@toc@l(3)
-; PC64LE9-NEXT: xsrdpiz 0, 0
-; PC64LE9-NEXT: xscvdpspn 0, 0
-; PC64LE9-NEXT: xxsldwi 34, 0, 0, 1
+; PC64LE9-NEXT: addi 3, 3, .LCPI115_0@toc@l
+; PC64LE9-NEXT: lfiwzx 0, 0, 3
+; PC64LE9-NEXT: xxpermdi 34, 0, 0, 2
; PC64LE9-NEXT: blr
entry:
%trunc = call <1 x float> @llvm.experimental.constrained.trunc.v1f32(
; PC64LE-NEXT: addis 3, 2, .LCPI116_0@toc@ha
; PC64LE-NEXT: addi 3, 3, .LCPI116_0@toc@l
; PC64LE-NEXT: lxvd2x 0, 0, 3
-; PC64LE-NEXT: xxswapd 0, 0
-; PC64LE-NEXT: xvrdpiz 34, 0
+; PC64LE-NEXT: xxswapd 34, 0
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_trunc_v2f64:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI116_0@toc@ha
; PC64LE9-NEXT: addi 3, 3, .LCPI116_0@toc@l
-; PC64LE9-NEXT: lxvx 0, 0, 3
-; PC64LE9-NEXT: xvrdpiz 34, 0
+; PC64LE9-NEXT: lxvx 34, 0, 3
; PC64LE9-NEXT: blr
entry:
%trunc = call <2 x double> @llvm.experimental.constrained.trunc.v2f64(
define <3 x float> @constrained_vector_trunc_v3f32() #0 {
; PC64LE-LABEL: constrained_vector_trunc_v3f32:
; PC64LE: # %bb.0: # %entry
-; PC64LE-NEXT: addis 3, 2, .LCPI117_2@toc@ha
-; PC64LE-NEXT: addis 4, 2, .LCPI117_1@toc@ha
-; PC64LE-NEXT: lfs 0, .LCPI117_2@toc@l(3)
-; PC64LE-NEXT: lfs 1, .LCPI117_1@toc@l(4)
; PC64LE-NEXT: addis 3, 2, .LCPI117_0@toc@ha
-; PC64LE-NEXT: xsrdpiz 0, 0
-; PC64LE-NEXT: lfs 2, .LCPI117_0@toc@l(3)
-; PC64LE-NEXT: addis 3, 2, .LCPI117_3@toc@ha
-; PC64LE-NEXT: xsrdpiz 1, 1
-; PC64LE-NEXT: addi 3, 3, .LCPI117_3@toc@l
-; PC64LE-NEXT: xsrdpiz 2, 2
-; PC64LE-NEXT: xscvdpspn 0, 0
-; PC64LE-NEXT: xscvdpspn 1, 1
-; PC64LE-NEXT: xxsldwi 34, 0, 0, 1
-; PC64LE-NEXT: xscvdpspn 0, 2
-; PC64LE-NEXT: xxsldwi 35, 1, 1, 1
-; PC64LE-NEXT: vmrglw 2, 3, 2
-; PC64LE-NEXT: lvx 3, 0, 3
-; PC64LE-NEXT: xxsldwi 36, 0, 0, 1
-; PC64LE-NEXT: vperm 2, 4, 2, 3
+; PC64LE-NEXT: addi 3, 3, .LCPI117_0@toc@l
+; PC64LE-NEXT: lvx 2, 0, 3
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_trunc_v3f32:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI117_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI117_0@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI117_1@toc@ha
-; PC64LE9-NEXT: lfs 1, .LCPI117_1@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI117_2@toc@ha
-; PC64LE9-NEXT: xsrdpiz 0, 0
-; PC64LE9-NEXT: lfs 2, .LCPI117_2@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI117_3@toc@ha
-; PC64LE9-NEXT: addi 3, 3, .LCPI117_3@toc@l
-; PC64LE9-NEXT: xsrdpiz 1, 1
-; PC64LE9-NEXT: xsrdpiz 2, 2
-; PC64LE9-NEXT: xscvdpspn 0, 0
-; PC64LE9-NEXT: xscvdpspn 1, 1
-; PC64LE9-NEXT: xscvdpspn 2, 2
-; PC64LE9-NEXT: xxsldwi 36, 0, 0, 1
-; PC64LE9-NEXT: xxsldwi 35, 1, 1, 1
-; PC64LE9-NEXT: xxsldwi 34, 2, 2, 1
-; PC64LE9-NEXT: vmrglw 2, 3, 2
-; PC64LE9-NEXT: lxvx 35, 0, 3
-; PC64LE9-NEXT: vperm 2, 4, 2, 3
+; PC64LE9-NEXT: addi 3, 3, .LCPI117_0@toc@l
+; PC64LE9-NEXT: lxvx 34, 0, 3
; PC64LE9-NEXT: blr
entry:
%trunc = call <3 x float> @llvm.experimental.constrained.trunc.v3f32(
define <3 x double> @constrained_vector_trunc_v3f64() #0 {
; PC64LE-LABEL: constrained_vector_trunc_v3f64:
; PC64LE: # %bb.0: # %entry
-; PC64LE-NEXT: addis 3, 2, .LCPI118_1@toc@ha
-; PC64LE-NEXT: addi 3, 3, .LCPI118_1@toc@l
-; PC64LE-NEXT: lxvd2x 0, 0, 3
; PC64LE-NEXT: addis 3, 2, .LCPI118_0@toc@ha
; PC64LE-NEXT: lfs 1, .LCPI118_0@toc@l(3)
-; PC64LE-NEXT: xxswapd 0, 0
-; PC64LE-NEXT: xsrdpiz 3, 1
-; PC64LE-NEXT: xvrdpiz 2, 0
-; PC64LE-NEXT: xxswapd 1, 2
-; PC64LE-NEXT: # kill: def $f2 killed $f2 killed $vsl2
-; PC64LE-NEXT: # kill: def $f1 killed $f1 killed $vsl1
+; PC64LE-NEXT: fmr 2, 1
+; PC64LE-NEXT: fmr 3, 1
; PC64LE-NEXT: blr
;
; PC64LE9-LABEL: constrained_vector_trunc_v3f64:
; PC64LE9: # %bb.0: # %entry
; PC64LE9-NEXT: addis 3, 2, .LCPI118_0@toc@ha
-; PC64LE9-NEXT: lfs 0, .LCPI118_0@toc@l(3)
-; PC64LE9-NEXT: addis 3, 2, .LCPI118_1@toc@ha
-; PC64LE9-NEXT: addi 3, 3, .LCPI118_1@toc@l
-; PC64LE9-NEXT: xsrdpiz 3, 0
-; PC64LE9-NEXT: lxvx 0, 0, 3
-; PC64LE9-NEXT: xvrdpiz 2, 0
-; PC64LE9-NEXT: xxswapd 1, 2
-; PC64LE9-NEXT: # kill: def $f1 killed $f1 killed $vsl1
-; PC64LE9-NEXT: # kill: def $f2 killed $f2 killed $vsl2
+; PC64LE9-NEXT: lfs 1, .LCPI118_0@toc@l(3)
+; PC64LE9-NEXT: fmr 2, 1
+; PC64LE9-NEXT: fmr 3, 1
; PC64LE9-NEXT: blr
entry:
%trunc = call <3 x double> @llvm.experimental.constrained.trunc.v3f64(
--- /dev/null
+; RUN: opt < %s -instsimplify -S | FileCheck %s
+
+
+; Verify that floor(10.1) is folded to 10.0 when the exception behavior is 'ignore'.
+define double @floor_01() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.floor.f64(
+ double 1.010000e+01,
+ metadata !"fpexcept.ignore") #0
+ ret double %result
+ ; CHECK-LABEL: @floor_01
+ ; CHECK: ret double 1.000000e+01
+}
+
+; Verify that floor(-10.1) is folded to -11.0 when the exception behavior is not 'ignore'.
+define double @floor_02() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.floor.f64(
+ double -1.010000e+01,
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @floor_02
+ ; CHECK: ret double -1.100000e+01
+}
+
+; Verify that ceil(10.1) is folded to 11.0 when the exception behavior is 'ignore'.
+define double @ceil_01() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.ceil.f64(
+ double 1.010000e+01,
+ metadata !"fpexcept.ignore") #0
+ ret double %result
+ ; CHECK-LABEL: @ceil_01
+ ; CHECK: ret double 1.100000e+01
+}
+
+; Verify that ceil(-10.1) is folded to -10.0 when the exception behavior is not 'ignore'.
+define double @ceil_02() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.ceil.f64(
+ double -1.010000e+01,
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @ceil_02
+ ; CHECK: ret double -1.000000e+01
+}
+
+; Verify that trunc(10.1) is folded to 10.0 when the exception behavior is 'ignore'.
+define double @trunc_01() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.trunc.f64(
+ double 1.010000e+01,
+ metadata !"fpexcept.ignore") #0
+ ret double %result
+ ; CHECK-LABEL: @trunc_01
+ ; CHECK: ret double 1.000000e+01
+}
+
+; Verify that trunc(-10.1) is folded to -10.0 when the exception behavior is NOT 'ignore'.
+define double @trunc_02() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.trunc.f64(
+ double -1.010000e+01,
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @trunc_02
+ ; CHECK: ret double -1.000000e+01
+}
+
+; Verify that round(10.5) is folded to 11.0 when the exception behavior is 'ignore'.
+define double @round_01() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.round.f64(
+ double 1.050000e+01,
+ metadata !"fpexcept.ignore") #0
+ ret double %result
+ ; CHECK-LABEL: @round_01
+ ; CHECK: ret double 1.100000e+01
+}
+
+; Verify that floor(-10.5) is folded to -11.0 when the exception behavior is NOT 'ignore'.
+define double @round_02() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.round.f64(
+ double -1.050000e+01,
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @round_02
+ ; CHECK: ret double -1.100000e+01
+}
+
+; Verify that nearbyint(10.5) is folded to 11.0 when the rounding mode is 'upward'.
+define double @nearbyint_01() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.nearbyint.f64(
+ double 1.050000e+01,
+ metadata !"round.upward",
+ metadata !"fpexcept.ignore") #0
+ ret double %result
+ ; CHECK-LABEL: @nearbyint_01
+ ; CHECK: ret double 1.100000e+01
+}
+
+; Verify that nearbyint(10.5) is folded to 10.0 when the rounding mode is 'downward'.
+define double @nearbyint_02() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.nearbyint.f64(
+ double 1.050000e+01,
+ metadata !"round.downward",
+ metadata !"fpexcept.maytrap") #0
+ ret double %result
+ ; CHECK-LABEL: @nearbyint_02
+ ; CHECK: ret double 1.000000e+01
+}
+
+; Verify that nearbyint(10.5) is folded to 10.0 when the rounding mode is 'towardzero'.
+define double @nearbyint_03() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.nearbyint.f64(
+ double 1.050000e+01,
+ metadata !"round.towardzero",
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @nearbyint_03
+ ; CHECK: ret double 1.000000e+01
+}
+
+; Verify that nearbyint(10.5) is folded to 10.0 when the rounding mode is 'tonearest'.
+define double @nearbyint_04() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.nearbyint.f64(
+ double 1.050000e+01,
+ metadata !"round.tonearest",
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @nearbyint_04
+ ; CHECK: ret double 1.000000e+01
+}
+
+; Verify that nearbyint(10.5) is NOT folded if the rounding mode is 'dynamic'.
+define double @nearbyint_05() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.nearbyint.f64(
+ double 1.050000e+01,
+ metadata !"round.dynamic",
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @nearbyint_05
+ ; CHECK: [[VAL:%.+]] = {{.*}}call double @llvm.experimental.constrained.nearbyint
+ ; CHECK: ret double [[VAL]]
+}
+
+; Verify that trunc(SNAN) is NOT folded if the exception behavior mode is not 'ignore'.
+define double @nonfinite_01() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.trunc.f64(
+ double 0x7ff4000000000000,
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @nonfinite_01
+ ; CHECK: [[VAL:%.+]] = {{.*}}call double @llvm.experimental.constrained.trunc
+ ; CHECK: ret double [[VAL]]
+}
+
+; Verify that trunc(SNAN) is folded to QNAN if the exception behavior mode is 'ignore'.
+define double @nonfinite_02() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.trunc.f64(
+ double 0x7ff4000000000000,
+ metadata !"fpexcept.ignore") #0
+ ret double %result
+ ; CHECK-LABEL: @nonfinite_02
+ ; CHECK: ret double 0x7FF8000000000000
+}
+
+; Verify that trunc(QNAN) is folded even if the exception behavior mode is not 'ignore'.
+define double @nonfinite_03() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.trunc.f64(
+ double 0x7ff8000000000000,
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @nonfinite_03
+ ; CHECK: ret double 0x7FF8000000000000
+}
+
+; Verify that trunc(+Inf) is folded even if the exception behavior mode is not 'ignore'.
+define double @nonfinite_04() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.trunc.f64(
+ double 0x7ff0000000000000,
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @nonfinite_04
+ ; CHECK: ret double 0x7FF0000000000000
+}
+
+; Verify that rint(10) is folded to 10.0 when the rounding mode is 'tonearest'.
+define double @rint_01() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.rint.f64(
+ double 1.000000e+01,
+ metadata !"round.tonearest",
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @rint_01
+ ; CHECK: ret double 1.000000e+01
+}
+
+; Verify that rint(10.1) is NOT folded to 10.0 when the exception behavior is 'strict'.
+define double @rint_02() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.rint.f64(
+ double 1.010000e+01,
+ metadata !"round.tonearest",
+ metadata !"fpexcept.strict") #0
+ ret double %result
+ ; CHECK-LABEL: @rint_02
+ ; CHECK: [[VAL:%.+]] = {{.*}}call double @llvm.experimental.constrained.rint
+ ; CHECK: ret double [[VAL]]
+}
+
+; Verify that rint(10.1) is folded to 10.0 when the exception behavior is not 'strict'.
+define double @rint_03() #0 {
+entry:
+ %result = call double @llvm.experimental.constrained.rint.f64(
+ double 1.010000e+01,
+ metadata !"round.tonearest",
+ metadata !"fpexcept.maytrap") #0
+ ret double %result
+ ; CHECK-LABEL: @rint_03
+ ; CHECK: ret double 1.000000e+01
+}
+
+
+attributes #0 = { strictfp }
+
+declare double @llvm.experimental.constrained.nearbyint.f64(double, metadata, metadata)
+declare double @llvm.experimental.constrained.floor.f64(double, metadata)
+declare double @llvm.experimental.constrained.ceil.f64(double, metadata)
+declare double @llvm.experimental.constrained.trunc.f64(double, metadata)
+declare double @llvm.experimental.constrained.round.f64(double, metadata)
+declare double @llvm.experimental.constrained.rint.f64(double, metadata, metadata)
+