V8-SH4移植项目到目前为止的经验总结 2010.3

  1. 从IA32实现移植,而不是ARM

    1. 尽量在指令级实现移植(Assembler、MacroAssembler),这样大部分代码可不做修改
    2. IA32的通用寄存器名称不变,定义成常量映射为SH4的通用寄存器
  2. 比较及条件跳转
    1. 现实:IA32有FLAG寄存器,而SH4只有一个T位
    2. 从高层概念上把握一个原则:‘条件成立’时,跳或不跳(动作必须固定住)
    3. IA32的ReverseCondition用于交换src,dst,SH4则不需要
    4. 对a<b,IA32翻译为cmp(a,b);j(less,target); 而SH4则翻译为cmp_gt(a,b);bt(target);
      IA32里,a翻译为dst目标操作数;而SH4里,a变成了src源操作数
    5. 如果能够确定IA32的cmp后续只使用j(equal/not_equal, 则可简单翻译为SH4 cmp_eq
      否则,延迟比较操作,将dst、src操作数(j(less,target)即是dst <(less) src)压栈,在碰到j条件跳转时再pop出执行比较
      此情况下,原始IA32 cmp与j中间不能够有push/pop栈操作、或根据sp+offset的数据寻址操作!
  3. 寻址:
    1. 根据两边的ABI约定,EAX应映射为r0,同时r0在SH4中不应作为临时寄存器使用,避免冲突
    2. 所有的寻址包装成XxxOperand函数的形式,可在开始时使用临时寄存器,只翻译为@Rn间接寻址方式
      1. 至于是否需要当offset很小时,使用@(disp,Rn) add(imm8, Rn) @(R0,Rn)待功能实现后优化不迟
  4. CallRuntime:Runtime函数参数为Argument(argc,argv),但有可能返回64位的ObjectPair
    1. IA32里,argc、argv参数被压栈,(edx:eax)用于返回64位ObjectPair
    2. SH4里,argc、argv分别传递给r4、r5,(r1:r0)用于返回64位数据
    3. *推论:EDX EAX最好直接映射为r1,r0?
  5. IA32 Call指令
    1. IA32的call自动将pr(return address)压栈;SH4需要手工加上(在某些情况下,可能不需要)
    2. StackFrame:某些Stub::Generate,SH4栈上没有pr,需要调整offset
    3. fixup(isPCRelative=true/fasle时的不同处理)
    4. C++代码中如何获取当前Frame的pp、fp、sp?(利用pr。。。)
  6. IA32 call/jmp imm32指令的翻译:
    1. 相对地址的call/jmp,使用BSRF BRAF;绝对地址,使用JSR JMP

      1. 注意:要求知道bsrf braf jsr jmp指令的地址,即可得到imm32地址,因此与mov.l的相对位置必须固定
    2. bf/bt/bsr/bra用于同一个Code内部的分支跳转
    3. 不使用bf.s bt.s
  7. SH4 加载32位立即数到寄存器
    1. 统一的调用入口:mov(const Immediate& src, Register dst);
    2. 因重定位信息只保存mov指令的地址,为使得计算公式统一,要求当rmode!=NONE时,mov指令应Align(4,2);
    3. 立即数不管大小,可统一使用mov(const Immediate& src, Register dst);
      1. 后期优化:仅当rmode==NONE且is_int8(src.value())时,可内部替换为mov_imme(imm8, dst);
  8. 下列操作不应用汇编指令实现,而应考虑提供外部C++ builtin函数:
    1. 64位整数的MUL DIV MOD
    2. CheckFloatOperands:+0 -0 NaN
  9. v8原始代码的Smi优化:可暂不考虑
  10. v8翻译js switch语句的快速Jump Table实现:可暂不考虑
  11. CodeSegment算法
    1. EnsureSpace::CheckSpace(Assembler* assm, int ins_bytes_needed=2, int imm_bytes_needed=0/4/...);
    2. 当开始新代码段的第一个立即数加载指令(imm_bytes_needed>0)时,必须确保还有:
      1. ins_bytes_needed(指令本身大小) + 127(第1个disp值)*4+4/2 + 128*4(假设最多可保存128个立即数) + imm_bytes_needed/4*RelocInfo::kMaxSize ==> ins_bytes_needed+1024+3*imm_bytes_needed
  12. DataLabel、ShortLabel
  13. 反汇编:Dissembler::Decode(stdout, start, end);
    1. 应正确输出立即数,因此内部需要记住mov.l指令对应立即数的位置

      1. 这里假设一个mov.l指令加载一个立即数,指令总在操作数前面(实际上disp类型是uint8_t)
  14. Simulator:Jmp外部C++函数时,仿真为先Call外部C++函数,然后执行一个Return
  15. v8 C++ builtin函数:原型总是Object* BUILTIN_FUNCTION(int argc, char** argv);
    1. 也就是说,总是2个参数,SH4下通过r4,r5传递
    2. 但有可能没有返回值,但无论如何,应注意调用builtin后不应立即改掉r0,这有可能导致一个错误
    3. v8的js调用builtin函数实现为:先加载目标函数的绝对地址到Rn;延后、在适当时机执行jsr(Rn)
  16. 测试:首先cctest,然后mjsunit,确保全部通过(0.4.9.3 mjsunit存在已知bug)
  17. 编码实践指南
    1. 不要复制粘贴,而是首先提取出公共函数,然后手工敲入调用代码(特别是注意不同的参数)
    2. 注意临时寄存器的使用,最好是强制要求调用者指定;其次是约定使用规则
    3. 使用C++代码交叉引用生成工具(最好是能够展开宏代码的)
    4. 分离大的文件如codegen-sh4.cc,根据功能变成小的容易理解、管理、分配的,且SCM也不大会出现冲突
    5. 尽快将调试时所做的补丁代码以易于理解维护的方式改写掉
    6. 使用代码覆盖工具,测试MK23测试代码的条件覆盖情况

历史工作记录:V8-SH4移植项目到目前为止的经验总结 2010.3相关推荐

  1. GitHub/GitLab/Gitee中项目互拷贝后仍保留历史提交记录的方法

    GitHub.GitLab.Gitee等在同一个网站中执行复制或拷贝一个已有项目到一个新项目比较简单,因为它们在每一个项目上都有一个Fork按钮,直接点击此Fork按钮即可,Fork后的新项目会保留原 ...

  2. 项目实训工作记录(二)

    项目实训工作记录(二)赵乐乐 201800301115 词向量搜索分析与算法设计 项目实训工作记录(二)赵乐乐 201800301115 1.词向量搜索 2.搜索过程中的问题分析 3.基于效率的算法设 ...

  3. 对不同的项目设置不同的git提交用户名和清除贡献者信息和历史提交记录

    对不同的项目设置不同的git提交用户名 在项目目录下的(存在.git文件夹,如果不存在.git文件夹说明没有初始化git仓库,此目录下打开cmd输入git init一下就好了,但是要注意这时此目录应该 ...

  4. Atitit 常见每日流程日程日常工作.docx v8 ver ampm imp 签到 am y 天气情况检查 am y 晨会,每天或者隔天 am 每日计划(项目计划,日计划等。 am

    Atitit 常见每日流程日程日常工作.docx v8 ver ampm imp 签到 am y 天气情况检查 am y 晨会,每天或者隔天 am 每日计划(项目计划,日计划等. am 如遇一周,一月 ...

  5. 趣话题:git三部曲(二)-拆分历史提交记录reset

    前言 git有一个非常关键的功能就是reset.当我们需要拆分一个历史提交记录的时候需要使用reset.估计很多小伙伴不明白,reset究竟做了什么,所以在这篇文章当中我们来详细聊聊. git res ...

  6. centos查看历史指令记录_CentOS清除SSH登录记录、历史命令及日志缓存

    清除 SSH 登录记录 SSH 登录日志以二进制方式存储在以下文件内,需要使用对应命令查看,不然会显示乱码. 日志文件 查看命令 日志内容 /var/log/wtmp last 登录成功日志,包含用户 ...

  7. 2015年1月工作记录和阅读记录

    2019独角兽企业重金招聘Python工程师标准>>> 关于IT.翻过了2014的一年,也走到了大四的中间.成长说不上,但是眼界是慢慢开阔了.这一年的节奏像流水一样缓慢平稳,没有特别 ...

  8. SVN迁移至GIT,并附带历史提交记录

    文章目录 SVN代码同步至GIT 背景 准备工作 操作步骤 SVN代码同步至GIT 背景 近年随着信息工程的多元化发展,GIT逐渐取代SVN成为主流的版本管理工具,部门的项目代码也决定迁移至git进行 ...

  9. linux 登陆 历史,linux记录每次登陆的历史命令

    编辑/etc/profile,增加如下代码 #Record history operation USER_IP=`who -u am i >/dev/null |awk '{print $NF} ...

最新文章

  1. Atitit. 查找linux 项目源码位置
  2. UVA1108 Mining Your Own Business(思维、割点)(2011 ICPC - WorldFinal)
  3. mysql5.5数据库操作_命令行下mysql数据库基本操作
  4. NFVI融合架构解决方案的四大特点—Vecloud微云
  5. android锁屏显示应用程序,今日应用:微软又给 Android 做了一款锁屏应用
  6. logback配置(与log4j对比)
  7. LAMP环境中如何重新部署一个Yii2.0 web项目
  8. java 文件输出流_Java 文件输出流
  9. 如何去除Druid数据监控广告?
  10. ASP 文件下载实例
  11. CF914D Bash and a Tough Math Puzzle
  12. 火龙果卡密生成获取get!{火龙果邀请码指定卡密}
  13. 怎样在Axure中创建高保真的Axure原型(二)
  14. html 爬数据,简单爬取html页面的表格中的数据
  15. Wannafly挑战赛26 御坂网络
  16. 集成七牛云储存-上传图片Demo
  17. 信号、传输介质、数制转换
  18. Linux内核配置(转)
  19. 【百日刷题计划 第一天】——熟悉语法 语法基础题
  20. 双目测距数学原理详解

热门文章

  1. html css投影效果,CSS添加阴影效果
  2. 语义分割之SegFormer分享
  3. 2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)
  4. 【微信小程序】小程序中几种跳转页面的方式
  5. 七日杀服务器租用多少钱?七日杀服务器需要什么配置?宿迁BGP服务器43.248.184.x
  6. yii2 php版本,composer如何更新yii2版本
  7. Excel 2016双击文件显示灰色空白页解决方法
  8. 计算机it知识,计算机基础知识大全电脑基础知识IT计算机专业资料-计算机基础(8页)-原创力文档...
  9. 使用mat-leap的正确方法
  10. SpringBoot-JPA多数据源