8 2 301 C
-
1
• ) ),
• ) ( ( , (
2
-
•
•
•
3
(
• - - ( ) ) -
• ( - - ) - - - - )
• ) - - - -
• - - ) - - - - ) -
4
1 2 3
• B
• F B IS VDMA
• E F B
• 13 4 : 8 : 6 : 2
• 13 , 4 : 8 : 6 : 2
• 13 4 : 8 : 6 : 2
• 13 4 : 8 : 6 : 2
• QR C B
• -
5
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
6https://github.com/lowRISC/riscv-llvm
3 M CL M
• 0 1 0 - . 1
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
7https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• - 3.206- 06 2 06 02 04 - 4 602 4
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
8https://github.com/lowRISC/riscv-llvm
6GA 4 E DAIAED
• //80 6GA
• 4 -.6 674 8 1 4 4 6.1 6 0
• L C EHL
• AD C 6 6GA
9
class Triple {
public:
enum ArchType {
...,
riscv32, // RISC-V (32-bit): riscv32
riscv64, // RISC-V (64-bit): riscv64
...,
};
...
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• -- -. . 3 0
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
10https://github.com/lowRISC/riscv-llvm
3 BEBIBFEH
• D =ABE
• 4 718, )
• 718, 8 =B B= C H
• 718, 7 ,
• 718, 36 1
• 718, 36 1 86
•
• 7 CF= IBFE IJ
• 3 7 36, 7 718, 7 ,
• 3 7 36, 7 718, 2 3
• 3 7 36, 7 718, , 33 (
• 11
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• . 0 -
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
12https://github.com/lowRISC/riscv-llvm
• ..
13
RISCVTargetMachine::RISCVTargetMachine(
const Target &T, // riscv32
const Triple &TT, // riscv32---elf
StringRef CPU, // generic-rv32
StringRef FS, // Feature String: +a,+m, …
const TargetOptions &Options, // FloatABIType = FloatABI::Default
Optional<Reloc::Model> RM, // Static, PIC_, etc.
Optional<CodeModel::Model> CM, // Small, Large, Medlow, Medany, Pic
CodeGenOpt::Level OL, // -O0 -O1 -O2 -Os -O3
bool JIT)
: LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options,
getEffectiveRelocModel(TT, RM),
getEffectiveCodeModel(CM), OL),
TLOF(make_unique<TargetLoweringObjectFileELF>()) {
initAsmInfo();
}
F 2 C - 1 MDI
• B) E) ) ) C 4 ( DF F
• ) A A C: C
• B) ) .1 B C A C ) 3F MB8DA 1 EF L
• E) ) ) 8 ED C F 8 A CB C
• ) ) A CB C D 8
• C ) D C C F : DF F
36 C 8
• 4 ( ) C IF A A CB C D ( 8 14
static std::string computeDataLayout(const Triple &TT) {
if (TT.isArch64Bit()) {
return "e-m:e-p:64:64-i64:64-i128:128-n64-S128";
} else {
assert(TT.isArch32Bit() && "only RV32 and RV64 are currently supported");
return "e-m:e-p:32:32-i64:64-n32-S128";
}
}
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• . - - 5 0
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
15https://github.com/lowRISC/riscv-llvm
+ .
•
• ) + ( .
16
------------- Classes -----------------
class ALU<bits<5> ALU:opcode = { ?, ?, ?, ?, ? }, string ALU:op = ?> {
bits<5> Opcode = { ALU:opcode{4}, ALU:opcode{3}, ALU:opcode{2}, ALU:opcode{1},
ALU:opcode{0} };
string Op = ALU:op;
string NAME = ?;
}
------------- Defs -----------------
def ADD { // ALU
bits<5> Opcode = { 1, 0, 1, 0, 1 };
string Op = "add";
string NAME = ?;
}
def SUB { // ALU
bits<5> Opcode = { 1, 0, 1, 1, 1 };
string Op = "sub";
string NAME = ?;
}
class ALU<bits<5> opcode, string op> {
bits<5> Opcode = opcode;
string Op = op;
}
def ADD : ALU<0b10101, "add">;
def SUB : ALU<0b10111, "sub">;
- / .
• B . . /
• . . . / -
• B
• . -
• B /
• . / -
17
RISCV.td
Assembler
Disassembler
Compiler
- -.
• -
18
let Namespace = "RISCV" in {
class RISCVReg<bits<5> Enc, string n, list<string> alt = []> : Register<n> {
let HWEncoding{4-0} = Enc;
let AltNames = alt;
}
def ABIRegAltName : RegAltNameIndex;
} // Namespace = "RISCV"
// Integer registers
let RegAltNameIndices = [ABIRegAltName] in {
// RegNum RegName ABIName
def X0 : RISCVReg<0, "x0", ["zero"]>, DwarfRegNum<[0]>;
def X1 : RISCVReg<1, "x1", ["ra"]>, DwarfRegNum<[1]>;
def X2 : RISCVReg<2, "x2", ["sp"]>, DwarfRegNum<[2]>;
...
def X31 : RISCVReg<31, "x31", ["t6"]>, DwarfRegNum<[31]>;
}
// GPR: {X0, X1, …, X31}
def GPR : RegisterClass< "RISCV", [i32],
32, (add (sequence "X%u", 0, 31))>
. -
19
// R-type (e.g. add rd, rs1, rs2) I-type, S-type, etc.
class RVInstR<bits<7> funct7, bits<3> funct3, RISCVOpcode opcode, dag outs,
dag ins, string opcodestr, string argstr>
: RVInst<outs, ins, opcodestr, argstr, []> {
bits<5> rs2; //
bits<5> rs1;
bits<5> rd;
let Inst{31-25} = funct7; //
let Inst{24-20} = rs2;
let Inst{19-15} = rs1;
let Inst{14-12} = funct3;
let Inst{11-7} = rd;
let Opcode = opcode.Value;
}
-
• . .
20
include "RISCVInstrFormats.td"
// Instruction Class Templates
class ALU_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
: RVInstR<funct7, funct3, OPC_OP, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2),
opcodestr, "$rd, $rs1, $rs2">;
def ADD : ALU_rr<0b0000000, 0b000, "add">; // add rd, rs1, rs2
.-
• $ llvm-tblgen ./RISCV.td -I ../../../include/
21
def ADD { // Instruction RVInst RVInstR ALU_rr
field bits<32> Inst = { 0, 0, 0, 0, 0, 0, 0, // funct7
rs2{4}, rs2{3}, rs2{2}, rs2{1}, rs2{0}, // rs2
rs1{4}, rs1{3}, rs1{2}, rs1{1}, rs1{0}, // rs1
0, 0, 0, // funct3
rd{4}, rd{3}, rd{2}, rd{1}, rd{0}, // rd
0, 1, 1, 0, 0, 1, 1 }; // opcode
string Namespace = "RISCV";
dag OutOperandList = (outs GPR:$rd);
dag InOperandList = (ins GPR:$rs1, GPR:$rs2);
string AsmString = "add $rd, $rs1, $rs2"; // AsmParser, InstrPrinter
list<dag> Pattern = []; // pattern
...
int Size = 4; // 4-byte
bit isReturn = 0; // return
bit isBranch = 0; // branch
bits<7> Opcode = { 0, 1, 1, 0, 0, 1, 1 };
bits<5> rs2 = { ?, ?, ?, ?, ? };
bits<5> rs1 = { ?, ?, ?, ?, ? };
bits<5> rd = { ?, ?, ?, ?, ? };
}
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• .. 6 0 6- -
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
22https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• .. 7 - 7 7 8-0
• .. 78 8 . 7 - 77 8 8-0
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
23https://github.com/lowRISC/riscv-llvm
& . & .
• &
• .
• add x1, x2, x3 -> MCInst
• . & .
• .
• MCInst -> add x1, x2, x3
•
•
• [0xb3,0x00,0x31,0x00] -> MCInst
•
• MCInst -> [0xb3,0x00,0x31,0x00]
24
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 332 -2 00 2 3 .
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
25https://github.com/lowRISC/riscv-llvm
- 3
• 3 -3
• 3 3 - 3
• /
• 3 3 - 3
• / /
• - 3
• - 3 3
•
• 3 3 -2
• /
• - 3
•
•
•
• 26
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• - 1 0 .
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
27https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 00 1 . 1 . 1 -
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
28https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 221 1 2 - 00 - .- 2 2 .
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
29https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 3 -.0. . 1
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
30https://github.com/lowRISC/riscv-llvm
(( ) ) )- )
• (( ) ) )- ) a
e C a
• :
• :
•
((
•
((
31
// Callee-save
callee:
sw s0, 12(sp)
...
mv s0, a1 # s0
...
lw s0, 12(sp)
// Caller-save
caller:
sw ra, 12(sp)
...
call callee
...
lw ra, 12(sp)
.
• . .
32
// x10(a0) x11(a1)
int add(int a, int b) {
return a + b; // x10(a0)
}
void caller() {
// x10(a0) x11(a1)
int result = add(3, 5);
} // x10(a0)
.
33
• .
// X10 X11
def RetCC_RISCV32 : CallingConv<[CCIfType<[i32], CCAssignToReg<[X10, X11]>>]>;
// RISCV 32-bit C Calling convention.
def CC_RISCV32 : CallingConv<[
// Promote i1/i8/i16 args to i32
CCIfType<[ i1, i8, i16 ], CCPromoteToType<i32>>,
// X10~X17
CCIfType<[i32], CCAssignToReg<[ X10, X11, X12, X13, X14, X15, X16, X17]>>,
// size 4 bytes, alignment 4 bytes
CCAssignToStack<4, 4>
]>;
// Callee-save
def CSR : CalleeSavedRegs<(add X1, X3, X4, X8, X9, (sequence "X%u", 18, 27))>;
34
LLVM IR
Map IR instructions
to DAG
SelectionDAGBuilder
Target
Lowering
Instruction
Selection
))- ( :
• :
• ))- ( :
• : :
• : :
35
a
add
b
c
add
36
int add(int a, int b) {
return a + b;
}
define i32 @add(i32 signext %a,
i32 signext %b) #0 {
entry:
%add = add nsw i32 %a, %b
ret i32 %add
}
t0: ch = EntryToken
t4: i32,ch = CopyFromReg t0, Register:i32 %1
t2: i32,ch = CopyFromReg t0, Register:i32 %0
t5: i32 = add nsw t4, t2
t7: ch,glue = CopyToReg t0, Register:i32 %x10_32, t5
t8: ch = RISCVISD::RET_FLAG t7, Register:i32 %x10_32, t7:1
37
LLVM IR
Map IR instructions
to DAG
SelectionDAGBuilder
Target
Lowering
Instruction
Selection
) 3 - 2 -3
• ) 3 - SI T
) 3 - SI
• ) 3 - S
• ) 3 -
• 4 36 2 (- - 2
) 3 - SI
• void setOperationAction(
unsigned Op, // S
MVT VT, //
LegalizeAction Action) // TL Target
// I S
38
3
• 3
• O T
• L T
• 3 LA T PC L
• L
• 3
39
setOperationAction(ISD::ADD, MVT::i32, Legal)
setOperationAction(ISD::ADD, MVT::i8, Promote)
AddPromotedToType(ISD::ADD, MVT::i8, MVT::i32)
// P T L shift T PC L E
setOperationAction(ISD::MUL, MVT::i32, Expand);
setOperationAction(ISD::GlobalAddress, i32, Custom);
.
• .
40
RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
const RISCVSubtarget &STI)
: TargetLowering(TM), Subtarget(STI) {
// Set up the register classes.
addRegisterClass(MVT::i32, &RISCV::GPRRegClass);
// 32-bit promote 32-bit
// 32-bit 32-bit
computeRegisterProperties(STI.getRegisterInfo());
setStackPointerRegisterToSaveRestore(RISCV::X2);
// TODO: add all necessary setOperationAction calls.
setOperationAction(ISD::MUL, XLenVT, Expand);
...
setOperationAction(ISD::GlobalAddress, i32, Custom);
...
}
•
•
•
41
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
bool IsVarArg,
const SmallVectorImpl<ISD::InputArg> &Ins,
const SDLoc &DL, SelectionDAG &DAG,
SmallVectorImpl<SDValue> &InVals) const override;
SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
const SmallVectorImpl<ISD::OutputArg> &Outs,
const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
SelectionDAG &DAG) const override;
SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
SmallVectorImpl<SDValue> &InVals) const override;
42
LLVM IR
Map IR instructions
to DAG
SelectionDAGBuilder
Target
Lowering
Instruction
Selection
• -
• -
43
// RISCVInstrInto.td
def Pat<(add GPR:$rs1, GPR:$rs2), (ADD GPR:$rs1, GPR:$rs2)>;
- - - -
44
// RISCVInstrInto.td
def Pat<(add GPR:$rs1, simm12:$imm12), (ADDI GPR:$rs1, simm12:$imm12)>;
. . - .
• -
45
void RISCVDAGToDAGISel::Select(SDNode *Node) {
// If we have a custom node, we have already selected
if (Node->isMachineOpcode()) {
DEBUG(dbgs() << "== "; Node->dump(CurDAG); dbgs() << "n");
Node->setNodeId(-1);
return;
}
// C
if (Node->getOpcode() == ISD::AND) {
...
return;
}
// A .td pattern
SelectCode(Node);
}
// RISCVInstrInto.td
def Pat<(add GPR:$rs1, GPR:$rs2), (ADD GPR:$rs1, GPR:$rs2)>;
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• - 44 1 0 - 4 .
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
46https://github.com/lowRISC/riscv-llvm
• 2 3
- -
47
// 3 12-bit sign-extension
def LO12Sext : SDNodeXForm<imm, [{
return CurDAG->getTargetConstant(SignExtend64<12>(N->getZExtValue()),
SDLoc(N), N->getValueType(0));
}]>;
// 32-bit 20-bit 11 1 1
def HI20 : SDNodeXForm<imm, [{
return CurDAG->getTargetConstant(((N->getZExtValue()+0x800) >> 12) & 0xfffff,
SDLoc(N), N->getValueType(0));
}]>;
def simm32 : ImmLeaf<XLenVT, [{return isInt<32>(Imm);}]>;
// simm12 -> addi rd, x0, simm12
def : Pat<(simm12:$imm), (ADDI X0, simm12:$imm)>;
// simm32 -> lui rd, uimm20 + addi rd, rd, simm12
def : Pat<(simm32:$imm), (ADDI (LUI (HI20 imm:$imm)), (LO12Sext imm:$imm))>;
# 0xabcd5566 a0, simm32 = (uimm20 << 12) + simm12
lui a0, 0xabcd5 # a0 = 0xabcd5
addi a0, a0, 0x566 # a0 = 0xabcd5566
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• - 1 5 0 0 15 .
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
48https://github.com/lowRISC/riscv-llvm
49
def : Pat<(load (add GPR:$rs1, simm12:$imm12)), (LW GPR:$rs1, simm12:$imm12)>;
LW rd, rs, simm12
50
/// Loads
multiclass LdPat<PatFrag LoadOp, RVInst Inst> {
def : Pat<(LoadOp GPR:$rs1), (Inst GPR:$rs1, 0)>;
def : Pat<(LoadOp (add GPR:$rs1, simm12:$imm12)),
(Inst GPR:$rs1, simm12:$imm12)>;
}
defm : LdPat<sextloadi8, LB>;
defm : LdPat<extloadi8, LB>;
defm : LdPat<sextloadi16, LH>;
defm : LdPat<extloadi16, LH>;
defm : LdPat<load, LW>;
defm : LdPat<zextloadi8, LBU>;
defm : LdPat<zextloadi16, LHU>;
/// Stores
multiclass StPat<PatFrag StoreOp, RVInst Inst> {
def : Pat<(StoreOp GPR:$rs2, GPR:$rs1), (Inst GPR:$rs2, GPR:$rs1, 0)>;
def : Pat<(StoreOp GPR:$rs2, (add GPR:$rs1, simm12:$imm12)),
(Inst GPR:$rs2, GPR:$rs1, simm12:$imm12)>;
}
defm : StPat<truncstorei8, SB>;
defm : StPat<truncstorei16, SH>;
defm : StPat<store, SW>;
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• . 6 - 6 6 6 0 .1
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
51https://github.com/lowRISC/riscv-llvm
:
52
@G = global i32 0
define i32 @lw_global(i32 %a) {
%1 = load volatile i32, i32* @G
ret i32 %1
}
lui a0, %hi(G)
addi a0, a0, %lo(G)
lw a0, 0(a0)
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• . - 070 1 7
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
53https://github.com/lowRISC/riscv-llvm
54
define void @condbr(i32 %a, i32 %b, i32 *%c) {
%tst = icmp ne i32 %a, %b
br i1 %tst, label %end, label %equal
equal:
store i32 1, i32* %c
br label %end
end:
ret void
}
def : Pat<(brcond (i32 (setne GPR:$rs1, GPR:$rs2)), bb:$imm12)
(BEQ GPR:$rs1, GPR:$rs2, simm13_lsb0:$imm12)>;
BEQ rs1, rs2, simm13_lsb0
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 00 1 1 . . -- 0
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
55https://github.com/lowRISC/riscv-llvm
• RISCVTargetLowering::LowerCall
• 0
• 7
• 0
56
57
let isCall = 1, Defs=[X1] in
def PseudoCALL : Pseudo<(outs), (ins GPR:$rs1), [(Call GPR:$rs1)]>,
PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>;
lui a0, %hi(external_function)
addi a3, a0, %lo(external_function)
// a0~a7
addi a0, zero, 1
addi a1, zero, 2
addi a2, zero, 3
// /
jalr ra, a3, 0
declare i32 @external_function(i32, i32, i32)
define i32 @test_call_external() nounwind {
%1 = call i32 @external_function(i32 1, i32 2, i32 3)
ret i32 %1
}
JALR rd, rs1, simm12
• target address: rs1 + simm12
• rd = pc + 4
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• . . 9 . 0 9-1
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
58https://github.com/lowRISC/riscv-llvm
59
:
define i32 @bare_select(i1 %a, i32 %b, i32 %c) {
%1 = select i1 %a, i32 %b, i32 %c
ret i32 %1
}
bare_select:
# %bb.0:
andi a0, a0, 1
addi a3, zero, 0
bne a0, a3, .LBB0_2
# %bb.1:
addi a1, a2, 0
.LBB0_2:
addi a0, a1, 0
jalr zero, ra, 0
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 02 02 2- 0 - -0 .
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
60https://github.com/lowRISC/riscv-llvm
29 I
• 3 L I 9D 3 4 7 9E I 9
• 3 4 7 3 F EAI AI L 9E AI L AE A C 9 IAE 9
• 3 4 7 3 4 7 -0. AE I 9
• 3 4 7 I 9 E 9
• 3 4 7 9IA 3 4 7 EI .F D9 I EI E F 3 AI 9
• 3 4 7 9 FE I 3 4 7 1 59 I 9
• 3 4 7 9IA 3 4 7 ID29 I 9
• 3 4 7 3 4 7 EI 2 AE 9E 9IA 1 9II D C 9
• 3 4 7 I F F 9CC 37 AEI AFEI 9
• 3 4 7 I F F AI9II D C 9
• 3 4 7 FDDFE A I 9E CF 9 AFEI 9
• 3 4 7 I F F 9 8CC 8 I 8 I 9
• 3 4 7 EA A9C F E I F F 06 F 9 AFEI 9
• 3 4 7 F E I F F D9 A9CAPAE FEI 9E I 9
• 3 4 7 F E I F F D DF F 9 AFEI 9
• 3 4 7 F E I F F D DF F 9 AFEI FE CF 9 9
• 3 4 7 F E F FE A AFE9C 9E I 9
• 3 4 7 4 F F E AFE 9CCI 9
• 3 4 7 D C D E CFM AE F 4 4-0- 5 9
• 3 4 7 4 F 9E I I F 9 L9 A F 9 A AFE9C 9
• 1 0 . - - .2
• 3 4 7 4 F CFM AE . 9D E 9
• 3 4 7 D C D E FCF 9E ACF AEI AFE 9
• 3 4 7 CCFM CFM AE F E9DA 8I 9 9CCF I 9 I9L 9
• 3 4 7 I FD 83 4 7 9CCAE FEL E AFE 9E AD 9
• 3 4 7 4 F F L9 9 I 9
• 3 4 7 4 F I 9 9D I 9E F I I F A I 9
• 3 4 7 9IA I F F AECAE 9ID FEI 9AE I 9
• 3 4 7 I F F CCLD 9D 9 II E9 9
• 3 4 7 D C D E 9E 9E9C IAI 9
61https://github.com/lowRISC/riscv-llvm
addi a1, zero, 0
sub a0, a1, a0
sub a0, zero, a0
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 2 2 . 0 -
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
62https://github.com/lowRISC/riscv-llvm
63
// Replace FrameIndex with Offset
void RISCVRegisterInfo::eliminateFrameIndex
// Calculate Offset by FrameIndex
int RISCVFrameLowering::getFrameIndexReference
OffsetHigh Address
Low Address
fp/s0
sp
ra
s0/fp
s1
s2
s3
.
.
.
FrameIndex
0
1
2
3
4
sp + 12
sp + 16
sp + 20
sp + 24
sp + 28
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 03 0 3 2 2 3. 2 . .2 3 -
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
64https://github.com/lowRISC/riscv-llvm
0 / 0 / ) -/
• /
• I
• ( - ( //
•
• P ( // -
E (
• I
• -/
• ( ( //
- P E
•
•
•
65
func:
// Prologue
addi sp, sp, -32
sw ra, 28(sp)
sw s0/fp, 24(sp)
sw s1, 20(sp)
sw s2, 16(sp)
sw s3, 12(sp)
addi s0/fp, sp, 32
...
// callee-save
// register
...
// Epilog
lw s3, 12(sp)
lw s2, 16(sp)
lw s1, 20(sp)
lw s0/fp, 24(sp)
lw ra, 28(sp)
addi sp, sp, 32
ret
. .
• .
66
void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
MachineBasicBlock &MBB) const {
...
uint64_t StackSize = MFI.getStackSize();
...
// addi sp, sp, -StackSize
adjustReg(MBB, MBBI, DL, SPReg, SPReg, -StackSize, MachineInstr::FrameSetup);
...
// addi fp, sp, StackSize
adjustReg(MBB, MBBI, DL, FPReg, SPReg, StackSize, MachineInstr::FrameSetup);
}
void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
MachineBasicBlock &MBB) const {
...
uint64_t StackSize = MFI.getStackSize();
...
// Deallocate stack: addi sp, sp, StackSize
adjustReg(MBB, MBBI, DL, SPReg, SPReg, StackSize, MachineInstr::FrameDestroy);
}
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• - . 4 2 2 - 0
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
67https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 2 0 . - 0 025 5
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
68https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 2..- - 0 .
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
69https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 7 . 2-7 3 ..7- 7 0 7
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
70https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 0 8 . 0 0 - 2 8 0 8 8
• 4 5 8 L I M AI FFO A LL M M C
• 4 5 8 F M C FRLDL M C
71https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 2 -2 0 - 0 .
• 4 5 8 F M C FRLDL M C
72https://github.com/lowRISC/riscv-llvm
3 M CL M
• 4 O M LM 4 5 8 C L M C
• 4 5 8 4 I DL DL O DL O D M D F LD M C
• 4 5 8 4 5 8 -0. AD L M C
• 4 5 8 LM E M C
• 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C
• 4 5 8 I L 4 5 8 1 6 M L M C
• 4 5 8 LD 4 5 8 L 3 L M C
• 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C
• 4 5 8 L I M AI FF 48 D LM MDI L M C
• 4 5 8 L I M AI DL LL FR M C
• 4 5 8 I I AD L FI MDI L M C
• 4 5 8 L I M MI M FF M LM C EL R M C
• 4 5 8 DMD F I L I M AI 07 I MDI L M C
• 4 5 8 I L I M AI M D FDSD I LM ML M C
• 4 5 8 I L I M AI I R I MDI L M C
• 4 5 8 I L I M AI I R I MDI L I FI M C
• 4 5 8 I AI I DMDI F C L M C
• 4 5 8 5 I M AI A MDI FFL M C
• 4 5 8 F M FIP D IA 5 5-0- 6 M C
• 4 5 8 5 I M M LML AI O D MR IA DMDI F M C
• 4 5 8 7L DLM 9 -42 AI I LM M M C
• 4 5 8 5 I M FIP D . M C
• 4 5 8 F M IFI DFI D L MDI M C
• 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C
• 4 5 8 LMI 4 5 8 FFD I O MDI D M C
• 4 5 8 5 I M AI O L M C
• 4 5 8 5 I M LM E A L IAAL ML MI DML M C
• 4 5 8 LD L I M AI D FD L I LM D ML M C
• 4 5 8 L I M AI FFO A LL M M C
• .0- . 3 - 0 3
73https://github.com/lowRISC/riscv-llvm
: .
• :
• : . :
• : / .
• : / : -: :
•
74

llvm basic porting for risc v

  • 1.
    8 2 301C - 1
  • 2.
    • ) ), •) ( ( , ( 2
  • 3.
  • 4.
    ( • - -( ) ) - • ( - - ) - - - - ) • ) - - - - • - - ) - - - - ) - 4
  • 5.
    1 2 3 •B • F B IS VDMA • E F B • 13 4 : 8 : 6 : 2 • 13 , 4 : 8 : 6 : 2 • 13 4 : 8 : 6 : 2 • 13 4 : 8 : 6 : 2 • QR C B • - 5
  • 6.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 6https://github.com/lowRISC/riscv-llvm
  • 7.
    3 M CLM • 0 1 0 - . 1 • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 7https://github.com/lowRISC/riscv-llvm
  • 8.
    3 M CLM • 4 O M LM 4 5 8 C L M C • - 3.206- 06 2 06 02 04 - 4 602 4 • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 8https://github.com/lowRISC/riscv-llvm
  • 9.
    6GA 4 EDAIAED • //80 6GA • 4 -.6 674 8 1 4 4 6.1 6 0 • L C EHL • AD C 6 6GA 9 class Triple { public: enum ArchType { ..., riscv32, // RISC-V (32-bit): riscv32 riscv64, // RISC-V (64-bit): riscv64 ..., }; ...
  • 10.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • -- -. . 3 0 • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 10https://github.com/lowRISC/riscv-llvm
  • 11.
    3 BEBIBFEH • D=ABE • 4 718, ) • 718, 8 =B B= C H • 718, 7 , • 718, 36 1 • 718, 36 1 86 • • 7 CF= IBFE IJ • 3 7 36, 7 718, 7 , • 3 7 36, 7 718, 2 3 • 3 7 36, 7 718, , 33 ( • 11
  • 12.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • . 0 - • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 12https://github.com/lowRISC/riscv-llvm
  • 13.
    • .. 13 RISCVTargetMachine::RISCVTargetMachine( const Target&T, // riscv32 const Triple &TT, // riscv32---elf StringRef CPU, // generic-rv32 StringRef FS, // Feature String: +a,+m, … const TargetOptions &Options, // FloatABIType = FloatABI::Default Optional<Reloc::Model> RM, // Static, PIC_, etc. Optional<CodeModel::Model> CM, // Small, Large, Medlow, Medany, Pic CodeGenOpt::Level OL, // -O0 -O1 -O2 -Os -O3 bool JIT) : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options, getEffectiveRelocModel(TT, RM), getEffectiveCodeModel(CM), OL), TLOF(make_unique<TargetLoweringObjectFileELF>()) { initAsmInfo(); }
  • 14.
    F 2 C- 1 MDI • B) E) ) ) C 4 ( DF F • ) A A C: C • B) ) .1 B C A C ) 3F MB8DA 1 EF L • E) ) ) 8 ED C F 8 A CB C • ) ) A CB C D 8 • C ) D C C F : DF F 36 C 8 • 4 ( ) C IF A A CB C D ( 8 14 static std::string computeDataLayout(const Triple &TT) { if (TT.isArch64Bit()) { return "e-m:e-p:64:64-i64:64-i128:128-n64-S128"; } else { assert(TT.isArch32Bit() && "only RV32 and RV64 are currently supported"); return "e-m:e-p:32:32-i64:64-n32-S128"; } }
  • 15.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • . - - 5 0 • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 15https://github.com/lowRISC/riscv-llvm
  • 16.
    + . • • )+ ( . 16 ------------- Classes ----------------- class ALU<bits<5> ALU:opcode = { ?, ?, ?, ?, ? }, string ALU:op = ?> { bits<5> Opcode = { ALU:opcode{4}, ALU:opcode{3}, ALU:opcode{2}, ALU:opcode{1}, ALU:opcode{0} }; string Op = ALU:op; string NAME = ?; } ------------- Defs ----------------- def ADD { // ALU bits<5> Opcode = { 1, 0, 1, 0, 1 }; string Op = "add"; string NAME = ?; } def SUB { // ALU bits<5> Opcode = { 1, 0, 1, 1, 1 }; string Op = "sub"; string NAME = ?; } class ALU<bits<5> opcode, string op> { bits<5> Opcode = opcode; string Op = op; } def ADD : ALU<0b10101, "add">; def SUB : ALU<0b10111, "sub">;
  • 17.
    - / . •B . . / • . . . / - • B • . - • B / • . / - 17 RISCV.td Assembler Disassembler Compiler
  • 18.
    - -. • - 18 letNamespace = "RISCV" in { class RISCVReg<bits<5> Enc, string n, list<string> alt = []> : Register<n> { let HWEncoding{4-0} = Enc; let AltNames = alt; } def ABIRegAltName : RegAltNameIndex; } // Namespace = "RISCV" // Integer registers let RegAltNameIndices = [ABIRegAltName] in { // RegNum RegName ABIName def X0 : RISCVReg<0, "x0", ["zero"]>, DwarfRegNum<[0]>; def X1 : RISCVReg<1, "x1", ["ra"]>, DwarfRegNum<[1]>; def X2 : RISCVReg<2, "x2", ["sp"]>, DwarfRegNum<[2]>; ... def X31 : RISCVReg<31, "x31", ["t6"]>, DwarfRegNum<[31]>; } // GPR: {X0, X1, …, X31} def GPR : RegisterClass< "RISCV", [i32], 32, (add (sequence "X%u", 0, 31))>
  • 19.
    . - 19 // R-type(e.g. add rd, rs1, rs2) I-type, S-type, etc. class RVInstR<bits<7> funct7, bits<3> funct3, RISCVOpcode opcode, dag outs, dag ins, string opcodestr, string argstr> : RVInst<outs, ins, opcodestr, argstr, []> { bits<5> rs2; // bits<5> rs1; bits<5> rd; let Inst{31-25} = funct7; // let Inst{24-20} = rs2; let Inst{19-15} = rs1; let Inst{14-12} = funct3; let Inst{11-7} = rd; let Opcode = opcode.Value; }
  • 20.
    - • . . 20 include"RISCVInstrFormats.td" // Instruction Class Templates class ALU_rr<bits<7> funct7, bits<3> funct3, string opcodestr> : RVInstR<funct7, funct3, OPC_OP, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">; def ADD : ALU_rr<0b0000000, 0b000, "add">; // add rd, rs1, rs2
  • 21.
    .- • $ llvm-tblgen./RISCV.td -I ../../../include/ 21 def ADD { // Instruction RVInst RVInstR ALU_rr field bits<32> Inst = { 0, 0, 0, 0, 0, 0, 0, // funct7 rs2{4}, rs2{3}, rs2{2}, rs2{1}, rs2{0}, // rs2 rs1{4}, rs1{3}, rs1{2}, rs1{1}, rs1{0}, // rs1 0, 0, 0, // funct3 rd{4}, rd{3}, rd{2}, rd{1}, rd{0}, // rd 0, 1, 1, 0, 0, 1, 1 }; // opcode string Namespace = "RISCV"; dag OutOperandList = (outs GPR:$rd); dag InOperandList = (ins GPR:$rs1, GPR:$rs2); string AsmString = "add $rd, $rs1, $rs2"; // AsmParser, InstrPrinter list<dag> Pattern = []; // pattern ... int Size = 4; // 4-byte bit isReturn = 0; // return bit isBranch = 0; // branch bits<7> Opcode = { 0, 1, 1, 0, 0, 1, 1 }; bits<5> rs2 = { ?, ?, ?, ?, ? }; bits<5> rs1 = { ?, ?, ?, ?, ? }; bits<5> rd = { ?, ?, ?, ?, ? }; }
  • 22.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • .. 6 0 6- - • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 22https://github.com/lowRISC/riscv-llvm
  • 23.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • .. 7 - 7 7 8-0 • .. 78 8 . 7 - 77 8 8-0 • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 23https://github.com/lowRISC/riscv-llvm
  • 24.
    & . &. • & • . • add x1, x2, x3 -> MCInst • . & . • . • MCInst -> add x1, x2, x3 • • • [0xb3,0x00,0x31,0x00] -> MCInst • • MCInst -> [0xb3,0x00,0x31,0x00] 24
  • 25.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 332 -2 00 2 3 . • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 25https://github.com/lowRISC/riscv-llvm
  • 26.
    - 3 • 3-3 • 3 3 - 3 • / • 3 3 - 3 • / / • - 3 • - 3 3 • • 3 3 -2 • / • - 3 • • • • 26
  • 27.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • - 1 0 . • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 27https://github.com/lowRISC/riscv-llvm
  • 28.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 00 1 . 1 . 1 - • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 28https://github.com/lowRISC/riscv-llvm
  • 29.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 221 1 2 - 00 - .- 2 2 . • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 29https://github.com/lowRISC/riscv-llvm
  • 30.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 3 -.0. . 1 • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 30https://github.com/lowRISC/riscv-llvm
  • 31.
    (( ) ))- ) • (( ) ) )- ) a e C a • : • : • (( • (( 31 // Callee-save callee: sw s0, 12(sp) ... mv s0, a1 # s0 ... lw s0, 12(sp) // Caller-save caller: sw ra, 12(sp) ... call callee ... lw ra, 12(sp)
  • 32.
    . • . . 32 //x10(a0) x11(a1) int add(int a, int b) { return a + b; // x10(a0) } void caller() { // x10(a0) x11(a1) int result = add(3, 5); } // x10(a0)
  • 33.
    . 33 • . // X10X11 def RetCC_RISCV32 : CallingConv<[CCIfType<[i32], CCAssignToReg<[X10, X11]>>]>; // RISCV 32-bit C Calling convention. def CC_RISCV32 : CallingConv<[ // Promote i1/i8/i16 args to i32 CCIfType<[ i1, i8, i16 ], CCPromoteToType<i32>>, // X10~X17 CCIfType<[i32], CCAssignToReg<[ X10, X11, X12, X13, X14, X15, X16, X17]>>, // size 4 bytes, alignment 4 bytes CCAssignToStack<4, 4> ]>; // Callee-save def CSR : CalleeSavedRegs<(add X1, X3, X4, X8, X9, (sequence "X%u", 18, 27))>;
  • 34.
    34 LLVM IR Map IRinstructions to DAG SelectionDAGBuilder Target Lowering Instruction Selection
  • 35.
    ))- ( : •: • ))- ( : • : : • : : 35 a add b c add
  • 36.
    36 int add(int a,int b) { return a + b; } define i32 @add(i32 signext %a, i32 signext %b) #0 { entry: %add = add nsw i32 %a, %b ret i32 %add } t0: ch = EntryToken t4: i32,ch = CopyFromReg t0, Register:i32 %1 t2: i32,ch = CopyFromReg t0, Register:i32 %0 t5: i32 = add nsw t4, t2 t7: ch,glue = CopyToReg t0, Register:i32 %x10_32, t5 t8: ch = RISCVISD::RET_FLAG t7, Register:i32 %x10_32, t7:1
  • 37.
    37 LLVM IR Map IRinstructions to DAG SelectionDAGBuilder Target Lowering Instruction Selection
  • 38.
    ) 3 -2 -3 • ) 3 - SI T ) 3 - SI • ) 3 - S • ) 3 - • 4 36 2 (- - 2 ) 3 - SI • void setOperationAction( unsigned Op, // S MVT VT, // LegalizeAction Action) // TL Target // I S 38
  • 39.
    3 • 3 • OT • L T • 3 LA T PC L • L • 3 39 setOperationAction(ISD::ADD, MVT::i32, Legal) setOperationAction(ISD::ADD, MVT::i8, Promote) AddPromotedToType(ISD::ADD, MVT::i8, MVT::i32) // P T L shift T PC L E setOperationAction(ISD::MUL, MVT::i32, Expand); setOperationAction(ISD::GlobalAddress, i32, Custom);
  • 40.
    . • . 40 RISCVTargetLowering::RISCVTargetLowering(const TargetMachine&TM, const RISCVSubtarget &STI) : TargetLowering(TM), Subtarget(STI) { // Set up the register classes. addRegisterClass(MVT::i32, &RISCV::GPRRegClass); // 32-bit promote 32-bit // 32-bit 32-bit computeRegisterProperties(STI.getRegisterInfo()); setStackPointerRegisterToSaveRestore(RISCV::X2); // TODO: add all necessary setOperationAction calls. setOperationAction(ISD::MUL, XLenVT, Expand); ... setOperationAction(ISD::GlobalAddress, i32, Custom); ... }
  • 41.
    • • • 41 SDValue LowerFormalArguments(SDValue Chain,CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &DL, SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const override; SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl<ISD::OutputArg> &Outs, const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL, SelectionDAG &DAG) const override; SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl<SDValue> &InVals) const override;
  • 42.
    42 LLVM IR Map IRinstructions to DAG SelectionDAGBuilder Target Lowering Instruction Selection
  • 43.
    • - • - 43 //RISCVInstrInto.td def Pat<(add GPR:$rs1, GPR:$rs2), (ADD GPR:$rs1, GPR:$rs2)>;
  • 44.
    - - -- 44 // RISCVInstrInto.td def Pat<(add GPR:$rs1, simm12:$imm12), (ADDI GPR:$rs1, simm12:$imm12)>;
  • 45.
    . . -. • - 45 void RISCVDAGToDAGISel::Select(SDNode *Node) { // If we have a custom node, we have already selected if (Node->isMachineOpcode()) { DEBUG(dbgs() << "== "; Node->dump(CurDAG); dbgs() << "n"); Node->setNodeId(-1); return; } // C if (Node->getOpcode() == ISD::AND) { ... return; } // A .td pattern SelectCode(Node); } // RISCVInstrInto.td def Pat<(add GPR:$rs1, GPR:$rs2), (ADD GPR:$rs1, GPR:$rs2)>;
  • 46.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • - 44 1 0 - 4 . • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 46https://github.com/lowRISC/riscv-llvm
  • 47.
    • 2 3 -- 47 // 3 12-bit sign-extension def LO12Sext : SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(SignExtend64<12>(N->getZExtValue()), SDLoc(N), N->getValueType(0)); }]>; // 32-bit 20-bit 11 1 1 def HI20 : SDNodeXForm<imm, [{ return CurDAG->getTargetConstant(((N->getZExtValue()+0x800) >> 12) & 0xfffff, SDLoc(N), N->getValueType(0)); }]>; def simm32 : ImmLeaf<XLenVT, [{return isInt<32>(Imm);}]>; // simm12 -> addi rd, x0, simm12 def : Pat<(simm12:$imm), (ADDI X0, simm12:$imm)>; // simm32 -> lui rd, uimm20 + addi rd, rd, simm12 def : Pat<(simm32:$imm), (ADDI (LUI (HI20 imm:$imm)), (LO12Sext imm:$imm))>; # 0xabcd5566 a0, simm32 = (uimm20 << 12) + simm12 lui a0, 0xabcd5 # a0 = 0xabcd5 addi a0, a0, 0x566 # a0 = 0xabcd5566
  • 48.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • - 1 5 0 0 15 . • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 48https://github.com/lowRISC/riscv-llvm
  • 49.
    49 def : Pat<(load(add GPR:$rs1, simm12:$imm12)), (LW GPR:$rs1, simm12:$imm12)>; LW rd, rs, simm12
  • 50.
    50 /// Loads multiclass LdPat<PatFragLoadOp, RVInst Inst> { def : Pat<(LoadOp GPR:$rs1), (Inst GPR:$rs1, 0)>; def : Pat<(LoadOp (add GPR:$rs1, simm12:$imm12)), (Inst GPR:$rs1, simm12:$imm12)>; } defm : LdPat<sextloadi8, LB>; defm : LdPat<extloadi8, LB>; defm : LdPat<sextloadi16, LH>; defm : LdPat<extloadi16, LH>; defm : LdPat<load, LW>; defm : LdPat<zextloadi8, LBU>; defm : LdPat<zextloadi16, LHU>; /// Stores multiclass StPat<PatFrag StoreOp, RVInst Inst> { def : Pat<(StoreOp GPR:$rs2, GPR:$rs1), (Inst GPR:$rs2, GPR:$rs1, 0)>; def : Pat<(StoreOp GPR:$rs2, (add GPR:$rs1, simm12:$imm12)), (Inst GPR:$rs2, GPR:$rs1, simm12:$imm12)>; } defm : StPat<truncstorei8, SB>; defm : StPat<truncstorei16, SH>; defm : StPat<store, SW>;
  • 51.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • . 6 - 6 6 6 0 .1 • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 51https://github.com/lowRISC/riscv-llvm
  • 52.
    : 52 @G = globali32 0 define i32 @lw_global(i32 %a) { %1 = load volatile i32, i32* @G ret i32 %1 } lui a0, %hi(G) addi a0, a0, %lo(G) lw a0, 0(a0)
  • 53.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • . - 070 1 7 • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 53https://github.com/lowRISC/riscv-llvm
  • 54.
    54 define void @condbr(i32%a, i32 %b, i32 *%c) { %tst = icmp ne i32 %a, %b br i1 %tst, label %end, label %equal equal: store i32 1, i32* %c br label %end end: ret void } def : Pat<(brcond (i32 (setne GPR:$rs1, GPR:$rs2)), bb:$imm12) (BEQ GPR:$rs1, GPR:$rs2, simm13_lsb0:$imm12)>; BEQ rs1, rs2, simm13_lsb0
  • 55.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 00 1 1 . . -- 0 • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 55https://github.com/lowRISC/riscv-llvm
  • 56.
  • 57.
    57 let isCall =1, Defs=[X1] in def PseudoCALL : Pseudo<(outs), (ins GPR:$rs1), [(Call GPR:$rs1)]>, PseudoInstExpansion<(JALR X1, GPR:$rs1, 0)>; lui a0, %hi(external_function) addi a3, a0, %lo(external_function) // a0~a7 addi a0, zero, 1 addi a1, zero, 2 addi a2, zero, 3 // / jalr ra, a3, 0 declare i32 @external_function(i32, i32, i32) define i32 @test_call_external() nounwind { %1 = call i32 @external_function(i32 1, i32 2, i32 3) ret i32 %1 } JALR rd, rs1, simm12 • target address: rs1 + simm12 • rd = pc + 4
  • 58.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • . . 9 . 0 9-1 • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 58https://github.com/lowRISC/riscv-llvm
  • 59.
    59 : define i32 @bare_select(i1%a, i32 %b, i32 %c) { %1 = select i1 %a, i32 %b, i32 %c ret i32 %1 } bare_select: # %bb.0: andi a0, a0, 1 addi a3, zero, 0 bne a0, a3, .LBB0_2 # %bb.1: addi a1, a2, 0 .LBB0_2: addi a0, a1, 0 jalr zero, ra, 0
  • 60.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 02 02 2- 0 - -0 . • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 60https://github.com/lowRISC/riscv-llvm
  • 61.
    29 I • 3L I 9D 3 4 7 9E I 9 • 3 4 7 3 F EAI AI L 9E AI L AE A C 9 IAE 9 • 3 4 7 3 4 7 -0. AE I 9 • 3 4 7 I 9 E 9 • 3 4 7 9IA 3 4 7 EI .F D9 I EI E F 3 AI 9 • 3 4 7 9 FE I 3 4 7 1 59 I 9 • 3 4 7 9IA 3 4 7 ID29 I 9 • 3 4 7 3 4 7 EI 2 AE 9E 9IA 1 9II D C 9 • 3 4 7 I F F 9CC 37 AEI AFEI 9 • 3 4 7 I F F AI9II D C 9 • 3 4 7 FDDFE A I 9E CF 9 AFEI 9 • 3 4 7 I F F 9 8CC 8 I 8 I 9 • 3 4 7 EA A9C F E I F F 06 F 9 AFEI 9 • 3 4 7 F E I F F D9 A9CAPAE FEI 9E I 9 • 3 4 7 F E I F F D DF F 9 AFEI 9 • 3 4 7 F E I F F D DF F 9 AFEI FE CF 9 9 • 3 4 7 F E F FE A AFE9C 9E I 9 • 3 4 7 4 F F E AFE 9CCI 9 • 3 4 7 D C D E CFM AE F 4 4-0- 5 9 • 3 4 7 4 F 9E I I F 9 L9 A F 9 A AFE9C 9 • 1 0 . - - .2 • 3 4 7 4 F CFM AE . 9D E 9 • 3 4 7 D C D E FCF 9E ACF AEI AFE 9 • 3 4 7 CCFM CFM AE F E9DA 8I 9 9CCF I 9 I9L 9 • 3 4 7 I FD 83 4 7 9CCAE FEL E AFE 9E AD 9 • 3 4 7 4 F F L9 9 I 9 • 3 4 7 4 F I 9 9D I 9E F I I F A I 9 • 3 4 7 9IA I F F AECAE 9ID FEI 9AE I 9 • 3 4 7 I F F CCLD 9D 9 II E9 9 • 3 4 7 D C D E 9E 9E9C IAI 9 61https://github.com/lowRISC/riscv-llvm addi a1, zero, 0 sub a0, a1, a0 sub a0, zero, a0
  • 62.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 2 2 . 0 - • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 62https://github.com/lowRISC/riscv-llvm
  • 63.
    63 // Replace FrameIndexwith Offset void RISCVRegisterInfo::eliminateFrameIndex // Calculate Offset by FrameIndex int RISCVFrameLowering::getFrameIndexReference OffsetHigh Address Low Address fp/s0 sp ra s0/fp s1 s2 s3 . . . FrameIndex 0 1 2 3 4 sp + 12 sp + 16 sp + 20 sp + 24 sp + 28
  • 64.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 03 0 3 2 2 3. 2 . .2 3 - • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 64https://github.com/lowRISC/riscv-llvm
  • 65.
    0 / 0/ ) -/ • / • I • ( - ( // • • P ( // - E ( • I • -/ • ( ( // - P E • • • 65 func: // Prologue addi sp, sp, -32 sw ra, 28(sp) sw s0/fp, 24(sp) sw s1, 20(sp) sw s2, 16(sp) sw s3, 12(sp) addi s0/fp, sp, 32 ... // callee-save // register ... // Epilog lw s3, 12(sp) lw s2, 16(sp) lw s1, 20(sp) lw s0/fp, 24(sp) lw ra, 28(sp) addi sp, sp, 32 ret
  • 66.
    . . • . 66 voidRISCVFrameLowering::emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const { ... uint64_t StackSize = MFI.getStackSize(); ... // addi sp, sp, -StackSize adjustReg(MBB, MBBI, DL, SPReg, SPReg, -StackSize, MachineInstr::FrameSetup); ... // addi fp, sp, StackSize adjustReg(MBB, MBBI, DL, FPReg, SPReg, StackSize, MachineInstr::FrameSetup); } void RISCVFrameLowering::emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const { ... uint64_t StackSize = MFI.getStackSize(); ... // Deallocate stack: addi sp, sp, StackSize adjustReg(MBB, MBBI, DL, SPReg, SPReg, StackSize, MachineInstr::FrameDestroy); }
  • 67.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • - . 4 2 2 - 0 • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 67https://github.com/lowRISC/riscv-llvm
  • 68.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 2 0 . - 0 025 5 • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 68https://github.com/lowRISC/riscv-llvm
  • 69.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 2..- - 0 . • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 69https://github.com/lowRISC/riscv-llvm
  • 70.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 7 . 2-7 3 ..7- 7 0 7 • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 70https://github.com/lowRISC/riscv-llvm
  • 71.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 0 8 . 0 0 - 2 8 0 8 8 • 4 5 8 L I M AI FFO A LL M M C • 4 5 8 F M C FRLDL M C 71https://github.com/lowRISC/riscv-llvm
  • 72.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 2 -2 0 - 0 . • 4 5 8 F M C FRLDL M C 72https://github.com/lowRISC/riscv-llvm
  • 73.
    3 M CLM • 4 O M LM 4 5 8 C L M C • 4 5 8 4 I DL DL O DL O D M D F LD M C • 4 5 8 4 5 8 -0. AD L M C • 4 5 8 LM E M C • 4 5 8 LD 4 5 8 LM .I ML LM AI 4 DLM M C • 4 5 8 I L 4 5 8 1 6 M L M C • 4 5 8 LD 4 5 8 L 3 L M C • 4 5 8 4 5 8 LM3 D M LD 1 LL F M M C • 4 5 8 L I M AI FF 48 D LM MDI L M C • 4 5 8 L I M AI DL LL FR M C • 4 5 8 I I AD L FI MDI L M C • 4 5 8 L I M MI M FF M LM C EL R M C • 4 5 8 DMD F I L I M AI 07 I MDI L M C • 4 5 8 I L I M AI M D FDSD I LM ML M C • 4 5 8 I L I M AI I R I MDI L M C • 4 5 8 I L I M AI I R I MDI L I FI M C • 4 5 8 I AI I DMDI F C L M C • 4 5 8 5 I M AI A MDI FFL M C • 4 5 8 F M FIP D IA 5 5-0- 6 M C • 4 5 8 5 I M M LML AI O D MR IA DMDI F M C • 4 5 8 7L DLM 9 -42 AI I LM M M C • 4 5 8 5 I M FIP D . M C • 4 5 8 F M IFI DFI D L MDI M C • 4 5 8 FFIP FIP D IA R D LM E FFI LM EL O M C • 4 5 8 LMI 4 5 8 FFD I O MDI D M C • 4 5 8 5 I M AI O L M C • 4 5 8 5 I M LM E A L IAAL ML MI DML M C • 4 5 8 LD L I M AI D FD L I LM D ML M C • 4 5 8 L I M AI FFO A LL M M C • .0- . 3 - 0 3 73https://github.com/lowRISC/riscv-llvm
  • 74.
    : . • : •: . : • : / . • : / : -: : • 74