Intel encodings for regspill and regfill.
These are always SP-based.
This commit is contained in:
@@ -193,6 +193,7 @@ enc_i32_i64_ld_st(base.store, True, r.stDisp8, 0x89)
|
||||
enc_i32_i64_ld_st(base.store, True, r.stDisp32, 0x89)
|
||||
|
||||
enc_i32_i64(base.spill, r.spSib32, 0x89)
|
||||
enc_i32_i64(base.regspill, r.rsp32, 0x89)
|
||||
|
||||
enc_i64(base.istore32.i64.any, r.st, 0x89)
|
||||
enc_i64(base.istore32.i64.any, r.stDisp8, 0x89)
|
||||
@@ -222,6 +223,7 @@ enc_i32_i64_ld_st(base.load, True, r.ldDisp8, 0x8b)
|
||||
enc_i32_i64_ld_st(base.load, True, r.ldDisp32, 0x8b)
|
||||
|
||||
enc_i32_i64(base.fill, r.fiSib32, 0x8b)
|
||||
enc_i32_i64(base.regfill, r.rfi32, 0x8b)
|
||||
|
||||
enc_i64(base.uload32.i64, r.ld, 0x8b)
|
||||
enc_i64(base.uload32.i64, r.ldDisp8, 0x8b)
|
||||
@@ -268,10 +270,14 @@ enc_both(base.store.f64.any, r.fstDisp8, 0x66, 0x0f, 0xd6)
|
||||
enc_both(base.store.f64.any, r.fstDisp32, 0x66, 0x0f, 0xd6)
|
||||
|
||||
enc_both(base.fill.f32, r.ffiSib32, 0x66, 0x0f, 0x6e)
|
||||
enc_both(base.regfill.f32, r.frfi32, 0x66, 0x0f, 0x6e)
|
||||
enc_both(base.fill.f64, r.ffiSib32, 0xf3, 0x0f, 0x7e)
|
||||
enc_both(base.regfill.f64, r.frfi32, 0xf3, 0x0f, 0x7e)
|
||||
|
||||
enc_both(base.spill.f32, r.fspSib32, 0x66, 0x0f, 0x7e)
|
||||
enc_both(base.regspill.f32, r.frsp32, 0x66, 0x0f, 0x7e)
|
||||
enc_both(base.spill.f64, r.fspSib32, 0x66, 0x0f, 0xd6)
|
||||
enc_both(base.regspill.f64, r.frsp32, 0x66, 0x0f, 0xd6)
|
||||
|
||||
#
|
||||
# Function addresses.
|
||||
|
||||
@@ -8,7 +8,8 @@ from cdsl.registers import RegClass
|
||||
from base.formats import Unary, UnaryImm, Binary, BinaryImm, MultiAry
|
||||
from base.formats import Trap, Call, IndirectCall, Store, Load
|
||||
from base.formats import IntCompare, FloatCompare
|
||||
from base.formats import RegMove, Ternary, Jump, Branch, FuncAddr
|
||||
from base.formats import Ternary, Jump, Branch, FuncAddr
|
||||
from base.formats import RegMove, RegSpill, RegFill
|
||||
from .registers import GPR, ABCD, FPR, GPR8, FPR8, StackGPR32, StackFPR32
|
||||
from .defs import supported_floatccs
|
||||
|
||||
@@ -570,6 +571,28 @@ fspSib32 = TailRecipe(
|
||||
sink.put4(out_stk0.offset as u32);
|
||||
''')
|
||||
|
||||
# Regspill using RSP-relative addressing.
|
||||
rsp32 = TailRecipe(
|
||||
'rsp32', RegSpill, size=6, ins=GPR, outs=(),
|
||||
emit='''
|
||||
let dst = StackRef::sp(dst, &func.stack_slots);
|
||||
let base = stk_base(dst.base);
|
||||
PUT_OP(bits, rex2(base, src), sink);
|
||||
modrm_sib_disp32(src, sink);
|
||||
sib_noindex(base, sink);
|
||||
sink.put4(dst.offset as u32);
|
||||
''')
|
||||
frsp32 = TailRecipe(
|
||||
'frsp32', RegSpill, size=6, ins=FPR, outs=(),
|
||||
emit='''
|
||||
let dst = StackRef::sp(dst, &func.stack_slots);
|
||||
let base = stk_base(dst.base);
|
||||
PUT_OP(bits, rex2(base, src), sink);
|
||||
modrm_sib_disp32(src, sink);
|
||||
sib_noindex(base, sink);
|
||||
sink.put4(dst.offset as u32);
|
||||
''')
|
||||
|
||||
#
|
||||
# Load recipes
|
||||
#
|
||||
@@ -656,6 +679,28 @@ ffiSib32 = TailRecipe(
|
||||
sink.put4(in_stk0.offset as u32);
|
||||
''')
|
||||
|
||||
# Regfill with RSP-relative 32-bit displacement.
|
||||
rfi32 = TailRecipe(
|
||||
'rfi32', RegFill, size=6, ins=StackGPR32, outs=(),
|
||||
emit='''
|
||||
let src = StackRef::sp(src, &func.stack_slots);
|
||||
let base = stk_base(src.base);
|
||||
PUT_OP(bits, rex2(base, dst), sink);
|
||||
modrm_sib_disp32(dst, sink);
|
||||
sib_noindex(base, sink);
|
||||
sink.put4(src.offset as u32);
|
||||
''')
|
||||
frfi32 = TailRecipe(
|
||||
'frfi32', RegFill, size=6, ins=StackFPR32, outs=(),
|
||||
emit='''
|
||||
let src = StackRef::sp(src, &func.stack_slots);
|
||||
let base = stk_base(src.base);
|
||||
PUT_OP(bits, rex2(base, dst), sink);
|
||||
modrm_sib_disp32(dst, sink);
|
||||
sib_noindex(base, sink);
|
||||
sink.put4(src.offset as u32);
|
||||
''')
|
||||
|
||||
#
|
||||
# Call/return
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user