Slide 71
Slide 71 text
C言語側から
Dot Product Acceleratorを制御する
71
#define CUSTOMX(X, rd, rs1, rs2, funct) ¥
CUSTOMX_OPCODE(X) | ¥
(rd << (7)) | ¥
(0x7 << (7+5)) | ¥
(rs1 << (7+5+3)) | ¥
(rs2 << (7+5+3+5)) | ¥
(EXTRACT(funct, 7, 0) << (7+5+3+5+5))
// Standard macro that passes rd, rs1, and rs2 via registers
#define ROCC_INSTRUCTION(X, rd, rs1, rs2, funct) ¥
ROCC_INSTRUCTION_R_R_R(X, rd, rs1, rs2, funct, 10, 11, 12)
// rd, rs1, and rs2 are data
// rd_n, rs_1, and rs2_n are the register numbers to use
#define ROCC_INSTRUCTION_R_R_R(X, rd, rs1, rs2, funct, rd_n, rs1_n, rs2_n)
{ ¥
register uint64_t rd_ asm ("x" # rd_n); ¥
register uint64_t rs1_ asm ("x" # rs1_n) = (uint64_t) rs1; ¥
register uint64_t rs2_ asm ("x" # rs2_n) = (uint64_t) rs2; ¥
asm volatile ( ¥
".word " STR(CUSTOMX(X, rd_n, rs1_n, rs2_n, funct)) "¥n¥t" ¥
: "=r" (rd_) ¥
: [_rs1] "r" (rs1_), [_rs2] "r" (rs2_)); ¥
rd = rd_; ¥
}