fixes #23114; Nim v2 regression emit / asm var param dereference inconsistency (#24547)

fixes #23114

As in https://github.com/nim-lang/Nim/pull/22074, expressions in
bracketed emit are strictly typechecked, this PR applies the same check
for symbols in asm statements in order to keep them consistent.
This commit is contained in:
ringabout
2024-12-25 16:23:25 +08:00
committed by GitHub
parent fc806710cb
commit 3c4246dd24
5 changed files with 62 additions and 1 deletions

54
tests/compiler/tasm2.nim Normal file
View File

@@ -0,0 +1,54 @@
discard """
targets: "c cpp"
disabled: "arm64"
"""
import std/strutils
block: # bug #23114
func ccopy_x86_asm(ctl: uint64, x: var uint64, y: uint64) =
asm """
testq %[ctl], %[ctl]
cmovnzq %[y], %[x]
: [x] "+r" (`x`)
: [ctl] "r" (`ctl`), [y] "r" (`y`)
: "cc"
"""
func ccopy_x86_emit(ctl: uint64, x: var uint64, y: uint64) =
{.emit:[
"""
asm volatile(
"testq %[ctl], %[ctl]\n"
"cmovnzq %[y], %[x]\n"
: [x] "+r" (""", x, """)
: [ctl] "r" (""", ctl, """), [y] "r" (""", y, """)
: "cc"
);"""].}
let x = 0x1111111'u64
let y = 0xFFFFFFF'u64
block:
let ctl = 1'u64
var a0 = x
ctl.ccopy_x86_asm(a0, y)
var a1 = x
ctl.ccopy_x86_emit(a1, y)
doAssert a0.toHex() == "000000000FFFFFFF"
doAssert a0 == a1
block:
let ctl = 0'u64
var a0 = x
ctl.ccopy_x86_asm(a0, y)
var a1 = x
ctl.ccopy_x86_emit(a1, y)
doAssert a0.toHex() == "0000000001111111"
doAssert a0 == a1

View File

@@ -38,6 +38,7 @@ switch("define", "nimPreviewHashRef")
switch("define", "nimPreviewRangeDefault")
switch("define", "nimPreviewNonVarDestructor")
switch("define", "nimPreviewCheckedClose")
switch("define", "nimPreviewAsmSemSymbol")
switch("warningAserror", "UnnamedBreak")
when not defined(testsConciseTypeMismatch):