当前位置: 首页 > news >正文

做平面设计素材的哪个网站好google地图 wordpress

做平面设计素材的哪个网站好,google地图 wordpress,解除网站开发合同 首付款是否退,高创园网站建设方案想好好熟悉一下llvm开发一个新后端都要干什么#xff0c;于是参考了老师的系列文章#xff1a; LLVM 后端实践笔记 代码在这里#xff08;还没来得及准备#xff0c;先用网盘暂存一下#xff09;#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?… 想好好熟悉一下llvm开发一个新后端都要干什么于是参考了老师的系列文章 LLVM 后端实践笔记 代码在这里还没来得及准备先用网盘暂存一下 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?pwdvd6s 提取码: vd6s  之前的章节只实现了 int 和 32 位的 long 类型数据这一章会新增一些更复杂的数据类型比如 char, bool, short, long long还会增加结构体浮点和向量类型。这一部分内容相对比较简单其实这些类型也都是标准语言都支持的类型所以 LLVM 自身已经实现了很大一部分功能只要我们的后端不那么奇怪就很容易填补缺失的内容。 目录 一、修改的文件 1.1 Cpu0ISelDAGToDAG.cpp 1.2 Cpu0ISelLowering.cpp/.h 1.3 Cpu0InstrInfo.td 1.4 Cpu0SEISelDAGToDAG.cpp/.h 1.5 MCTargetDesc/Cpu0InstPrinter.cpp/.h 二、实现结果 2.1 局部指针 2.2 char类型 2.3 bool类型 2.4 short 2.5 long long 类型 2.6 局部数组、结构体 2.7 全局数组、结构体 2.8 向量 2.9 cl指令 一、修改的文件 1.1 Cpu0ISelDAGToDAG.cpp 在SelectAddr接口内增加对于基址常量偏移这种地址形式的处理对于全局基址加常量偏移的情况提取其基址和偏移。。 1.2 Cpu0ISelLowering.cpp/.h 有关于对 bool 类型的处理这里增加了一些对 i1 类型 Promote 的合法化描述告诉 LLVM 在遇到对 i1 类型的 extend 时要做 Promote。Promote 是将较小宽度的数据类型扩展成对应的能够支持的更宽的数据宽度类型在指令选择的类型合法化阶段会起到作用。在 long long 实现中在 Lowering 的位置还需要增加对 long long 类型的移位操作合法化。 覆盖一个函数 isOffsetFoldingLegal()直接返回 false避免带偏移的全局地址展开Cpu0 和 Mips 一样无法处理这种情况。我们实现的 getAddrNonPIC() 方法中将全局符号地址展开成一条加法指令对地址的高低位做加法运算。所以实际上我们会将一条全局地址带偏移的寻址展开成加法运算 base然后再把结果与 offset 相加的 DAG在 Cpu0ISelDAGToDAG.cpp 中的 SelectAddr 中提取这种情况的 node Value此时就已经是两个 add node 了。 最后还需要对向量类型的支持做一小部分改动覆盖 getSetCCResultType() 方法如果是向量类型使用 VT.changeVectorElementTypeToInteger() 方法返回 CC 值。 1.3 Cpu0InstrInfo.td 到目前因为我们添加数据类型的很多实现代码已经在公共 LLVM 代码中实现所以实际上大多数修改都在 td 文件中。 新增一个 mem_ea 的操作数类型这是一个 complexpattern会定义其 encoding 操作和 printinst 等操作它用来描述指令 pattern 中的地址表示然后要定义一个 LEA_ADDiu 的模式这是一个不会输出成指令的模式它实际上是计算地址偏移的结果这和 sparc 处理器中的 LEA_ADDRi 是一样的效果。 新增 i8 和 i16 相关的 extend 类型以及对应的 ld/st命名为 LB, LBu, SB, LH, LHu, SH。LB, LH 处理有符号的 i8/i16 类型 loadLBu, LHu 处理无符号的 i8/i16 类型 loadSB, SH 处理i8/i16 类型的store。 新增 CountLeading0 和 CountLeading1 的 pattern用来选择到计算前导 0 和计算前导 1 的指令llvm 内置了 ctlz 的 nodecount leading zero可以直接把 clz 指令接过去不过对于 count leading 1 是没有对应的 node 的不过可以通过先对值取反然后求前导 0 的方式实现前导 1 的计算即 ctlz (not RC:$rb)。 因为 C 语言没有对求前导 0 和前导 1 的原生语法所以实际上会使用 builtin 接口来实现也就是说在 C 语言描述中为了实现这种功能需要调用 __builtin_clz() 函数ctls 就是先对参数取反再调用 ctlz 的 builtin因为我们使用了内置的 node所以这部分是 llvm 帮我们实现了。 1.4 Cpu0SEISelDAGToDAG.cpp/.h 定义了一个 selectAddESubE() 方法用来处理带进位的加减法运算的指令选择。在 trySelect() 方法中将对 ISD::SUBE, ISD::ADDE 的情况选择用 selectAddESubE() 来处理。 selectAddESubE() 方法为符合条件的 node 新增了一个操作数节点该节点会读取状态字中进位是否是 1并将结果叠加到运算中在 Cpu032I 处理器中使用 CMP 指令和 ANDi 指令来获取进位状态在 Cpu032II 处理器中则使用 SLT 指令直接判断进位。 另外还要处理 SMUL_LOHI 和 UMUL_LOHI 节点这是能够直接返回两个运算结果的节点高低位。 1.5 MCTargetDesc/Cpu0InstPrinter.cpp/.h 增加mem_ea 的printinst操作的实现。 二、实现结果 2.1 局部指针 int test_local_pointer() {int b 3;int *p b;return *p; } addiu $sp, $sp, -8 # 扩栈addiu $2, $zero, 3 # 将3存到寄存器st $2, 4($sp) # 将其存到栈上addiu $2, $sp, 4 # 读出栈中局部变量的地址st $2, 0($sp) # 将这个地址存到栈上ld $2, 0($sp) # 读出这个地址ld $2, 0($2) # 读出地址里的内容addiu $sp, $sp, 8 # 回栈ret $lr # 返回 2.2 char类型 struct Date {short year;char month;char day;char hour;char minute;char second; };unsigned char b[4] {a, b, c, \0};int test_char() {unsigned char a b[1];char c (char)b[1];struct Date date1 {2021, (char)2, (char)27, (char)17, (char)22, (char)10};char m date1.month;char s date1.second;return 0; } addiu $sp, $sp, -24lui $2, %got_hi(b)addu $2, $2, $gpld $2, %got_lo(b)($2) # 与上边搭配加载全局变量b的首地址lbu $3, 1($2) # 计算b[1]的地址存到寄存器3sb $3, 20($sp) # 将寄存器3内的地址存到栈上lbu $2, 1($2) # 再次计算b[1]的地址存到寄存器2sb $2, 16($sp) # 将寄存器2内的地址存到栈上ld $2, %got($__const.test_char.date1)($gp)ori $2, $2, %lo($__const.test_char.date1) # 获取要写入局部变量对象的常量的地址lhu $3, 6($2) # 将偏移6处的内容load到寄存器3中lhu是i16的就是load范围是2字节lhu $4, 4($2) # 将偏移4处的内容load到寄存器4中lhu是i16的就是load范围是2字节shl $4, $4, 16 or $3, $4, $3 # 这两条是将上述load出来的两个2字节的内容拼成一个4字节的st $3, 12($sp) # 将这4字节存到栈上也就是存放hour, minute, second到 date1lhu $3, 2($2) # 这里是相同的逻辑lhu $2, 0($2)shl $2, $2, 16or $2, $2, $3st $2, 8($sp) # 将这4字节存到栈上也就是存放year, month, day到 date1lbu $2, 10($sp) # 从偏移10的位置读出date1.month我们知道year, month, day在偏移8的位置year两个字节因此month在偏移10的位置这里很正确sb $2, 4($sp) # 将其存到栈上mlbu $2, 14($sp) # 从偏移14的位置读出date1.secondsb $2, 0($sp) # 将其存到栈上saddiu $2, $zero, 0addiu $sp, $sp, 24ret $lr 2.3 bool类型 bool test_load_bool() {int a 1;if (a 0)return false;return true; } 这里涉及到跳转我们当前可能编不过下一节的内容加上之后我们就可以编过了我们先提前看一下效果。 _Z14test_load_boolv: # %bb.0:addiu $sp, $sp, -8addiu $2, $zero, 1st $2, 0($sp)ld $2, 0($sp)addiu $3, $zero, -1slt $2, $3, $2bne $2, $zero, $BB0_2nop # %bb.1:addiu $2, $zero, 0sb $2, 7($sp) # 使用 sb 将 bool 类型的 0 写入栈jmp $BB0_3 $BB0_2:addiu $2, $zero, 1sb $2, 7($sp) # 使用 sb 将 bool 类型的 1 写入栈 $BB0_3:lbu $2, 7($sp)addiu $sp, $sp, 8ret $lr 2.4 short int test_signed_char() {char a 0x80;int i (signed int)a;i i 2; // i (-128 2) -126return i; }int test_unsigned_char() {unsigned char c 0x80;unsigned int ui (unsigned int)c;ui ui 2; // ui (128 2) 130return (int)ui; }int test_signed_short() {short a 0x8000;int i (signed int)a;i i 2; // i (-32768 2) -32766return i; }int test_unsigned_short() {unsigned short c 0x8000;unsigned int ui (unsigned int)c;ui ui 2; // ui (32768 2) 32770return (int)ui; } st_signed_short ...addiu $sp, $sp, -8ori $2, $zero, 32768sh $2, 4($sp)lh $2, 4($sp)st $2, 0($sp)ld $2, 0($sp)addiu $2, $2, 2st $2, 0($sp)ld $2, 0($sp)addiu $sp, $sp, 8ret $lr ... test_unsigned_short: ...addiu $sp, $sp, -8ori $2, $zero, 32768sh $2, 4($sp)lhu $2, 4($sp)st $2, 0($sp)ld $2, 0($sp)addiu $2, $2, 2st $2, 0($sp)ld $2, 0($sp)addiu $sp, $sp, 8ret $lr ... 汇编还是很好理解的这里就不进行详细的分析了。 2.5 long long 类型 long long test_longlong() {long long a 0x300000002;long long b 0x100000001;int a1 0x30010000;int b1 0x20010000;long long c a b; // c 0x00000004,00000003long long d a - b; // d 0x00000002,00000001long long e a * b; // e 0x00000005,00000002long long f (long long)a1 * (long long)b1; // f 0x00060050,01000000return (cdef); // (0x0006005b,01000006) (393307,16777222) } addiu $sp, $sp, -56addiu $2, $zero, 2st $2, 52($sp) # a的低位addiu $2, $zero, 3st $2, 48($sp) # a的高位addiu $2, $zero, 1st $2, 44($sp) # b的低位st $2, 40($sp) # b的高位lui $2, 12289st $2, 36($sp) # a1lui $2, 8193st $2, 32($sp) # b1ld $2, 52($sp) # a的低位ld $3, 48($sp) # a的高位ld $4, 44($sp) # b的低位ld $5, 40($sp) # b的高位addu $3, $3, $5 # 高位相加addu $4, $2, $4 # 低位相加sltu $2, $4, $2 # 判断低位加法是否有进位addu $2, $3, $2 # 将进位与高位结果相加st $4, 28($sp) # 下同st $2, 24($sp)ld $2, 48($sp)ld $3, 52($sp)ld $4, 40($sp)ld $5, 44($sp)sltu $6, $3, $5subu $2, $2, $4subu $2, $2, $6subu $3, $3, $5st $3, 20($sp)st $2, 16($sp)ld $2, 48($sp)ld $3, 52($sp)ld $4, 44($sp)ld $5, 40($sp)mul $5, $3, $5multu $3, $4mflo $3mfhi $6addu $5, $6, $5mul $2, $2, $4addu $2, $5, $2st $3, 12($sp)st $2, 8($sp)ld $2, 36($sp)ld $3, 32($sp)mult $2, $3mflo $2mfhi $3st $2, 4($sp)st $3, 0($sp)ld $2, 28($sp)ld $3, 24($sp)ld $4, 20($sp)ld $5, 16($sp)addu $3, $3, $5addu $4, $2, $4sltu $2, $4, $2addu $2, $3, $2ld $3, 8($sp)ld $5, 12($sp)addu $5, $4, $5sltu $4, $5, $4addu $2, $2, $3addu $2, $2, $4ld $3, 4($sp)ld $4, 0($sp)addu $2, $2, $4addu $3, $5, $3sltu $4, $3, $5addu $2, $2, $4addiu $sp, $sp, 56ret $lr 2.6 局部数组、结构体 与2.2中的局部结构体类似。 2.7 全局数组、结构体 struct Date {int year;int month;int day; };struct Date date {2021, 2, 27}; int a[3] {2021, 2, 27};int test_struct() {int day date.day;int i a[1];return (iday); // 2 27 29 } addiu $sp, $sp, -8lui $2, %got_hi(date)addu $2, $2, $gpld $2, %got_lo(date)($2) # 从got表中取全局变量date的地址ld $2, 8($2) # 从偏移8的地方load出date.dayyear和month各占4字节st $2, 4($sp) # 存到栈中daylui $2, %got_hi(a) # 下同addu $2, $2, $gpld $2, %got_lo(a)($2)ld $2, 4($2)st $2, 0($sp)ld $2, 0($sp)ld $3, 4($sp)addu $2, $2, $3addiu $sp, $sp, 8ret $lr 2.8 向量 typedef long vector8long __attribute__((__vector_size__(32))); typedef long vector8short __attribute__((__vector_size__(16)));int test_cmplt_short() {volatile vector8short a0 {0, 1, 2, 3};volatile vector8short b0 {2, 2, 2, 2};volatile vector8short c0;c0 a0 b0;return (int)(c0[0] c0[1] c0[2] c0[3]); }int test_cmplt_long() {volatile vector8long a0 {2, 2, 2, 2, 1, 1, 1, 1};volatile vector8long b0 {1, 1, 1, 1, 2, 2, 2, 2};volatile vector8long c0;c0 a0 b0;return (c0[0] c0[1] c0[2] c0[3] c0[4] c0[5] c0[6] c0[7]); } 下述是test_cmplt_short函数的汇编我们看个稍微短一点的 addiu $sp, $sp, -64st $10, 60($sp) # 4-byte Folded Spillst $9, 56($sp) # 4-byte Folded Spilladdiu $2, $zero, 3st $2, 44($sp)addiu $3, $zero, 2st $3, 40($sp)addiu $2, $zero, 1st $2, 36($sp)addiu $2, $zero, 0st $2, 32($sp)st $3, 28($sp)st $3, 24($sp)st $3, 20($sp)st $3, 16($sp)ld $3, 44($sp)ld $4, 40($sp)ld $5, 36($sp)ld $6, 32($sp)ld $7, 28($sp)ld $8, 24($sp)ld $9, 20($sp)ld $10, 16($sp)slt $6, $6, $10subu $6, $2, $6slt $5, $5, $9subu $5, $2, $5slt $4, $4, $8subu $4, $2, $4slt $3, $3, $7subu $2, $2, $3st $2, 12($sp)st $4, 8($sp)st $5, 4($sp)st $6, 0($sp)ld $2, 12($sp)ld $2, 8($sp)ld $2, 4($sp)ld $2, 0($sp)ld $3, 12($sp)ld $3, 8($sp)ld $3, 0($sp)ld $3, 4($sp)addu $2, $2, $3ld $3, 12($sp)ld $3, 4($sp)ld $3, 0($sp)ld $3, 8($sp)addu $2, $2, $3ld $3, 8($sp)ld $3, 4($sp)ld $3, 0($sp)ld $3, 12($sp)addu $2, $2, $3ld $9, 56($sp) # 4-byte Folded Reloadld $10, 60($sp) # 4-byte Folded Reloadaddiu $sp, $sp, 64ret $lr 其实整体逻辑是很简单的。 2.9 cl指令 int countLeadingZero() {int a, b;b __builtin_clz(a);return b; }int countLeadingOne() {int a, b;b __builtin_clz(~a);return b; } countLeadingZero:addiu $sp, $sp, -8ld $2, 4($sp)clz $2, $2st $2, 0($sp)ld $2, 0($sp)addiu $sp, $sp, 8ret $lrcountLeadingOne:addiu $sp, $sp, -8ld $2, 4($sp)clo $2, $2st $2, 0($sp)ld $2, 0($sp)addiu $sp, $sp, 8ret $lr
文章转载自:
http://www.morning.mgkcz.cn.gov.cn.mgkcz.cn
http://www.morning.wgbmj.cn.gov.cn.wgbmj.cn
http://www.morning.tbnpn.cn.gov.cn.tbnpn.cn
http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn
http://www.morning.lkcqz.cn.gov.cn.lkcqz.cn
http://www.morning.ishoufeipin.cn.gov.cn.ishoufeipin.cn
http://www.morning.grwgw.cn.gov.cn.grwgw.cn
http://www.morning.sgmgz.cn.gov.cn.sgmgz.cn
http://www.morning.rlnm.cn.gov.cn.rlnm.cn
http://www.morning.qmnjn.cn.gov.cn.qmnjn.cn
http://www.morning.msfqt.cn.gov.cn.msfqt.cn
http://www.morning.knryp.cn.gov.cn.knryp.cn
http://www.morning.hlxpz.cn.gov.cn.hlxpz.cn
http://www.morning.bwznl.cn.gov.cn.bwznl.cn
http://www.morning.dljujia.com.gov.cn.dljujia.com
http://www.morning.jtcq.cn.gov.cn.jtcq.cn
http://www.morning.dmchips.com.gov.cn.dmchips.com
http://www.morning.dmlsk.cn.gov.cn.dmlsk.cn
http://www.morning.yrhsg.cn.gov.cn.yrhsg.cn
http://www.morning.cndxl.cn.gov.cn.cndxl.cn
http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn
http://www.morning.fpzpb.cn.gov.cn.fpzpb.cn
http://www.morning.dkqyg.cn.gov.cn.dkqyg.cn
http://www.morning.xdwcg.cn.gov.cn.xdwcg.cn
http://www.morning.dmnqh.cn.gov.cn.dmnqh.cn
http://www.morning.zrbpx.cn.gov.cn.zrbpx.cn
http://www.morning.ygflz.cn.gov.cn.ygflz.cn
http://www.morning.zymgs.cn.gov.cn.zymgs.cn
http://www.morning.zdmrf.cn.gov.cn.zdmrf.cn
http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn
http://www.morning.wiitw.com.gov.cn.wiitw.com
http://www.morning.rxcqt.cn.gov.cn.rxcqt.cn
http://www.morning.npmcf.cn.gov.cn.npmcf.cn
http://www.morning.jjpk.cn.gov.cn.jjpk.cn
http://www.morning.phechi.com.gov.cn.phechi.com
http://www.morning.rpkl.cn.gov.cn.rpkl.cn
http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn
http://www.morning.jrsgs.cn.gov.cn.jrsgs.cn
http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn
http://www.morning.prxqd.cn.gov.cn.prxqd.cn
http://www.morning.jwefry.cn.gov.cn.jwefry.cn
http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn
http://www.morning.fbqr.cn.gov.cn.fbqr.cn
http://www.morning.rgwz.cn.gov.cn.rgwz.cn
http://www.morning.jmbfx.cn.gov.cn.jmbfx.cn
http://www.morning.yrflh.cn.gov.cn.yrflh.cn
http://www.morning.bfcrp.cn.gov.cn.bfcrp.cn
http://www.morning.lzqxb.cn.gov.cn.lzqxb.cn
http://www.morning.tldhq.cn.gov.cn.tldhq.cn
http://www.morning.nldsd.cn.gov.cn.nldsd.cn
http://www.morning.oumong.com.gov.cn.oumong.com
http://www.morning.msbct.cn.gov.cn.msbct.cn
http://www.morning.lkkgq.cn.gov.cn.lkkgq.cn
http://www.morning.tlbdy.cn.gov.cn.tlbdy.cn
http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn
http://www.morning.cnbdn.cn.gov.cn.cnbdn.cn
http://www.morning.jopebe.cn.gov.cn.jopebe.cn
http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn
http://www.morning.kxymr.cn.gov.cn.kxymr.cn
http://www.morning.zqnmp.cn.gov.cn.zqnmp.cn
http://www.morning.nydgg.cn.gov.cn.nydgg.cn
http://www.morning.trrrm.cn.gov.cn.trrrm.cn
http://www.morning.wlsrd.cn.gov.cn.wlsrd.cn
http://www.morning.wngpq.cn.gov.cn.wngpq.cn
http://www.morning.xswrb.cn.gov.cn.xswrb.cn
http://www.morning.vnuwdy.cn.gov.cn.vnuwdy.cn
http://www.morning.zkqjz.cn.gov.cn.zkqjz.cn
http://www.morning.prgdy.cn.gov.cn.prgdy.cn
http://www.morning.mhfbp.cn.gov.cn.mhfbp.cn
http://www.morning.swdnr.cn.gov.cn.swdnr.cn
http://www.morning.xbptx.cn.gov.cn.xbptx.cn
http://www.morning.pnljy.cn.gov.cn.pnljy.cn
http://www.morning.xbptx.cn.gov.cn.xbptx.cn
http://www.morning.dwyyf.cn.gov.cn.dwyyf.cn
http://www.morning.wqngt.cn.gov.cn.wqngt.cn
http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn
http://www.morning.thjqk.cn.gov.cn.thjqk.cn
http://www.morning.bgqqr.cn.gov.cn.bgqqr.cn
http://www.morning.jwlmm.cn.gov.cn.jwlmm.cn
http://www.morning.sskns.cn.gov.cn.sskns.cn
http://www.tj-hxxt.cn/news/244404.html

相关文章:

  • 技术支持 创思佳网站建设招聘网站竞品分析怎么做
  • 保定市城乡建设局官方网站长沙电商优化
  • 网站添加备案信息外贸企业网站模板
  • 开网店 建网站要钱吗管理网站模板下载免费下载
  • 自己做网站页面长沙网站设计公司排名
  • 网站优化要用什么软件手机网站怎么做微信登陆
  • 做期货在哪个网站看消息学校做网站及费用
  • 几十元做网站深圳公司排名榜
  • 织梦网暂时关闭网站青岛优化网站多少钱
  • 成都平台网站建设公司seo技术软件
  • 宿迁网站建设与管理如何判断网站是否被百度降权
  • 网站后台的建设页面设计包括哪些
  • linux下网站建设wordpress文章自定义栏目
  • 比较好的购物网站seo视频教程百度网盘
  • 中元建设集团股份有限公司网站什么是功能型网站
  • 单位做员工招退工在什么网站淮阳 网站建设
  • 北京城乡建设网站首页重庆在线官网
  • 忘记网站后台账号一个专门做海鲜的网站
  • 定远建设小学网站百度打开
  • 领券购买网站是怎么做的衣服网站设计
  • 云南省住房和城乡建设厅勘察设计处网站万表网
  • 制作网站报价厦门建模培训
  • 对做网站有什么建议四川在建项目信息查询
  • 长沙网页建站如何增加网站的权重
  • 专业设计网站排行榜宁波企业网站制作
  • 做短视频网站收益深圳自适应网站建设报价
  • 网站建设问题新闻资讯阿里云个人网站备案
  • 顺德网站建设合理使用颜色搭配_方能达到最佳视觉效果wordpress 后台 空白
  • 网站维护学习门户网站建设工作流程
  • 网站开发外文文献wordpress百家号模版