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
@@ -8,6 +8,7 @@ from cdsl.registers import RegClass
|
||||
from base.formats import Unary, UnaryImm, Binary, BinaryImm, MultiAry, NullAry
|
||||
from base.formats import Trap, Call, IndirectCall, Store, Load
|
||||
from base.formats import IntCompare, FloatCompare, IntCond, FloatCond
|
||||
from base.formats import IntSelect
|
||||
from base.formats import Jump, Branch, BranchInt, BranchFloat
|
||||
from base.formats import Ternary, FuncAddr, UnaryGlobalVar
|
||||
from base.formats import RegMove, RegSpill, RegFill, CopySpecial
|
||||
@@ -1021,6 +1022,32 @@ setf_abcd = TailRecipe(
|
||||
modrm_r_bits(out_reg0, bits, sink);
|
||||
''')
|
||||
|
||||
#
|
||||
# Conditional move (a.k.a integer select)
|
||||
# (maybe-REX.W) 0F 4x modrm(r,r)
|
||||
# 1 byte, modrm(r,r), is after the opcode
|
||||
#
|
||||
cmov = TailRecipe(
|
||||
'cmov', IntSelect, size=1, ins=(FLAG.eflags, GPR, GPR), outs=2,
|
||||
requires_prefix=False,
|
||||
clobbers_flags=False,
|
||||
emit='''
|
||||
PUT_OP(bits | icc2opc(cond), rex2(in_reg1, in_reg2), sink);
|
||||
modrm_rr(in_reg1, in_reg2, sink);
|
||||
''')
|
||||
|
||||
#
|
||||
# Bit scan forwards and reverse
|
||||
#
|
||||
bsf_and_bsr = TailRecipe(
|
||||
'bsf_and_bsr', Unary, size=1, ins=GPR, outs=(GPR, FLAG.eflags),
|
||||
requires_prefix=False,
|
||||
clobbers_flags=True,
|
||||
emit='''
|
||||
PUT_OP(bits, rex2(in_reg0, out_reg0), sink);
|
||||
modrm_rr(in_reg0, out_reg0, sink);
|
||||
''')
|
||||
|
||||
#
|
||||
# Compare and set flags.
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user