Add docs and tests for copy_special instruction. Fixes encoding issue that tests revealed.

This commit is contained in:
Tyler McMullen
2017-12-01 18:01:00 -08:00
committed by Jakob Stoklund Olesen
parent 4eb9a54096
commit 3b1b33e0ac
6 changed files with 41 additions and 4 deletions

View File

@@ -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.

View File

@@ -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.

View File

@@ -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] {

View File

@@ -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: }

View File

@@ -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)

View File

@@ -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