mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-05 12:37:46 +00:00
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.
(cherry picked from commit 3c4246dd24)
This commit is contained in:
@@ -17,6 +17,8 @@ rounding guarantees (via the
|
||||
- Unknown warnings and hints now gives warnings `warnUnknownNotes` instead of
|
||||
errors.
|
||||
|
||||
- With `-d:nimPreviewAsmSemSymbol`, backticked symbols are type checked in the `asm/emit` statements.
|
||||
|
||||
## Standard library additions and changes
|
||||
|
||||
[//]: # "Additions:"
|
||||
|
||||
@@ -10,6 +10,7 @@ define:nimPreviewProcConversion
|
||||
define:nimPreviewRangeDefault
|
||||
define:nimPreviewNonVarDestructor
|
||||
define:nimPreviewCheckedClose
|
||||
define:nimPreviewAsmSemSymbol
|
||||
threads:off
|
||||
|
||||
#import:"$projectpath/testability"
|
||||
|
||||
@@ -637,7 +637,10 @@ proc semAsmOrEmit*(con: PContext, n: PNode, marker: char): PNode =
|
||||
# XXX what to do here if 'amb' is true?
|
||||
if e != nil:
|
||||
incl(e.flags, sfUsed)
|
||||
result.add newSymNode(e)
|
||||
if isDefined(con.config, "nimPreviewAsmSemSymbol"):
|
||||
result.add con.semExprWithType(con, newSymNode(e), {efTypeAllowed})
|
||||
else:
|
||||
result.add newSymNode(e)
|
||||
else:
|
||||
result.add newStrNode(nkStrLit, sub)
|
||||
else:
|
||||
|
||||
54
tests/compiler/tasm2.nim
Normal file
54
tests/compiler/tasm2.nim
Normal 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
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user