Guia prático RISC-V Atlas de uma Arquitetura Aberta Primeira edição, 1.0.0
obtém 4 , RVA 11, RVF 6, RVD 6 e RVV 0. Guia prático RISC-V Atlas de uma Arquitetura Aberta Primeira edição, 1.0.0 David Patterson e Andrew Waterman March 29, 2019 Copyright 2017 Strawberry Canyon LLC namorados de escola, eles celebraram seu 50º aniversário de casamento alguns dias após a publicação da edição Beta. Andrew Waterman atua como chief engineer e co-fundador da SiFive. A SiFive foi fundada pelos três arquiteturas e descreve 2O comitê que define RV32V não concluiu seu trabalho a tempo para a edição Beta, então omitimos essas instruções do Apêndice A. O Capítulo 8 é nossa melhor suposição sobre0 码力 | 215 页 | 21.77 MB | 1 年前3Performance Engineering: Being Friendly to Your Hardware
- y; } uint32_t res = fn1(x, y, 42); cmp rdx, 27 jne L_0F mov eax, edi shl eax, 4 add eax, esi jmp L_15 L_0F: mov eax, edi shr eax, 1 sub eax, esi L_15: ret nop 10 48 83 FA 1B 75 09 89 F8 C1 E0 - y; } uint32_t res = fn1(x, y, 42); cmp rdx, 27 jne L_0F mov eax, edi shl eax, 4 add eax, esi jmp L_15 L_0F: mov eax, edi shr eax, 1 sub eax, esi L_15: ret nop 10 48 83 FA 1B 75 09 89 F8 C1 E0 - y; } uint32_t res = fn1(x, y, 42); cmp rdx, 27 jne L_0F mov eax, edi shl eax, 4 add eax, esi jmp L_15 L_0F: mov eax, edi shr eax, 1 sub eax, esi L_15: ret nop 10 48 83 FA 1B 75 09 89 F8 C1 E00 码力 | 111 页 | 2.23 MB | 5 月前3简明 X86 汇编语言教程
通常在内存操作指令中作为“源地址指针”使用。当然,ESI 可以被装入任意的数 值,但通常没有人把它当作通用寄存器来用。DS 是默认段寄存器或选择器。 EDI 32-bit 宽 通常在内存操作指令中作为“目的地址指针”使用。当然,EDI 也可以被装入任意 的数值,但通常没有人把它当作通用寄存器来用。DS 是默认段寄存器或选择器。 EBP 32-bit 宽 这也是一个作为指针的 么做 的时候需要小心一些。方法是,首先把数据送给 AX,然后再把它从 AX 传送给 DS(当 然,也可以通过堆栈来做). ES 附加段,或附加选择器。这个寄存器的低 16 bit 连同 EDI 一同指向的指令将要处 理的内存。同样的,这个寄存器可以被装入任意数值,方法和 DS 类似。 FS F 段或 F 选择器(推测 F 可能是 Free?)。可以用这个寄存器作为默认段寄存器或选 sub esp,48h push ebx push esi push edi ; 子程序入口 ; 保护现场 lea edi,[ebp-48h] mov ecx,12h mov eax,0CCCCCCCCh rep stos dword ptr [edi] mov dword ptr [ebp-4],0 mov dword ptr [ebp-8]0 码力 | 63 页 | 598.28 KB | 1 年前3Hidden Overhead of a Function API
org/z/ofznMvKWcarmv8-a clang 18.1.0 x86-64 gcc 14.2 x64 msvc v19.40 VS17.10 cmp w0, #0 cset w0, eq ret test edi, edi sete al ret test ecx, ecx sete al ret 0 V A L U E ldr w8, [x0] cmp w8, #0 cset w0, 94armv8-a clang 18.1.0 x86-64 gcc 14.2 x64 msvc v19.40 VS17.10 cmp w0, #0 cset w0, eq ret test edi, edi sete al ret test ecx, ecx sete al ret 0 V A L U E ldr w8, [x0] cmp w8, #0 cset w0, clang 18.1.0 x86-64 gcc 14.2 x64 msvc v19.40 VS17.10 mov w0, #1 b value_is_zero(int) mov edi, 1 jmp value_is_zero(int) mov ecx, 1 jmp value_is_zero(int) V A L U E sub sp, sp, #32 stp0 码力 | 158 页 | 2.46 MB | 5 月前3C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming
必不再执行 B • .L2: • 分支 B • .L3: 编译器是如何优化 if-else 的 xor eax, eax :相当于 mov eax, 0 更高效的写法 test edi, edi :相当于 cmp edi, 0 更高效的写法 setle al :如果上一次 cmp 的结果为小于等于,则把 al 设为 1 ,否则设为 0 add eax, 1 :给 eax 加 1 ,也就是 eax=eax+1 上一次比较结果为小于等于时,程序跳转到 .L1 处,否则不跳转继续往下执行。 • setle al 上一次比较结果为小于等于时,把 al 设为 1 ,否则设为 0 。 • cmovle eax, edi 上一次比较结果为小于等于时,把 eax 设为 edi 的值,否则 eax 保持 不变。 • 因为不用破坏流水线,不需要分支预测,无分支指令往往更加高效, CPU 执行效率更高 。 • j 系列指令有 jle , jge http://unixwiz.net/techtips/x86-jumps.html 手动进行无分支优化的方法 无分支优化:从汇编角度分析 • 发生了什么?让我们把源码和汇编逐个对应。 • x 是第一个参数(通过 edi 传入,被存入 rbp 指向的堆 栈) • 比较 x 和 0 的大小( cmp 命令把刚存入堆栈的 x 和 0 比较) • 这里 x > 0 返回的是一个 bool 类型(通过指令 setg0 码力 | 47 页 | 8.45 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化
专题) 第 0 章:汇编语言 x64 架构下的寄存器模型 通用寄存器: 32 位时代 • 32 位 x86 架构中的通用寄存器有: • eax, ecx, edx, ebx, esi, edi, esp, ebp • 其中 esp 是堆栈指针寄存器,和函数的调用与返回相关。 • 其中 eax 是用于保存返回值的寄存器。 通用寄存器: 64 位时代 • 64 位 x86 架构中的通用寄存器有: $42, %eax 相当于: eax = 42; 前 6 个参数:分别通过 edi , esi , edx , ecx , r8d , r9d 传入 movl %edi, -4(%rsp) 相当于: *(rsp - 4) = edi; 开启优化: -O3 movl %edi, %eax 相当于: eax = edi 32 位乘法运算: imull imull %esi, %eax 相当于:0 码力 | 108 页 | 9.47 MB | 1 年前3RISC-V 开放架构设计之道 1.0.0
4(t1) ldr r0, [r1, #4] mov eax, [edi+4] 取半字 lh t0, 4(t1) ldrsh r0, [r1, #4] movsx eax,WORD PTR[edi+4] 取无符号半字 lhu t0, 4(t1) ldrh r0, [r1, #4] movzx eax,WORD PTR[edi+4] 取字节 lb t0, 4(t1) ldrsb r0, [r1 movsx eax,BYTE PTR[edi+4] 取无符号字节 lbu t0, 4(t1) ldrb r0, [r1, #4] movzx eax,BYTE PTR[edi+4] 存字节 sb t0, 4(t1) strb r0, [r1, #4] mov [edi+4], al 存半字 sh t0, 4(t1) strh r0, [r1, #4] mov [edi+4], ax 存字 sw t0 str r0, [r1, #4] mov [edi+4], eax 图 B.1: RV32I 的访存指令翻译成 ARM-32 和 x86-32。 171 描述 RV32I ARM-32 x86-32 清零寄存器 li t0, 0 mov r0, #0 xor eax, eax 传送寄存器 mv t0, t1 mov r0, r1 mov eax, edi 取反 not t0, t1 mvn r00 码力 | 223 页 | 15.31 MB | 1 年前3Template-Less Meta-Programming
lookup: // x86-64 1 1 0.25 shl edi, 3 2 5 0.50 * bzhi eax, dword ptr [rsi], edi 1 3 1.00 imul eax, eax, 267363435 1 1 [6] lookup : // x86-64 1 1 0.50 shl edi, 3 2 5 0.50 * bzhi eax, dword ptr [rsi], edi 1 1 0.50 mov ecx, 65795 1 3 1.00 0 码力 | 130 页 | 5.79 MB | 5 月前3Is std::mdspan a Zero-overhead Abstraction? - Oleksandr Bakirov - CppCon
rdx, qword ptr [rsi + 16] mov rsi, qword ptr [rsi + 24] shl rdx, 2 xor edi, edi jmp .LBB0_2 .LBB0_5: # in Loop: Header=BB0_2 Depth=1 inc rdi add rsi, rdx rdx, qword ptr [rsi + 16] mov rsi, qword ptr [rsi + 24] shl rdx, 2 xor edi, edi jmp .LBB0_2 .LBB0_5: # in Loop: Header=BB0_2 Depth=1 inc rdi add rsi, rdx0 码力 | 75 页 | 1.04 MB | 5 月前3The RISC-V Reader: An Open Architecture AtlasFirst Edition, 1.0.0 - 2021
r0, [r1, #4] mov eax, [edi+4] Load halfword lh t0, 4(t1) ldrsh r0, [r1, #4] movsx eax,WORD PTR[edi+4] Load halfword unsigned lhu t0, 4(t1) ldrh r0, [r1, #4] movzx eax,WORD PTR[edi+4] Load byte lb t0, r0, [r1, #4] movsx eax,BYTE PTR[edi+4] Load byte unsigned lbu t0, 4(t1) ldrb r0, [r1, #4] movzx eax,BYTE PTR[edi+4] Store byte sb t0, 4(t1) strb r0, [r1, #4] mov [edi+4], al Store halfword sh t0, 4(t1) 4(t1) strh r0, [r1, #4] mov [edi+4], ax Store word sw t0, 4(t1) str r0, [r1, #4] mov [edi+4], eax 그림 B.1: ARM-32와 x86-32로 변환된 RV32I 메모리 접근 명령어. B.1. 소개 195 Description RV32I ARM-32 x86-32 Zero register0 码力 | 232 页 | 5.16 MB | 1 年前3
共 83 条
- 1
- 2
- 3
- 4
- 5
- 6
- 9
相关搜索词
GuiaprticoRISCAtlasdeumaArquiteturaAbertaPrimeiraedi1.0PerformanceEngineeringBeingFriendlytoYourHardware简明X86汇编语言汇编语言教程HiddenOverheadofFunctionAPIC++高性性能高性能并行编程优化课件04开放架构构设设计架构设计之道TemplateLessMetaProgrammingIsstdmdspanZerooverheadAbstractionOleksandrBakirovCppConTheReaderAnOpenArchitectureAtlasFirstEdition2021