Go to the documentation of this file.
25 AArch64WinCOFFStreamer(
MCContext &
C, std::unique_ptr<MCAsmBackend> AB,
26 std::unique_ptr<MCCodeEmitter> CE,
27 std::unique_ptr<MCObjectWriter> OW)
30 void emitWinEHHandlerData(
SMLoc Loc)
override;
31 void emitWindowsUnwindTables()
override;
33 void finishImpl()
override;
36 void AArch64WinCOFFStreamer::emitWinEHHandlerData(
SMLoc Loc) {
41 EHStreamer.EmitUnwindInfo(*
this, getCurrentWinFrameInfo(),
45 void AArch64WinCOFFStreamer::emitWindowsUnwindTables(
WinEH::FrameInfo *Frame) {
46 EHStreamer.EmitUnwindInfo(*
this, Frame,
false);
49 void AArch64WinCOFFStreamer::emitWindowsUnwindTables() {
50 if (!getNumWinFrameInfos())
55 void AArch64WinCOFFStreamer::finishImpl() {
57 emitWindowsUnwindTables();
69 void AArch64TargetWinCOFFStreamer::emitARM64WinUnwindCode(
unsigned UnwindCode,
77 CurFrame->
EpilogMap[CurrentEpilog].Instructions.push_back(Inst);
88 emitARM64WinUnwindCode(
Op, -1, Size);
106 "Offset for save reg should be >= 0 && <= 504");
133 "Offset for save reg should be >= 0 && <= 504");
157 assert(
Offset <= 2040 &&
"UOP_AddFP must have offset <= 2040");
192 CurrentEpilog =
S.emitCFILabel();
204 CurFrame->
EpilogMap[CurrentEpilog].Instructions.push_back(Inst);
206 CurFrame->
EpilogMap[CurrentEpilog].End = Label;
207 CurrentEpilog =
nullptr;
292 std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter>
Emitter,
293 bool RelaxAll,
bool IncrementalLinkerCompatible) {
296 S->getAssembler().setIncrementalLinkerCompatible(IncrementalLinkerCompatible);
MCStreamer & getStreamer()
void emitARM64WinCFISaveReg(unsigned Reg, int Offset) override
void emitARM64WinCFIClearUnwoundToCall() override
This is an optimization pass for GlobalISel generic memory operations.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
into xmm2 addss xmm2 xmm1 xmm3 addss xmm3 movaps xmm0 unpcklps xmm0 ret seems silly when it could just be one addps Expand libm rounding functions main should enable SSE DAZ mode and other fast SSE modes Think about doing i64 math in SSE regs on x86 This testcase should have no SSE instructions in it
void emitARM64WinCFIAddFP(unsigned Size) override
Context object for machine code objects.
Emits exception handling directives.
Reg
All possible values of the reg field in the ModR/M byte.
void emitARM64WinCFISaveFRegP(unsigned Reg, int Offset) override
void emitARM64WinCFISaveAnyRegD(unsigned Reg, int Offset) override
void emitARM64WinCFISaveFRegX(unsigned Reg, int Offset) override
void emitARM64WinCFISaveAnyRegQP(unsigned Reg, int Offset) override
void emitARM64WinCFISaveRegP(unsigned Reg, int Offset) override
void emitARM64WinCFISaveRegX(unsigned Reg, int Offset) override
void emitARM64WinCFISaveAnyRegQPX(unsigned Reg, int Offset) override
MapVector< MCSymbol *, Epilog > EpilogMap
dxil DXContainer Global Emitter
Represents a location in source code.
void emitARM64WinCFIMachineFrame() override
void emitARM64WinCFITrapFrame() override
void emitARM64WinCFISaveAnyRegQX(unsigned Reg, int Offset) override
void emitARM64WinCFISaveR19R20X(int Offset) override
(vector float) vec_cmpeq(*A, *B) C
virtual void emitWinEHHandlerData(SMLoc Loc=SMLoc())
void emitARM64WinCFIEpilogEnd() override
void emitARM64WinCFISaveFPLR(int Offset) override
void emitARM64WinCFIContext() override
MCWinCOFFStreamer * createAArch64WinCOFFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter, bool RelaxAll, bool IncrementalLinkerCompatible)
void emitARM64WinCFISaveAnyRegDP(unsigned Reg, int Offset) override
void emitARM64WinCFISaveAnyRegIP(unsigned Reg, int Offset) override
void emitARM64WinCFIPACSignLR() override
void emitARM64WinCFIAllocStack(unsigned Size) override
const MCSymbol * PrologEnd
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
void emitARM64WinCFISaveAnyRegDPX(unsigned Reg, int Offset) override
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
@ CE
Windows NT (Windows on ARM)
void emitARM64WinCFIEpilogStart() override
void emitARM64WinCFINop() override
void finishImpl() override
Streamer specific finalization.
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
void emitARM64WinCFISaveNext() override
void emitARM64WinCFISaveFPLRX(int Offset) override
void emitARM64WinCFISaveRegPX(unsigned Reg, int Offset) override
void emitARM64WinCFISaveFReg(unsigned Reg, int Offset) override
void emitARM64WinCFISaveAnyRegQ(unsigned Reg, int Offset) override
void emitARM64WinCFISaveAnyRegDX(unsigned Reg, int Offset) override
std::vector< Instruction > Instructions
void emitARM64WinCFISaveLRPair(unsigned Reg, int Offset) override
void emitARM64WinCFIPrologEnd() override
void emitARM64WinCFISaveAnyRegIPX(unsigned Reg, int Offset) override
void emitARM64WinCFISetFP() override
void emitARM64WinCFISaveFRegPX(unsigned Reg, int Offset) override
void emitARM64WinCFISaveAnyRegI(unsigned Reg, int Offset) override
void emitARM64WinCFISaveAnyRegIX(unsigned Reg, int Offset) override