Intel x87 FPU专门用于执行标量浮点计算,可以对单精度浮点(32位)、双精度浮点(64位)以及扩展双精度浮点(80位)进行计算,并顺从IEEE754标准。

x87 FPU可以工作在32位兼容模式下以及64位模式下,在这两种下,FPU的数据寄存器的个数都一样,只有8个。对x87 FPU的数据寄存器的访问方式与一般的寄存器有所不同,它是栈式访问。你通过 FLD 指令把外部数据搬到x87 FPU的数据寄存器中时,那么x87 FPU会根据所搬数据的长度(32位、64位、80位)将输入数据分别对待为单精度浮点、双精度浮点和扩展双精度浮点方式,然后统一转为双精度扩展模式放到数据栈顶。因此x87 FPU的数据寄存器长度为80位,并且后续的浮点计算都是基于扩展双精度进行的。

在栈顶的数据寄存器索引为0,那么它下面一个就是1, 然后是2, 以此类推,到栈底则为7。数据输出到存储器时使用 FSTFSTP 指令,前者仅仅是根据目标存储器的长度(32位、64位、80位)将扩展双精度类型分别转为单精度、双精度、扩展双精度类型,然后输出到指定的存储器位置中。对于 FSTP 指令,除了将数据搬到外部外,还会执行推出堆栈的操作。另外,FLDFST 以及 FSTP 还能搬移FPU内部寄存器的数据,FLD 的作用是将指定的FPU数据寄存器位置的数据搬移到栈顶寄存器中,而 FST 则是将栈顶寄存器的数据搬移到指定的FPU数据寄存器的位置。

这边要注意的是,由于80位(10个字节)并不是32位(4个字节)的整数倍,因此数据加载或存储双精度扩展浮点往往是用96位(12个字节)为单位进行,所以 “tbyte” 所指的就是“twelve bytes”,呵呵呵。这里可以列一下Intel汇编格式的字节、字宽指定修饰词——byte(字节,8位),word(字,16位),dword(双字,32位),qword(四字,64位),tbyte(十二字节,96位),mmword(64位,但只能用于MMX指令集中),xmmword(128位,用于SSE指令集),ymmword(256位,用于AVX和AVX2指令集),zmmword(512位,用于AVX-512指令集)。

下面是一段演示计算sin(10.05) + cos(20.05)的代码,三角函数中的参数都以弧度制表示。

/** hi.c * test* Created by Zenny Chen on 2/11/11. * Copyright 2011 GreenGames Studio. All rights reserved. **/
#include <stdio.h>void test(long double *p, long double *q)
{__asm__(".intel_syntax noprefix");__asm__("fld tbyte ptr [rdi] \n" // use double extended float -- st(0) holds 10.05"fld tbyte ptr [rsi] \n" // use double extended float -- st(0) holds 20.05, st(1) holds 10.05"fcos \n" // cos"fstp st(2) \n" // mov st(0) (i.e. cos(20.05) result) to st(2) and pop the value "fsin \n" // now st(0) holds 10.05 and does fsin"fadd st(0), st(1) \n" // add st(0) and st(1) and store the result to st(0)"fstp dword ptr [rdi] \n" // automatically truncate to single-float, write to the first arg and pop the value ); __asm__(".att_syntax");
}int main(void)
{long double a = 10.05;long double b = 20.05; // calculate: sin(10.05) + cos(20.05) = -0.2233334test(&a, &b);printf("The answer is: %f\n", *(float*)&a);
}

上述内联汇编用AT&T汇编语法格式写的话,如下表示:

.text
.align 2
.globl _asm_test_asm_test: fldt (%rdi)fldt (%rsi)fcosfstp %st(2)fsinfadd %st(1), %st(0)fstp (%rdi)ret

Intel x87 FPU的使用基础相关推荐

  1. Intel 内部指令---AVX编程基础

    AVX编程基础 一.数据类型 数据类型 描述 __m128 包含4个float类型数字的向量 __m128d 包含2个double类型数字的向量 __m128i 包含若干个整型数字的向量 __m256 ...

  2. X87 FPU 指令集

    FPU 指令集 (1) FPU 数据传输指令集 fld 将浮点值压入寄存器栈,源操作数可以是ST(i)或内存地址 fild 从内存中读取一个有符号整型操作数,将该值转换为扩展双精度值,并将此结果加载到 ...

  3. Intel汇编-FPU状态

    # An example get the FPU status register contents # # FPU寄存器包括8个80位数据寄存器. # # 因FPU独立于主处理器,一般不使用EFLAG ...

  4. 资源 | Intel发布AI免费系列课程3部曲:机器学习基础、深度学习基础以及TensorFlow基础

    翻译 | AI科技大本营(公众号ID:rgznai100) 校对 | 成龙 编辑 | 明明 Intel于近期发布了三门AI系列的免费课程,分别是关于机器学习基础.深度学习基础.TensorFlow基础 ...

  5. 《翻译》Intel 64 与 IA-32 架构软件开发者手册卷1翻译

    <前言> 翻译自官方的PDF版手册,可以从下述站点下载英文原版: http://www.intel.com/content/www/us/en/processors/architectur ...

  6. 图解CPU生产全过程——以intel CORE i7为例,展望CPU架构

    科学Sciences导读:图解CPU生产全过程--以intel CORE i7为例,展望CPU架构.本文简介英特尔Intel x86架构.生产制造CPU的原料和准备.CPU生产制造过程,并展望CPU的 ...

  7. 【硬件设备】CPU系列之基础知识

    ​目录 概述 指令集 一.复杂指令集(CISC) 二.精简指令集(RISC) 三.复杂指令集与精简指令集区别 CPU的架构 一.X86 CPU架构 二.ARM CPU架构 三.MIPS CPU架构 四 ...

  8. Intel英特尔历代经典 CPU 产品回顾

    悉数历史 英特尔历代经典 CPU 产品回顾 从英特尔于 1971 年推出首款 4004 微处理器到现在, 英特尔处理器已经走过 了 40 个年头.在告别 13 年传奇品牌奔腾之后,我们又迎来新一代酷睿 ...

  9. RISC、CISC、 SIMD、FPU、MMX、SSE、SSEX、AVX、3D Now以及DSP、ARM的Neon简介

    CPU的指令集从主流的体系结构上分为精简指令集和复杂指令集,而在普通的计算机处理器基本上是使用的复杂指令集.在计算机早期的发展过程中,CPU中的指令集是没有划分类型的,而是都将各种程序需要相配合的指令 ...

最新文章

  1. android混淆和反编译
  2. android 背景图太大,android – 背景图片需要太长时间才能画(Canvas)Jerky Sprites ……?...
  3. 【每周NLP论文推荐】 介绍语义匹配中的经典文章
  4. Mybatis基于XML配置SQL映射器(一)
  5. arch_version(12) of input model should be 11!
  6. 请问:如何在C#简单分布式程序的数据层中为其它层留出很好的接口?????...
  7. c++游戏编程100事列_C/C++编程笔记:C语言开发经典游戏项目《五子棋》,内含源码...
  8. Oracle Statistic 统计
  9. C++setw函数的运用
  10. 使用知用电流探头时如何设置示波器参数
  11. ubuntu18.04装N卡驱动后无法开机或关机的解决方法
  12. 初二年级男生厌学家长应该怎么应对
  13. PDF是如何在线分割的?
  14. CodeForces 858C Did you mean... 、 CodeForces 858D Polycarp's phone book!黑科技
  15. mysql的三种engine_MySQL 学习之-三种安装方式与版本介绍
  16. 模型中AIC和BIC以及loglikelihood的关系
  17. Linux系列讲解 —— 常用小工具下载
  18. Pytorch LSTM 长短期记忆网络
  19. 【教程】区块链是数据库?那么区块链的数据存储在哪里?如何查看数据?FISCO-BCOS如何更换区块链的数据存储,由RocksDB更换为MySQL、MariaDB,联盟链区块链数据库,区块链数据库应用
  20. 拍摄失败导致照片像素低,学会这个可以一键高清修复

热门文章

  1. 教你如何制作浪漫的表白网站
  2. 计算机网络复习————概述,应用层,传输层
  3. 【Lua从青铜到王者基础篇】第一篇:Lua初始教程和环境安装
  4. 1631 小鲨鱼在51nod小学
  5. 真太极之只言片语 (续)
  6. Jmeter的配置原件操作
  7. [i:]和[i]发音
  8. Distilling Object Detectors via Decoupled Features
  9. 什么是归一化,它与标准化的区别是什么?
  10. JTAG和SWD调试器