Skip to content

Commit

Permalink
Merge branch 'main' into dev/kbroch/fix-schema-typos
Browse files Browse the repository at this point in the history
  • Loading branch information
dhower-qc authored Nov 13, 2024
2 parents f170816 + 5f96554 commit e151647
Show file tree
Hide file tree
Showing 47 changed files with 1,916 additions and 0 deletions.
6 changes: 6 additions & 0 deletions arch/ext/C.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
C:
type: unprivileged
long_name: Compressed instructions
company:
name: RISC-V International
url: https://riscv.org
doc_license:
name: Creative Commons Attribution 4.0 International License
url: https://creativecommons.org/licenses/by/4.0/
versions:
- version: "2.2.0"
state: ratified
Expand Down
36 changes: 36 additions & 0 deletions arch/inst/C/c.add.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# yaml-language-server: $schema=../../../schemas/inst_schema.json

c.add:
long_name: Add
description: |
Add the value in rs2 to rd, and store the result in rd.
C.ADD expands into `add rd, rd, rs2`.
definedBy:
anyOf:
- C
- Zca
assembly: xd, rs2
encoding:
match: 1001----------10
variables:
- name: rs2
location: 6-2
- name: rd
location: 11-7
access:
s: always
u: always
vs: always
vu: always
operation(): |
XReg t0 = X[rd];
XReg t1 = X[rs2];
X[rd] = t0 + t1;
sail(): |
{
let rs1_val = X(rd);
let rs2_val = X(rs2);
X(rd) = rs1_val + rs2_val;
RETIRE_SUCCESS
}
35 changes: 35 additions & 0 deletions arch/inst/C/c.addi.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# yaml-language-server: $schema=../../../schemas/inst_schema.json

c.addi:
long_name: Add a sign-extended non-zero immediate
description: |
C.ADDI adds the non-zero sign-extended 6-bit immediate to the value in register rd then writes the result to rd.
C.ADDI expands into `addi rd, rd, imm`.
C.ADDI is only valid when rd≠x0 and imm≠0.
The code points with rd=x0 encode the C.NOP instruction; the remaining code points with imm=0 encode HINTs.
definedBy:
anyOf:
- C
- Zca
assembly: xd, imm
encoding:
match: 000-----------01
variables:
- name: imm
location: 12|6-2
not: 0
- name: rd
location: 11-7
not: 0
access:
s: always
u: always
vs: always
vu: always
operation(): |
if (implemented?(ExtensionName::C) && (CSR[misa].C == 1'b0)) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
X[rd] = X[rd] + imm;
33 changes: 33 additions & 0 deletions arch/inst/C/c.addi16sp.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# yaml-language-server: $schema=../../../schemas/inst_schema.json

c.addi16sp:
long_name: Add a sign-extended non-zero immediate
description: |
C.ADDI16SP adds the non-zero sign-extended 6-bit immediate to the value in the stack pointer (sp=x2), where the immediate is scaled to represent multiples of 16 in the range (-512,496).
C.ADDI16SP is used to adjust the stack pointer in procedure prologues and epilogues.
It expands into `addi x2, x2, nzimm[9:4]`.
C.ADDI16SP is only valid when nzimm≠0; the code point with nzimm=0 is reserved.
definedBy:
anyOf:
- C
- Zca
assembly: imm
encoding:
match: 011-00010-----01
variables:
- name: imm
location: 12|4-3|5|2|6
left_shift: 4
not: 0
access:
s: always
u: always
vs: always
vu: always
operation(): |
if (implemented?(ExtensionName::C) && (CSR[misa].C == 1'b0)) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
X[2] = X[2] + imm;
35 changes: 35 additions & 0 deletions arch/inst/C/c.addi4spn.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# yaml-language-server: $schema=../../../schemas/inst_schema.json

c.addi4spn:
long_name: Add a zero-extended non-zero immediate, scaled by 4, to the stack pointer
description: |
Adds a zero-extended non-zero immediate, scaled by 4, to the stack pointer, x2, and writes the result to rd′.
This instruction is used to generate pointers to stack-allocated variables.
It expands to `addi rd′, x2, nzuimm[9:2]`.
C.ADDI4SPN is only valid when nzuimm≠0; the code points with nzuimm=0 are reserved.
definedBy:
anyOf:
- C
- Zca
assembly: xd, imm
encoding:
match: 000-----------00
variables:
- name: imm
location: 10-7|12-11|5|6
left_shift: 2
not: 0
- name: rd
location: 4-2
access:
s: always
u: always
vs: always
vu: always
operation(): |
if (implemented?(ExtensionName::C) && (CSR[misa].C == 1'b0)) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
X[rd+8] = X[2] + imm;
35 changes: 35 additions & 0 deletions arch/inst/C/c.addiw.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# yaml-language-server: $schema=../../../schemas/inst_schema.json

c.addiw:
long_name: Add a sign-extended non-zero immediate
description: |
C.ADDIW is an RV64C/RV128C-only instruction that performs the same computation as C.ADDI but produces a 32-bit result, then sign-extends result to 64 bits.
C.ADDIW expands into `addiw rd, rd, imm`.
The immediate can be zero for C.ADDIW, where this corresponds to `sext.w rd`.
C.ADDIW is only valid when rd≠x0; the code points with rd=x0 are reserved.
definedBy:
anyOf:
- C
- Zca
base: 64
assembly: xd, imm
encoding:
match: 001-----------01
variables:
- name: imm
location: 12|6-2
- name: rd
location: 11-7
not: 0
access:
s: always
u: always
vs: always
vu: always
operation(): |
if (implemented?(ExtensionName::C) && (CSR[misa].C == 1'b0)) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
X[rd] = sext((X[rd] + imm), 32);
45 changes: 45 additions & 0 deletions arch/inst/C/c.addw.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# yaml-language-server: $schema=../../../schemas/inst_schema.json

c.addw:
long_name: Add word
description: |
Add the 32-bit values in rs2 from rd, and store the result in rd.
The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
C.ADDW expands into `addw rd, rd, rs2`.
definedBy:
anyOf:
- C
- Zca
base: 64
assembly: xd, rs2
encoding:
match: 100111---01---01
variables:
- name: rs2
location: 4-2
- name: rd
location: 9-7
access:
s: always
u: always
vs: always
vu: always
operation(): |
Bits<32> t0 = X[rd+8][31:0];
Bits<32> t1 = X[rs2+8][31:0];
X[rd+8] = sext(t0 + t1, 31);
sail(): |
{
let rs1_val = (X(rd+8))[31..0];
let rs2_val = (X(rs2+8))[31..0];
let result : bits(32) = match op {
RISCV_ADDW => rs1_val + rs2_val,
RISCV_SUBW => rs1_val - rs2_val,
RISCV_SLLW => rs1_val << (rs2_val[4..0]),
RISCV_SRLW => rs1_val >> (rs2_val[4..0]),
RISCV_SRAW => shift_right_arith32(rs1_val, rs2_val[4..0])
};
X(rd+8) = sign_extend(result);
RETIRE_SUCCESS
}
55 changes: 55 additions & 0 deletions arch/inst/C/c.and.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# yaml-language-server: $schema=../../../schemas/inst_schema.json

c.and:
long_name: And
description: |
And rd with rs2, and store the result in rd
The rd and rs2 register indexes should be used as rd+8 and rs2+8 (registers x8-x15).
C.AND expands into `and rd, rd, rs2`.
definedBy:
anyOf:
- C
- Zca
assembly: xd, rs2
encoding:
match: 100011---11---01
variables:
- name: rs2
location: 4-2
- name: rd
location: 9-7
access:
s: always
u: always
vs: always
vu: always
operation(): |
XReg t0 = X[rd+8];
XReg t1 = X[rs2+8];
X[rd+8] = t0 & t1;
sail(): |
{
let rs1_val = X(rd+8);
let rs2_val = X(rs2+8);
let result : xlenbits = match op {
RISCV_ADD => rs1_val + rs2_val,
RISCV_SLT => zero_extend(bool_to_bits(rs1_val <_s rs2_val)),
RISCV_SLTU => zero_extend(bool_to_bits(rs1_val <_u rs2_val)),
RISCV_AND => rs1_val & rs2_val,
RISCV_OR => rs1_val | rs2_val,
RISCV_XOR => rs1_val ^ rs2_val,
RISCV_SLL => if sizeof(xlen) == 32
then rs1_val << (rs2_val[4..0])
else rs1_val << (rs2_val[5..0]),
RISCV_SRL => if sizeof(xlen) == 32
then rs1_val >> (rs2_val[4..0])
else rs1_val >> (rs2_val[5..0]),
RISCV_SUB => rs1_val - rs2_val,
RISCV_SRA => if sizeof(xlen) == 32
then shift_right_arith32(rs1_val, rs2_val[4..0])
else shift_right_arith64(rs1_val, rs2_val[5..0])
};
X(rd+8) = result;
RETIRE_SUCCESS
}
44 changes: 44 additions & 0 deletions arch/inst/C/c.andi.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# yaml-language-server: $schema=../../../schemas/inst_schema.json

c.andi:
long_name: And immediate
description: |
And an immediate to the value in rd, and store the result in rd.
The rd register index should be used as rd+8 (registers x8-x15).
C.ANDI expands into `andi rd, rd, imm`.
definedBy:
anyOf:
- C
- Zca
assembly: xd, imm
encoding:
match: 100-10--------01
variables:
- name: imm
location: 12|6-2
- name: rd
location: 9-7
access:
s: always
u: always
vs: always
vu: always
operation(): |
# shamt is between 0-63
X[rd+8] = X[rd+8] & imm;
sail(): |
{
let rd_val = X(rd+8);
let immext : xlenbits = sign_extend(imm);
let result : xlenbits = match op {
RISCV_ADDI => rd_val + immext,
RISCV_SLTI => zero_extend(bool_to_bits(rd_val <_s immext)),
RISCV_SLTIU => zero_extend(bool_to_bits(rd_val <_u immext)),
RISCV_ANDI => rd_val & immext,
RISCV_ORI => rd_val | immext,
RISCV_XORI => rd_val ^ immext
};
X(rd+8) = result;
RETIRE_SUCCESS
}
Loading

0 comments on commit e151647

Please sign in to comment.