Add spill/fill encodings for Intel ISAs.
To begin with, these are catch-all encodings with a SIB byte and a 32-bit displacement, so they can access any stack slot via both the stack pointer and the frame pointer. In the future, we will add encodings for 8-bit displacements as well as EBP-relative references without a SIB byte.
This commit is contained in:
@@ -8,6 +8,11 @@ isa intel has_sse2
|
||||
;
|
||||
|
||||
function %F32() {
|
||||
ss0 = incoming_arg 8, offset 0
|
||||
ss1 = incoming_arg 1024, offset -1024
|
||||
ss2 = incoming_arg 1024, offset -2048
|
||||
ss3 = incoming_arg 8, offset -2056
|
||||
|
||||
ebb0:
|
||||
[-,%rcx] v0 = iconst.i32 1
|
||||
[-,%rsi] v1 = iconst.i32 2
|
||||
@@ -105,10 +110,27 @@ ebb0:
|
||||
; asm: movd %xmm2, -10000(%esi)
|
||||
[-] store.f32 v101, v1-10000 ; bin: 66 0f 7e 96 ffffd8f0
|
||||
|
||||
; Spill / Fill.
|
||||
|
||||
; asm: movd %xmm5, 1032(%esp)
|
||||
[-,ss1] v200 = spill v100 ; bin: 66 0f 7e ac 24 00000408
|
||||
; asm: movd %xmm2, 1032(%esp)
|
||||
[-,ss1] v201 = spill v101 ; bin: 66 0f 7e 94 24 00000408
|
||||
|
||||
; asm: movd 1032(%esp), %xmm5
|
||||
[-,%xmm5] v210 = fill v200 ; bin: 66 0f 6e ac 24 00000408
|
||||
; asm: movd 1032(%esp), %xmm2
|
||||
[-,%xmm2] v211 = fill v201 ; bin: 66 0f 6e 94 24 00000408
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
function %F64() {
|
||||
ss0 = incoming_arg 8, offset 0
|
||||
ss1 = incoming_arg 1024, offset -1024
|
||||
ss2 = incoming_arg 1024, offset -2048
|
||||
ss3 = incoming_arg 8, offset -2056
|
||||
|
||||
ebb0:
|
||||
[-,%rcx] v0 = iconst.i32 1
|
||||
[-,%rsi] v1 = iconst.i32 2
|
||||
@@ -198,5 +220,17 @@ ebb0:
|
||||
; asm: movq %xmm2, -10000(%esi)
|
||||
[-] store.f64 v101, v1-10000 ; bin: 66 0f d6 96 ffffd8f0
|
||||
|
||||
; Spill / Fill.
|
||||
|
||||
; asm: movq %xmm5, 1032(%esp)
|
||||
[-,ss1] v200 = spill v100 ; bin: 66 0f d6 ac 24 00000408
|
||||
; asm: movq %xmm2, 1032(%esp)
|
||||
[-,ss1] v201 = spill v101 ; bin: 66 0f d6 94 24 00000408
|
||||
|
||||
; asm: movq 1032(%esp), %xmm5
|
||||
[-,%xmm5] v210 = fill v200 ; bin: f3 0f 7e ac 24 00000408
|
||||
; asm: movq 1032(%esp), %xmm2
|
||||
[-,%xmm2] v211 = fill v201 ; bin: f3 0f 7e 94 24 00000408
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -11,6 +11,11 @@ function %I32() {
|
||||
fn0 = function %foo()
|
||||
sig0 = ()
|
||||
|
||||
ss0 = incoming_arg 8, offset 0
|
||||
ss1 = incoming_arg 1024, offset -1024
|
||||
ss2 = incoming_arg 1024, offset -2048
|
||||
ss3 = incoming_arg 8, offset -2056
|
||||
|
||||
ebb0:
|
||||
; asm: movl $1, %ecx
|
||||
[-,%rcx] v1 = iconst.i32 1 ; bin: b9 00000001
|
||||
@@ -346,6 +351,18 @@ ebb0:
|
||||
; asm: call *%esi
|
||||
call_indirect sig0, v401() ; bin: ff d6
|
||||
|
||||
; Spill / Fill.
|
||||
|
||||
; asm: movl %ecx, 1032(%esp)
|
||||
[-,ss1] v500 = spill v1 ; bin: 89 8c 24 00000408
|
||||
; asm: movl %esi, 1032(%esp)
|
||||
[-,ss1] v501 = spill v2 ; bin: 89 b4 24 00000408
|
||||
|
||||
; asm: movl 1032(%esp), %ecx
|
||||
[-,%rcx] v510 = fill v500 ; bin: 8b 8c 24 00000408
|
||||
; asm: movl 1032(%esp), %esi
|
||||
[-,%rsi] v511 = fill v501 ; bin: 8b b4 24 00000408
|
||||
|
||||
; asm: testl %ecx, %ecx
|
||||
; asm: je ebb1
|
||||
brz v1, ebb1 ; bin: 85 c9 74 0e
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
; Binary emission of 64-bit floating point code.
|
||||
test binemit
|
||||
set is_64bit
|
||||
set is_compressed
|
||||
isa intel has_sse2
|
||||
|
||||
; The binary encodings can be verified with the command:
|
||||
@@ -9,6 +10,11 @@ isa intel has_sse2
|
||||
;
|
||||
|
||||
function %F32() {
|
||||
ss0 = incoming_arg 8, offset 0
|
||||
ss1 = incoming_arg 1024, offset -1024
|
||||
ss2 = incoming_arg 1024, offset -2048
|
||||
ss3 = incoming_arg 8, offset -2056
|
||||
|
||||
ebb0:
|
||||
[-,%r11] v0 = iconst.i32 1
|
||||
[-,%rsi] v1 = iconst.i32 2
|
||||
@@ -36,7 +42,7 @@ ebb0:
|
||||
[-,%xmm10] v17 = bitcast.f32 v1 ; bin: 66 44 0f 6e d6
|
||||
|
||||
; asm: movd %xmm5, %ecx
|
||||
[-,%rcx] v18 = bitcast.i32 v10 ; bin: 66 40 0f 7e e9
|
||||
[-,%rcx] v18 = bitcast.i32 v10 ; bin: 66 0f 7e e9
|
||||
; asm: movd %xmm10, %esi
|
||||
[-,%rsi] v19 = bitcast.i32 v11 ; bin: 66 44 0f 7e d6
|
||||
|
||||
@@ -113,10 +119,27 @@ ebb0:
|
||||
; asm: movd %xmm10, -10000(%rax)
|
||||
[-] store.f32 v101, v2-10000 ; bin: 66 44 0f 7e 90 ffffd8f0
|
||||
|
||||
; Spill / Fill.
|
||||
|
||||
; asm: movd %xmm5, 1032(%rsp)
|
||||
[-,ss1] v200 = spill v100 ; bin: 66 0f 7e ac 24 00000408
|
||||
; asm: movd %xmm10, 1032(%rsp)
|
||||
[-,ss1] v201 = spill v101 ; bin: 66 44 0f 7e 94 24 00000408
|
||||
|
||||
; asm: movd 1032(%rsp), %xmm5
|
||||
[-,%xmm5] v210 = fill v200 ; bin: 66 0f 6e ac 24 00000408
|
||||
; asm: movd 1032(%rsp), %xmm10
|
||||
[-,%xmm10] v211 = fill v201 ; bin: 66 44 0f 6e 94 24 00000408
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
function %F64() {
|
||||
ss0 = incoming_arg 8, offset 0
|
||||
ss1 = incoming_arg 1024, offset -1024
|
||||
ss2 = incoming_arg 1024, offset -2048
|
||||
ss3 = incoming_arg 8, offset -2056
|
||||
|
||||
ebb0:
|
||||
[-,%r11] v0 = iconst.i32 1
|
||||
[-,%rsi] v1 = iconst.i32 2
|
||||
@@ -221,5 +244,17 @@ ebb0:
|
||||
; asm: movq %xmm10, -10000(%rax)
|
||||
[-] store.f64 v101, v2-10000 ; bin: 66 44 0f d6 90 ffffd8f0
|
||||
|
||||
; Spill / Fill.
|
||||
|
||||
; asm: movq %xmm5, 1032(%rsp)
|
||||
[-,ss1] v200 = spill v100 ; bin: 66 0f d6 ac 24 00000408
|
||||
; asm: movq %xmm10, 1032(%rsp)
|
||||
[-,ss1] v201 = spill v101 ; bin: 66 44 0f d6 94 24 00000408
|
||||
|
||||
; asm: movq 1032(%rsp), %xmm5
|
||||
[-,%xmm5] v210 = fill v200 ; bin: f3 0f 7e ac 24 00000408
|
||||
; asm: movq 1032(%rsp), %xmm10
|
||||
[-,%xmm10] v211 = fill v201 ; bin: f3 44 0f 7e 94 24 00000408
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -14,6 +14,13 @@ function %I64() {
|
||||
fn0 = function %foo()
|
||||
sig0 = ()
|
||||
|
||||
; Use incoming_arg stack slots because they won't be relocated by the frame
|
||||
; layout.
|
||||
ss0 = incoming_arg 8, offset 0
|
||||
ss1 = incoming_arg 1024, offset -1024
|
||||
ss2 = incoming_arg 1024, offset -2048
|
||||
ss3 = incoming_arg 8, offset -2056
|
||||
|
||||
ebb0:
|
||||
|
||||
; Integer Constants.
|
||||
@@ -436,6 +443,22 @@ ebb0:
|
||||
; asm: call *%r10
|
||||
call_indirect sig0, v402() ; bin: 41 ff d2
|
||||
|
||||
; Spill / Fill.
|
||||
|
||||
; asm: movq %rcx, 1032(%rsp)
|
||||
[-,ss1] v500 = spill v1 ; bin: 48 89 8c 24 00000408
|
||||
; asm: movq %rsi, 1032(%rsp)
|
||||
[-,ss1] v501 = spill v2 ; bin: 48 89 b4 24 00000408
|
||||
; asm: movq %r10, 1032(%rsp)
|
||||
[-,ss1] v502 = spill v3 ; bin: 4c 89 94 24 00000408
|
||||
|
||||
; asm: movq 1032(%rsp), %rcx
|
||||
[-,%rcx] v510 = fill v500 ; bin: 48 8b 8c 24 00000408
|
||||
; asm: movq 1032(%rsp), %rsi
|
||||
[-,%rsi] v511 = fill v501 ; bin: 48 8b b4 24 00000408
|
||||
; asm: movq 1032(%rsp), %r10
|
||||
[-,%r10] v512 = fill v502 ; bin: 4c 8b 94 24 00000408
|
||||
|
||||
; asm: testq %rcx, %rcx
|
||||
; asm: je ebb1
|
||||
brz v1, ebb1 ; bin: 48 85 c9 74 1b
|
||||
@@ -477,6 +500,11 @@ function %I32() {
|
||||
fn0 = function %foo()
|
||||
sig0 = ()
|
||||
|
||||
ss0 = incoming_arg 8, offset 0
|
||||
ss1 = incoming_arg 1024, offset -1024
|
||||
ss2 = incoming_arg 1024, offset -2048
|
||||
ss3 = incoming_arg 8, offset -2056
|
||||
|
||||
ebb0:
|
||||
|
||||
; Integer Constants.
|
||||
@@ -806,6 +834,22 @@ ebb0:
|
||||
; asm: movzbl %dl, %esi
|
||||
[-,%rsi] v351 = bint.i32 v301 ; bin: 0f b6 f2
|
||||
|
||||
; Spill / Fill.
|
||||
|
||||
; asm: movl %ecx, 1032(%rsp)
|
||||
[-,ss1] v500 = spill v1 ; bin: 89 8c 24 00000408
|
||||
; asm: movl %esi, 1032(%rsp)
|
||||
[-,ss1] v501 = spill v2 ; bin: 89 b4 24 00000408
|
||||
; asm: movl %r10d, 1032(%rsp)
|
||||
[-,ss1] v502 = spill v3 ; bin: 44 89 94 24 00000408
|
||||
|
||||
; asm: movl 1032(%rsp), %ecx
|
||||
[-,%rcx] v510 = fill v500 ; bin: 8b 8c 24 00000408
|
||||
; asm: movl 1032(%rsp), %esi
|
||||
[-,%rsi] v511 = fill v501 ; bin: 8b b4 24 00000408
|
||||
; asm: movl 1032(%rsp), %r10d
|
||||
[-,%r10] v512 = fill v502 ; bin: 44 8b 94 24 00000408
|
||||
|
||||
; asm: testl %ecx, %ecx
|
||||
; asm: je ebb1x
|
||||
brz v1, ebb1 ; bin: 85 c9 74 18
|
||||
|
||||
Reference in New Issue
Block a user