2015-06-20 78 views
0

我不想在由llvm生成的彙編代碼中使用特定的機器指令。LLVM:在生成機器代碼時禁用某些指令

是否有辦法禁用相同的?我也可以修改llvm代碼。

+0

你不想使用的指令是什麼,爲什麼你不想使用它? – davmac

+0

它用於某些研究目的。我想禁用bt(位測試)指令。 –

+0

您可以從lib/target/X86/X86InstrInfo.td中刪除位測試指令並重新構建。我不確定是否有其他需要。 – davmac

回答

2

一種解決方案是指定LLVM,該指令不能被「降低」 ......兩件事情可能會發生:

  • 編譯器可以使用的指令的另一組合執行相同的操作......事情會沒關係
  • 編譯離不開它,在這種情況下,你必須修改目標產生建議解決方法(不是很容易,如果你不熟悉與LLVM)

要做到該搜索XXXISelDAGToDAG.cpp,其中XXX是你的目標機器,並指定到構造是這樣的:

setOperationAction(ISD::YYY, MVT::i8, Expand); 
setOperationAction(ISD::YYY, MVT::i16, Expand); 
setOperationAction(ISD::YYY, MVT::i32, Expand); 
setOperationAction(ISD::YYY, MVT::i64, Expand); 

ISD :: YYY是你不想使用的指令。 瀏覽源代碼時,這很容易找到。

大致爲:

  • setOperationAction指定要更改默認操作爲給定的操作,與沿型(MVT :: ...)
  • 展開的意思是「嘗試擴大到其他操作」(還有其他操作,如定製Libcall ...)

玩弄這個,你應該能夠解決你的問題。

希望它會有所幫助。