mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
62ad0a5cf3
As noted in the D44909 review, the transform from (fptosi+sitofp) to ftrunc can produce -0.0 where the original code does not: #include <stdio.h> int main(int argc) { float x; x = -0.8 * argc; printf("%f\n", (float)((int)x)); return 0; } $ clang -O0 -mavx fp.c ; ./a.out 0.000000 $ clang -O1 -mavx fp.c ; ./a.out -0.000000 Ideally, we'd use IR/node flags to predicate the transform, but the IR parser doesn't currently allow fast-math-flags on the cast instructions. So for now, just use the function attribute that corresponds to clang's "-fno-signed-zeros" option. Differential Revision: https://reviews.llvm.org/D48085 llvm-svn: 335761
46 lines
1.3 KiB
LLVM
46 lines
1.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs < %s | FileCheck %s
|
|
|
|
define <4 x float> @truncf32(<4 x float> %a) #0 {
|
|
; CHECK-LABEL: truncf32:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: xvrspiz 34, 34
|
|
; CHECK-NEXT: blr
|
|
%t0 = fptosi <4 x float> %a to <4 x i32>
|
|
%t1 = sitofp <4 x i32> %t0 to <4 x float>
|
|
ret <4 x float> %t1
|
|
}
|
|
|
|
define <2 x double> @truncf64(<2 x double> %a) #0 {
|
|
; CHECK-LABEL: truncf64:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: xvrdpiz 34, 34
|
|
; CHECK-NEXT: blr
|
|
%t0 = fptosi <2 x double> %a to <2 x i64>
|
|
%t1 = sitofp <2 x i64> %t0 to <2 x double>
|
|
ret <2 x double> %t1
|
|
}
|
|
|
|
define <4 x float> @truncf32u(<4 x float> %a) #0 {
|
|
; CHECK-LABEL: truncf32u:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: xvrspiz 34, 34
|
|
; CHECK-NEXT: blr
|
|
%t0 = fptoui <4 x float> %a to <4 x i32>
|
|
%t1 = uitofp <4 x i32> %t0 to <4 x float>
|
|
ret <4 x float> %t1
|
|
}
|
|
|
|
define <2 x double> @truncf64u(<2 x double> %a) #0 {
|
|
; CHECK-LABEL: truncf64u:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: xvrdpiz 34, 34
|
|
; CHECK-NEXT: blr
|
|
%t0 = fptoui <2 x double> %a to <2 x i64>
|
|
%t1 = uitofp <2 x i64> %t0 to <2 x double>
|
|
ret <2 x double> %t1
|
|
}
|
|
|
|
attributes #0 = { "no-signed-zeros-fp-math"="true" }
|
|
|