Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[SystemZ][FPEnv] Back-end support for STRICT_[SU]INT_TO_FP
As of b1d8576 there is middle-end support for STRICT_[SU]INT_TO_FP, so this patch adds SystemZ back-end support as well. The patch is SystemZ target specific except for adding SD patterns strict_[su]int_to_fp and any_[su]int_to_fp to TargetSelectionDAG.td as usual.
- Loading branch information
Showing
12 changed files
with
462 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
; Test strict conversions of signed i32s to floating-point values. | ||
; | ||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s | ||
|
||
declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata) | ||
declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata) | ||
declare fp128 @llvm.experimental.constrained.sitofp.f128.i32(i32, metadata, metadata) | ||
|
||
; Check i32->f32. | ||
define float @f1(i32 %i) #0 { | ||
; CHECK-LABEL: f1: | ||
; CHECK: cefbr %f0, %r2 | ||
; CHECK: br %r14 | ||
%conv = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
ret float %conv | ||
} | ||
|
||
; Check i32->f64. | ||
define double @f2(i32 %i) #0 { | ||
; CHECK-LABEL: f2: | ||
; CHECK: cdfbr %f0, %r2 | ||
; CHECK: br %r14 | ||
%conv = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
ret double %conv | ||
} | ||
|
||
; Check i32->f128. | ||
define void @f3(i32 %i, fp128 *%dst) #0 { | ||
; CHECK-LABEL: f3: | ||
; CHECK: cxfbr %f0, %r2 | ||
; CHECK: std %f0, 0(%r3) | ||
; CHECK: std %f2, 8(%r3) | ||
; CHECK: br %r14 | ||
%conv = call fp128 @llvm.experimental.constrained.sitofp.f128.i32(i32 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
store fp128 %conv, fp128 *%dst | ||
ret void | ||
} | ||
|
||
attributes #0 = { strictfp } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
; Test strict conversions of unsigned i32s to floating-point values (z10 only). | ||
; | ||
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s | ||
|
||
declare float @llvm.experimental.constrained.uitofp.f32.i32(i32, metadata, metadata) | ||
declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata) | ||
declare fp128 @llvm.experimental.constrained.uitofp.f128.i32(i32, metadata, metadata) | ||
|
||
; Check i32->f32. There is no native instruction, so we must promote | ||
; to i64 first. | ||
define float @f1(i32 %i) #0 { | ||
; CHECK-LABEL: f1: | ||
; CHECK: llgfr [[REGISTER:%r[0-5]]], %r2 | ||
; CHECK: cegbr %f0, [[REGISTER]] | ||
; CHECK: br %r14 | ||
%conv = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
ret float %conv | ||
} | ||
|
||
; Check i32->f64. | ||
define double @f2(i32 %i) #0 { | ||
; CHECK-LABEL: f2: | ||
; CHECK: llgfr [[REGISTER:%r[0-5]]], %r2 | ||
; CHECK: cdgbr %f0, [[REGISTER]] | ||
; CHECK: br %r14 | ||
%conv = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
ret double %conv | ||
} | ||
|
||
; Check i32->f128. | ||
define void @f3(i32 %i, fp128 *%dst) #0 { | ||
; CHECK-LABEL: f3: | ||
; CHECK: llgfr [[REGISTER:%r[0-5]]], %r2 | ||
; CHECK: cxgbr %f0, [[REGISTER]] | ||
; CHECK: std %f0, 0(%r3) | ||
; CHECK: std %f2, 8(%r3) | ||
; CHECK: br %r14 | ||
%conv = call fp128 @llvm.experimental.constrained.uitofp.f128.i32(i32 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
store fp128 %conv, fp128 *%dst | ||
ret void | ||
} | ||
|
||
attributes #0 = { strictfp } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
; Test strict conversions of signed i64s to floating-point values. | ||
; | ||
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s | ||
|
||
declare float @llvm.experimental.constrained.sitofp.f32.i64(i64, metadata, metadata) | ||
declare double @llvm.experimental.constrained.sitofp.f64.i64(i64, metadata, metadata) | ||
declare fp128 @llvm.experimental.constrained.sitofp.f128.i64(i64, metadata, metadata) | ||
|
||
; Test i64->f32. | ||
define float @f1(i64 %i) #0 { | ||
; CHECK-LABEL: f1: | ||
; CHECK: cegbr %f0, %r2 | ||
; CHECK: br %r14 | ||
%conv = call float @llvm.experimental.constrained.sitofp.f32.i64(i64 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
ret float %conv | ||
} | ||
|
||
; Test i64->f64. | ||
define double @f2(i64 %i) #0 { | ||
; CHECK-LABEL: f2: | ||
; CHECK: cdgbr %f0, %r2 | ||
; CHECK: br %r14 | ||
%conv = call double @llvm.experimental.constrained.sitofp.f64.i64(i64 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
ret double %conv | ||
} | ||
|
||
; Test i64->f128. | ||
define void @f3(i64 %i, fp128 *%dst) #0 { | ||
; CHECK-LABEL: f3: | ||
; CHECK: cxgbr %f0, %r2 | ||
; CHECK: std %f0, 0(%r3) | ||
; CHECK: std %f2, 8(%r3) | ||
; CHECK: br %r14 | ||
%conv = call fp128 @llvm.experimental.constrained.sitofp.f128.i64(i64 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
store fp128 %conv, fp128 *%dst | ||
ret void | ||
} | ||
|
||
attributes #0 = { strictfp } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
; Test strict conversions of unsigned i64s to floating-point values (z10 only). | ||
; | ||
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s | ||
|
||
declare float @llvm.experimental.constrained.uitofp.f32.i64(i64, metadata, metadata) | ||
declare double @llvm.experimental.constrained.uitofp.f64.i64(i64, metadata, metadata) | ||
declare fp128 @llvm.experimental.constrained.uitofp.f128.i64(i64, metadata, metadata) | ||
|
||
; Test i64->f32. There's no native support for unsigned i64-to-fp conversions, | ||
; but we should be able to implement them using signed i64-to-fp conversions. | ||
define float @f1(i64 %i) #0 { | ||
; CHECK-LABEL: f1: | ||
; CHECK: cegbr | ||
; CHECK: aebr | ||
; CHECK: br %r14 | ||
%conv = call float @llvm.experimental.constrained.uitofp.f32.i64(i64 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
ret float %conv | ||
} | ||
|
||
; Test i64->f64. | ||
define double @f2(i64 %i) #0 { | ||
; CHECK-LABEL: f2: | ||
; CHECK: ldgr | ||
; CHECK: adbr | ||
; CHECK: br %r14 | ||
%conv = call double @llvm.experimental.constrained.uitofp.f64.i64(i64 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
ret double %conv | ||
} | ||
|
||
; Test i64->f128. | ||
define void @f3(i64 %i, fp128 *%dst) #0 { | ||
; CHECK-LABEL: f3: | ||
; CHECK: cxgbr | ||
; CHECK: axbr | ||
; CHECK: br %r14 | ||
%conv = call fp128 @llvm.experimental.constrained.uitofp.f128.i64(i64 %i, | ||
metadata !"round.dynamic", | ||
metadata !"fpexcept.strict") #0 | ||
store fp128 %conv, fp128 *%dst | ||
ret void | ||
} | ||
|
||
attributes #0 = { strictfp } |
Oops, something went wrong.