From 09d83a161306549738ed7fdddec55c518e491bd0 Mon Sep 17 00:00:00 2001 From: Mike <45243121+tankf33der@users.noreply.github.com> Date: Fri, 25 Apr 2025 07:01:08 +0300 Subject: [PATCH] cgen,ast: add ppc64le assembly support + test (#24299) --- vlib/v/ast/ast.v | 13 ++++++++ vlib/v/gen/c/cgen.v | 4 +-- vlib/v/slow_tests/assembly/asm_test.ppc64le.v | 32 +++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 vlib/v/slow_tests/assembly/asm_test.ppc64le.v diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 49004758f..0de48a39b 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -1834,6 +1834,12 @@ pub const s390x_with_number_register_list = { 'v#': 32 } +pub const ppc64le_no_number_register_list = []string{} +pub const ppc64le_with_number_register_list = { + 'f#': 32 + 'r#': 32 +} + pub struct DebuggerStmt { pub: pos token.Pos @@ -2646,6 +2652,13 @@ pub fn all_registers(mut t Table, arch pref.Arch) map[string]ScopeObject { res[k] = v } } + .ppc64le { + ppc64le := gen_all_registers(mut t, ppc64le_no_number_register_list, ppc64le_with_number_register_list, + 64) + for k, v in ppc64le { + res[k] = v + } + } .wasm32 { // no registers } diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 213ff9ad1..fe09c02e1 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -3150,7 +3150,7 @@ fn (mut g Gen) asm_stmt(stmt ast.AsmStmt) { } // swap destination and operands for att syntax, not for arm64 if template.args.len != 0 && !template.is_directive && stmt.arch != .arm64 - && stmt.arch != .s390x { + && stmt.arch != .s390x && stmt.arch != .ppc64le { template.args.prepend(template.args.last()) template.args.delete(template.args.len - 1) } @@ -3227,7 +3227,7 @@ fn (mut g Gen) asm_arg(arg ast.AsmArg, stmt ast.AsmStmt) { ast.IntegerLiteral { if stmt.arch == .arm64 { g.write('#${arg.val}') - } else if stmt.arch == .s390x { + } else if stmt.arch == .s390x || stmt.arch == .ppc64le { g.write('${arg.val}') } else { g.write('\$${arg.val}') diff --git a/vlib/v/slow_tests/assembly/asm_test.ppc64le.v b/vlib/v/slow_tests/assembly/asm_test.ppc64le.v new file mode 100644 index 000000000..6acf6e444 --- /dev/null +++ b/vlib/v/slow_tests/assembly/asm_test.ppc64le.v @@ -0,0 +1,32 @@ +// vtest build: gcc +fn test_inline_asm() { + a, mut b := 10, 0 + asm ppc64le { + mr r12, a + mr b, r12 + ; +r (b) + ; r (a) + ; r12 + } + assert a == b + + mut c := 0 + asm ppc64le { + li c, 5 + ; +r (c) + } + assert c == 5 + + d, e, mut f := 10, 2, 0 + asm ppc64le { + mr f, d + add f, f, e + addi f, f, 5 + ; +r (f) + ; r (d) + r (e) + } + assert d == 10 + assert e == 2 + assert f == 17 +} -- 2.39.5