Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions language-truth/backend/abi/aarch64-linux.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# جدول ABI لـ AArch64 على لينكس (AAPCS64 + النداء العامّ asm-generic) — توسيع م٠.
# نفس backend_abi.schema.json يستوعبه بلا تغيير (e_machine مختلف، تعليمة نداء svc، لا منطقة حمراء).

version: "1.0"
isa: arm64
os: linux
object_format: elf
e_machine: 183 # EM_AARCH64
status: experimental

call:
int_args: [x0, x1, x2, x3, x4, x5, x6, x7]
fp_args: [v0, v1, v2, v3, v4, v5, v6, v7]
int_return: [x0, x1]
fp_return: [v0, v1]
stack_align: 16 # AAPCS64 يُلزم محاذاة ١٦ عند نقطة call
red_zone: 0 # لا منطقة حمراء في AAPCS64

syscall:
instruction: svc
number_reg: x8
arg_regs: [x0, x1, x2, x3, x4, x5]
nr: # أرقام النداء العامّة (asm-generic/unistd.h)
write: 64
exit: 93
exit_group: 94
72 changes: 72 additions & 0 deletions language-truth/backend/arm64/instructions.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# جدول ترميز تعليمات AArch64 (عائلة fixed32) — توسيع م٠ (الهدف الثاني، RISC ثابت ٣٢-بت).
# يُبرهِن عموميّة المخطّط: نفس backend_encoding.schema.json يستوعب x86 (variable) وARM64 (fixed32)
# بلا تغيير. اللاتينيّة (en) توثيقُ تقابلٍ فقط. الترميزُ يُتحقَّق بايتًا ببايت ضدّ llvm-mc في م٣+.
# المجموعة الدنيا لبرهان «خروج ٤٢» الحرّ: انقل (MOVZ)، اجمع (ADD)، نداء_نظام (SVC)، ارجع (RET).

version: "1.0"
architecture: arm64
word_bits: 64
encoding_family: fixed32
status: experimental

instructions:
# MOVZ Xd, #imm16 ⇒ sf(1) 10 100101 hw(00) imm16 Rd
انقل:
- en: movz
form: "x, imm16"
operands:
- { kind: reg, class: gpr, role: out }
- { kind: imm, bits: 16 }
encode:
width: 32
fields:
- { name: sf, hi: 31, lo: 31, const: 1 } # ٦٤-بت
- { name: opc, hi: 30, lo: 29, const: 2 } # 0b10 (MOVZ)
- { name: fixed, hi: 28, lo: 23, const: 37 } # 0b100101
- { name: hw, hi: 22, lo: 21, const: 0 } # إزاحة ٠
- { name: imm16, hi: 20, lo: 5, from: op1 }
- { name: Rd, hi: 4, lo: 0, from: op0 }
reads_dest: false

# ADD Xd, Xn, Xm ⇒ sf 0 0 01011 00 0 Rm 000000 Rn Rd (ثلاثة معاملات، لا تدمير الوجهة)
اجمع:
- en: add
form: "x, x, x"
operands:
- { kind: reg, class: gpr, role: out }
- { kind: reg, class: gpr, role: in }
- { kind: reg, class: gpr, role: in }
encode:
width: 32
fields:
- { name: sf, hi: 31, lo: 31, const: 1 } # ٦٤-بت
- { name: fixed, hi: 30, lo: 21, const: 88 } # 0b0001011000 (op/S/opcode/shift/N)
- { name: Rm, hi: 20, lo: 16, from: op2 }
- { name: imm6, hi: 15, lo: 10, const: 0 } # بلا إزاحة
- { name: Rn, hi: 9, lo: 5, from: op1 }
- { name: Rd, hi: 4, lo: 0, from: op0 }
reads_dest: false

# SVC #0 ⇒ 11010100 000 imm16(0) 00001
نداء_نظام:
- en: svc
form: ""
operands: []
encode:
width: 32
fields:
- { name: fixed, hi: 31, lo: 21, const: 1696 } # 0b11010100000
- { name: imm16, hi: 20, lo: 5, const: 0 } # SVC #0
- { name: op, hi: 4, lo: 0, const: 1 } # 0b00001

# RET {X30} ⇒ 1101011 0 0 10 11111 000000 Rn(30) 00000
ارجع:
- en: ret
form: ""
operands: []
encode:
width: 32
fields:
- { name: fixed, hi: 31, lo: 10, const: 3512256 } # 0b1101011001011111000000 (RET x30 = 0xD65F03C0)
- { name: Rn, hi: 9, lo: 5, const: 30 } # x30 (سجلّ الرابط)
- { name: op, hi: 4, lo: 0, const: 0 }
25 changes: 25 additions & 0 deletions language-truth/backend/arm64/isel.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# جدول اختيار تعليمات AArch64 — توسيع م٠ (الهدف الثاني fixed32).
# بنية النمط (sir → match → emit + cost) مطابقةٌ حرفيًّا لـx86-64؛ المحتوى مختلف:
# ARM64 ثلاثيّةُ المعاملات (add d,a,b — لا تدمير الوجهة) بخلاف x86 (add dst,src).

version: "1.0"
architecture: arm64
status: experimental

patterns:
- sir: ADD_I64
match: "add(reg, reg)"
emit:
- { mn: اجمع, form: "x, x, x", ops: ["$dst", "$lhs", "$rhs"] }
cost: 1

- sir: CONST_I64
match: "const(imm)"
emit:
- { mn: انقل, form: "x, imm16", ops: ["$dst", "$imm"] }
cost: 1

- sir: RET
emit:
- { mn: ارجع, form: "", ops: [] }
cost: 1
46 changes: 46 additions & 0 deletions language-truth/backend/arm64/registers.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# جدول سجلّات AArch64 — توسيع م٠ (الهدف الثاني fixed32).
# num = رقمُ ترميز السجلّ داخل حقول Rd/Rn/Rm. نفس مخطّط x86-64 يستوعبه بلا تغيير.
# x0..x7 وسائط/عودة؛ x8 نتيجة غير مباشرة؛ x18 محجوز نظاميّ (platform)؛ x19..x28 محفوظة؛
# x29 الإطار، x30 الرابط (LR)، وnum=31 مشترك بين xzr (الصفر) وsp (المكدّس) حسب السياق.

version: "1.0"
architecture: arm64
status: experimental

classes:
gpr:
width: 64
registers:
- { ar: س0, en: x0, num: 0, role: caller_saved }
- { ar: س1, en: x1, num: 1, role: caller_saved }
- { ar: س2, en: x2, num: 2, role: caller_saved }
- { ar: س3, en: x3, num: 3, role: caller_saved }
- { ar: س4, en: x4, num: 4, role: caller_saved }
- { ar: س5, en: x5, num: 5, role: caller_saved }
- { ar: س6, en: x6, num: 6, role: caller_saved }
- { ar: س7, en: x7, num: 7, role: caller_saved }
- { ar: س8, en: x8, num: 8, role: caller_saved, note: "سجلّ النتيجة غير المباشرة / رقم النداء" }
- { ar: س9, en: x9, num: 9, role: caller_saved }
- { ar: س10, en: x10, num: 10, role: caller_saved }
- { ar: س11, en: x11, num: 11, role: caller_saved }
- { ar: س12, en: x12, num: 12, role: caller_saved }
- { ar: س13, en: x13, num: 13, role: caller_saved }
- { ar: س14, en: x14, num: 14, role: caller_saved }
- { ar: س15, en: x15, num: 15, role: caller_saved }
- { ar: س16, en: x16, num: 16, role: caller_saved, note: "IP0 داخل النداء" }
- { ar: س17, en: x17, num: 17, role: caller_saved, note: "IP1 داخل النداء" }
- { ar: س18, en: x18, num: 18, role: platform, reserved: true, note: "سجلّ المنصّة (محجوز)" }
- { ar: س19, en: x19, num: 19, role: callee_saved }
- { ar: س20, en: x20, num: 20, role: callee_saved }
- { ar: س21, en: x21, num: 21, role: callee_saved }
- { ar: س22, en: x22, num: 22, role: callee_saved }
- { ar: س23, en: x23, num: 23, role: callee_saved }
- { ar: س24, en: x24, num: 24, role: callee_saved }
- { ar: س25, en: x25, num: 25, role: callee_saved }
- { ar: س26, en: x26, num: 26, role: callee_saved }
- { ar: س27, en: x27, num: 27, role: callee_saved }
- { ar: س28, en: x28, num: 28, role: callee_saved }
- { ar: الإطار, en: x29, num: 29, role: frame, reserved: true }
- { ar: الرابط, en: x30, num: 30, role: link, reserved: true }
- { ar: الصفر, en: xzr, num: 31, role: zero, reserved: true }
- { ar: المكدّس, en: sp, num: 31, role: stack, reserved: true }
16 changes: 15 additions & 1 deletion language-truth/tests/test_schema_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,23 +180,37 @@ def test_yaml_validates_against_schema(self, yaml_path: str, schema_name: str):
# أزواج (وصف, مسار_YAML_النسبي, مسار_Schema): كلّ جدول خلفيّة يُتحقَّق ضدّ مخطّطه.
# تُوسَّع مع كلّ معماريّة/جدول جديد (arm64/riscv64/… ، وأنظمة abi إضافيّة).
BACKEND_TABLE_PAIRS: list[tuple[str, str, str]] = [
# x86_64 (عائلة variable) — الهدف المرجعيّ (م٠)
("x86_64 تعليمات", "backend/x86_64/instructions.yaml", "backend_encoding.schema.json"),
("x86_64 سجلّات", "backend/x86_64/registers.yaml", "backend_register_file.schema.json"),
("x86_64 اختيار", "backend/x86_64/isel.yaml", "backend_isel.schema.json"),
("x86_64-linux ABI", "backend/abi/x86_64-linux.yaml", "backend_abi.schema.json"),
# arm64 (عائلة fixed32) — الهدف الثاني: يُبرهِن عموميّة المخطّطات (RISC مقابل CISC)
("arm64 تعليمات", "backend/arm64/instructions.yaml", "backend_encoding.schema.json"),
("arm64 سجلّات", "backend/arm64/registers.yaml", "backend_register_file.schema.json"),
("arm64 اختيار", "backend/arm64/isel.yaml", "backend_isel.schema.json"),
("aarch64-linux ABI", "backend/abi/aarch64-linux.yaml", "backend_abi.schema.json"),
]


class TestBackendTables:
"""اختبارات T1 لطبقة الخلفيّة السياديّة — الجداول تُتحقَّق ضدّ مخطّطاتها."""

def test_backend_dir_exists(self):
"""language-truth/backend/ موجود بمجلّد المعماريّة المرجعيّة x86_64 وجذر abi."""
"""language-truth/backend/ موجود بهدفَي العائلتين (x86_64=variable، arm64=fixed32) وجذر abi."""
backend = TRUTH_DIR / "backend"
assert backend.is_dir(), "language-truth/backend/ غير موجود"
assert (backend / "x86_64").is_dir(), "backend/x86_64/ غير موجود"
assert (backend / "arm64").is_dir(), "backend/arm64/ غير موجود"
assert (backend / "abi").is_dir(), "backend/abi/ غير موجود"

def test_both_encoding_families_present(self):
"""الهدفان يغطّيان عائلتَي الترميز: x86_64=variable، arm64=fixed32 (إثبات عموميّة المخطّط)."""
x86 = load_yaml(TRUTH_DIR / "backend/x86_64/instructions.yaml")
arm = load_yaml(TRUTH_DIR / "backend/arm64/instructions.yaml")
assert x86["encoding_family"] == "variable", "x86_64 يجب أن يكون variable"
assert arm["encoding_family"] == "fixed32", "arm64 يجب أن يكون fixed32"

@pytest.mark.parametrize("schema_name", [
"backend_encoding.schema.json",
"backend_register_file.schema.json",
Expand Down
Loading