x64: Migrate selectif and selectif_spectre_guard to ISLE (#4619)
https://github.com/bytecodealliance/wasmtime/pull/4619
This commit is contained in:
@@ -3140,7 +3140,6 @@
|
||||
(ConsumesFlags.ConsumesFlagsSideEffect
|
||||
(MInst.JmpTableSeq idx tmp1 tmp2 default_target jt_targets)))))
|
||||
|
||||
|
||||
;;;; Comparisons ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(type IcmpCondResult (enum (Condition (producer ProducesFlags) (cc CC))))
|
||||
@@ -3157,6 +3156,19 @@
|
||||
(rule (lower_icmp_bool (IcmpCondResult.Condition producer cc))
|
||||
(with_flags producer (x64_setcc cc)))
|
||||
|
||||
;; Emit a conditional move based on the result of an icmp.
|
||||
(decl select_icmp (IcmpCondResult Value Value) ValueRegs)
|
||||
|
||||
;; Ensure that we put the `x` argument into a register for single-register
|
||||
;; gpr-typed arguments, as we rely on this for the legalization of heap_addr and
|
||||
;; loading easily computed constants (like 0) from memory is too expensive.
|
||||
(rule (select_icmp (IcmpCondResult.Condition producer cc) x @ (value_type (is_gpr_type (is_single_register_type ty))) y)
|
||||
(with_flags producer (cmove ty cc (put_in_gpr x) y)))
|
||||
|
||||
;; Otherwise, fall back on the behavior of `cmove_from_values`.
|
||||
(rule (select_icmp (IcmpCondResult.Condition producer cc) x @ (value_type ty) y)
|
||||
(with_flags producer (cmove_from_values ty cc x y)))
|
||||
|
||||
(decl emit_cmp (IntCC Value Value) IcmpCondResult)
|
||||
|
||||
;; For GPR-held values we only need to emit `CMP + SETCC`. We rely here on
|
||||
|
||||
Reference in New Issue
Block a user