Skip to content

Commit c3c923c

Browse files
[X86][GlobalISel] Enable SINCOS with libcall mapping (#142438)
1 parent a0ce3e6 commit c3c923c

File tree

5 files changed

+348
-6
lines changed

5 files changed

+348
-6
lines changed

llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,11 @@ class LegalizerHelper {
295295
getNeutralElementForVecReduce(unsigned Opcode, MachineIRBuilder &MIRBuilder,
296296
LLT Ty);
297297

298+
LegalizeResult emitSincosLibcall(MachineInstr &MI,
299+
MachineIRBuilder &MIRBuilder, unsigned Size,
300+
Type *OpType,
301+
LostDebugLocObserver &LocObserver);
302+
298303
public:
299304
/// Return the alignment to use for a stack temporary object with the given
300305
/// type.

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,8 @@ static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) {
469469
RTLIBCASE(COSH_F);
470470
case TargetOpcode::G_FTANH:
471471
RTLIBCASE(TANH_F);
472+
case TargetOpcode::G_FSINCOS:
473+
RTLIBCASE(SINCOS_F);
472474
case TargetOpcode::G_FLOG10:
473475
RTLIBCASE(LOG10_F);
474476
case TargetOpcode::G_FLOG:
@@ -648,6 +650,54 @@ simpleLibcall(MachineInstr &MI, MachineIRBuilder &MIRBuilder, unsigned Size,
648650
LocObserver, &MI);
649651
}
650652

653+
LegalizerHelper::LegalizeResult LegalizerHelper::emitSincosLibcall(
654+
MachineInstr &MI, MachineIRBuilder &MIRBuilder, unsigned Size, Type *OpType,
655+
LostDebugLocObserver &LocObserver) {
656+
MachineFunction &MF = *MI.getMF();
657+
MachineRegisterInfo &MRI = MF.getRegInfo();
658+
659+
Register DstSin = MI.getOperand(0).getReg();
660+
Register DstCos = MI.getOperand(1).getReg();
661+
Register Src = MI.getOperand(2).getReg();
662+
LLT DstTy = MRI.getType(DstSin);
663+
664+
int MemSize = DstTy.getSizeInBytes();
665+
Align Alignment = getStackTemporaryAlignment(DstTy);
666+
const DataLayout &DL = MIRBuilder.getDataLayout();
667+
unsigned AddrSpace = DL.getAllocaAddrSpace();
668+
MachinePointerInfo PtrInfo;
669+
670+
Register StackPtrSin =
671+
createStackTemporary(TypeSize::getFixed(MemSize), Alignment, PtrInfo)
672+
.getReg(0);
673+
Register StackPtrCos =
674+
createStackTemporary(TypeSize::getFixed(MemSize), Alignment, PtrInfo)
675+
.getReg(0);
676+
677+
auto &Ctx = MF.getFunction().getContext();
678+
auto LibcallResult =
679+
createLibcall(MIRBuilder, getRTLibDesc(MI.getOpcode(), Size),
680+
{{0}, Type::getVoidTy(Ctx), 0},
681+
{{Src, OpType, 0},
682+
{StackPtrSin, PointerType::get(Ctx, AddrSpace), 1},
683+
{StackPtrCos, PointerType::get(Ctx, AddrSpace), 2}},
684+
LocObserver, &MI);
685+
686+
if (LibcallResult != LegalizeResult::Legalized)
687+
return LegalizerHelper::UnableToLegalize;
688+
689+
MachineMemOperand *LoadMMOSin = MF.getMachineMemOperand(
690+
PtrInfo, MachineMemOperand::MOLoad, MemSize, Alignment);
691+
MachineMemOperand *LoadMMOCos = MF.getMachineMemOperand(
692+
PtrInfo, MachineMemOperand::MOLoad, MemSize, Alignment);
693+
694+
MIRBuilder.buildLoad(DstSin, StackPtrSin, *LoadMMOSin);
695+
MIRBuilder.buildLoad(DstCos, StackPtrCos, *LoadMMOCos);
696+
MI.eraseFromParent();
697+
698+
return LegalizerHelper::Legalized;
699+
}
700+
651701
LegalizerHelper::LegalizeResult
652702
llvm::createMemLibcall(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
653703
MachineInstr &MI, LostDebugLocObserver &LocObserver) {
@@ -1275,6 +1325,16 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
12751325
return Status;
12761326
break;
12771327
}
1328+
case TargetOpcode::G_FSINCOS: {
1329+
LLT LLTy = MRI.getType(MI.getOperand(0).getReg());
1330+
unsigned Size = LLTy.getSizeInBits();
1331+
Type *HLTy = getFloatTypeForLLT(Ctx, LLTy);
1332+
if (!HLTy || (Size != 32 && Size != 64 && Size != 80 && Size != 128)) {
1333+
LLVM_DEBUG(dbgs() << "No libcall available for type " << LLTy << ".\n");
1334+
return UnableToLegalize;
1335+
}
1336+
return emitSincosLibcall(MI, MIRBuilder, Size, HLTy, LocObserver);
1337+
}
12781338
case TargetOpcode::G_LROUND:
12791339
case TargetOpcode::G_LLROUND:
12801340
case TargetOpcode::G_INTRINSIC_LRINT:

llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
9797
.widenScalarToNextPow2(0, /*Min=*/8)
9898
.clampScalar(0, s8, sMaxScalar);
9999

100-
getActionDefinitionsBuilder({G_LROUND, G_LLROUND, G_FCOS, G_FCOSH, G_FACOS,
101-
G_FSIN, G_FSINH, G_FASIN, G_FTAN, G_FTANH,
102-
G_FATAN, G_FATAN2, G_FPOW, G_FEXP, G_FEXP2,
103-
G_FEXP10, G_FLOG, G_FLOG2, G_FLOG10, G_FPOWI})
100+
getActionDefinitionsBuilder(
101+
{G_LROUND, G_LLROUND, G_FCOS, G_FCOSH, G_FACOS, G_FSIN, G_FSINH,
102+
G_FASIN, G_FTAN, G_FTANH, G_FATAN, G_FATAN2, G_FPOW, G_FEXP,
103+
G_FEXP2, G_FEXP10, G_FLOG, G_FLOG2, G_FLOG10, G_FPOWI, G_FSINCOS})
104104
.libcall();
105105

106106
getActionDefinitionsBuilder(G_FSQRT)
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=i686-linux-gnu -run-pass=regbankselect,instruction-select %s -o - | FileCheck %s --check-prefixes GISEL-I686
3+
4+
---
5+
name: test_sincos_f32
6+
alignment: 16
7+
legalized: true
8+
fixedStack:
9+
- { id: 0, type: default, offset: 0, size: 4, alignment: 16, stack-id: default,
10+
isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
11+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
12+
stack:
13+
- { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4,
14+
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
15+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
16+
- { id: 1, name: '', type: default, offset: 0, size: 4, alignment: 4,
17+
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
18+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
19+
body: |
20+
bb.1:
21+
; GISEL-I686-LABEL: name: test_sincos_f32
22+
; GISEL-I686: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (invariant load (s32) from %fixed-stack.0, align 16)
23+
; GISEL-I686-NEXT: [[LEA32r:%[0-9]+]]:gr32 = LEA32r %stack.0, 1, $noreg, 0, $noreg
24+
; GISEL-I686-NEXT: [[LEA32r1:%[0-9]+]]:gr32 = LEA32r %stack.1, 1, $noreg, 0, $noreg
25+
; GISEL-I686-NEXT: ADJCALLSTACKDOWN32 12, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
26+
; GISEL-I686-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esp
27+
; GISEL-I686-NEXT: MOV32mr [[COPY]], 1, $noreg, 0, $noreg, [[MOV32rm]] :: (store (s32) into stack, align 1)
28+
; GISEL-I686-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $esp
29+
; GISEL-I686-NEXT: MOV32mr [[COPY1]], 1, $noreg, 4, $noreg, [[LEA32r]] :: (store (s32) into stack + 4, align 1)
30+
; GISEL-I686-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY $esp
31+
; GISEL-I686-NEXT: MOV32mr [[COPY2]], 1, $noreg, 8, $noreg, [[LEA32r1]] :: (store (s32) into stack + 8, align 1)
32+
; GISEL-I686-NEXT: CALLpcrel32 &sincosf, csr_32, implicit $esp, implicit $ssp
33+
; GISEL-I686-NEXT: ADJCALLSTACKUP32 12, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
34+
; GISEL-I686-NEXT: [[LD_Fp32m:%[0-9]+]]:rfp32 = nofpexcept LD_Fp32m %stack.0, 1, $noreg, 0, $noreg, implicit-def dead $fpsw, implicit $fpcw :: (load (s32) from %stack.0)
35+
; GISEL-I686-NEXT: [[LD_Fp32m1:%[0-9]+]]:rfp32 = nofpexcept LD_Fp32m %stack.1, 1, $noreg, 0, $noreg, implicit-def dead $fpsw, implicit $fpcw :: (load (s32) from %stack.1)
36+
; GISEL-I686-NEXT: $fp0 = COPY [[LD_Fp32m]]
37+
; GISEL-I686-NEXT: $fp1 = COPY [[LD_Fp32m1]]
38+
; GISEL-I686-NEXT: RET 0, implicit $fp0, implicit $fp1
39+
%1:_(p0) = G_FRAME_INDEX %fixed-stack.0
40+
%0:_(s32) = G_LOAD %1(p0) :: (invariant load (s32) from %fixed-stack.0, align 16)
41+
%4:_(p0) = G_FRAME_INDEX %stack.0
42+
%5:_(p0) = G_FRAME_INDEX %stack.1
43+
ADJCALLSTACKDOWN32 12, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
44+
%6:_(p0) = COPY $esp
45+
%7:_(s32) = G_CONSTANT i32 0
46+
%8:_(p0) = G_PTR_ADD %6, %7(s32)
47+
G_STORE %0(s32), %8(p0) :: (store (s32) into stack, align 1)
48+
%9:_(p0) = COPY $esp
49+
%10:_(s32) = G_CONSTANT i32 4
50+
%11:_(p0) = G_PTR_ADD %9, %10(s32)
51+
G_STORE %4(p0), %11(p0) :: (store (s32) into stack + 4, align 1)
52+
%12:_(p0) = COPY $esp
53+
%13:_(s32) = G_CONSTANT i32 8
54+
%14:_(p0) = G_PTR_ADD %12, %13(s32)
55+
G_STORE %5(p0), %14(p0) :: (store (s32) into stack + 8, align 1)
56+
CALLpcrel32 &sincosf, csr_32, implicit $esp, implicit $ssp
57+
ADJCALLSTACKUP32 12, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
58+
%2:_(s32) = G_LOAD %4(p0) :: (load (s32) from %stack.0)
59+
%3:_(s32) = G_LOAD %5(p0) :: (load (s32) from %stack.1)
60+
$fp0 = COPY %2(s32)
61+
$fp1 = COPY %3(s32)
62+
RET 0, implicit $fp0, implicit $fp1
63+
...
64+
---
65+
name: test_sincos_f64
66+
alignment: 16
67+
legalized: true
68+
fixedStack:
69+
- { id: 0, type: default, offset: 0, size: 8, alignment: 16, stack-id: default,
70+
isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
71+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
72+
stack:
73+
- { id: 0, name: '', type: default, offset: 0, size: 8, alignment: 8,
74+
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
75+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
76+
- { id: 1, name: '', type: default, offset: 0, size: 8, alignment: 8,
77+
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
78+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
79+
body: |
80+
bb.1:
81+
; GISEL-I686-LABEL: name: test_sincos_f64
82+
; GISEL-I686: [[LEA32r:%[0-9]+]]:gr32 = LEA32r %fixed-stack.0, 1, $noreg, 0, $noreg
83+
; GISEL-I686-NEXT: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm %fixed-stack.0, 1, $noreg, 0, $noreg :: (invariant load (s32) from %fixed-stack.0, align 16)
84+
; GISEL-I686-NEXT: [[MOV32rm1:%[0-9]+]]:gr32 = MOV32rm [[LEA32r]], 1, $noreg, 4, $noreg :: (invariant load (s32) from %fixed-stack.0 + 4, basealign 16)
85+
; GISEL-I686-NEXT: [[LEA32r1:%[0-9]+]]:gr32 = LEA32r %stack.0, 1, $noreg, 0, $noreg
86+
; GISEL-I686-NEXT: [[LEA32r2:%[0-9]+]]:gr32 = LEA32r %stack.1, 1, $noreg, 0, $noreg
87+
; GISEL-I686-NEXT: ADJCALLSTACKDOWN32 16, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
88+
; GISEL-I686-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esp
89+
; GISEL-I686-NEXT: [[MOV32r0_:%[0-9]+]]:gr32_nosp = MOV32r0 implicit-def dead $eflags
90+
; GISEL-I686-NEXT: [[LEA32r3:%[0-9]+]]:gr32 = LEA32r [[COPY]], 1, [[MOV32r0_]], 0, $noreg
91+
; GISEL-I686-NEXT: MOV32mr [[COPY]], 1, $noreg, 0, $noreg, [[MOV32rm]] :: (store (s32) into stack, align 1)
92+
; GISEL-I686-NEXT: MOV32mr [[LEA32r3]], 1, $noreg, 4, $noreg, [[MOV32rm1]] :: (store (s32) into stack + 4, align 1)
93+
; GISEL-I686-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $esp
94+
; GISEL-I686-NEXT: MOV32mr [[COPY1]], 1, $noreg, 8, $noreg, [[LEA32r1]] :: (store (s32) into stack + 8, align 1)
95+
; GISEL-I686-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY $esp
96+
; GISEL-I686-NEXT: MOV32mr [[COPY2]], 1, $noreg, 12, $noreg, [[LEA32r2]] :: (store (s32) into stack + 12, align 1)
97+
; GISEL-I686-NEXT: CALLpcrel32 &sincos, csr_32, implicit $esp, implicit $ssp
98+
; GISEL-I686-NEXT: ADJCALLSTACKUP32 16, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
99+
; GISEL-I686-NEXT: $fp0 = IMPLICIT_DEF
100+
; GISEL-I686-NEXT: $fp1 = IMPLICIT_DEF
101+
; GISEL-I686-NEXT: RET 0, implicit $fp0, implicit $fp1
102+
%1:_(p0) = G_FRAME_INDEX %fixed-stack.0
103+
%25:_(s32) = G_LOAD %1(p0) :: (invariant load (s32) from %fixed-stack.0, align 16)
104+
%17:_(s32) = G_CONSTANT i32 4
105+
%26:_(p0) = G_PTR_ADD %1, %17(s32)
106+
%27:_(s32) = G_LOAD %26(p0) :: (invariant load (s32) from %fixed-stack.0 + 4, basealign 16)
107+
%4:_(p0) = G_FRAME_INDEX %stack.0
108+
%5:_(p0) = G_FRAME_INDEX %stack.1
109+
ADJCALLSTACKDOWN32 16, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
110+
%6:_(p0) = COPY $esp
111+
%7:_(s32) = G_CONSTANT i32 0
112+
%8:_(p0) = G_PTR_ADD %6, %7(s32)
113+
G_STORE %25(s32), %8(p0) :: (store (s32) into stack, align 1)
114+
%24:_(p0) = G_PTR_ADD %8, %17(s32)
115+
G_STORE %27(s32), %24(p0) :: (store (s32) into stack + 4, align 1)
116+
%9:_(p0) = COPY $esp
117+
%10:_(s32) = G_CONSTANT i32 8
118+
%11:_(p0) = G_PTR_ADD %9, %10(s32)
119+
G_STORE %4(p0), %11(p0) :: (store (s32) into stack + 8, align 1)
120+
%12:_(p0) = COPY $esp
121+
%13:_(s32) = G_CONSTANT i32 12
122+
%14:_(p0) = G_PTR_ADD %12, %13(s32)
123+
G_STORE %5(p0), %14(p0) :: (store (s32) into stack + 12, align 1)
124+
CALLpcrel32 &sincos, csr_32, implicit $esp, implicit $ssp
125+
ADJCALLSTACKUP32 16, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
126+
$fp0 = IMPLICIT_DEF
127+
$fp1 = IMPLICIT_DEF
128+
RET 0, implicit $fp0, implicit $fp1
129+
...
130+
---
131+
name: test_sincos_f80
132+
alignment: 16
133+
legalized: true
134+
fixedStack:
135+
- { id: 0, type: default, offset: 0, size: 10, alignment: 16, stack-id: default,
136+
isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
137+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
138+
stack:
139+
- { id: 0, name: '', type: default, offset: 0, size: 10, alignment: 16,
140+
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
141+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
142+
- { id: 1, name: '', type: default, offset: 0, size: 10, alignment: 16,
143+
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
144+
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
145+
body: |
146+
bb.1:
147+
; GISEL-I686-LABEL: name: test_sincos_f80
148+
; GISEL-I686: [[LD_Fp80m:%[0-9]+]]:rfp80 = nofpexcept LD_Fp80m %fixed-stack.0, 1, $noreg, 0, $noreg, implicit-def dead $fpsw, implicit $fpcw :: (invariant load (s80) from %fixed-stack.0, align 16)
149+
; GISEL-I686-NEXT: [[LEA32r:%[0-9]+]]:gr32 = LEA32r %stack.0, 1, $noreg, 0, $noreg
150+
; GISEL-I686-NEXT: [[LEA32r1:%[0-9]+]]:gr32 = LEA32r %stack.1, 1, $noreg, 0, $noreg
151+
; GISEL-I686-NEXT: ADJCALLSTACKDOWN32 20, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
152+
; GISEL-I686-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esp
153+
; GISEL-I686-NEXT: nofpexcept ST_FpP80m [[COPY]], 1, $noreg, 0, $noreg, [[LD_Fp80m]], implicit-def dead $fpsw, implicit $fpcw :: (store (s80) into stack, align 1)
154+
; GISEL-I686-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $esp
155+
; GISEL-I686-NEXT: MOV32mr [[COPY1]], 1, $noreg, 12, $noreg, [[LEA32r]] :: (store (s32) into stack + 12, align 1)
156+
; GISEL-I686-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY $esp
157+
; GISEL-I686-NEXT: MOV32mr [[COPY2]], 1, $noreg, 16, $noreg, [[LEA32r1]] :: (store (s32) into stack + 16, align 1)
158+
; GISEL-I686-NEXT: CALLpcrel32 &sincosl, csr_32, implicit $esp, implicit $ssp
159+
; GISEL-I686-NEXT: ADJCALLSTACKUP32 20, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
160+
; GISEL-I686-NEXT: [[LD_Fp80m1:%[0-9]+]]:rfp80 = nofpexcept LD_Fp80m %stack.0, 1, $noreg, 0, $noreg, implicit-def dead $fpsw, implicit $fpcw :: (load (s80) from %stack.0, align 16)
161+
; GISEL-I686-NEXT: [[LD_Fp80m2:%[0-9]+]]:rfp80 = nofpexcept LD_Fp80m %stack.1, 1, $noreg, 0, $noreg, implicit-def dead $fpsw, implicit $fpcw :: (load (s80) from %stack.1, align 16)
162+
; GISEL-I686-NEXT: $fp0 = COPY [[LD_Fp80m1]]
163+
; GISEL-I686-NEXT: $fp1 = COPY [[LD_Fp80m2]]
164+
; GISEL-I686-NEXT: RET 0, implicit $fp0, implicit $fp1
165+
%1:_(p0) = G_FRAME_INDEX %fixed-stack.0
166+
%0:_(s80) = G_LOAD %1(p0) :: (invariant load (s80) from %fixed-stack.0, align 16)
167+
%4:_(p0) = G_FRAME_INDEX %stack.0
168+
%5:_(p0) = G_FRAME_INDEX %stack.1
169+
ADJCALLSTACKDOWN32 20, 0, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
170+
%6:_(p0) = COPY $esp
171+
%7:_(s32) = G_CONSTANT i32 0
172+
%8:_(p0) = G_PTR_ADD %6, %7(s32)
173+
G_STORE %0(s80), %8(p0) :: (store (s80) into stack, align 1)
174+
%9:_(p0) = COPY $esp
175+
%10:_(s32) = G_CONSTANT i32 12
176+
%11:_(p0) = G_PTR_ADD %9, %10(s32)
177+
G_STORE %4(p0), %11(p0) :: (store (s32) into stack + 12, align 1)
178+
%12:_(p0) = COPY $esp
179+
%13:_(s32) = G_CONSTANT i32 16
180+
%14:_(p0) = G_PTR_ADD %12, %13(s32)
181+
G_STORE %5(p0), %14(p0) :: (store (s32) into stack + 16, align 1)
182+
CALLpcrel32 &sincosl, csr_32, implicit $esp, implicit $ssp
183+
ADJCALLSTACKUP32 20, 0, implicit-def $esp, implicit-def $eflags, implicit-def $ssp, implicit $esp, implicit $ssp
184+
%2:_(s80) = G_LOAD %4(p0) :: (load (s80) from %stack.0, align 16)
185+
%3:_(s80) = G_LOAD %5(p0) :: (load (s80) from %stack.1, align 16)
186+
$fp0 = COPY %2(s80)
187+
$fp1 = COPY %3(s80)
188+
RET 0, implicit $fp0, implicit $fp1
189+
...

0 commit comments

Comments
 (0)