96SEO 2026-02-23 15:19 15
。

TargetLoweringBase的容器RegisterTypeForVT、RegClassForVT以及NumRegistersForVT用于记录原生支持每个ValueType目标机器寄存器类的信息#xff0c;即类型对应的寄存…4.4.3.3.3.
1679行调用computeRegisterProperties()来计算寄存器类的衍生属性。
TargetLoweringBase的容器RegisterTypeForVT、RegClassForVT以及NumRegistersForVT用于记录原生支持每个ValueType目标机器寄存器类的信息即类型对应的寄存器类型、寄存器类别以及寄存器数量。
前面每次调用addRegisterClass()时就会设置上RegClassForVT中对应的项因此1074~1087行确定需要一个以上寄存器来保存的类型。
TargetLoweringBase::computeRegisterProperties(
static_assert(MVT::LAST_VALUETYPE
2*NumRegistersForVT[ExpandedReg-1];
(MVT::SimpleValueType)LargestIntReg;
(MVT::SimpleValueType)(ExpandedReg
ValueTypeActions.setTypeAction((MVT::SimpleValueType)ExpandedReg,
MVT::SimpleValueType)LegalIntReg;
ValueTypeActions.setTypeAction(IVT,
NumRegistersForVT[MVT::ppcf128]
RegisterTypeForVT[MVT::ppcf128]
ValueTypeActions.setTypeAction(MVT::ppcf128,
NumRegistersForVT[MVT::ppcf128]
RegisterTypeForVT[MVT::ppcf128]
ValueTypeActions.setTypeAction(MVT::ppcf128,
ValueTypeActions.setTypeAction(MVT::f128,
ValueTypeActions.setTypeAction(MVT::f64,
ValueTypeActions.setTypeAction(MVT::f32,
ValueTypeActions.setTypeAction(MVT::f16,
容器TransformToType用于记录值类型间的提升或扩展关系。
对于扩展类型它包含了该扩展的一步比如i64
i16。
至于系统内在就支持的类型容器会保存相同的类型比如i32
i321066行循环初始化。
注意TransformToType与PromoteToType的含义是不同的。
PromoteToType给出了对指定操作指定类型所要提升到的类型。
而TransformToType则是通用的提升规则即PromoteToType给的是特例。
与TransformToType伴随的容器ValueTypeActions则记录了该提升或扩展所需的操作这些操作通过枚举类型LegalizeTypeAction来描述。
computeRegisterProperties()下半部分处理向量类型提升。
1166行的getPreferredVectorAction()如果类型是v32i1支持AVX-512但不支持指令集返回TypeSplitVector如果开启了X86实验性的向量拓宽合法化返回TypeWidenVector如果该向量只包含一个元素返回TypeScalarizeVector否则返回TypePromoteInteger。
TargetLoweringBase::computeRegisterProperties续
(unsigned)MVT::LAST_VECTOR_VALUETYPE;
ValueTypeActions.setTypeAction(VT,
ValueTypeActions.setTypeAction(VT,
ValueTypeActions.setTypeAction(VT,
ValueTypeActions.setTypeAction(VT,
ValueTypeActions.setTypeAction(VT,
ValueTypeActions.setTypeAction(VT,
注意1168行与1189行的case分支如果1185行与1203行的条件语句不满足它们将执行下一个case分支的语句。
因此对扩展无望的类型就会谋求分裂类型即通过多个更小的向量类型来支持。
对于TypeSplitVector操作源向量类型必须是2幂次大小getVectorTypeBreakdownMVT()获取可能的分裂类型它的返回值是所需寄存器的个数。
!TLI-isTypeLegal(MVT::getVectorVT(EltTy,
NumVectorRegs*(NewVTSize/DestVT.getSizeInBits());
向量类型有一些限制它元素的个数必须是2的幂。
因此如果要求的类型不是由2的幂个元素组成就需要使用这么多个元素大小的类型来替换868行条件。
如果这个检查通过了那么在875行循环我们每次将元素个数减半换而言之寄存器数个数加倍直到找到合法的向量类型为止。
因此如果883行条件不满足这意味着我们把元素个数降到1也没找到合法的类型。
那么以元素类型为出发点在891行通过NextPowerOf2()向上查找大小为2次幂且最接近的类型。
在computeRegisterProperties()的1212与1214行通过NumRegistersForVT与RegisterTypeForVT记录下了getVectorTypeBreakdownMVT()给出的结果。
在1216行getPow2VectorType()返回大小为2次幂且最接近VT的上级类型如果VT本身不是2次幂大小就要提升到这个类型。
最后在1244行循环通过findRepresentativeClass()找出每个类型的代表寄存器。
TargetLoweringBase::findRepresentativeClass(const
SuperRegRC(TRI-getNumRegClasses());
SuperRegRC.setBitsInMask(RCI.getMask());
1041行的SuperRegClassIterator是一个定制的迭代器可以遍历一个指定寄存器类的上级寄存器。
而容器SuperRegRC记录的就是这些上级寄存器类的序号。
因此1046行循环就是查找最大的寄存器类并连同使用代价返回它这里代价总是1它被调度器用来估算寄存器压力。
从computeRegisterProperties()返回X86TargetLowering构造函数完成剩下的配置就结束了。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback