x64: Lower fcopysign, ceil, floor, nearest, and trunc in ISLE (#4730)
https://github.com/bytecodealliance/wasmtime/pull/4730
This commit is contained in:
@@ -3332,3 +3332,97 @@
|
||||
|
||||
(rule (lower (has_type $F64 (bitcast src @ (value_type $I64))))
|
||||
(bitcast_gpr_to_xmm $I64 src))
|
||||
|
||||
;; Rules for `fcopysign` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type $F32 (fcopysign a @ (value_type $F32) b)))
|
||||
(let ((sign_bit Xmm (imm $F32 0x80000000)))
|
||||
(x64_orps
|
||||
(x64_andnps sign_bit a)
|
||||
(x64_andps sign_bit b))))
|
||||
|
||||
(rule (lower (has_type $F64 (fcopysign a @ (value_type $F64) b)))
|
||||
(let ((sign_bit Xmm (imm $F64 0x8000000000000000)))
|
||||
(x64_orpd
|
||||
(x64_andnpd sign_bit a)
|
||||
(x64_andpd sign_bit b))))
|
||||
|
||||
;; Rules for `ceil` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type (use_sse41) (ceil a @ (value_type $F32))))
|
||||
(x64_roundss a (RoundImm.RoundUp)))
|
||||
|
||||
(rule (lower (ceil a @ (value_type $F32)))
|
||||
(libcall_1 (LibCall.CeilF32) a))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (ceil a @ (value_type $F64))))
|
||||
(x64_roundsd a (RoundImm.RoundUp)))
|
||||
|
||||
(rule (lower (ceil a @ (value_type $F64)))
|
||||
(libcall_1 (LibCall.CeilF64) a))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (ceil a @ (value_type $F32X4))))
|
||||
(x64_roundps a (RoundImm.RoundUp)))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (ceil a @ (value_type $F64X2))))
|
||||
(x64_roundpd a (RoundImm.RoundUp)))
|
||||
|
||||
;; Rules for `floor` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type (use_sse41) (floor a @ (value_type $F32))))
|
||||
(x64_roundss a (RoundImm.RoundDown)))
|
||||
|
||||
(rule (lower (floor a @ (value_type $F32)))
|
||||
(libcall_1 (LibCall.FloorF32) a))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (floor a @ (value_type $F64))))
|
||||
(x64_roundsd a (RoundImm.RoundDown)))
|
||||
|
||||
(rule (lower (floor a @ (value_type $F64)))
|
||||
(libcall_1 (LibCall.FloorF64) a))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (floor a @ (value_type $F32X4))))
|
||||
(x64_roundps a (RoundImm.RoundDown)))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (floor a @ (value_type $F64X2))))
|
||||
(x64_roundpd a (RoundImm.RoundDown)))
|
||||
|
||||
;; Rules for `nearest` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type (use_sse41) (nearest a @ (value_type $F32))))
|
||||
(x64_roundss a (RoundImm.RoundNearest)))
|
||||
|
||||
(rule (lower (nearest a @ (value_type $F32)))
|
||||
(libcall_1 (LibCall.NearestF32) a))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (nearest a @ (value_type $F64))))
|
||||
(x64_roundsd a (RoundImm.RoundNearest)))
|
||||
|
||||
(rule (lower (nearest a @ (value_type $F64)))
|
||||
(libcall_1 (LibCall.NearestF64) a))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (nearest a @ (value_type $F32X4))))
|
||||
(x64_roundps a (RoundImm.RoundNearest)))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (nearest a @ (value_type $F64X2))))
|
||||
(x64_roundpd a (RoundImm.RoundNearest)))
|
||||
|
||||
;; Rules for `trunc` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(rule (lower (has_type (use_sse41) (trunc a @ (value_type $F32))))
|
||||
(x64_roundss a (RoundImm.RoundZero)))
|
||||
|
||||
(rule (lower (trunc a @ (value_type $F32)))
|
||||
(libcall_1 (LibCall.TruncF32) a))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (trunc a @ (value_type $F64))))
|
||||
(x64_roundsd a (RoundImm.RoundZero)))
|
||||
|
||||
(rule (lower (trunc a @ (value_type $F64)))
|
||||
(libcall_1 (LibCall.TruncF64) a))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (trunc a @ (value_type $F32X4))))
|
||||
(x64_roundps a (RoundImm.RoundZero)))
|
||||
|
||||
(rule (lower (has_type (use_sse41) (trunc a @ (value_type $F64X2))))
|
||||
(x64_roundpd a (RoundImm.RoundZero)))
|
||||
|
||||
Reference in New Issue
Block a user