@@ -702,43 +702,45 @@ def : Pat<(v8f64 (X86cmov VR512:$t, VR512:$f, timm:$cond, EFLAGS)),
702702let isPseudo = 1, isNotDuplicable = 1 in {
703703 // Phase 1: Initial pseudos that consume EFLAGS (via custom inserter)
704704 // These are matched by patterns and convert EFLAGS to condition byte
705- multiclass CTSELECT_I386_INITIAL<RegisterClass RC, ValueType VT> {
706- let Uses = [EFLAGS], Defs = [EFLAGS], usesCustomInserter = 1, hasNoSchedulingInfo = 1 in {
707- def rr : PseudoI<(outs RC:$dst),
708- (ins RC:$src1, RC:$src2, i8imm:$cond),
709- [(set RC:$dst, (VT(X86ctselect RC:$src1, RC:$src2, timm:$cond, EFLAGS)))]>;
710- }
705+ class CTSELECT_I386_INITIAL<RegisterClass RC, ValueType VT>
706+ : PseudoI<(outs RC:$dst),
707+ (ins RC:$src1, RC:$src2, i8imm:$cond),
708+ [(set RC:$dst, (VT(X86ctselect RC:$src1, RC:$src2, timm:$cond,
709+ EFLAGS)))]> {
710+ let Uses = [EFLAGS];
711+ let Defs = [EFLAGS];
712+ let usesCustomInserter = 1;
713+ let hasNoSchedulingInfo = 1;
711714 }
712715
713716 // Phase 2: Internal pseudos with pre-materialized condition byte (post-RA expansion)
714717 // These generate the actual constant-time instruction bundles
715- multiclass CTSELECT_I386_INTERNAL<RegisterClass RC, RegisterClass ByteRC> {
716- let hasNoSchedulingInfo = 1 in {
717- def rr : PseudoI<(outs RC:$dst, ByteRC:$tmp_byte, RC:$tmp_mask),
718- (ins RC:$src1, RC:$src2, ByteRC:$cond_byte), []> {
719- let Constraints =
720- "@earlyclobber $dst,@earlyclobber $tmp_byte,@earlyclobber "
721- "$tmp_mask";
722- }
723- }
718+ class CTSELECT_I386_INTERNAL<RegisterClass RC, RegisterClass ByteRC>
719+ : PseudoI<(outs RC:$dst, ByteRC:$tmp_byte, RC:$tmp_mask),
720+ (ins RC:$src1, RC:$src2, ByteRC:$cond_byte), []> {
721+ let hasNoSchedulingInfo = 1;
722+ let Constraints = "@earlyclobber $dst,@earlyclobber $tmp_byte,@earlyclobber $tmp_mask";
724723 }
725724}
726725
727726// Phase 1 pseudos for non-CMOV targets (custom inserter materializes condition)
728727let isCodeGenOnly = 1, hasSideEffects = 1, ForceDisassemble = 1 in {
729728 let Predicates = [NoNativeCMOV] in {
730- defm CTSELECT_I386_GR8 : CTSELECT_I386_INITIAL<GR8, i8>;
731- defm CTSELECT_I386_GR16 : CTSELECT_I386_INITIAL<GR16, i16>;
732- defm CTSELECT_I386_GR32 : CTSELECT_I386_INITIAL<GR32, i32>;
729+ def CTSELECT_I386_GR8rr : CTSELECT_I386_INITIAL<GR8, i8>;
730+ def CTSELECT_I386_GR16rr : CTSELECT_I386_INITIAL<GR16, i16>;
731+ def CTSELECT_I386_GR32rr : CTSELECT_I386_INITIAL<GR32, i32>;
733732 }
734733}
735734
736735// Phase 2 pseudos (post-RA expansion with pre-materialized condition byte)
737736let isCodeGenOnly = 1, hasSideEffects = 1, ForceDisassemble = 1 in {
738737 let Predicates = [NoNativeCMOV] in {
739- defm CTSELECT_I386_INT_GR8 : CTSELECT_I386_INTERNAL<GR8, GR8>;
740- defm CTSELECT_I386_INT_GR16 : CTSELECT_I386_INTERNAL<GR16, GR8>;
741- defm CTSELECT_I386_INT_GR32 : CTSELECT_I386_INTERNAL<GR32, GR8>;
738+ def CTSELECT_I386_INT_GR8rr :
739+ CTSELECT_I386_INTERNAL<GR8, GR8>;
740+ def CTSELECT_I386_INT_GR16rr :
741+ CTSELECT_I386_INTERNAL<GR16, GR8>;
742+ def CTSELECT_I386_INT_GR32rr :
743+ CTSELECT_I386_INTERNAL<GR32, GR8>;
742744 }
743745}
744746
@@ -747,12 +749,12 @@ let hasSideEffects = 1,
747749 Constraints = "$dst = $src1" in {
748750
749751 let Predicates = [FPStackf32] in
750- defm CTSELECT_I386_FP32 : CTSELECT_I386_INITIAL<RFP32, f32>;
752+ def CTSELECT_I386_FP32rr : CTSELECT_I386_INITIAL<RFP32, f32>;
751753
752754 let Predicates = [FPStackf64] in
753- defm CTSELECT_I386_FP64 : CTSELECT_I386_INITIAL<RFP64, f64>;
755+ def CTSELECT_I386_FP64rr : CTSELECT_I386_INITIAL<RFP64, f64>;
754756
755- defm CTSELECT_I386_FP80 : CTSELECT_I386_INITIAL<RFP80, f80>;
757+ def CTSELECT_I386_FP80rr : CTSELECT_I386_INITIAL<RFP80, f80>;
756758}
757759
758760// Pattern matching for non-native-CMOV CTSELECT (routes to custom inserter for condition materialization)
0 commit comments