编译器的优化

编译器使用的优化技巧

a、1.  变量优化

 

     b、加法的优化

变量+变量 = lea reg32,[变量+变量]

变量+变量 = add eax,xx
         变量+常量 = add 变量+常量
         变量+1    = inc 变量

     b、减法的优化

变量-变量 = lea reg32,[变量-变量]

变量-变量 = sub xx,xx
         变量-常量 = add 变量+补码(常量)
         变量-1    = dec 变量

c、乘法优化

变量*常量(为2的幂)=shl eax, n(2^n)(乘数为2的幂)

变量*常量(非2的幂)=lea eax, [变量+变量*n]

变量*变量=Imul reg32

     d、除法的优化

      普通除法:

mov Reg32_1, XXXXXXXXh(除数)
imul Reg32_2(被除数)

add  edx,Reg32_2

sar   edx,xxx

mov eax,edx

Shr eax,1Fh

mov
Reg32_1, XXXXXXXXh(除数)
                  imul
Reg32_2(被除数)
                  mov
Reg32_1, edx
                  shr
Reg32_1, 1Fh
                  add
Reg32_1, edx
                  应用计算结果
                  (除数=XXXXXXXXh*2^-32 如果倒数被向上圆整了,那么根据sar指令后的数值向下            圆整即可)

除数为2的次方:
                  mov
eax, (被除数)
                  cdq
                  and
edx, XXh
                  add
eax, edx
                  sar
eax, YYh
                  应用计算结果
                  (除数 = XXh+1 或 2^YYh)

e、堆栈恢复优化

原文地址:https://www.cnblogs.com/xiangtingshen/p/11212807.html

时间: 2024-08-24 18:24:47

编译器的优化的相关文章

5.4.1 中间代码生成与优化_UCC编译器的优化_删除无用的临时变量和优化跳转目标

5.4.1  删除无用的临时变量和优化跳转目标 UCC编译器在优化方面做的工作不多,其中与优化有关的函数主要有以下几个: (1)    Symbol  Simplify(Type ty, int opcode, Symbol src1,Symbol src2); 用于进行"代数恒等式"的简化,例如表达式"a<<0"可简化为a. (2)    Symbol  TryAddValue(Type ty, int op, Symbol src1,Symbol s

Javac编译器早期优化

Java的早期(编译器)优化 1. Javac编译器 1.1 编译步骤 编译过程可分为3个步骤: 解析与填充符号过程 插入式注解处理器的注解处理过程 分析与字节码生成过程 1.2 解析与填充符号表 解析步骤包含了词法分析和语法分析两个过程. 1.2.1 词法.语法分析 词法分析是将源代码的字符流转变为标记(Token)集合,标记是编译过程的最小元素. 语法分析是根据Token序列构建抽象语法树的过程. 抽象语法树是一种用来描述程序代码语法结构的树形表示方式,语法树中的每一个节点都代表着程序代码中

【转】volatile关键字。编译器不优化,多线程会改。防止随时变动的

来自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html 1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明: A volatile specifier is a hint to

009 早期(编译器)优化

javac 编译的过程大致可以分为3个过程,分别是: 解析与填充符号表过程. 插入式注解处理器的注解处理过程. 分析与字节码生成过程. 这3个步骤之间的关系与交互顺序如图 1.解析与填充符号表 ①词法.语法分析 词法分析是将源代码的字符流转变为标记(Token)集合,单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素,关键字.变量名.字面量.运算符都可以成为标记,在Javac的源码中,词法分析过程由com.sun.tools.javac.parser.Scanner类来实现. 语法分

早期(编译器)优化--javac编译器

java语言的"编译期"其实是一段"不确定"的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用静态提前编译器(AOT)直接把.java文件直接编译成本地机器代码的过程.现在讨论的是第一种编译器. Javac编译器 ①javac的源码与测试   运行com.sun.tools.javac.Main的main()方法来执行编译,与命令行中使用javac的命令没什么区

jvm编译器的优化

1.对byte.short.char赋值时,若右边范围没有超过左边类型的最大表达范围则会自动隐式的加上(byte).(short).(char)强制转换:若右边范围超过了左边类型的最大表达范围则编译失败 byte b1 = 65;等效于byte b2 = (byte)65;//整数的字面量类型为int byte b3 = 128;//编译失败,由于128超过了byte类型的最大表达范围,因此这里需要进行显式的强转 2.在赋值时,若右边都是常量则会在编译时将右边常量的计算结果赋值给左边:若右边不全

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

PHP编译器没有对尾递归进行优化

不同的语言对尾递归的支持都有所不同,编译器的优化也不尽相同.我们之前看了C语言的尾递归,那么在PHP里又是如何的呢? PHP对尾递归没有优化效果 先来看下实验.澳门威尼斯人赌场 01 <?php 02 function factorial($n) 03 { 04     if($n == 0) { 05         return 1; 06     }   07     return factorial($n-1) * $n; 08 } 09    10 var_dump(factorial

编译器,优化,及目标代码生成.

本文介绍从源文件开始到目标代码生成的过程. 首先,是我们每天都要接触的源文件.源文件是由纯ASCII或者其他字符集组成的文本,由程序员使用文本编辑器创建.它有以下的几种形式 纯文本.好处是易于维护.并且可以使用处理文本文件的程序来处理源文件. 这个就是我们最常见的源代码形式了.甚至可以使用notepad来处理源文件! 记号化的源文件.使用专门的单字节"记号"值来表示源文件中的保留字等语句元素. 好处1:尺寸小,由于使用单字节的符号来"压缩"多字符的保留字,所以比纯文