Adds support for legalizing CLZ, CTZ and POPCOUNT on baseline x86_64 targets.
Changes: * Adds a new generic instruction, SELECTIF, that does value selection (a la conditional move) similarly to existing SELECT, except that it is controlled by condition code input and flags-register inputs. * Adds a new Intel x86_64 variant, 'baseline', that supports SSE2 and nothing else. * Adds new Intel x86_64 instructions BSR and BSF. * Implements generic CLZ, CTZ and POPCOUNT on x86_64 'baseline' targets using the new BSR, BSF and SELECTIF instructions. * Implements SELECTIF on x86_64 targets using conditional-moves. * new test filetests/isa/intel/baseline_clz_ctz_popcount.cton (for legalization) * new test filetests/isa/intel/baseline_clz_ctz_popcount_encoding.cton (for encoding) * Allow lib/cretonne/meta/gen_legalizer.py to generate non-snake-caseified Rust without rustc complaining. Fixes #238.
This commit is contained in:
committed by
Jakob Stoklund Olesen
parent
e3714ddd10
commit
6f8a54b6a5
@@ -5,6 +5,7 @@ This module defines additional instructions that are useful only to the Intel
|
||||
target ISA.
|
||||
"""
|
||||
|
||||
from base.types import iflags
|
||||
from cdsl.operands import Operand
|
||||
from cdsl.typevar import TypeVar
|
||||
from cdsl.instructions import Instruction, InstructionGroup
|
||||
@@ -125,4 +126,26 @@ pop = Instruction(
|
||||
""",
|
||||
outs=x, can_load=True, other_side_effects=True)
|
||||
|
||||
y = Operand('y', iWord)
|
||||
rflags = Operand('rflags', iflags)
|
||||
|
||||
bsr = Instruction(
|
||||
'x86_bsr', r"""
|
||||
Bit Scan Reverse -- returns the bit-index of the most significant 1
|
||||
in the word. Result is undefined if the argument is zero. However, it
|
||||
sets the Z flag depending on the argument, so it is at least easy to
|
||||
detect and handle that case.
|
||||
|
||||
This is polymorphic in i32 and i64. It is implemented for both i64 and
|
||||
i32 in 64-bit mode, and only for i32 in 32-bit mode.
|
||||
""",
|
||||
ins=x, outs=(y, rflags))
|
||||
|
||||
bsf = Instruction(
|
||||
'x86_bsf', r"""
|
||||
Bit Scan Forwards -- returns the bit-index of the least significant 1
|
||||
in the word. Is otherwise identical to 'bsr', just above.
|
||||
""",
|
||||
ins=x, outs=(y, rflags))
|
||||
|
||||
GROUP.close()
|
||||
|
||||
Reference in New Issue
Block a user