2019-10-01ãã1ã¶æéã®è¨äºä¸è¦§
RISC-Vã®å®è£ ã§ããHummingBirdã調æ»ãã¦ãããã¨ã«ããã HummingBirdã®æ¦è¦ HummingBirdã¯ä¸å½ã®å¤§å¦ã§éçºãããRISC-Vã³ã¢ã§ãæ£å¼ã«ã¯E203ã¨ããååãä»ãããã¦ãããGitHubã®ãã¼ã¸ãåç §ããã¨ããã®HummingBirdãéçºããç®çã¯RISC-Vã®äººæ°ãåâ¦
ååã®ç¶ããMYRISCVXã®ãã¹ãã追å ããã simple_main.cppãclangã§ã³ã³ãã¤ã«ããã¨ã以ä¸ã®ãããªLLVMä¸éã³ã¼ããçæãããã ./bin/clang --target=riscv64-unknown-elf -c ../myriscvx-tests/tests/simple_main.cpp -emit-llvm -o - | ./bin/llvm-diâ¦
LLVMã®ãªãªã¸ãã«ã®ããã¯ã¨ã³ããå®è£ ãã¦ããããããããªã½ã¼ã¹ã³ã¼ããã³ã³ãã¤ã«ãã¦ãããããªãã¹ãããã°ã©ã ãåããã¦ããã ããã ãå¤ãã®ãã¹ããã¿ã³ãå®è¡ããã®ãªãããã¹ãç°å¢ã¨ãªã°ã¬ãã·ã§ã³ãã¹ããç¨æãã¦ããã®ãè¯ããLLVMã¯ããã¹â¦
人ã«ãã£ã¦ã¯GitHubã®ã¢ã«ã¦ã³ãã2ã¤ä»¥ä¸æã£ã¦ãããã社å ã§è¤æ°ã®GitHubã¢ã«ã¦ã³ãã使ãåããå¿ è¦ããã£ããããå ´åãããã ä¾ãã°ä»äºç¨ã¨è¶£å³ç¨ã§GitHubã¢ã«ã¦ã³ãã2ã¤ç¨æãã¦ãããããã®å ´åã¯1ã¤ã®PCããè¤æ°ã®GitHubã«å¯¾ãã¦å¶å¾¡ãè¡ãå¿ è¦â¦
ååã®ç¶ããå½ä»¤ãã³ãã®ãªãã©ã³ã表è¨ãä¸é¨æ¹é ãã ãã®ã¾ã¾ã§LLVMãã³ã³ãã¤ã«ãã¦å®è¡ãã¦ãè¯ãã®ã ããä¾ãã°ä»¥ä¸ã®ãããªå½ä»¤ã¯ãã³ãã®çµæããããããªãã addi x2, x2, -4 --> addi x2, x2, 4092 ãã¤ãã¹å¤ã®è¡¨è¨ããã¾ãè¡ããªãããªãã©ã³â¦
ELFãã¡ã¤ã«ã®çæã¨ãã£ã¹ã¢ã»ã³ãã©ã®ä½æ LLVMã«ã¯ããã¼ã«ã»ããã¨ãã¦çæãããªãã¸ã§ã¯ããã¡ã¤ã«ãéã¢ã»ã³ãã«ããããã®llvm-ojbdumpã¨ããã³ãã³ããç¨æããã¦ããã åºæ¬çã«çæãããªãã¸ã§ã¯ããã¡ã¤ã«ã¯ãã®ã³ãã³ããç¨ãã¦ãã³ããããã¨â¦
CQåºçãããåºçãã¦ããéèªã¤ã³ã¿ãã§ã¼ã¹ã®12æå·ã§ãã注ç®ãªã¼ãã³ã½ã¼ã¹RISC-Vãã¤ã³ã³ãã¨ããç¹éè¨äºã«å¯ç¨¿ãã¾ããã RISC-Vãã¤ã³ã³ã®è©±ãã¡ã¤ã³ãªãã§ãããããè¦ãã¨ç§ã¯ãã¤ã³ã³ã®è©±ã¯ã»ã¨ãã©æ¸ãã¦ããªãã§ããã ãªããä»æ§ã ã®ã¯ã©ã¦ãâ¦
ååã®ç¶ãã ãã¼ã¿ã®ãã¤ãã¹ã¯ãããè¡ããCè¨èªã§ã¯ã__builtin_bswap16, __builtin_bswap32, __builtin_bswap64ã«ããåå¾ãããã¨ãã§ããã ãããã¯ãã®ã¾ã¾å½ä»¤ã«è½ã¨ãè¾¼ããªãã®ã§ãIRã®çæãæå¶ããã func_bswap.cpp int test_bswap16() { voâ¦
Chipyardã¨ããã®ã¯RISC-Vããã¼ã¹ã¨ãããããè¨è¨ã®ããã®ãã¬ã¼ã ã¯ã¼ã¯ã§ããã¼ã«ã»ããã»ã©ã¤ãã©ãªã»ãã¶ã¤ã³ãªã©ãä¸ã¤ã«ã¾ã¨ãããã¬ã¼ã ã¯ã¼ã¯ã®ããã ããã®ãã¬ã¼ã ã¯ã¼ã¯ã使ç¨ãããã¨ã§ããã¼ãã¦ã§ã¢ã®è¨è¨ããã·ãã¥ã¬ã¼ã·ã§ã³ã»è«çåæã»â¦
å°ãåããããå®è·µRustå ¥éããèªã¿å§ãã¦ãããRustèªä½ã¯åã«è§¦ã£ããã¨ãããã®ã ããã¸ã§ããªã¯ã¹ã¨ããã¬ã¤ãã¨ããåºæ¬çãªç¥èãä¸è¶³ãã¦ããã®ã§ãè©å¤ãè¯ããããªæ¬ãè³¼å ¥ãã¦èªã¿é²ãã¦ãããã¨ã«ããã å®è·µRustå ¥é[è¨èªä»æ§ããéçºææ³ã¾ã§]â¦
RISC-Vã®å ¥éæ¸ã¨ããã°ãRISC-V Readerãªã©åºæ¬çã«è±èªã®ãã®ãæ¥æ¬èªã«ç¿»è¨³ãããã¨ããå½¢å¼ãå¤ãããä¸å½èªçã®è¯ããããªãã®ããã£ãã®ã§ç¡çããè²·ã£ã¦ã¿ãã 2åã»ããã§ãçµæ§ååããæ¼¢åã°ã£ããã§ãç©æããã¦ãããããã ã¨ãããããã¹ããâ¦
LLVM IRã«ã¯ãããã¤ãã®ç¹æ®ãªæ§æãåå¨ãããããããµãã¼ããããã¨ã§ããå¤ãã®ã³ã¼ããçæã§ããããã«ãªãã ãããã«ã¤ãã¦ã¯ãclangå´ããIntrinsicé¢æ°ãå¼ã³åºããã¨ã§LLVM IRãçæããllcã«æ¸¡ãã¦ãã¹ããããã¨ãã§ããã frame_addres, retuâ¦
ååã®ç¶ããæ«å°¾å帰ã®çæã«ã¤ãã¦ã LowerCallã«æ»ããIsTailCallãTrueã¨ãªããæ«å°¾é¢æ°å¼ã³åºãæé©åãæå¹ã¨ãã¦èªã¿é²ããã ... if (!IsTailCall) Chain = DAG.getCALLSEQ_START(Chain, NextStackOffset, 0, DL); ... æ«å°¾é¢æ°å¼ã³åºãæé©åãæå¹â¦
é¢æ°å¼ã³åºãã«ã¯æ§ã ãªæé©åã®å½¢ããããããã®ä¸ã®ä¸ã¤ã§ããæ«å°¾é¢æ°å¼ã³åºãã§ã®æé©åãå®è¡ãã¦ã¿ãã æ«å°¾é¢æ°å¼ã³åºãã¨ã¯ãããé¢æ°f1()ãé¢æ°f2()ã®æå¾ã®å¦çã¨ãã¦å¼ã³åºãããã±ã¼ã¹ãè¨ãã int f1(a, b) { a + b; } int f2(c, d, e, f) { /*â¦
Cè¨èªã®å¯å¤é·å¼æ°ã§ã¯ãä¾ãã°ä»¥ä¸ã®ãããªè¨è¿°ãå¯è½ã¨ãªãã vararg.cpp #include <stdarg.h> int sum_i(int amount, ...) { int i = 0; int val = 0; int sum = 0; va_list vl; va_start(vl, amount); for (i = 0; i < amount; i++) { val = va_arg(vl, int); sum </stdarg.h>â¦
ååã®ç¶ãã ByValå±æ§ã®å¼æ°ã«ãããå¼ã³åºãå´ã®å¦ç ããã§ã¯ã次ã«å¼ã³åºãå´ã¯ã©ã®ããã«ãªã£ã¦ããã®ã ãããã å¼ã³åºãå´ã§ããByValå±æ§ã®ã¤ããå¼æ°ãä¸ã¤ä¸ã¤ã³ãã¼ãã¦é¢æ°å¼ã³åºããå´ã«æ¸¡ãå¿ è¦ãããã é¢æ°å¼ã³åºãå´ã¯ãMYRISCVXTargetLowâ¦
ä»ã¾ã§ã®é¢æ°å¦çã®ä¸ã§ãå¼æ°ã¯åºæ¬çã«ãã¤ã³ã¿ãå¤æ¸¡ããããã¦å¤ãä½ããã®åã®å¤ã1ã¤ãã¤æ¸¡ãã¦ããã¨ããå½¢å¼ã ã£ãã ããããCè¨èªã§ã¯æ§é ä½ãªã©ã®è¤æ°ã®è¦ç´ ãã¾ã¨ããåã渡ããã¨ãã§ãããã¾ããCè¨èªã§ã¯æ§é ä½ã®å¤ããã®ã¾ã¾å¤æ¸¡ãã§å¼æ°ã¨â¦
ååã®ç¶ãã Legalizeã§ã¯ãã¿ã¼ã²ããåºæã®ãã¼ãã¸ã®å¤æãè¡ããLLVM IRã§ã¯æ§ã ãªæ¼ç®ãã¼ããå®ç¾©ãã¦ããããã¿ã¼ã²ããã¢ã¼ããã¯ãã£ã«ãã£ã¦ã¯ãµãã¼ããã¦ããªãæ¼ç®ãããã ãã®ãããªæ¼ç®ã«é¢ãã¦ã¯ãã¿ã¼ã²ãããçæã§ãããã¼ãã«å¤æããâ¦
Instruction Selectionã§ã¯ãLLVM IRãåãåãããããSelection DAGã«å¤æããããã®ãã§ã¼ãºã¯ãããã«ä»¥ä¸ã®ç´°ããªãã§ã¼ãºã«åãããã¨ãã§ããã LLVM IRãSelection DAGã¸å¤æ Selection DAGã®Combine Selection DAGã®Legalize Selection DAGãMachinâ¦
次ã«ãæ»ãå¤ã«é¢ããCalling Conventionã®å®è£ ããå§ããã 以ä¸ã®è¨è¿°ã§ã¯ãé¢æ°ã®æ»ãå¤ã渡ãããå ´åã«ãCCAssignToRegã§ç¤ºãããã¬ã¸ã¹ã¿ã®ã©ããã«å¼æ°ãæ ¼ç´ãããã«ã¼ã«ã追å ããã¦ããã ããã¦Calling Conventionã§ããRetCC_MYRISCVXãå®ç¾©ããâ¦
ãªãªã¸ãã«LLVMããã¯ã¨ã³ãå®è£ ãã¾ã¨ãã(16. é¢æ°ã³ã¼ã«ããµãã¼ããã)
ä»ã¾ã§ã®ããã¯ã¨ã³ãã®å®è£ ã§ã¯ãé¢æ°ã®åãæ±ãã«ã¤ãã¦ããããã¨ãã¼ã£ã¦ããé¨åããã£ããä»åã¯ãé¢æ°ã®å®ç¾©ã¨é¢æ°ã³ã¼ã«ããã¡ãã¨ãµãã¼ããããã¨æãããã®ããã«ã¯ã ã¹ã¿ãã¯ãã¬ã¼ã ã®å®ç¾© å¼æ°ã®å¦ç ãªã©ãå®è£ ãã¦ããã ç¾ç¶ã§ã¯ãå¼æ°ã®â¦
ååã®å¶å¾¡æ§æã追å ããéã«ãä¸è¦ãªã¸ã£ã³ãå½ä»¤ãçºçãã¦ããã®ãæ°ã«ãªã£ããä¾ãã°ãLLVM IRããã³ããæã«ä»¥ä¸ã®ãããªIRãåºåãããã¯ãã ã ãã®æãbr label %if.endã¯ããå¾ãã®if.endã«ã¸ã£ã³ãããããããã®ã¸ã£ã³ãæã¯ä¸è¦ãªã¯ãã ãããâ¦
次ã¯ãifæãçµã¿åããããããªå½¢ã§ç»å ´ããswitchæã®ãµãã¼ããèããã以ä¸ã®ãããªã³ã¼ããç¨æããã test_switch.cpp int test_value = 0x30; // 0x30, 0x31, ... ,0x35 int a_val = 0; int b_val = 0; void test_switch () { int result = 0; switchâ¦
å¶å¾¡ããã¼çæ ããããLLVMããã¯ã¨ã³ãã®ééå³ãå¶å¾¡æ§æã®çæã«å ¥ãã ã¾ãã¯ã以ä¸ã®ãããªç°¡åãªCããã°ã©ã ãClangã«å ¥åããLLVM IRãçæãã¦ã¿ããã©ã®ãããªå¶å¾¡IRãå¿ è¦ã«ãªãã®ãã確èªããã if_ctrl.cpp int test_ifctrl() { unsigned int â¦
é åã®ãµãã¼ãã®ç¢ºèª 次ã«ãæ´æ°å以å¤ã«é åã®ãµãã¼ãã®ç¢ºèªããããå®ã¯ãããã¾ã§ã®å®è£ ã§é åã¯ãµãã¼ãã§ããããã«ãªã£ã¦ããã以ä¸ã®ããã°ã©ã ãã³ã³ãã¤ã«ãã¦ã¿ãã int_arary.cpp int int_array() { int array[4] = {100, 200, 300, 400}; int â¦
ããã¾ã§ã®å®è£ ã§ãintå以å¤ã®åããµãã¼ãã§ãã¦ãããã念ã®ããã«ç¢ºèªãã¦ããã int32åãããå°ããåãæ±ãããã«ãããã¾ã§ã«ä»¥ä¸ã®ãã¼ãã追å ãã¦ããã®ã ã£ãã llvm-myriscvx80/lib/Target/MYRISCVX/MYRISCVXInstrInfo.td // Load/Store PatFraâ¦
ä»åã¯ãã°ãã¼ãã«å¤æ°ãåãæ±ãããã®ææ³ã«ã¤ãã¦èª¿æ»ããã ç¾ç¶ã§ã¯ãã°ãã¼ãã«å¤æ°ã®å ¥ã£ã¦ããããã°ã©ã ãã³ã³ãã¤ã«ããã¨ä»¥ä¸ã®ããã«ã¨ã©ã¼ãçºçããã global_access.cpp int global0 = 0; int global1 = 100; void global_access () { int iâ¦
RISC-V Day Tokyo 2019ã§ã販売ãããããã®ã ããåå ããªãã£ãã®ã§ãããã§è³¼å ¥ã å°çãã¦ãéå°ããã¨ã¨ãããããã«ããªï¼ ã³ã³ãã¥ã¼ã¿ã¢ã¼ããã¯ã㣠第6ç åèã¨æ¥æ¬èªç ä¸èº«ã¯ã¾ã çèªãã¦ããªããã©ãã¨ããããæ°ã«ãªãã®ã¯2ç¹ï¼ 表ç´ã«ã第6â¦
ãªãã¸ã§ã¯ããã¡ã¤ã«ã®çæ llcã¯ã¢ã»ã³ããªãã¡ã¤ã«ãåºåããã ãã§ãªãããªãã¸ã§ã¯ããã¡ã¤ã«ãåºåããæ©è½ãããããªãã¸ã§ã¯ããã¡ã¤ã«ãåºåããããã«ã¯ãllcã®ãªãã·ã§ã³ã§-filetype=asmã®ä»£ããã«-filetype=objãæå®ããã $ ./bin/llc -debug â¦
é¢æ°ã«é¢é£ããå½ä»¤ã®çæã®ç¶ããé¢æ°ã®ãããã¼ã°ã»ã¨ããã¼ã°ã¨ã¯ã©ã®ãããªå¦çãããã®ã ãããã ãããã¼ã° : é¢æ°ã®å é ã§ãé¢æ°ã®ã¹ã¿ãã¯ãã¬ã¼ã ãçæãããé¢æ°ã使ç¨ããå¤æ°ã®ãµã¤ãºã ãã¹ã¿ãã¯ã移åããã¡ã¢ãªé åã確ä¿ãããã¾ããCalliâ¦