青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

歲月流轉(zhuǎn),往昔空明

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks

在設(shè)計(jì)一門語言與其他語言交互的API與ABI(Application Binary Interface,二進(jìn)制接口)時(shí),調(diào)用協(xié)議和內(nèi)存對齊是兩個(gè)無從回避的問題。

本文將討論如何在LLVM上生成正確的內(nèi)存對齊和調(diào)用協(xié)議的代碼。

在這里為了方便和標(biāo)準(zhǔn)起見,假定應(yīng)用LLVM的語言的Extending和Embedding的對象都是C。

調(diào)用協(xié)議

先來討論調(diào)用協(xié)議。調(diào)用協(xié)議用于保證調(diào)用方和被調(diào)用方在二進(jìn)制/匯編一級上是相容的。合適的調(diào)用協(xié)議可以幫助構(gòu)造出以下代碼:

// Callee Signature of LLVM code
void __cdecl foo( int a, float b, float4 c);

// C caller
typedef void (__cdecl* fn_ptr)(int, float, float4)
fn_ptr p = static_cast<fn_ptr>( get_jit_function("foo") );
p(1, 1.0, vec);

一般來說調(diào)用協(xié)議包括參數(shù)傳遞和返回值傳遞和堆棧平衡三個(gè)部分。在x86平臺上的C/C++編譯器中常見的調(diào)用協(xié)議有cdecl, fastcall和stdcall。具體的協(xié)議內(nèi)容請參見MSDN。

在C++中還有一類特殊的調(diào)用協(xié)議thiscall,用于調(diào)用對象的成員函數(shù)。但是這一類調(diào)用協(xié)議不同的平臺,不同的編譯器實(shí)現(xiàn)皆有不同,既無書面標(biāo)準(zhǔn),也無事實(shí)標(biāo)準(zhǔn),再加上virtual call等復(fù)雜的情況存在,并不適合用于做跨語言的調(diào)用。

對于x64平臺而言,在windows下和linux下分別有兩種調(diào)用協(xié)議。

先來看x86。由于x86在cdecl和fastcall上是有著跨平臺的標(biāo)準(zhǔn)的,因此LLVM對它的支持是比較完整的。程序只要在創(chuàng)建Function的時(shí)候指定Call Convention即可。

但是對于x64,LLVM的支持便不是那么完善。以windows為例,windows的x64調(diào)用協(xié)議要求以rcx,rdx,r8,r9寄存器傳遞前四個(gè)不大于64bit的參數(shù),其余參數(shù)放在棧上。如果參數(shù)大于64bit,則要求傳遞它的指針。浮點(diǎn)使用xmm0-3來傳遞。但是對于LLVM而言,一旦參數(shù)大于64bit,它便會將整個(gè)對象而不是指針壓到棧上傳遞。因此在遇到x64時(shí),需要小心處理API部分的調(diào)用協(xié)議。

在這里,我們需要將所有超過64bit的結(jié)構(gòu)體處理成指針(或者拷貝后處理成指針)傳遞。

同時(shí),LLVM提供了readonly和byval兩個(gè)參數(shù)屬性(Attribute)來確保參數(shù)的值語義。前者意味著傳入的指針?biāo)赶虻闹凳遣槐恍薷牡?,(類似于T const*),而后者會對傳入的指針做一份內(nèi)存拷貝,確保寫值不被傳遞出函數(shù)(類似于值拷貝)。這樣,LLVM生成的函數(shù)便可以MSVC生成的x64代碼正確調(diào)用了。

內(nèi)存對齊

與移動(dòng)平臺的體系結(jié)構(gòu)相比,x86對內(nèi)存對齊的條件算是相當(dāng)寬松的了。大部分的指令對內(nèi)存對齊基本上是沒有特殊要求的。只有一些SIMD的指令會對內(nèi)存對齊有所限定,例如movaps。

為了方便后端生成SIMD代碼,LLVM提供了vector類型,例如vector<float, 1>。在代碼生成的時(shí)候,vector會編譯成最有可能的SIMD類型。因此在x86平臺上,vector<float, 1-4>都被處理成類似于__m128的類型,更長的vector則被拆分成多個(gè)__m128類型。

這實(shí)際上意味著,所有的vector都應(yīng)該遵循16Bytes對齊的原則。

考慮到我們的需求,類似于struct{ float[3]; }這樣的結(jié)構(gòu),如果能表示為vector<float, 3>顯然適合一些數(shù)學(xué)運(yùn)算,例如shuffle,逐元素的add,sub,mul,同時(shí)LLVM指令的選擇也更加靈活。但是顯然,這個(gè)結(jié)構(gòu)體有兩個(gè)條件是不滿足的:16字節(jié)對齊和16字節(jié)的大?。╩ovups和movaps都是一次取16字節(jié))。這會造成邊界下讀寫的內(nèi)存越界。因此非常可惜,這些數(shù)據(jù)必須表示為struct{ float ,float, float }。在讀取的時(shí)候,也會生成正確的指令:movss。

那么,對于一般的非對齊的vec4應(yīng)用vector<float,4>行不行呢?

答案是,很困難。對于LLVM而言,他們在設(shè)計(jì)的時(shí)候就沒有過多的考慮vector在非對齊時(shí)候的應(yīng)用。盡管load和store都能夠指定alignment以生成非對齊的內(nèi)存操作(例如movups)并且確實(shí)會起效,但是由于代碼優(yōu)化、臨時(shí)存取等特性的存在,導(dǎo)致一些非load和store的內(nèi)存操作仍然是要求對齊的(例如生成了addaps xmm, [addr])。此時(shí)仍然有可能為非對齊的數(shù)據(jù)生成了內(nèi)存對齊的指令。

因此綜合權(quán)衡,SASL在API界面上使用了struct{float x,y,z,w;} 這樣的ABI來表示數(shù)據(jù),在代碼生成時(shí),會首先將struct的數(shù)據(jù)轉(zhuǎn)換成vector,然后再執(zhí)行其它的操作,兼顧ABI與SIMD;同時(shí)對于Intrinsic,由于并不暴露給Host,所以它們?nèi)匀槐M可能使用Vector,便于LLVM進(jìn)行優(yōu)化。

posted on 2011-08-17 13:58 空明流轉(zhuǎn) 閱讀(3495) 評論(3)  編輯 收藏 引用

評論

# re: LLVM的調(diào)用協(xié)議與內(nèi)存對齊 2011-08-17 16:38 陳梓瀚(vczh)
好復(fù)雜啊  回復(fù)  更多評論
  

# re: LLVM的調(diào)用協(xié)議與內(nèi)存對齊 2011-08-18 00:36 ooseven
期待空轉(zhuǎn)兄的大作,希望做成一個(gè)系列。  回復(fù)  更多評論
  

# re: LLVM的調(diào)用協(xié)議與內(nèi)存對齊 2014-04-03 09:56 往往
在建立扎實(shí)收入之前的那種開支需求的一種保障在生活,保障在房租,保障在零用之間建立起來的三個(gè)基本的扎實(shí)收入的過程當(dāng)中所需要的一種付出其中的基本的一個(gè)事實(shí)的努力的參考的基本含量在于確定起來的是基于一個(gè)現(xiàn)實(shí)的暫時(shí)的扎實(shí)的基礎(chǔ)收入建立起來對于溝通模式暢通的一個(gè)局面上面建立起來的扎實(shí)收入的基本面,這樣的一個(gè)基本面不是說自己具備的這樣的一種自我意識的過程當(dāng)中來尋找這樣的一個(gè)扎實(shí)基礎(chǔ)收入的可能,而是一定需要建立這樣扎實(shí)收入的基本面,在這個(gè)之前付出就需要更加斟酌的保持其中的一個(gè)安全的自我層面來考量。  回復(fù)  更多評論
  


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品影视天天线| 久久露脸国产精品| 久久久91精品国产| 欧美综合国产| 老色鬼久久亚洲一区二区| 狼人天天伊人久久| 亚洲国产欧美在线人成| 欧美高清视频一区二区三区在线观看| 久久精品人人做人人爽| 久久一区亚洲| 亚洲精品视频免费| 亚洲欧美久久久| 六月丁香综合| 国产精品成人一区二区| 激情成人在线视频| 99热精品在线观看| 欧美在线视频不卡| 亚洲国产精品日韩| 亚洲欧美久久久| 欧美国产日本在线| 国产日韩欧美另类| 9色porny自拍视频一区二区| 欧美在线播放一区| 亚洲国产欧美另类丝袜| 午夜精品影院| 欧美日韩国产一区精品一区| 国产婷婷色一区二区三区| 亚洲乱码一区二区| 久久综合精品一区| 亚洲一区二区三区精品动漫| 蜜桃av一区| 国产亚洲欧美日韩一区二区| 在线亚洲伦理| 亚洲国产精品成人综合色在线婷婷 | 卡一卡二国产精品| 国产精品亚洲片夜色在线| 最新精品在线| 美日韩精品视频| 欧美一区二区免费观在线| 国产精品久久波多野结衣| aa级大片欧美| 亚洲三级网站| 免费观看久久久4p| 在线欧美影院| 麻豆精品精华液| 久久精品欧美日韩精品| 国产伦精品一区二区三区四区免费| 99精品国产在热久久| 亚洲第一福利社区| 老妇喷水一区二区三区| 黄色精品网站| 欧美精品一卡| 葵司免费一区二区三区四区五区| 国产精品免费网站| 亚洲综合另类| 一区二区三区毛片| 欧美性久久久| 亚洲女人小视频在线观看| 一区二区三区|亚洲午夜| 欧美日韩综合不卡| 亚洲欧美激情一区二区| 亚洲视频在线一区观看| 国产精品久久久久久久第一福利| 亚洲在线1234| 亚洲男人的天堂在线| 国产精品亚洲美女av网站| 欧美主播一区二区三区美女 久久精品人 | 久久久久久婷| 1000部精品久久久久久久久| 麻豆久久婷婷| 蜜桃久久精品乱码一区二区| 亚洲日韩第九十九页| 亚洲九九爱视频| 国产精品久久久久永久免费观看| 亚洲欧美视频一区| 香蕉久久一区二区不卡无毒影院 | 99精品99久久久久久宅男| 亚洲精品永久免费| 国产精品国产三级国产专区53| 亚洲欧美日韩中文视频| 久久福利毛片| 亚洲精品裸体| 亚洲影院在线| 亚洲国产福利在线| 一区二区免费在线视频| 国产情侣一区| 亚洲电影免费观看高清| 国产精品国产三级国产aⅴ入口 | 欧美成人精品福利| 亚洲免费一级电影| 久久综合给合久久狠狠色| 亚洲人成在线观看网站高清| 一区二区三区四区五区精品| 国产亚洲a∨片在线观看| 欧美国产高清| 国产欧美精品日韩区二区麻豆天美| 久久婷婷麻豆| 欧美视频在线观看免费| 久久亚洲二区| 国产精品理论片在线观看| 男男成人高潮片免费网站| 国产精品v亚洲精品v日韩精品| 美女被久久久| 国产精品亚洲综合| 久久只精品国产| 一区二区三区日韩精品视频| 亚洲性视频h| 亚洲精品一二三区| 久久精品免费看| 亚洲欧美怡红院| 欧美日韩亚洲综合在线| 亚洲第一区中文99精品| 国产日韩精品一区二区三区在线| 亚洲国产欧美精品| 亚洲第一区中文99精品| 欧美一区二区三区男人的天堂| 亚洲网站视频福利| 欧美日本国产在线| 亚洲欧洲综合另类在线| 精品成人免费| 久久九九国产| 久久久xxx| 国产欧美综合在线| 亚洲欧美中文日韩在线| 午夜精品久久久久久久白皮肤 | 久久亚洲精品一区二区| 欧美一区二视频| 国产精品欧美一区二区三区奶水| 91久久综合亚洲鲁鲁五月天| 亚洲国产导航| 欧美成人r级一区二区三区| 麻豆精品视频在线观看视频| 国产亚洲精品久久久久动| 亚洲欧美国产一区二区三区| 亚洲欧美不卡| 国产精品一区二区在线| 亚洲午夜在线观看| 先锋影音国产精品| 国产欧美三级| 久久www成人_看片免费不卡| 久久久久久久国产| 激情丁香综合| 免费欧美在线| 亚洲毛片一区| 午夜日韩电影| 国内成人在线| 久久女同精品一区二区| 亚洲第一网站免费视频| 亚洲美女淫视频| 国产精品国产馆在线真实露脸| 亚洲一区二区三区高清| 久久精品亚洲一区二区| 欲香欲色天天天综合和网| 欧美va天堂在线| 99国产精品99久久久久久粉嫩| 亚洲嫩草精品久久| 一区二区亚洲欧洲国产日韩| 欧美大成色www永久网站婷| 亚洲精品看片| 久久激情久久| 亚洲美女在线国产| 国产精品夜夜夜| 久久综合色8888| 一级日韩一区在线观看| 久久欧美肥婆一二区| 亚洲人成在线观看一区二区| 欧美午夜在线一二页| 久久精品国产久精国产一老狼| 亚洲国产cao| 久久国产精品久久久久久电车| 亚洲激情二区| 国产日产高清欧美一区二区三区| 麻豆精品视频在线观看| 欧美在线日韩在线| 老巨人导航500精品| 夜久久久久久| 免费欧美视频| 午夜精品久久久久久99热软件| 国语自产精品视频在线看8查询8| 欧美成人中文字幕| 欧美一级理论性理论a| 亚洲国产天堂久久国产91| 欧美在线观看你懂的| 亚洲免费高清| 在线成人www免费观看视频| 国产精品嫩草99av在线| 欧美高清视频www夜色资源网| 香蕉成人久久| 亚洲影视综合| 在线视频免费在线观看一区二区| 欧美第一黄色网| 久久综合色综合88| 久久动漫亚洲| 欧美一级理论性理论a| 一区二区高清视频| 亚洲人成网站999久久久综合 | 99国产精品久久久久老师 | 欧美亚洲免费电影| 一区二区三区高清不卡| 亚洲精品免费电影|