mirror of
git://c9x.me/qbe.git
synced 2026-04-05 18:09:47 +00:00
It is quite similar to arm64_apple.
Probably, the call that needs to be
generated also provides extra
invariants on top of the regular
abi, but I have not checked that.
Clang generates code that is a bit
neater than qbe's because, on x86,
a load can be fused in a call
instruction! We do not bother with
supporting these since we expect
only sporadic use of the feature.
For reference, here is what clang
might output for a store to the
second entry of a thread-local
array of ints:
movq _x@TLVP(%rip), %rdi
callq *(%rdi)
movl %ecx, 4(%rax)
31 lines
543 B
Plaintext
31 lines
543 B
Plaintext
thread data $i = align 4 {w 42}
|
|
data $fmt = align 1 {b "i%d==%d\n", b 0}
|
|
|
|
export
|
|
function w $main() {
|
|
@start
|
|
%pthr =l alloc8 8
|
|
%rval =l alloc8 8
|
|
call $pthread_create(l %pthr, l 0, l $thread, l 0)
|
|
%t =l load %pthr
|
|
call $pthread_join(l %t, l %rval)
|
|
%i0 =w loadw thread $i
|
|
call $printf(l $fmt, ..., w 0, w %i0)
|
|
%i1 =w load %rval
|
|
call $printf(l $fmt, ..., w 1, w %i1)
|
|
ret 0
|
|
}
|
|
|
|
function l $thread(l %arg) {
|
|
@start
|
|
%i3 =l add thread $i, 3
|
|
storeb 24, %i3
|
|
%ret =l loadsw thread $i
|
|
ret %ret
|
|
}
|
|
|
|
# >>> output
|
|
# i0==42
|
|
# i1==402653226
|
|
# <<<
|