hameeza ahmed via llvm-dev
2017-Sep-05 05:27 UTC
[llvm-dev] Issues in Vector Add Instruction Machine Code Emission
I was getting same error when i keep both EVEX/EVEX_4V and TA. So, i
restored my original instructions and for that i have to include
bool HasTA = TSFlags & X86II::TA; in x86MCCodeEmitter.cpp
then used this condition;
if(HasTA)
++SrcRegNum;
in order to emit binary correctly.
Is it right?
On Tue, Sep 5, 2017 at 5:45 AM, Craig Topper <craig.topper at gmail.com>
wrote:
> Put the TA's back. EVEX/EVEX_4V does not replace TA. They are for
> different things. An EVEX/EVEX_4V instruction must use one of T8, TA, XOP8,
> XOP9, XOPA.
>
> ~Craig
>
> On Mon, Sep 4, 2017 at 5:33 PM, hameeza ahmed <hahmed2305 at
gmail.com>
> wrote:
>
>> Thank You,
>> I changed TA to EVEX or EVEX_4V. But now i am getting following error:
>>
>> Invalid prefix!
>> UNREACHABLE executed at /lib/Target/X86/MCTargetDesc/X
>> 86MCCodeEmitter.cpp:647!
>>
>>
>> On Tue, Sep 5, 2017 at 4:36 AM, Craig Topper <craig.topper at
gmail.com>
>> wrote:
>>
>>> Not all instructions can use EVEX_4V. Move instructions in
particular
>>> cannot because they don't have 2 sources.
>>>
>>> What do you intend to do with the binary output once you have it?
You
>>> don't seem to be targeting a particular binary definition so
its
>>> effectively just random numbers.
>>>
>>> ~Craig
>>>
>>> On Mon, Sep 4, 2017 at 4:28 PM, hameeza ahmed <hahmed2305 at
gmail.com>
>>> wrote:
>>>
>>>> Thank You.
>>>>
>>>> I used EVEX_4V with all the instructions. I replaced TA and
EVEX both
>>>> with EVEX_4V. Now, I am getting following error:
>>>>
>>>> llvm-tblgen: /utils/TableGen/X86RecognizableInstr.cpp:687: void
>>>>
llvm::X86Disassembler::RecognizableInstr::emitInstructionSpecifier():
>>>> Assertion `numPhysicalOperands >= 2 + additionalOperands
&&
>>>> numPhysicalOperands <= 4 + additionalOperands &&
"Unexpected number of
>>>> operands for MRMSrcMemFrm"' failed
>>>>
>>>> What to do now?
>>>>
>>>> On Tue, Sep 5, 2017 at 4:23 AM, Craig Topper <craig.topper
at gmail.com>
>>>> wrote:
>>>>
>>>>> VEX_4V tells the encoder to use the VEX.vvvv field to
encode one of
>>>>> the operands. Without it the encoder assumes that the
destination and one
>>>>> of the sources must be the same physical register.
>>>>>
>>>>> TA indicates which of the opcode maps the instruction
belongs to. This
>>>>> corresponds to encoding 0x3 of the VEX.mmmmm field.
>>>>>
>>>>> ~Craig
>>>>>
>>>>> On Mon, Sep 4, 2017 at 4:01 PM, hameeza ahmed
<hahmed2305 at gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Sorry to ask but what does it mean to put both?
>>>>>>
>>>>>> On Tue, Sep 5, 2017 at 4:01 AM, Craig Topper
<craig.topper at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Leave TA. Put both.
>>>>>>>
>>>>>>> ~Craig
>>>>>>>
>>>>>>> On Mon, Sep 4, 2017 at 4:00 PM, hameeza ahmed
<hahmed2305 at gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> You are right. But when i defined my
instruction as follows:
>>>>>>>> def P_256B_VADD : I<0xE1, MRMDestReg, (outs
VRP_2048:$dst), (ins
>>>>>>>> VRP_2048:$src1,
VRPIM_2048:$src2),"P_256B_VADD\t{$src1, $src2,
>>>>>>>> $dst|$dst, $src1, $src2}", [(set
VRP_2048:$dst, (add (v64i32
>>>>>>>> VRP_2048:$src1), (v64i32
VRP_2048:$src2)))]>, VEX_4V;
>>>>>>>>
>>>>>>>> I get opcode conflicts? Then what to do?
>>>>>>>>
>>>>>>>> On Tue, Sep 5, 2017 at 3:51 AM, Craig Topper
<
>>>>>>>> craig.topper at gmail.com> wrote:
>>>>>>>>
>>>>>>>>> That is not correct. You should add VEX_4V.
TA tells the X86
>>>>>>>>> encoder that the instruction opcode belongs
on the 3 byte opcode 0x0F 0x3A
>>>>>>>>> page in the Intel manual.
>>>>>>>>>
>>>>>>>>> ~Craig
>>>>>>>>>
>>>>>>>>> On Mon, Sep 4, 2017 at 3:38 PM, hameeza
ahmed <
>>>>>>>>> hahmed2305 at gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> Thank You.
>>>>>>>>>>
>>>>>>>>>> My add instruction has TA as follows:
>>>>>>>>>>
>>>>>>>>>> def P_256B_VADD : I<0xE1,
MRMDestReg, (outs VRP_2048:$dst), (ins
>>>>>>>>>> VRP_2048:$src1,
VRPIM_2048:$src2),"P_256B_VADD\t{$src1, $src2,
>>>>>>>>>> $dst|$dst, $src1, $src2}", [(set
VRP_2048:$dst, (add (v64i32
>>>>>>>>>> VRP_2048:$src1), (v64i32
VRP_2048:$src2)))]>, TA;
>>>>>>>>>>
>>>>>>>>>> so i defined;
>>>>>>>>>>
>>>>>>>>>> bool HasTA = TSFlags & X86II::TA;
in x86MCCodeEmitter.cpp
>>>>>>>>>>
>>>>>>>>>> then used this condition;
>>>>>>>>>>
>>>>>>>>>> if(HasTA)
>>>>>>>>>> ++SrcRegNum;
>>>>>>>>>>
>>>>>>>>>> now getting no error.
>>>>>>>>>>
>>>>>>>>>> please tell me whether my method is
correct? Also please confirm
>>>>>>>>>> this whether i need to make changes in
MC framework to emit binary code of
>>>>>>>>>> my vector instructions. So far i made
no changes or additions in MC
>>>>>>>>>> framework or any of the file (except
the above discussed) and still getting
>>>>>>>>>> the correct machine code.
>>>>>>>>>>
>>>>>>>>>> Is it right way?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Tue, Sep 5, 2017 at 3:29 AM, Craig
Topper <
>>>>>>>>>> craig.topper at gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> Does your ADD instruction have
VEX_4V or EVEX_4V as part of its
>>>>>>>>>>> declaration in the td file?
>>>>>>>>>>>
>>>>>>>>>>> ~Craig
>>>>>>>>>>>
>>>>>>>>>>> On Mon, Sep 4, 2017 at 2:11 PM,
hameeza ahmed <
>>>>>>>>>>> hahmed2305 at gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Hello,
>>>>>>>>>>>> I am trying to emit binary for
my implemented vector
>>>>>>>>>>>> instructions. Although yet i
havent done any change or addition in MC
>>>>>>>>>>>> framework, For vector load
instruction there are no error coming. But for
>>>>>>>>>>>> vector add
>>>>>>>>>>>>
>>>>>>>>>>>> instruction is something like
this;
>>>>>>>>>>>>
>>>>>>>>>>>> > %R_0_REG2048b_1<def>
= P_256B_VADD %R_0_REG2048b_1<kill>,
>>>>>>>>>>>> %R_0_REG2048b_0<kill>
>>>>>>>>>>>>
>>>>>>>>>>>> I am getting the following
error:
>>>>>>>>>>>>
>>>>>>>>>>>> Unknown immediate size
>>>>>>>>>>>> UNREACHABLE executed at
/lib/Target/X86/MCTargetDesc/X
>>>>>>>>>>>> 86BaseInfo.h:574!
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> i made extensive use of gdb
and after debugging i found the
>>>>>>>>>>>> line with issue in
X86MCCodeEmitter.cpp.
>>>>>>>>>>>>
>>>>>>>>>>>> Here NumOps=3 (all registers).
and CurOp is 1st initialized to
>>>>>>>>>>>> 0.
>>>>>>>>>>>>
>>>>>>>>>>>> then, the following code gets
executed;
>>>>>>>>>>>>
>>>>>>>>>>>> case X86II::MRMDestReg: {
>>>>>>>>>>>> EmitByte(BaseOpcode,
CurByte, OS);
>>>>>>>>>>>> unsigned SrcRegNum = CurOp
+ 1; //SrcRegNum=1
>>>>>>>>>>>>
EmitRegModRMByte(MI.getOperand(CurOp),
>>>>>>>>>>>>
GetX86RegNum(MI.getOperand(SrcRegNum)),
>>>>>>>>>>>> CurByte, OS);
>>>>>>>>>>>> CurOp = SrcRegNum + 1;
>>>>>>>>>>>> break;
>>>>>>>>>>>> }
>>>>>>>>>>>> so here CurOp becomes 2.
>>>>>>>>>>>>
>>>>>>>>>>>> After this;
>>>>>>>>>>>>
>>>>>>>>>>>> it comes to;
>>>>>>>>>>>> else {
>>>>>>>>>>>> // If there is a remaining
operand, it must be a trailing
>>>>>>>>>>>> immediate. Emit it
>>>>>>>>>>>> // according to the right
size for the instruction. Some
>>>>>>>>>>>> instructions
>>>>>>>>>>>> // (SSE4a extrq and
insertq) have two trailing immediates.
>>>>>>>>>>>> while (CurOp != NumOps
&& NumOps - CurOp <= 2) {
>>>>>>>>>>>>
EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
>>>>>>>>>>>>
X86II::getSizeOfImm(TSFlags),
>>>>>>>>>>>> getImmFixupKind(TSFlags),
>>>>>>>>>>>> CurByte,
OS, Fixups);
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> here CurOp=2 !=NumOps=3
&& 3-2<=2
>>>>>>>>>>>> so while condition is satisfied
and it goes to emitimmediate
>>>>>>>>>>>> which is wrong and there prints
error message.
>>>>>>>>>>>>
>>>>>>>>>>>> Since, there are no immediate
involved in instruction, it
>>>>>>>>>>>> should not go to emitimmediate.
How to solve this issue?
>>>>>>>>>>>>
>>>>>>>>>>>> Please help.
>>>>>>>>>>>>
>>>>>>>>>>>> Thank You
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170905/8868120c/attachment.html>
Craig Topper via llvm-dev
2017-Sep-05 05:34 UTC
[llvm-dev] Issues in Vector Add Instruction Machine Code Emission
No, its not right. What error were you getting with EVEX/EVEX_4V and TA? ~Craig On Mon, Sep 4, 2017 at 10:27 PM, hameeza ahmed <hahmed2305 at gmail.com> wrote:> I was getting same error when i keep both EVEX/EVEX_4V and TA. So, i > restored my original instructions and for that i have to include > bool HasTA = TSFlags & X86II::TA; in x86MCCodeEmitter.cpp > > then used this condition; > > if(HasTA) > ++SrcRegNum; > > in order to emit binary correctly. > > Is it right? > > On Tue, Sep 5, 2017 at 5:45 AM, Craig Topper <craig.topper at gmail.com> > wrote: > >> Put the TA's back. EVEX/EVEX_4V does not replace TA. They are for >> different things. An EVEX/EVEX_4V instruction must use one of T8, TA, XOP8, >> XOP9, XOPA. >> >> ~Craig >> >> On Mon, Sep 4, 2017 at 5:33 PM, hameeza ahmed <hahmed2305 at gmail.com> >> wrote: >> >>> Thank You, >>> I changed TA to EVEX or EVEX_4V. But now i am getting following error: >>> >>> Invalid prefix! >>> UNREACHABLE executed at /lib/Target/X86/MCTargetDesc/X >>> 86MCCodeEmitter.cpp:647! >>> >>> >>> On Tue, Sep 5, 2017 at 4:36 AM, Craig Topper <craig.topper at gmail.com> >>> wrote: >>> >>>> Not all instructions can use EVEX_4V. Move instructions in particular >>>> cannot because they don't have 2 sources. >>>> >>>> What do you intend to do with the binary output once you have it? You >>>> don't seem to be targeting a particular binary definition so its >>>> effectively just random numbers. >>>> >>>> ~Craig >>>> >>>> On Mon, Sep 4, 2017 at 4:28 PM, hameeza ahmed <hahmed2305 at gmail.com> >>>> wrote: >>>> >>>>> Thank You. >>>>> >>>>> I used EVEX_4V with all the instructions. I replaced TA and EVEX both >>>>> with EVEX_4V. Now, I am getting following error: >>>>> >>>>> llvm-tblgen: /utils/TableGen/X86RecognizableInstr.cpp:687: void >>>>> llvm::X86Disassembler::RecognizableInstr::emitInstructionSpecifier(): >>>>> Assertion `numPhysicalOperands >= 2 + additionalOperands && >>>>> numPhysicalOperands <= 4 + additionalOperands && "Unexpected number of >>>>> operands for MRMSrcMemFrm"' failed >>>>> >>>>> What to do now? >>>>> >>>>> On Tue, Sep 5, 2017 at 4:23 AM, Craig Topper <craig.topper at gmail.com> >>>>> wrote: >>>>> >>>>>> VEX_4V tells the encoder to use the VEX.vvvv field to encode one of >>>>>> the operands. Without it the encoder assumes that the destination and one >>>>>> of the sources must be the same physical register. >>>>>> >>>>>> TA indicates which of the opcode maps the instruction belongs to. >>>>>> This corresponds to encoding 0x3 of the VEX.mmmmm field. >>>>>> >>>>>> ~Craig >>>>>> >>>>>> On Mon, Sep 4, 2017 at 4:01 PM, hameeza ahmed <hahmed2305 at gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Sorry to ask but what does it mean to put both? >>>>>>> >>>>>>> On Tue, Sep 5, 2017 at 4:01 AM, Craig Topper <craig.topper at gmail.com >>>>>>> > wrote: >>>>>>> >>>>>>>> Leave TA. Put both. >>>>>>>> >>>>>>>> ~Craig >>>>>>>> >>>>>>>> On Mon, Sep 4, 2017 at 4:00 PM, hameeza ahmed <hahmed2305 at gmail.com >>>>>>>> > wrote: >>>>>>>> >>>>>>>>> You are right. But when i defined my instruction as follows: >>>>>>>>> def P_256B_VADD : I<0xE1, MRMDestReg, (outs VRP_2048:$dst), (ins >>>>>>>>> VRP_2048:$src1, VRPIM_2048:$src2),"P_256B_VADD\t{$src1, $src2, >>>>>>>>> $dst|$dst, $src1, $src2}", [(set VRP_2048:$dst, (add (v64i32 >>>>>>>>> VRP_2048:$src1), (v64i32 VRP_2048:$src2)))]>, VEX_4V; >>>>>>>>> >>>>>>>>> I get opcode conflicts? Then what to do? >>>>>>>>> >>>>>>>>> On Tue, Sep 5, 2017 at 3:51 AM, Craig Topper < >>>>>>>>> craig.topper at gmail.com> wrote: >>>>>>>>> >>>>>>>>>> That is not correct. You should add VEX_4V. TA tells the X86 >>>>>>>>>> encoder that the instruction opcode belongs on the 3 byte opcode 0x0F 0x3A >>>>>>>>>> page in the Intel manual. >>>>>>>>>> >>>>>>>>>> ~Craig >>>>>>>>>> >>>>>>>>>> On Mon, Sep 4, 2017 at 3:38 PM, hameeza ahmed < >>>>>>>>>> hahmed2305 at gmail.com> wrote: >>>>>>>>>> >>>>>>>>>>> Thank You. >>>>>>>>>>> >>>>>>>>>>> My add instruction has TA as follows: >>>>>>>>>>> >>>>>>>>>>> def P_256B_VADD : I<0xE1, MRMDestReg, (outs VRP_2048:$dst), >>>>>>>>>>> (ins VRP_2048:$src1, VRPIM_2048:$src2),"P_256B_VADD\t{$src1, >>>>>>>>>>> $src2, $dst|$dst, $src1, $src2}", [(set VRP_2048:$dst, (add (v64i32 >>>>>>>>>>> VRP_2048:$src1), (v64i32 VRP_2048:$src2)))]>, TA; >>>>>>>>>>> >>>>>>>>>>> so i defined; >>>>>>>>>>> >>>>>>>>>>> bool HasTA = TSFlags & X86II::TA; in x86MCCodeEmitter.cpp >>>>>>>>>>> >>>>>>>>>>> then used this condition; >>>>>>>>>>> >>>>>>>>>>> if(HasTA) >>>>>>>>>>> ++SrcRegNum; >>>>>>>>>>> >>>>>>>>>>> now getting no error. >>>>>>>>>>> >>>>>>>>>>> please tell me whether my method is correct? Also please confirm >>>>>>>>>>> this whether i need to make changes in MC framework to emit binary code of >>>>>>>>>>> my vector instructions. So far i made no changes or additions in MC >>>>>>>>>>> framework or any of the file (except the above discussed) and still getting >>>>>>>>>>> the correct machine code. >>>>>>>>>>> >>>>>>>>>>> Is it right way? >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Tue, Sep 5, 2017 at 3:29 AM, Craig Topper < >>>>>>>>>>> craig.topper at gmail.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> Does your ADD instruction have VEX_4V or EVEX_4V as part of its >>>>>>>>>>>> declaration in the td file? >>>>>>>>>>>> >>>>>>>>>>>> ~Craig >>>>>>>>>>>> >>>>>>>>>>>> On Mon, Sep 4, 2017 at 2:11 PM, hameeza ahmed < >>>>>>>>>>>> hahmed2305 at gmail.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Hello, >>>>>>>>>>>>> I am trying to emit binary for my implemented vector >>>>>>>>>>>>> instructions. Although yet i havent done any change or addition in MC >>>>>>>>>>>>> framework, For vector load instruction there are no error coming. But for >>>>>>>>>>>>> vector add >>>>>>>>>>>>> >>>>>>>>>>>>> instruction is something like this; >>>>>>>>>>>>> >>>>>>>>>>>>> > %R_0_REG2048b_1<def> = P_256B_VADD %R_0_REG2048b_1<kill>, >>>>>>>>>>>>> %R_0_REG2048b_0<kill> >>>>>>>>>>>>> >>>>>>>>>>>>> I am getting the following error: >>>>>>>>>>>>> >>>>>>>>>>>>> Unknown immediate size >>>>>>>>>>>>> UNREACHABLE executed at /lib/Target/X86/MCTargetDesc/X >>>>>>>>>>>>> 86BaseInfo.h:574! >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> i made extensive use of gdb and after debugging i found the >>>>>>>>>>>>> line with issue in X86MCCodeEmitter.cpp. >>>>>>>>>>>>> >>>>>>>>>>>>> Here NumOps=3 (all registers). and CurOp is 1st initialized to >>>>>>>>>>>>> 0. >>>>>>>>>>>>> >>>>>>>>>>>>> then, the following code gets executed; >>>>>>>>>>>>> >>>>>>>>>>>>> case X86II::MRMDestReg: { >>>>>>>>>>>>> EmitByte(BaseOpcode, CurByte, OS); >>>>>>>>>>>>> unsigned SrcRegNum = CurOp + 1; //SrcRegNum=1 >>>>>>>>>>>>> EmitRegModRMByte(MI.getOperand(CurOp), >>>>>>>>>>>>> GetX86RegNum(MI.getOperand(SrcRegNum)), >>>>>>>>>>>>> CurByte, OS); >>>>>>>>>>>>> CurOp = SrcRegNum + 1; >>>>>>>>>>>>> break; >>>>>>>>>>>>> } >>>>>>>>>>>>> so here CurOp becomes 2. >>>>>>>>>>>>> >>>>>>>>>>>>> After this; >>>>>>>>>>>>> >>>>>>>>>>>>> it comes to; >>>>>>>>>>>>> else { >>>>>>>>>>>>> // If there is a remaining operand, it must be a trailing >>>>>>>>>>>>> immediate. Emit it >>>>>>>>>>>>> // according to the right size for the instruction. Some >>>>>>>>>>>>> instructions >>>>>>>>>>>>> // (SSE4a extrq and insertq) have two trailing immediates. >>>>>>>>>>>>> while (CurOp != NumOps && NumOps - CurOp <= 2) { >>>>>>>>>>>>> EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(), >>>>>>>>>>>>> X86II::getSizeOfImm(TSFlags), >>>>>>>>>>>>> getImmFixupKind(TSFlags), >>>>>>>>>>>>> CurByte, OS, Fixups); >>>>>>>>>>>>> } >>>>>>>>>>>>> >>>>>>>>>>>>> here CurOp=2 !=NumOps=3 && 3-2<=2 >>>>>>>>>>>>> so while condition is satisfied and it goes to emitimmediate >>>>>>>>>>>>> which is wrong and there prints error message. >>>>>>>>>>>>> >>>>>>>>>>>>> Since, there are no immediate involved in instruction, it >>>>>>>>>>>>> should not go to emitimmediate. How to solve this issue? >>>>>>>>>>>>> >>>>>>>>>>>>> Please help. >>>>>>>>>>>>> >>>>>>>>>>>>> Thank You >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170904/c8a8f013/attachment.html>
hameeza ahmed via llvm-dev
2017-Sep-05 05:36 UTC
[llvm-dev] Issues in Vector Add Instruction Machine Code Emission
the output of backtrace is follows:
(gdb) bt
#0 0x00007ffff6b79267 in __GI_raise (sig=sig at entry=6)
at ../sysdeps/unix/sysv/linux/raise.c:55
#1 0x00007ffff6b7aeca in __GI_abort () at abort.c:89
#2 0x0000000001960700 in llvm::llvm_unreachable_internal (
msg=0x2224614 "Invalid op prefix!",
file=0x222411f
"/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp",
line=681)
at /lib/Support/ErrorHandling.cpp:118
#3 0x0000000000c05c57 in (anonymous
namespace)::X86MCCodeEmitter::EmitVEXOpcodePrefix (this=0x3037d00,
TSFlags=1126109823418401, CurByte=@0x7fffffffae7c: 0,
MemOperand=1, MI=..., Desc=..., OS=...)
at /lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp:681
#4 0x0000000000c03add in (anonymous
namespace)::X86MCCodeEmitter::encodeInstruction (this=0x3037d00, MI=...,
OS=..., Fixups=..., STI=...)
at /lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp:1227
#5 0x00000000015894f3 in llvm::MCELFStreamer::EmitInstToData
(this=0x304db90,
Inst=..., STI=...)
at /lib/MC/MCELFStreamer.cpp:478
#6 0x00000000015abe00 in llvm::MCObjectStreamer::EmitInstruction (
this=0x304db90, Inst=..., STI=...)
at /lib/MC/MCObjectStreamer.cpp:244
#7 0x00000000007a04ab in llvm::X86AsmPrinter::EmitAndCountInstruction
(this 0x3052950, Inst=...)
at /lib/Target/X86/X86MCInstLower.cpp:105
#8 0x00000000007a341c in llvm::X86AsmPrinter::EmitInstruction (
this=0x3052950, MI=0x30a1e10)
at /lib/Target/X86/X86MCInstLower.cpp:1737
#9 0x0000000000dde5d6 in llvm::AsmPrinter::EmitFunctionBody
(this=0x3052950)
---Type <return> to continue, or q <return> to quit---
at /lib/CodeGen/AsmPrinter/AsmPrinter.cpp:939
#10 0x0000000000796fc1 in llvm::X86AsmPrinter::runOnMachineFunction (
this=0x3052950, MF=...)
at /lib/Target/X86/X86AsmPrinter.cpp:70
#11 0x000000000104d7f1 in llvm::MachineFunctionPass::runOnFunction (
this=0x3052950, F=...)
at /lib/CodeGen/MachineFunctionPass.cpp:62
#12 0x00000000014776ff in llvm::FPPassManager::runOnFunction
(this=0x302f5d0,
F=...) at /lib/IR/LegacyPassManager.cpp:1513
#13 0x0000000001477a15 in llvm::FPPassManager::runOnModule (this=0x302f5d0,
M=...) at /lib/IR/LegacyPassManager.cpp:1534
#14 0x00000000014781aa in (anonymous namespace)::MPPassManager::runOnModule
(
this=0x3022d30, M=...)
at /lib/IR/LegacyPassManager.cpp:1590
#15 0x0000000001477cd6 in llvm::legacy::PassManagerImpl::run
(this=0x301d250,
M=...) at /lib/IR/LegacyPassManager.cpp:1693
#16 0x00000000014786c1 in llvm::legacy::PassManager::run
(this=0x7fffffffd778,
M=...) at /lib/IR/LegacyPassManager.cpp:1724
#17 0x000000000076bd1e in compileModule (argv=0x7fffffffdf68, Context=...)
at /tools/llc/llc.cpp:528
#18 0x000000000076a209 in main (argc=5, argv=0x7fffffffdf68)
at /tools/llc/llc.cpp:285
(gdb)
(gdb)
On Tue, Sep 5, 2017 at 10:34 AM, Craig Topper <craig.topper at gmail.com>
wrote:
> No, its not right. What error were you getting with EVEX/EVEX_4V and TA?
>
> ~Craig
>
> On Mon, Sep 4, 2017 at 10:27 PM, hameeza ahmed <hahmed2305 at
gmail.com>
> wrote:
>
>> I was getting same error when i keep both EVEX/EVEX_4V and TA. So, i
>> restored my original instructions and for that i have to include
>> bool HasTA = TSFlags & X86II::TA; in x86MCCodeEmitter.cpp
>>
>> then used this condition;
>>
>> if(HasTA)
>> ++SrcRegNum;
>>
>> in order to emit binary correctly.
>>
>> Is it right?
>>
>> On Tue, Sep 5, 2017 at 5:45 AM, Craig Topper <craig.topper at
gmail.com>
>> wrote:
>>
>>> Put the TA's back. EVEX/EVEX_4V does not replace TA. They are
for
>>> different things. An EVEX/EVEX_4V instruction must use one of T8,
TA, XOP8,
>>> XOP9, XOPA.
>>>
>>> ~Craig
>>>
>>> On Mon, Sep 4, 2017 at 5:33 PM, hameeza ahmed <hahmed2305 at
gmail.com>
>>> wrote:
>>>
>>>> Thank You,
>>>> I changed TA to EVEX or EVEX_4V. But now i am getting following
error:
>>>>
>>>> Invalid prefix!
>>>> UNREACHABLE executed at /lib/Target/X86/MCTargetDesc/X
>>>> 86MCCodeEmitter.cpp:647!
>>>>
>>>>
>>>> On Tue, Sep 5, 2017 at 4:36 AM, Craig Topper <craig.topper
at gmail.com>
>>>> wrote:
>>>>
>>>>> Not all instructions can use EVEX_4V. Move instructions in
particular
>>>>> cannot because they don't have 2 sources.
>>>>>
>>>>> What do you intend to do with the binary output once you
have it? You
>>>>> don't seem to be targeting a particular binary
definition so its
>>>>> effectively just random numbers.
>>>>>
>>>>> ~Craig
>>>>>
>>>>> On Mon, Sep 4, 2017 at 4:28 PM, hameeza ahmed
<hahmed2305 at gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Thank You.
>>>>>>
>>>>>> I used EVEX_4V with all the instructions. I replaced TA
and EVEX both
>>>>>> with EVEX_4V. Now, I am getting following error:
>>>>>>
>>>>>> llvm-tblgen:
/utils/TableGen/X86RecognizableInstr.cpp:687: void
>>>>>>
llvm::X86Disassembler::RecognizableInstr::emitInstructionSpecifier():
>>>>>> Assertion `numPhysicalOperands >= 2 +
additionalOperands &&
>>>>>> numPhysicalOperands <= 4 + additionalOperands
&& "Unexpected number of
>>>>>> operands for MRMSrcMemFrm"' failed
>>>>>>
>>>>>> What to do now?
>>>>>>
>>>>>> On Tue, Sep 5, 2017 at 4:23 AM, Craig Topper
<craig.topper at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> VEX_4V tells the encoder to use the VEX.vvvv field
to encode one of
>>>>>>> the operands. Without it the encoder assumes that
the destination and one
>>>>>>> of the sources must be the same physical register.
>>>>>>>
>>>>>>> TA indicates which of the opcode maps the
instruction belongs to.
>>>>>>> This corresponds to encoding 0x3 of the VEX.mmmmm
field.
>>>>>>>
>>>>>>> ~Craig
>>>>>>>
>>>>>>> On Mon, Sep 4, 2017 at 4:01 PM, hameeza ahmed
<hahmed2305 at gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Sorry to ask but what does it mean to put both?
>>>>>>>>
>>>>>>>> On Tue, Sep 5, 2017 at 4:01 AM, Craig Topper
<
>>>>>>>> craig.topper at gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Leave TA. Put both.
>>>>>>>>>
>>>>>>>>> ~Craig
>>>>>>>>>
>>>>>>>>> On Mon, Sep 4, 2017 at 4:00 PM, hameeza
ahmed <
>>>>>>>>> hahmed2305 at gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> You are right. But when i defined my
instruction as follows:
>>>>>>>>>> def P_256B_VADD : I<0xE1,
MRMDestReg, (outs VRP_2048:$dst), (ins
>>>>>>>>>> VRP_2048:$src1,
VRPIM_2048:$src2),"P_256B_VADD\t{$src1, $src2,
>>>>>>>>>> $dst|$dst, $src1, $src2}", [(set
VRP_2048:$dst, (add (v64i32
>>>>>>>>>> VRP_2048:$src1), (v64i32
VRP_2048:$src2)))]>, VEX_4V;
>>>>>>>>>>
>>>>>>>>>> I get opcode conflicts? Then what to
do?
>>>>>>>>>>
>>>>>>>>>> On Tue, Sep 5, 2017 at 3:51 AM, Craig
Topper <
>>>>>>>>>> craig.topper at gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> That is not correct. You should add
VEX_4V. TA tells the X86
>>>>>>>>>>> encoder that the instruction opcode
belongs on the 3 byte opcode 0x0F 0x3A
>>>>>>>>>>> page in the Intel manual.
>>>>>>>>>>>
>>>>>>>>>>> ~Craig
>>>>>>>>>>>
>>>>>>>>>>> On Mon, Sep 4, 2017 at 3:38 PM,
hameeza ahmed <
>>>>>>>>>>> hahmed2305 at gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Thank You.
>>>>>>>>>>>>
>>>>>>>>>>>> My add instruction has TA as
follows:
>>>>>>>>>>>>
>>>>>>>>>>>> def P_256B_VADD : I<0xE1,
MRMDestReg, (outs VRP_2048:$dst),
>>>>>>>>>>>> (ins VRP_2048:$src1,
VRPIM_2048:$src2),"P_256B_VADD\t{$src1,
>>>>>>>>>>>> $src2, $dst|$dst, $src1,
$src2}", [(set VRP_2048:$dst, (add (v64i32
>>>>>>>>>>>> VRP_2048:$src1), (v64i32
VRP_2048:$src2)))]>, TA;
>>>>>>>>>>>>
>>>>>>>>>>>> so i defined;
>>>>>>>>>>>>
>>>>>>>>>>>> bool HasTA = TSFlags &
X86II::TA; in x86MCCodeEmitter.cpp
>>>>>>>>>>>>
>>>>>>>>>>>> then used this condition;
>>>>>>>>>>>>
>>>>>>>>>>>> if(HasTA)
>>>>>>>>>>>> ++SrcRegNum;
>>>>>>>>>>>>
>>>>>>>>>>>> now getting no error.
>>>>>>>>>>>>
>>>>>>>>>>>> please tell me whether my
method is correct? Also please
>>>>>>>>>>>> confirm this whether i need to
make changes in MC framework to emit binary
>>>>>>>>>>>> code of my vector instructions.
So far i made no changes or additions in MC
>>>>>>>>>>>> framework or any of the file
(except the above discussed) and still getting
>>>>>>>>>>>> the correct machine code.
>>>>>>>>>>>>
>>>>>>>>>>>> Is it right way?
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Tue, Sep 5, 2017 at 3:29 AM,
Craig Topper <
>>>>>>>>>>>> craig.topper at gmail.com>
wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Does your ADD instruction
have VEX_4V or EVEX_4V as part of
>>>>>>>>>>>>> its declaration in the td
file?
>>>>>>>>>>>>>
>>>>>>>>>>>>> ~Craig
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Mon, Sep 4, 2017 at 2:11
PM, hameeza ahmed <
>>>>>>>>>>>>> hahmed2305 at gmail.com>
wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>> I am trying to emit
binary for my implemented vector
>>>>>>>>>>>>>> instructions. Although
yet i havent done any change or addition in MC
>>>>>>>>>>>>>> framework, For vector
load instruction there are no error coming. But for
>>>>>>>>>>>>>> vector add
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> instruction is
something like this;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> >
%R_0_REG2048b_1<def> = P_256B_VADD %R_0_REG2048b_1<kill>,
>>>>>>>>>>>>>>
%R_0_REG2048b_0<kill>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I am getting the
following error:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Unknown immediate size
>>>>>>>>>>>>>> UNREACHABLE executed at
/lib/Target/X86/MCTargetDesc/X
>>>>>>>>>>>>>> 86BaseInfo.h:574!
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> i made extensive use
of gdb and after debugging i found the
>>>>>>>>>>>>>> line with issue in
X86MCCodeEmitter.cpp.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Here NumOps=3 (all
registers). and CurOp is 1st initialized
>>>>>>>>>>>>>> to 0.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> then, the following
code gets executed;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> case X86II::MRMDestReg:
{
>>>>>>>>>>>>>>
EmitByte(BaseOpcode, CurByte, OS);
>>>>>>>>>>>>>> unsigned SrcRegNum
= CurOp + 1; //SrcRegNum=1
>>>>>>>>>>>>>>
EmitRegModRMByte(MI.getOperand(CurOp),
>>>>>>>>>>>>>>
GetX86RegNum(MI.getOperand(SrcRegNum)),
>>>>>>>>>>>>>> CurByte, OS);
>>>>>>>>>>>>>> CurOp = SrcRegNum +
1;
>>>>>>>>>>>>>> break;
>>>>>>>>>>>>>> }
>>>>>>>>>>>>>> so here CurOp becomes
2.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> After this;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> it comes to;
>>>>>>>>>>>>>> else {
>>>>>>>>>>>>>> // If there is a
remaining operand, it must be a trailing
>>>>>>>>>>>>>> immediate. Emit it
>>>>>>>>>>>>>> // according to the
right size for the instruction. Some
>>>>>>>>>>>>>> instructions
>>>>>>>>>>>>>> // (SSE4a extrq and
insertq) have two trailing immediates.
>>>>>>>>>>>>>> while (CurOp !=
NumOps && NumOps - CurOp <= 2) {
>>>>>>>>>>>>>>
EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
>>>>>>>>>>>>>>
X86II::getSizeOfImm(TSFlags),
>>>>>>>>>>>>>>
getImmFixupKind(TSFlags),
>>>>>>>>>>>>>>
CurByte, OS, Fixups);
>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> here CurOp=2 !=NumOps=3
&& 3-2<=2
>>>>>>>>>>>>>> so while condition is
satisfied and it goes to emitimmediate
>>>>>>>>>>>>>> which is wrong and
there prints error message.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Since, there are no
immediate involved in instruction, it
>>>>>>>>>>>>>> should not go to
emitimmediate. How to solve this issue?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Please help.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thank You
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20170905/df37a9d7/attachment-0001.html>