Jakob Stoklund Olesen
2010-Mar-25 19:59 UTC
[LLVMdev] TSFlagsFields and TSFlagsShifts obsolete?
I think we can get rid of the TSFlagsFields and TSFlagsShifts hack in the InstrInfo TableGen class now. This seems to work just fine: class Instruction { bits<32> TSFlags; } class Domain<bits<2> val> { bits<2> Value = val; } def GenericDomain : Domain<0>; def SSEPackedInt : Domain<1>; def SSEPackedSingle : Domain<2>; def SSEPackedDouble : Domain<3>; class X86Instr<bits<8> opcod> : Instruction { Domain ExeDomain = GenericDomain; let TSFlags{0-7} = opcod; let TSFlags{22-23} = ExeDomain.Value; } class PIInstr<bits<8> opcod> : X86Instr<opcod> { let ExeDomain = SSEPackedInt; } def i1 : X86Instr<0x12>; def i2 : PIInstr<0x34>; def i3 : PIInstr<0x34> { let ExeDomain = SSEPackedSingle; } Wouldn't it be better to assign TSFlags bits directly in an Instruction subclass, rather than in a magic InstrInfo instance somewhere? /jakob ------------- Classes ----------------- class Domain<bits<2> Domain:val = { ?, ? }> { bits<2> Value = { Domain:val{1}, Domain:val{0} }; } class Instruction { bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? }; } class PIInstr<bits<8> PIInstr:opcod = { ?, ?, ?, ?, ?, ?, ?, ? }> { // Instruction X86Instr bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, ExeDomain.Value{0}, ExeDomain.Value{1}, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, PIInstr:opcod{0}, PIInstr:opcod{1}, PIInstr:opcod{2}, PIInstr:opcod{3}, PIInstr:opcod{4}, PIInstr:opcod{5}, PIInstr:opcod{6}, PIInstr:opcod{7} }; Domain ExeDomain = SSEPackedInt; } class X86Instr<bits<8> X86Instr:opcod = { ?, ?, ?, ?, ?, ?, ?, ? }> { // Instruction bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, ExeDomain.Value{0}, ExeDomain.Value{1}, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, X86Instr:opcod{0}, X86Instr:opcod{1}, X86Instr:opcod{2}, X86Instr:opcod{3}, X86Instr:opcod{4}, X86Instr:opcod{5}, X86Instr:opcod{6}, X86Instr:opcod{7} }; Domain ExeDomain = GenericDomain; } ------------- Defs ----------------- def GenericDomain { // Domain bits<2> Value = { 0, 0 }; } def SSEPackedDouble { // Domain bits<2> Value = { 1, 1 }; } def SSEPackedInt { // Domain bits<2> Value = { 0, 1 }; } def SSEPackedSingle { // Domain bits<2> Value = { 1, 0 }; } def i1 { // Instruction X86Instr bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 1, 0, 0, 1, 0, 0, 0 }; Domain ExeDomain = GenericDomain; } def i2 { // Instruction X86Instr PIInstr bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, 1, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, 1, 0, 1, 1, 0, 0 }; Domain ExeDomain = SSEPackedInt; } def i3 { // Instruction X86Instr PIInstr bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, 0, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, 1, 0, 1, 1, 0, 0 }; Domain ExeDomain = SSEPackedSingle; }
On Mar 25, 2010, at 12:59 PM, Jakob Stoklund Olesen wrote:> I think we can get rid of the TSFlagsFields and TSFlagsShifts hack in the InstrInfo TableGen class now.That is really cool! Please do it, :) -Chris> > This seems to work just fine: > > class Instruction { > bits<32> TSFlags; > } > > class Domain<bits<2> val> { > bits<2> Value = val; > } > def GenericDomain : Domain<0>; > def SSEPackedInt : Domain<1>; > def SSEPackedSingle : Domain<2>; > def SSEPackedDouble : Domain<3>; > > class X86Instr<bits<8> opcod> : Instruction { > Domain ExeDomain = GenericDomain; > let TSFlags{0-7} = opcod; > let TSFlags{22-23} = ExeDomain.Value; > } > > class PIInstr<bits<8> opcod> : X86Instr<opcod> { > let ExeDomain = SSEPackedInt; > } > > def i1 : X86Instr<0x12>; > def i2 : PIInstr<0x34>; > def i3 : PIInstr<0x34> { let ExeDomain = SSEPackedSingle; } > > > Wouldn't it be better to assign TSFlags bits directly in an Instruction subclass, rather than in a magic InstrInfo instance somewhere? > > /jakob > > > ------------- Classes ----------------- > class Domain<bits<2> Domain:val = { ?, ? }> { > bits<2> Value = { Domain:val{1}, Domain:val{0} }; > } > class Instruction { > bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? }; > } > class PIInstr<bits<8> PIInstr:opcod = { ?, ?, ?, ?, ?, ?, ?, ? }> { // Instruction X86Instr > bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, ExeDomain.Value{0}, ExeDomain.Value{1}, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, PIInstr:opcod{0}, PIInstr:opcod{1}, PIInstr:opcod{2}, PIInstr:opcod{3}, PIInstr:opcod{4}, PIInstr:opcod{5}, PIInstr:opcod{6}, PIInstr:opcod{7} }; > Domain ExeDomain = SSEPackedInt; > } > class X86Instr<bits<8> X86Instr:opcod = { ?, ?, ?, ?, ?, ?, ?, ? }> { // Instruction > bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, ExeDomain.Value{0}, ExeDomain.Value{1}, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, X86Instr:opcod{0}, X86Instr:opcod{1}, X86Instr:opcod{2}, X86Instr:opcod{3}, X86Instr:opcod{4}, X86Instr:opcod{5}, X86Instr:opcod{6}, X86Instr:opcod{7} }; > Domain ExeDomain = GenericDomain; > } > ------------- Defs ----------------- > def GenericDomain { // Domain > bits<2> Value = { 0, 0 }; > } > def SSEPackedDouble { // Domain > bits<2> Value = { 1, 1 }; > } > def SSEPackedInt { // Domain > bits<2> Value = { 0, 1 }; > } > def SSEPackedSingle { // Domain > bits<2> Value = { 1, 0 }; > } > def i1 { // Instruction X86Instr > bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 1, 0, 0, 1, 0, 0, 0 }; > Domain ExeDomain = GenericDomain; > } > def i2 { // Instruction X86Instr PIInstr > bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, 1, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, 1, 0, 1, 1, 0, 0 }; > Domain ExeDomain = SSEPackedInt; > } > def i3 { // Instruction X86Instr PIInstr > bits<32> TSFlags = { ?, ?, ?, ?, ?, ?, ?, ?, 0, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, 1, 0, 1, 1, 0, 0 }; > Domain ExeDomain = SSEPackedSingle; > } > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Maybe Matching Threads
- RFC: code size reduction in X86 by replacing EVEX with VEX encoding
- [LLVMdev] Execution domain for VEXTRACTF128/VINSERTF128
- [LLVMdev] Execution domain for VEXTRACTF128/VINSERTF128
- [LLVMdev] Execution domain for VEXTRACTF128/VINSERTF128
- [LLVMdev] Emitting assembler code