luaJIT指令集介绍

----------------目录---------------

(a)相关ByteCode定义介绍

(b)lj_bc.h和lj_bc.c

(1)字节码format简介

(2)操作数的相关范围定义,和部分定义常量

(3)通过掩码镜像,来获取相对应区域的值

(4)通过掩码镜像,来设置相对应区域的值

(5)合成实现操作符

(6)关于字节码指令的定义

(7)BCMode定义

(8)参数类型校验

-------------------------------------

(a)相关ByteCode定义介绍

在luaJIT中定义了BCIns、BCReg、BCLine这4中类型,都是int32类型,也就是32位,关于为什么BC line number是有符号32位,这个在之后讨论

/* -- Common type definitions --------------------------------------------- *//* Types for handling bytecodes. Need this here, details in lj_bc.h. */
typedef uint32_t BCIns;  //BC指令
typedef uint32_t BCPos;  //BC位置
typedef uint32_t BCReg;  //BC参数
typedef int32_t BCLine;  //BC行数

在之后的luaJIT字节码实现过程中,这4个类型是经常用到的

(b)lj_bc.h和lj_bc.c

(1)字节码format简介

/* Bytecode instruction format, 32 bit wide, fields of 8 or 16 bit:

** +----+----+----+----+
** | B  | C  | A  | OP | Format ABC
** +----+----+----+----+
** |    D    | A  | OP | Format AD
** +--------------------

高位低位

这一部分描述了JIT,ByteCode的模板,相比于lua这里Bx变成了D,而Ax不存在了

(2)操作数的相关范围定义,和部分定义常量

 #define BCMAX_A     0xff    A的最大范围  #define BCMAX_B     0xff    B的最大范围#define BCMAX_C       0xff    C的最大范围#define BCMAX_D       0xffff  D的最大范围#define BCBIAS_J  0x8000  跳转指令标记码#define NO_REG       BCMAX_A 没有参数定义#define NO_JMP        (~(BCPos)0) 没有跳转定义

这一部分定义了操作参数的范围,还有几个常量定义

(3)通过掩码镜像,来获取相对应区域的值

 /* Macros to get instruction fields. */
    #define bc_op(i)    ((BCOp)((i)&0xff))
    #define bc_a(i)     ((BCReg)(((i)>>8)&0xff))
    #define bc_b(i)     ((BCReg)((i)>>24))
    #define bc_c(i)     ((BCReg)(((i)>>16)&0xff))
    #define bc_d(i)     ((BCReg)((i)>>16))
    #define bc_j(i)     ((ptrdiff_t)bc_d(i)-BCBIAS_J)

这一部分定义了如何获取相对应的参数的值,从这里也可以看出,各个参数区域的位置

(4)通过掩码镜像,来设置相对应区域的值

 #define setbc_byte(p, x, ofs) \ ((uint8_t *)(p))[LJ_ENDIAN_SELECT(ofs, 3-ofs)] = (uint8_t)(x) 这就是一种贼骚的操作,先把32位转换成8位指针,强行分成4组后做处理
    #define setbc_op(p, x)  setbc_byte(p, (x), 0)
    #define setbc_a(p, x)   setbc_byte(p, (x), 1)
    #define setbc_b(p, x)   setbc_byte(p, (x), 3)
    #define setbc_c(p, x)   setbc_byte(p, (x), 2)
    #define setbc_d(p, x) \ ((uint16_t *)(p))[LJ_ENDIAN_SELECT(1, 0)] = (uint16_t)(x)  这里一样,强行拆成两组然后做骚操作
    #define setbc_j(p, x)   setbc_d(p, (BCPos)((int32_t)(x)+BCBIAS_J)) 设置跳转,用BCBIAS_J做标记

(5)合成实现操作符

 /* Macros to compose instructions. */
    #define BCINS_ABC(o, a, b, c) \ (((BCIns)(o))|((BCIns)(a)<<8)|((BCIns)(b)<<24)|((BCIns)(c)<<16))  这一部分实现合成操作码指令
    #define BCINS_AD(o, a, d) \ (((BCIns)(o))|((BCIns)(a)<<8)|((BCIns)(d)<<16))
    #define BCINS_AJ(o, a, j)   BCINS_AD(o, a, (BCPos)((int32_t)(j)+BCBIAS_J)) 这一部分合成跳转指令

(6)关于字节码指令的定义

tips:

   EQ 就是 EQUAL等于
    NQ 就是 NOT EQUAL不等于
    GT 就是 GREATER THAN大于 
    LT 就是 LESS THAN小于
    GE 就是 GREATER THAN OR EQUAL 大于等于
    LE 就是 LESS THAN OR EQUAL 小于等于
  /* Bytecode instruction definition. Order matters, see below.**** (name, filler, Amode, Bmode, Cmode or Dmode, metamethod)还有相对应的元操作**** The opcode name suffixes specify the type for RB/RC or RD:** V = variable slot局部变量表** S = string const** N = number const** P = primitive type (~itype) 私有变量** B = unsigned byte literal 原义字符** M = multiple args/results 多参数和返回后缀命名指定 说明不同的后缀存有不同的意义*/#define BCDEF(_) \/* Comparison ops. ORDER OPR. */ \_(ISLT,        var,    ___,    var,    lt) \_(ISGE,        var,    ___,    var,    lt) \_(ISLE,        var,    ___,    var,    le) \_(ISGT,        var,    ___,    var,    le) \\_(ISEQV,  var,    ___,    var,    eq) \_(ISNEV,   var,    ___,    var,    eq) \_(ISEQS,   var,    ___,    str,    eq) \_(ISNES,   var,    ___,    str,    eq) \_(ISEQN,   var,    ___,    num,    eq) \_(ISNEN,   var,    ___,    num,    eq) \_(ISEQP,   var,    ___,    pri,    eq) \_(ISNEP,   var,    ___,    pri,    eq) \\/* Unary test and copy ops. */ \_(ISTC,       dst,    ___,    var,    ___) \_(ISFC,       dst,    ___,    var,    ___) \_(IST,        ___,    ___,    var,    ___) \_(ISF,        ___,    ___,    var,    ___) \\/* Unary ops. */ \_(MOV,     dst,    ___,    var,    ___) \_(NOT,        dst,    ___,    var,    ___) \_(UNM,        dst,    ___,    var,    unm) \_(LEN,        dst,    ___,    var,    len) \\/* Binary ops. ORDER OPR. VV last, POW must be next. */ \_(ADDVN,    dst,    var,    num,    add) \_(SUBVN,  dst,    var,    num,    sub) \_(MULVN,  dst,    var,    num,    mul) \_(DIVVN,  dst,    var,    num,    div) \_(MODVN,  dst,    var,    num,    mod) \\_(ADDNV, dst,    var,    num,    add) \_(SUBNV,  dst,    var,    num,    sub) \_(MULNV,  dst,    var,    num,    mul) \_(DIVNV,  dst,    var,    num,    div) \_(MODNV,  dst,    var,    num,    mod) \\_(ADDVV, dst,    var,    var,    add) \_(SUBVV,  dst,    var,    var,    sub) \_(MULVV,  dst,    var,    var,    mul) \_(DIVVV,  dst,    var,    var,    div) \_(MODVV,  dst,    var,    var,    mod) \\_(POW,       dst,    var,    var,    pow) \_(CAT,        dst,    rbase,  rbase,  concat) \\/* Constant ops. */ \_(KSTR,      dst,    ___,    str,    ___) \_(KCDATA, dst,    ___,    cdata,  ___) \_(KSHORT, dst,    ___,    lits,   ___) \_(KNUM,       dst,    ___,    num,    ___) \_(KPRI,       dst,    ___,    pri,    ___) \_(KNIL,       base,   ___,    base,   ___) \\/* Upvalue and function ops. */ \_(UGET,     dst,    ___,    uv, ___) \_(USETV,  uv, ___,    var,    ___) \_(USETS,  uv, ___,    str,    ___) \_(USETN,  uv, ___,    num,    ___) \_(USETP,  uv, ___,    pri,    ___) \_(UCLO,       rbase,  ___,    jump,   ___) \_(FNEW,       dst,    ___,    func,   gc) \\/* Table ops. */ \_(TNEW, dst,    ___,    lit,    gc) \_(TDUP,    dst,    ___,    tab,    gc) \_(GGET,    dst,    ___,    str,    index) \_(GSET, var,    ___,    str,    newindex) \_(TGETV, dst,    var,    var,    index) \_(TGETS,    dst,    var,    str,    index) \_(TGETB,    dst,    var,    lit,    index) \_(TSETV,    var,    var,    var,    newindex) \_(TSETS, var,    var,    str,    newindex) \_(TSETB, var,    var,    lit,    newindex) \_(TSETM, base,   ___,    num,    newindex) \\/* Calls and vararg handling. T = tail call. */ \_(CALLM,  base,   lit,    lit,    call) \_(CALL,  base,   lit,    lit,    call) \_(CALLMT,    base,   ___,    lit,    call) \_(CALLT, base,   ___,    lit,    call) \_(ITERC, base,   lit,    lit,    call) \_(ITERN, base,   lit,    lit,    call) \_(VARG,  base,   lit,    lit,    ___) \_(ISNEXT, base,   ___,    jump,   ___) \\/* Returns. */ \_(RETM,      base,   ___,    lit,    ___) \_(RET,        rbase,  ___,    lit,    ___) \_(RET0,       rbase,  ___,    lit,    ___) \_(RET1,       rbase,  ___,    lit,    ___) \\/* Loops and branches. I/J = interp/JIT, I/C/L = init/call/loop. */ \_(FORI,       base,   ___,    jump,   ___) \_(JFORI,  base,   ___,    jump,   ___) \\_(FORL,      base,   ___,    jump,   ___) \_(IFORL,  base,   ___,    jump,   ___) \_(JFORL,  base,   ___,    lit,    ___) \\_(ITERL, base,   ___,    jump,   ___) \_(IITERL, base,   ___,    jump,   ___) \_(JITERL, base,   ___,    lit,    ___) \\_(LOOP,      rbase,  ___,    jump,   ___) \_(ILOOP,  rbase,  ___,    jump,   ___) \_(JLOOP,  rbase,  ___,    lit,    ___) \\_(JMP,       rbase,  ___,    jump,   ___) \\/* Function headers. I/J = interp/JIT, F/V/C = fixarg/vararg/C func. */ \_(FUNCF,  rbase,  ___,    ___,    ___) \_(IFUNCF, rbase,  ___,    ___,    ___) \_(JFUNCF, rbase,  ___,    lit,    ___) \_(FUNCV,  rbase,  ___,    ___,    ___) \_(IFUNCV, rbase,  ___,    ___,    ___) \_(JFUNCV, rbase,  ___,    lit,    ___) \_(FUNCC,  rbase,  ___,    ___,    ___) \_(FUNCCW, rbase,  ___,    ___,    ___)
在这之后以下两行代码处理了这部分的定义

/* Bytecode opcode numbers. */
typedef enum {
#define BCENUM(name, ma, mb, mc, mt)
BC_##name,
BCDEF(BCENUM)
#undef BCENUM
  BC__MAX
} BCOp;

这里对之前定义过得BENUM完全undef了,这也就表明这里的枚举,仅仅是枚举用,命名为BC_操作名

/* This solves a circular dependency problem, change as needed. */
#define FF_next_N 4

这里说FF_next_N是用来解决循环依赖问题的,之后可以关注下

(7)BCMode定义

typedef enum {
  BCMnone, BCMdst, BCMbase, BCMvar, BCMrbase, BCMuv,
/* Mode A must be <= 7 */
  BCMlit, BCMlits, BCMpri, BCMnum, BCMstr, BCMtab, BCMfunc, BCMjump, BCMcdata,
  BCM_max
} BCMode;

这里定义了BCMode的类型,这里主要是定义参数类型,因为扩展了很多操作指令,所以参数类型的也变得更丰富

(8)参数类型校验
这里的参数校验定义为
a 0~2 位
b 3~6位
c 7~10位
d 与c相同,但是有hasd这个校验步骤,就是检验b是不是modeNone
mm 11位以后
到这里全部的指令集定义已经完全介绍完毕,接下来将介绍read和write来进一步讲解





												

luaJIT指令集介绍相关推荐

  1. SIMD补充 指令集架构类型 指令集介绍

    文章目录 SIMD 指令集架构类型 CISC的产生.发展和现状 RISC的产生.发展和现状 IA-64(EPIC)产生.发展和现状 RISC与 IA-64(EPIC)相比 指令集介绍 一.X86 二. ...

  2. 论ARMv7 Thumb-2指令集的性能(含Thumb指令集介绍)【转载】

    [摘要] 主要是介绍ARM CPU中的THUMB-2功能,相对于THUMB的比较THUMB-2指令集的扩展,THUMB-2的新指令带来的好处,新指令对性能和代码密度的改进.    如今的嵌入式系统开发 ...

  3. LINUX指令集介绍

    本文是LINUX指令及应用.现在学习嵌入式LINUX的使用,首先我才知道我对指令集的不了解.还是要多补课的呀! 引自:http://jsjzx.cqit.edu.cn/neow/webs/zljj/1 ...

  4. LuaJIT Bytecode介绍

    文章目录 一.Introduction 二.Comparison.Test and Copy.JMP 三.Unary and Binary ops 四.Upvalue and function ops ...

  5. 深入iOS系统底层之指令集介绍

    程序员大咖点击右侧关注,免费进阶高级! 作者:欧阳大哥2013 链接:https://www.jianshu.com/p/54884ce976ca 任何形式的转载都请联系作者获得授权并注明出处. 说到 ...

  6. RISC-V CPU设计(一)---RV32I指令集介绍

    RV32I是RISC-V最基本的指令集,包括6种,其中4种为核心的类型(R/I/S/U).下面给出了这6种指令的格式 指令详情如下 R型指令 包含两个源寄存器和一个目的寄存器编号,都是5位的(32个寄 ...

  7. C/C++指令集介绍以及优化(主要针对SSE优化)

    前言:最近在做一些OpenCV的优化相关的东西,发现OpenCV现在的执行效率很高的原因一部分是来自于底层的优化,比如指令集优化,但是一直没找到比较系统性的关于CPU指令集优化的文章或者是书籍,于是自 ...

  8. SIMD——MMX指令集介绍

    MMX指令集共47个指令,分为以下几类: • Data transfer • Arithmetic • Comparison • Conversion • Unpacking • Logical • ...

  9. 简单ARM指令集介绍

    1.ARM指令集简介 ARM指令集是基于精简指令集计算机(RISC)设计的,其指令集的译码机制相对比较简单,ARMv7-A具有32bit的ARM指令集和16/32bit的Thumb/Thumb-2指令 ...

最新文章

  1. 大一计算机考试题库window,2016年计算机考试Windows题库及答案
  2. Python基于MASK信息抽取ROI子图并构建基于迁移学习(densenet)的图像分类器实战(原始影像和mask文件都是二维的情况)
  3. VS2015编译TensorFlow C++程序完全攻略
  4. 条件运算符(?:)和 $替代string.Format()
  5. ROS Rviz 显示轨迹 Python
  6. 计算机三级网络技术路由,2009计算机三级网络技术:如何上网高效率宽带路由优化技巧放送...
  7. 【JavaEE】第一章线程和多线程
  8. 计算机发展史_最全计算机发展史
  9. dcs与plc与c语言的联系,PLC与和DCS系统通讯的实现
  10. 房间内人群疏散的python简单模拟
  11. c语言vt码的用法,你可以使用vt100转义码c ++的十六进制颜色值
  12. 好玩的Canvas射箭小游戏
  13. Java8-使用stream.sorted()对List排序
  14. YOLOv5剪枝✂️| 模型剪枝实战篇
  15. 精尽Spring MVC源码分析 - 一个请求的旅行过程
  16. 做到这些让你逃离奴隶的束缚
  17. 计算机辅助光学设计 code v s2,计算机辅助光学设计-code-v-s2复习进程.ppt
  18. 洛谷 P1219八皇后
  19. 安卓:Fragment的懒加载
  20. python简直万能_一键爬取资源,Python简直太强大了!

热门文章

  1. linux u盘加载阵列卡驱动步骤,Linux操作系统U盘加载阵列卡驱动步骤.doc
  2. AutoCAD 2013 .net插件创建向导现在支持Map 3D,Civil 3D,AutoCAD Architecture 和AutoCAD MEP...
  3. Java 垃圾收集(Garbage Collection)
  4. msm android机型适配,魅族系统适配全机型了,Flyme8 安卓9高通通刷包,通用适配...
  5. 使用ESP-8266模块做一个便携式WIFI杀手
  6. 深度学习之装机与系统篇
  7. 常规批复试录取浙大MBA的幸运儿经验分享
  8. M2固态硬盘和普通硬盘相比有什么区别
  9. python批量生成手机号
  10. 计算机考研复试-软件工程