test(asm): x86_64 cross-arch siblings for place + symbol operands
Adds ir-only x86_64 examples mirroring the aarch64 feature examples, so
each emit path is locked on both arches:
- 1657 read-write `+` → "incq ${0}", "=r,0" (tied input)
- 1658 indirect `=*m` → "movq $$42, ${0}", "=*m"(ptr elementtype i64)
- 1659 symbol `"s"` → "call ${2:P}", direct call to an exported sx fn
Each is x86-pinned (ir-only on this aarch64 host — the .ir is the
assertion; runs on x86_64-linux, main returns 0 on success / 1 if the
asm misbehaved). x86 templates validated by cross-emitting an object
(LLVM's integrated assembler accepts them; objdump confirms 1659 is a
direct `call` reloc to cb). Note: x86 direct calls need the `P` operand
modifier (`%[fn:P]`); aarch64 `bl %[fn]` needs none. Pure additive
locks, no compiler change. zig build test green (668 corpus, 446 unit).
This commit is contained in:
1
examples/expected/1657-platform-asm-x86-rw-place.build
Normal file
1
examples/expected/1657-platform-asm-x86-rw-place.build
Normal file
@@ -0,0 +1 @@
|
||||
{ "target": "x86_64-linux" }
|
||||
1
examples/expected/1657-platform-asm-x86-rw-place.exit
Normal file
1
examples/expected/1657-platform-asm-x86-rw-place.exit
Normal file
@@ -0,0 +1 @@
|
||||
0
|
||||
26
examples/expected/1657-platform-asm-x86-rw-place.ir
Normal file
26
examples/expected/1657-platform-asm-x86-rw-place.ir
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal i64 @bump() #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 41, ptr %alloca, align 8
|
||||
%asm.rw.seed = load i64, ptr %alloca, align 8
|
||||
%asm = call i64 asm sideeffect "incq ${0}", "=r,0"(i64 %asm.rw.seed)
|
||||
store i64 %asm, ptr %alloca, align 8
|
||||
%load = load i64, ptr %alloca, align 8
|
||||
ret i64 %load
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define i32 @main() #0 {
|
||||
entry:
|
||||
%call = call i64 @bump()
|
||||
%icmp = icmp ne i64 %call, 42
|
||||
br i1 %icmp, label %if.then.0, label %if.merge.1
|
||||
|
||||
if.then.0: ; preds = %entry
|
||||
ret i32 1
|
||||
|
||||
if.merge.1: ; preds = %entry
|
||||
ret i32 0
|
||||
}
|
||||
1
examples/expected/1657-platform-asm-x86-rw-place.stderr
Normal file
1
examples/expected/1657-platform-asm-x86-rw-place.stderr
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{ "target": "x86_64-linux" }
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
24
examples/expected/1658-platform-asm-x86-indirect-mem.ir
Normal file
24
examples/expected/1658-platform-asm-x86-indirect-mem.ir
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal i64 @poke() #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 0, ptr %alloca, align 8
|
||||
call void asm sideeffect "movq $$42, ${0}", "=*m"(ptr elementtype(i64) %alloca)
|
||||
%load = load i64, ptr %alloca, align 8
|
||||
ret i64 %load
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define i32 @main() #0 {
|
||||
entry:
|
||||
%call = call i64 @poke()
|
||||
%icmp = icmp ne i64 %call, 42
|
||||
br i1 %icmp, label %if.then.0, label %if.merge.1
|
||||
|
||||
if.then.0: ; preds = %entry
|
||||
ret i32 1
|
||||
|
||||
if.merge.1: ; preds = %entry
|
||||
ret i32 0
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
{ "target": "x86_64-linux" }
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
34
examples/expected/1659-platform-asm-x86-symbol-operand.ir
Normal file
34
examples/expected/1659-platform-asm-x86-symbol-operand.ir
Normal file
@@ -0,0 +1,34 @@
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define i64 @cb(i64 %0) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %0, ptr %alloca, align 8
|
||||
%load = load i64, ptr %alloca, align 8
|
||||
%add = add i64 %load, 1
|
||||
ret i64 %add
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define internal i64 @tramp(i64 %0) #0 {
|
||||
entry:
|
||||
%alloca = alloca i64, align 8
|
||||
store i64 %0, ptr %alloca, align 8
|
||||
%load = load i64, ptr %alloca, align 8
|
||||
%asm = call i64 asm sideeffect "call ${2:P}", "={rax},{rdi},s,~{rcx},~{rdx},~{rsi},~{r8},~{r9},~{r10},~{r11},~{memory}"(i64 %load, ptr @cb)
|
||||
ret i64 %asm
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define i32 @main() #0 {
|
||||
entry:
|
||||
%call = call i64 @tramp(i64 41)
|
||||
%icmp = icmp ne i64 %call, 42
|
||||
br i1 %icmp, label %if.then.0, label %if.merge.1
|
||||
|
||||
if.then.0: ; preds = %entry
|
||||
ret i32 1
|
||||
|
||||
if.merge.1: ; preds = %entry
|
||||
ret i32 0
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
Reference in New Issue
Block a user