mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-01 21:04:04 -04:00
[WebAssembly] Trapping fptoint builtins and intrinsics
Summary: The WebAssembly backend lowers fptoint instructions to a code sequence that checks for overflow to avoid traps because fptoint is supposed to be speculatable. These new builtins and intrinsics give users a way to depend on the trapping semantics of the underlying instructions and avoid the extra code generated normally. Patch by coffee and tlively. Reviewers: aheejin Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D68902 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374856 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -165,3 +165,83 @@ define i64 @i64_trunc_u_f64(double %x) {
|
||||
%a = fptoui double %x to i64
|
||||
ret i64 %a
|
||||
}
|
||||
|
||||
; CHECK-LABEL: llvm_wasm_trunc_signed_i32_f32:
|
||||
; CHECK-NEXT: .functype llvm_wasm_trunc_signed_i32_f32 (f32) -> (i32)
|
||||
; CHECK-NEXT: i32.trunc_f32_s $push[[L0:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[L0]]{{$}}
|
||||
declare i32 @llvm.wasm.trunc.signed.i32.f32(float)
|
||||
define i32 @llvm_wasm_trunc_signed_i32_f32(float %f) {
|
||||
%a = call i32 @llvm.wasm.trunc.signed.i32.f32(float %f)
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
; CHECK-LABEL: llvm_wasm_trunc_unsigned_i32_f32:
|
||||
; CHECK-NEXT: .functype llvm_wasm_trunc_unsigned_i32_f32 (f32) -> (i32)
|
||||
; CHECK-NEXT: i32.trunc_f32_u $push[[L0:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[L0]]{{$}}
|
||||
declare i32 @llvm.wasm.trunc.unsigned.i32.f32(float)
|
||||
define i32 @llvm_wasm_trunc_unsigned_i32_f32(float %f) {
|
||||
%a = call i32 @llvm.wasm.trunc.unsigned.i32.f32(float %f)
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
; CHECK-LABEL: llvm_wasm_trunc_signed_i32_f64:
|
||||
; CHECK-NEXT: .functype llvm_wasm_trunc_signed_i32_f64 (f64) -> (i32)
|
||||
; CHECK-NEXT: i32.trunc_f64_s $push[[L0:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[L0]]{{$}}
|
||||
declare i32 @llvm.wasm.trunc.signed.i32.f64(double)
|
||||
define i32 @llvm_wasm_trunc_signed_i32_f64(double %f) {
|
||||
%a = call i32 @llvm.wasm.trunc.signed.i32.f64(double %f)
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
; CHECK-LABEL: llvm_wasm_trunc_unsigned_i32_f64:
|
||||
; CHECK-NEXT: .functype llvm_wasm_trunc_unsigned_i32_f64 (f64) -> (i32)
|
||||
; CHECK-NEXT: i32.trunc_f64_u $push[[L0:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[L0]]{{$}}
|
||||
declare i32 @llvm.wasm.trunc.unsigned.i32.f64(double)
|
||||
define i32 @llvm_wasm_trunc_unsigned_i32_f64(double %f) {
|
||||
%a = call i32 @llvm.wasm.trunc.unsigned.i32.f64(double %f)
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
; CHECK-LABEL: llvm_wasm_trunc_signed_i64_f32:
|
||||
; CHECK-NEXT: .functype llvm_wasm_trunc_signed_i64_f32 (f32) -> (i64)
|
||||
; CHECK-NEXT: i64.trunc_f32_s $push[[L0:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[L0]]{{$}}
|
||||
declare i64 @llvm.wasm.trunc.signed.i64.f32(float)
|
||||
define i64 @llvm_wasm_trunc_signed_i64_f32(float %f) {
|
||||
%a = call i64 @llvm.wasm.trunc.signed.i64.f32(float %f)
|
||||
ret i64 %a
|
||||
}
|
||||
|
||||
; CHECK-LABEL: llvm_wasm_trunc_unsigned_i64_f32:
|
||||
; CHECK-NEXT: .functype llvm_wasm_trunc_unsigned_i64_f32 (f32) -> (i64)
|
||||
; CHECK-NEXT: i64.trunc_f32_u $push[[L0:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[L0]]{{$}}
|
||||
declare i64 @llvm.wasm.trunc.unsigned.i64.f32(float)
|
||||
define i64 @llvm_wasm_trunc_unsigned_i64_f32(float %f) {
|
||||
%a = call i64 @llvm.wasm.trunc.unsigned.i64.f32(float %f)
|
||||
ret i64 %a
|
||||
}
|
||||
|
||||
; CHECK-LABEL: llvm_wasm_trunc_signed_i64_f64:
|
||||
; CHECK-NEXT: .functype llvm_wasm_trunc_signed_i64_f64 (f64) -> (i64)
|
||||
; CHECK-NEXT: i64.trunc_f64_s $push[[L0:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[L0]]{{$}}
|
||||
declare i64 @llvm.wasm.trunc.signed.i64.f64(double)
|
||||
define i64 @llvm_wasm_trunc_signed_i64_f64(double %f) {
|
||||
%a = call i64 @llvm.wasm.trunc.signed.i64.f64(double %f)
|
||||
ret i64 %a
|
||||
}
|
||||
|
||||
; CHECK-LABEL: llvm_wasm_trunc_unsigned_i64_f64:
|
||||
; CHECK-NEXT: .functype llvm_wasm_trunc_unsigned_i64_f64 (f64) -> (i64)
|
||||
; CHECK-NEXT: i64.trunc_f64_u $push[[L0:[0-9]+]]=, $0{{$}}
|
||||
; CHECK-NEXT: return $pop[[L0]]{{$}}
|
||||
declare i64 @llvm.wasm.trunc.unsigned.i64.f64(double)
|
||||
define i64 @llvm_wasm_trunc_unsigned_i64_f64(double %f) {
|
||||
%a = call i64 @llvm.wasm.trunc.unsigned.i64.f64(double %f)
|
||||
ret i64 %a
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user