操作数与参数
RegDst- Reg5 destination or discard
SrcL- left Reg5 source
SrcR- right Reg5 source
SrcRType- right-source transformation selector
shamt- post-transformation logical-left-shift amount
ADD applies the selected right-source transformation before its encoded logical left shift, performs fixed-width addition, and publishes the PTO_XLEN result.
PTO-SCALAR-ADDadd SrcL, SrcR<{.sw,.uw,.neg}><<<shamt>, ->{t, u, Rd}| 字段 | 位宽 | 有符号性 | 架构角色 | 编码零 |
|---|---|---|---|---|
RegDst | 5 | encoding-defined | Reg5 destination or discard | Encoded zero discards the result. |
SrcL | 5 | encoding-defined | left Reg5 source | Encoded zero reads the architectural zero GPR. |
SrcR | 5 | encoding-defined | right Reg5 source | Encoded zero reads the architectural zero GPR. |
SrcRType | 2 | encoding-defined | right-source transformation selector | Encoded zero selects .sw and sign-extends SrcR[31:0]. |
shamt | 5 | encoding-defined | post-transformation logical-left-shift amount | Encoded zero performs no shift. |
Loading WaveDrom diagram… The encoding table and WaveJSON remain available below.
| Decoded item | Bit range | Value |
|---|---|---|
| shamt | 31:27 | variable |
| SrcRType | 26:25 | variable |
| SrcR | 24:20 | variable |
| SrcL | 19:15 | variable |
| Constant | 14:12 | 3'b000 |
| RegDst | 11:7 | variable |
| Constant | 6:0 | 7'b0000101 |
{
"reg": [
{
"bits": 7,
"name": "7'b0000101"
},
{
"bits": 5,
"name": "RegDst"
},
{
"bits": 3,
"name": "3'b000"
},
{
"bits": 5,
"name": "SrcL"
},
{
"bits": 5,
"name": "SrcR"
},
{
"bits": 2,
"name": "SrcRType"
},
{
"bits": 5,
"name": "shamt"
}
],
"config": {
"bits": 32,
"fontsize": 13,
"hspace": 900,
"lanes": 1,
"offset": 0
}
}add SrcL, SrcR<{.sw,.uw,.neg}><<<shamt>, ->{t, u, Rd}
RegDstSrcLSrcRSrcRTypeshamt下面是该指令所有者中的 Operation;页面没有重写这段行为。
readonly func InstructionContractOperation_ADD() => ScalarOperationbegin return ScalarOperation_ADD;end;readonly func InstructionContractHandler_ADD() => ScalarSemanticHandlerbegin return ScalarHandler_ScalarBinary;end;
pure func InstructionContractRightModifier_ADD(encoded: bits(2)) => ScalarRightModifierbegin case encoded of when '00' => return ScalarRight_SignedWord; when '01' => return ScalarRight_UnsignedWord; when '10' => return ScalarRight_NegateOrNot; when '11' => return ScalarRight_None; end;end;
pure func InstructionContractPreparedRight_ADD( right: Word, encoded_modifier: bits(2), shift_amount: integer {0..31}) => Wordbegin let modifier = InstructionContractRightModifier_ADD(encoded_modifier); let transformed = ApplyScalarRightModifier(right, modifier, FALSE); let shifted = LSL(transformed, shift_amount); return shifted;end;
pure func InstructionContractResult_ADD( left: Word, right: Word, encoded_modifier: bits(2), shift_amount: integer {0..31}) => Wordbegin let prepared_right = InstructionContractPreparedRight_ADD( right, encoded_modifier, shift_amount); return ScalarBinary(ScalarBinary_ADD, left, prepared_right);end;
pure func InstructionContractIsLogicalFamily_ADD() => booleanbegin return FALSE;end;
pure func InstructionContractIsWordOperation_ADD() => booleanbegin return FALSE;end;// PTO-INSTRUCTION: {"assembly":["add SrcL, SrcR<{.sw,.uw,.neg}><<<shamt>, ->{t, u, Rd}"],"block":[],"catalog_indices":[2],"catalog_records":[{"asm":"add SrcL, SrcR<{.sw,.uw,.neg}><<<shamt>, ->{t, u, Rd}","constraints":[],"encoding":[{"index":0,"mask":"0x0000707f","match":"0x00000005","width_bits":32}],"encoding_kind":"L32","fields":[{"name":"RegDst","pieces":[{"instruction_lsb":7,"value_lsb":0,"width":5}],"signedness":"encoding-defined","width":5},{"name":"SrcL","pieces":[{"instruction_lsb":15,"value_lsb":0,"width":5}],"signedness":"encoding-defined","width":5},{"name":"SrcR","pieces":[{"instruction_lsb":20,"value_lsb":0,"width":5}],"signedness":"encoding-defined","width":5},{"name":"SrcRType","pieces":[{"instruction_lsb":25,"value_lsb":0,"width":2}],"signedness":"encoding-defined","width":2},{"name":"shamt","pieces":[{"instruction_lsb":27,"value_lsb":0,"width":5}],"signedness":"encoding-defined","width":5}],"form_id":"add_32_d04202886d0a","length_bits":32,"mnemonic":"ADD","semantic_family":"ALU","semantic_group":"ALU","semantic_handler":"ScalarBinary","semantic_summary":"ADD applies the selected right-source transformation before its encoded logical left shift, performs fixed-width addition, and publishes the PTO_XLEN result.","status":"accepted"}],"classification":["alu"],"contract":{"block_composition":["none"],"canonical_assembly":["add SrcL, SrcR<{.sw,.uw,.neg}><<<shamt>, ->{t, u, Rd}"],"defaults":["SrcL, SrcR, SrcRType, shamt, and RegDst are required encoded fields; no field can be omitted.","SrcRType=00 selects .sw, SrcRType=01 selects .uw, SrcRType=10 selects .neg, and SrcRType=11 selects no modifier. An omitted assembly suffix encodes SrcRType=11.","Encoded shamt zero performs no shift; every value from 0 through 31 is assigned."],"encoding_class":"standalone-encoded","examples":["add a0, a1, ->a2","add t#1, u#1.neg<<1, ->u","add zero, a0.sw, ->zero"],"exceptions":["ADD raises no arithmetic exception; negation, shifting, and addition wrap modulo 2^PTO_XLEN.","A fixed-bit mismatch or unavailable selected T/U source raises Fault_IllegalInstruction before the destination effect and before TPC advances."],"field_contracts":{},"field_zero_meanings":{"RegDst":"Encoded zero discards the result.","SrcL":"Encoded zero reads the architectural zero GPR.","SrcR":"Encoded zero reads the architectural zero GPR.","SrcRType":"Encoded zero selects .sw and sign-extends SrcR[31:0].","shamt":"Encoded zero performs no shift."},"legality":["SrcL and SrcR codes 0..23 select absolute GPRs, 24..27 select T#1..T#4, and 28..31 select U#1..U#4 without consumption.","RegDst codes 0 and 24..29 discard, code 30 pushes U, code 31 pushes T, and codes 1..23 write GPRs.","All four SrcRType encodings are assigned. The logical family uses .not while the arithmetic family uses .neg; ADD uses .neg.","Every five-bit shamt value from 0 through 31 is legal."],"memory_effects":["none"],"operands":[{"field":"RegDst","role":"Reg5 destination or discard"},{"field":"SrcL","role":"left Reg5 source"},{"field":"SrcR","role":"right Reg5 source"},{"field":"SrcRType","role":"right-source transformation selector"},{"field":"shamt","role":"post-transformation logical-left-shift amount"}],"ordering":["Snapshot both sources before the destination effect so duplicate sources, destination aliases, and queue publication use pre-instruction values.","Publish the result, then advance TPC by four bytes."],"standalone_opcode":true,"state_effects":["Transform SrcR, perform the logical left shift, and add the shifted value to SrcL modulo 2^PTO_XLEN.","Apply the selected SrcRType transformation before the logical left shift. The transformation and shift affect SrcR only; SrcL is unchanged before the final operation.","Destination codes 0 and 24..29 discard, code 30 pushes U, code 31 pushes T, and codes 1..23 write GPRs; source queues are non-consuming.","No memory, reservation, descriptor, numeric-flag, trap, block, privilege, or control-flow state changes except the successful TPC advance."]},"depends_on":["PTO-BLOCK-MODEL-SCHEMA-PROFILE-ENCODING"],"id":"PTO-SCALAR-ADD","mnemonic":"ADD","summary":"ADD applies the selected right-source transformation before its encoded logical left shift, performs fixed-width addition, and publishes the PTO_XLEN result.","surface":"scalar"}// PTO-REVIEW: {"review_method":"formal-definition-read","outcome":"FORMAL-COMPLETE","reviewed_fields":["assembly","encoding","defaults","operation","state","memory","ordering","faults","reserved"]}// NDF-BEGIN: PTO-ADD-DECISION-BINDING-001// ndf: kind=contract level=L1 layer=scalar status=accepted// ADD MUST implement the mnemonic-local canonical assembly, encoded// legality, defaults, state and memory effects, ordering, and fault boundaries// declared in this owner. The operation region below is the executable binding// for every accepted decision that names this mnemonic.// NDF-END: PTO-ADD-DECISION-BINDING-001// DOC-BEGIN: decodereadonly func InstructionContractOperation_ADD() => ScalarOperationbegin return ScalarOperation_ADD;end;// DOC-END: decode// DOC-BEGIN: operationreadonly func InstructionContractHandler_ADD() => ScalarSemanticHandlerbegin return ScalarHandler_ScalarBinary;end;
pure func InstructionContractRightModifier_ADD(encoded: bits(2)) => ScalarRightModifierbegin case encoded of when '00' => return ScalarRight_SignedWord; when '01' => return ScalarRight_UnsignedWord; when '10' => return ScalarRight_NegateOrNot; when '11' => return ScalarRight_None; end;end;
pure func InstructionContractPreparedRight_ADD( right: Word, encoded_modifier: bits(2), shift_amount: integer {0..31}) => Wordbegin let modifier = InstructionContractRightModifier_ADD(encoded_modifier); let transformed = ApplyScalarRightModifier(right, modifier, FALSE); let shifted = LSL(transformed, shift_amount); return shifted;end;
pure func InstructionContractResult_ADD( left: Word, right: Word, encoded_modifier: bits(2), shift_amount: integer {0..31}) => Wordbegin let prepared_right = InstructionContractPreparedRight_ADD( right, encoded_modifier, shift_amount); return ScalarBinary(ScalarBinary_ADD, left, prepared_right);end;
pure func InstructionContractIsLogicalFamily_ADD() => booleanbegin return FALSE;end;
pure func InstructionContractIsWordOperation_ADD() => booleanbegin return FALSE;end;// DOC-END: operation
ADD 是一条独立编码的 32 位标量指令。它先准备右源,再将其与不变的左源按 2^PTO_XLEN 取模相加,并发布一个 XLEN 结果。
指令先对 SrcR 应用 SrcRType 选定的变换,再对变换后的值执行编码指定的逻辑左移,最后才把准备好的右值加到 SrcL 上。
SrcRType=00 选择有符号字扩展,01 选择无符号字扩展,10 在 ADD 中选择取负,11 保持完整右源不变。shamt 是 0 至 31 的逻辑左移量;0 表示不移动变换后的值。取负、移位和加法都是定宽操作。它们按 2^PTO_XLEN 取模回绕,不会引发算术异常。
SrcL 和 SrcR 使用完整 Reg5 源域:0..23 选择 GPR,24..27 选择 T#1..T#4,28..31 选择 U#1..U#4;读取临时源不会消费队列项。RegDst 的 1..23 写入 GPR,30 压入 U,31 压入 T,0 和 24..29 丢弃结果。页面显示的每个字段都有编码。汇编中省略修饰符表示 SrcRType=11;编码 shamt=0 表示不移位,而不是省略该操作。
两个源都会在目的效果发生前完成快照,因此目的别名或队列压入不会改变同一条指令所消费的任一值。
结果计算完成后,ADD 按 RegDst 发布或丢弃结果,然后让 TPC 前进 4 字节。
ADD 不读写内存,也不改变保留状态、描述符、数值状态、陷阱、指令束、特权、谓词或控制流状态;唯一例外是成功时 TPC 前进。
四个 SrcRType 值和全部 32 个移位量均已分配。固定编码位不匹配,或者选中的 T/U 源尚不可用,会在目的发布和 TPC 前进之前引发 Fault_IllegalInstruction。
下面的演示只帮助理解当前所有者,并不替代上面的规范操作。
当 SrcL=10、SrcR=3、SrcRType=10、shamt=1 时,ADD 先对右源取负,再左移一次,最后按 2^PTO_XLEN 取模计算 10 + (-6) = 4。即使目的位置与左侧 GPR 重叠,计算仍使用原始值 10。
正文来自 owning ASL。拖拽或按钮只临时改变当前页面显示顺序。
ADD MUST implement the mnemonic-local canonical assembly, encoded legality, defaults, state and memory effects, ordering, and fault boundaries declared in this owner. The operation region below is the executable binding for every accepted decision that names this mnemonic.
PTO-ADD-DECISION-BINDING-001asl/scalar/alu/ADD.asl0bf721f111c251ee1a40a9fec927b190803e7ad67908e7957b26d28c567388aa093626128eac8c6ad0bb6a5cfe4c75a2b2cc63ba2cb6b1b9730d7e0b3994214b12 matching entries
PTO-AVS-SCALAR-ADD-ALIASES-001tests/asl/scalar/alu/ADD/scalar-bound-add-aliases-001.asl890100b94f221f517ca831ed6f078cdfb5a9e011fae4145b50cb7252759bba66PTO-AVS-SCALAR-ADD-DECODE-001tests/asl/scalar/alu/ADD/scalar-decode-add-canonical-001.asla33b77a44d8d2718bce72664a128cd913f70b3aa2a45642ba2bd988d1c094772PTO-AVS-SCALAR-ADD-EXECUTION-001tests/asl/scalar/alu/ADD/scalar-exec-add-integer-001.asl92cd919b3d0cec4cb38bb48624ae9cf5273091e0182b94a7c402472febea5151PTO-AVS-SCALAR-ADD-MODIFIER-001tests/asl/scalar/alu/ADD/scalar-exec-add-modifier-001.asl7646f52c9e2b15d4334480f99097dd38a422386b2a2aa1e3de66686d7632af6cPTO-EVIDENCE-RELEASE-TRACEABILITYPTO-EVIDENCE-RELEASE-TRACEABILITYspec/evidence/release-traceability-readiness.jsonc7327021d39dc67ac5564bc55073b3870a397d79ac8d9648284d56e33bc14a3ePTO-EVIDENCE-INSTRUCTION-CONTRACT-CLOSUREPTO-EVIDENCE-INSTRUCTION-CONTRACT-CLOSUREspec/evidence/instruction-contract-closure.json3ef2bb62421c79dff8fa77a1c7983923b523244b8090812883ef81286ca8106aPTO-EVIDENCE-ARCHITECTURE-READINESSPTO-EVIDENCE-ARCHITECTURE-READINESSspec/evidence/architecture-readiness.json4b0b85199101251bea744e0f3591cc31906909dc80d5ab651c417a936036a004PTO-EVIDENCE-RELEASE-GATE-READINESSPTO-EVIDENCE-RELEASE-GATE-READINESSspec/evidence/release-gate-readiness.jsona0f4d2b6920c08981ea55fd8ef820708a40d4feb5402c5150e8e9ab532d84ce0PTO-EVIDENCE-RELEASE-MANIFESTPTO-EVIDENCE-RELEASE-MANIFESTspec/release-manifest.json1a64c109ed7a90351c41e2a418b3c0ebaf8ad975838986d2101385186b85c0d8Loading ADR-0026…
ADR-0026docs/status/decisions/0026-scalar-alu-totality-and-alias-order.md41d126f224dddc371832120f1b02eab64e426872fdcbea452bad77c90bdec349Loading ADR-0059…
ADR-0059docs/status/decisions/0059-mnemonic-field-encoding-closure.mdf18d13f735cfaf9f2803c754c5818f4af33d1cc42c489f0d9ce060b07bb3a196Loading ADR-0084…
ADR-0084docs/status/decisions/0084-scalar-system-and-queue-operations.mde068992fa81e2c4ac46e492391a2f784141d68e041bf0b9e0586c37217d1e08c{
"classification": [
"alu"
],
"documentation": "docs/scalar/alu/ADD.md",
"id": "PTO-SCALAR-ADD",
"instruction_contract": {
"artifact": "spec/evidence/instruction-contract-closure.json",
"mnemonic": "ADD",
"ndf_clause": "PTO-INST-SCALAR-ADD"
},
"mnemonic": "ADD",
"readiness_subjects": [
"ADR-0026",
"ADR-0059",
"ADR-0084"
],
"semantic_tests": [
"PTO-AVS-SCALAR-ADD-ALIASES-001",
"PTO-AVS-SCALAR-ADD-EXECUTION-001",
"PTO-AVS-SCALAR-ADD-MODIFIER-001"
],
"source": "asl/scalar/alu/ADD.asl",
"surface": "scalar",
"tests": [
"PTO-AVS-SCALAR-ADD-ALIASES-001",
"PTO-AVS-SCALAR-ADD-DECODE-001",
"PTO-AVS-SCALAR-ADD-EXECUTION-001",
"PTO-AVS-SCALAR-ADD-MODIFIER-001"
]
}0.58.5 · 候选发布7dc8b7e5b121d2b2499a2273bebff29e2cd868120bf721f111c251ee1a40a9fec927b190803e7ad67908e7957b26d28c567388aafa2119df9e9942afcec0dafd9a54763d1ac9d1986d15fb00df7c0bf25feb9fddasl/scalar/alu/ADD.aslasl/scalar/alu/ADD.aslasl/scalar/alu/ADD.asl