Add docs and tests for copy_special instruction. Fixes encoding issue that tests revealed.
This commit is contained in:
committed by
Jakob Stoklund Olesen
parent
4eb9a54096
commit
3b1b33e0ac
@@ -140,6 +140,13 @@ ebb0:
|
||||
; asm: movl %ecx, %esi
|
||||
[-,%rsi] v81 = copy v1 ; bin: 89 ce
|
||||
|
||||
; Copy Special
|
||||
; asm: movl %esp, %ebp
|
||||
copy_special %rsp -> %rbp ; bin: 89 e5
|
||||
; asm: movl %ebp, %esp
|
||||
copy_special %rbp -> %rsp ; bin: 89 ec
|
||||
|
||||
|
||||
; Load/Store instructions.
|
||||
|
||||
; Register indirect addressing with no displacement.
|
||||
|
||||
@@ -155,6 +155,17 @@ ebb0:
|
||||
; asm: movq %rcx, %r10
|
||||
[-,%r10] v112 = copy v1 ; bin: 49 89 ca
|
||||
|
||||
; Copy Special
|
||||
; asm: movq %rsp, %rbp
|
||||
copy_special %rsp -> %rbp ; bin: 48 89 e5
|
||||
; asm: movq %r10, %r11
|
||||
copy_special %r10 -> %r11 ; bin: 4d 89 d3
|
||||
; asm: movq %rsp, %r11
|
||||
copy_special %rsp -> %r11 ; bin: 49 89 e3
|
||||
; asm: movq %r10, %rsp
|
||||
copy_special %r10 -> %rsp ; bin: 4c 89 d4
|
||||
|
||||
|
||||
; Load/Store instructions.
|
||||
|
||||
; Register indirect addressing with no displacement.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
test legalizer
|
||||
test binemit
|
||||
set is_64bit=1
|
||||
set is_64bit
|
||||
set is_compressed
|
||||
isa intel haswell
|
||||
|
||||
function %foo(f64 [%xmm0], i64 fp [%rbp], i64 csr [%rbx], i64 csr [%r12]) -> i64 csr [%r12], i64 csr [%rbx], i64 fp [%rbp] {
|
||||
|
||||
@@ -186,3 +186,17 @@ ebb0(v1: i32):
|
||||
; nextln: regfill $v1, $ss0 -> %10
|
||||
; nextln: return
|
||||
; nextln: }
|
||||
|
||||
; Register copies.
|
||||
function %copy_special() {
|
||||
ebb0:
|
||||
copy_special %10 -> %20
|
||||
copy_special %20 -> %10
|
||||
return
|
||||
}
|
||||
; sameln: function %copy_special() native {
|
||||
; nextln: ebb0:
|
||||
; nextln: copy_special %10 -> %20
|
||||
; nextln: copy_special %20 -> %10
|
||||
; nextln: return
|
||||
; nextln: }
|
||||
|
||||
@@ -539,7 +539,12 @@ regmove = Instruction(
|
||||
|
||||
copy_special = Instruction(
|
||||
'copy_special', r"""
|
||||
Copies a value from one special register to another. e.g. rbp -> rsp.
|
||||
Copies the contents of ''src'' register to ''dst'' register.
|
||||
|
||||
This instructions copies the contents of one register to another
|
||||
register without involving any SSA values. This is used for copying
|
||||
special registers, e.g. copying the stack register to the frame
|
||||
register in a function prologue.
|
||||
""",
|
||||
ins=(src, dst),
|
||||
other_side_effects=True)
|
||||
|
||||
@@ -232,7 +232,7 @@ enc_i32_i64(x86.push, r.pushq, 0x50)
|
||||
enc_i32_i64(x86.pop, r.popq, 0x58)
|
||||
|
||||
# Copy Special
|
||||
enc_i64(base.copy_special, r.copysp, 0x89, w=1)
|
||||
I64.enc(base.copy_special, *r.copysp.rex(0x89, w=1))
|
||||
I32.enc(base.copy_special, *r.copysp(0x89))
|
||||
|
||||
# Adjust SP Imm
|
||||
|
||||
Reference in New Issue
Block a user