129 lines
4.3 KiB
Factor
129 lines
4.3 KiB
Factor
USING: compiler.cfg.registers cpu.x86.assembler
|
|
cpu.x86.assembler.operands cpu.x86.assembler.operands.private
|
|
help.markup help.syntax layouts math sequences system ;
|
|
IN: cpu.x86
|
|
|
|
HELP: %boolean
|
|
{ $values
|
|
{ "dst" "register" }
|
|
{ "cc" "comparision symbol" }
|
|
{ "temp" "temporary register" }
|
|
}
|
|
{ $description "Helper word for emitting conditional move instructions." }
|
|
{ $see-also CMOVL CMOVLE CMOVG CMOVGE CMOVE CMOVNE } ;
|
|
|
|
HELP: %prepare-var-args
|
|
{ $values { "reg-inputs" sequence } }
|
|
{ $description "Emits code needed for calling variadic functions. On " { $link unix } " " { $link x86.64 } ", the " { $link AL } " register must contain the number of float registers used. " } ;
|
|
|
|
HELP: JLE
|
|
{ $values { "dst" "destination offset (relative to the instruction pointer register)" } }
|
|
{ $description "Emits a 'jle' instruction." } ;
|
|
|
|
HELP: reserved-stack-space
|
|
{ $values { "n" integer } }
|
|
{ $description "Size in bytes of the register parameter area. It only exists on the windows " { $link x86.64 } " architecture, where it is 32 bytes and allocated by the caller. On all other platforms it is 0." } ;
|
|
|
|
HELP: stack-reg
|
|
{ $values { "reg" "a register symbol" } }
|
|
{ $description
|
|
"Symbol of the machine register that holds the (cpu) stack address."
|
|
} ;
|
|
|
|
HELP: ds-reg
|
|
{ $values { "reg" "a register symbol" } }
|
|
{ $description
|
|
"Symbol of the machine register that holds the address to the data stack's location."
|
|
} ;
|
|
|
|
HELP: (%inc)
|
|
{ $values { "n" number } { "reg" "a register symbol" } }
|
|
{ $description
|
|
"Emits machine code for increasing or decreasing the given register a number of cell sizes bytes."
|
|
}
|
|
{ $examples
|
|
{ $unchecked-example
|
|
"USING: cpu.x86 make prettyprint ;"
|
|
"[ 8 ECX (%inc) ] B{ } make disassemble"
|
|
"00000000615e5140: 83c140 add ecx, 0x40"
|
|
}
|
|
} ;
|
|
|
|
HELP: (%slot)
|
|
{ $values
|
|
{ "obj" "a register symbol" }
|
|
{ "slot" "a register symbol" }
|
|
{ "scale" "number of bits required to address all bytes in a " { $link cell } "." }
|
|
{ "tag" integer }
|
|
{ "op" indirect }
|
|
}
|
|
{ $description "Creates an indirect operand for addressing a slot in a container." }
|
|
{ $examples
|
|
{ $unchecked-example
|
|
"USING: cpu.x86 ;"
|
|
"[ RAX RBX 3 -14 (%slot) EDI MOV ] B{ } make disassemble"
|
|
"0000000001dd0990: 897cd80e mov [rax+rbx*8+0xe], edi"
|
|
}
|
|
} ;
|
|
|
|
HELP: decr-stack-reg
|
|
{ $values { "n" number } }
|
|
{ $description "Emits an instruction for decrementing the stack register the given number of bytes. If n is equal to the " { $link cell } " size, then a " { $link PUSH } " instruction is emitted instead because it has a shorter encoding." } ;
|
|
|
|
HELP: incr-stack-reg
|
|
{ $values { "n" number } }
|
|
{ $description "Emits an instruction for incrementing the stack register the given number of bytes. If n is equal to the " { $link cell } " size, then a " { $link POP } " instruction is emitted instead because it has a shorter encoding." } ;
|
|
|
|
HELP: load-zone-offset
|
|
{ $values { "nursery-ptr" "a register symbol" } }
|
|
{ $description
|
|
"Emits machine code for loading the address to the nursery into the machine register."
|
|
}
|
|
{ $examples
|
|
{ $unchecked-example
|
|
"USING: cpu.x86 make ;"
|
|
"[ RCX load-zone-offset ] B{ } make disassemble"
|
|
"0000000001b48f80: 498d4d10 lea rcx, [r13+0x10]"
|
|
}
|
|
} ;
|
|
|
|
HELP: loc>operand
|
|
{ $values { "loc" loc } { "operand" indirect } }
|
|
{ $description "Converts a stack location to an operand passable to the " { $link MOV } " instruction." } ;
|
|
|
|
HELP: store-tagged
|
|
{ $values { "dst" "a register symbol" } { "tag" "a builtin class" } }
|
|
{ $description "Tags the register with the tag number for the given class." }
|
|
{ $examples
|
|
{ $unchecked-example
|
|
"USING: cpu.x86 make ;"
|
|
"[ RAX alien store-tagged ] B{ } make disassemble"
|
|
"0000000002275f10: 4883c806 or rax, 0x6"
|
|
}
|
|
} ;
|
|
|
|
HELP: copy-register*
|
|
{ $values
|
|
{ "dst" "a register symbol" }
|
|
{ "src" "a register symbol" }
|
|
{ "rep" "a value representation singleton" }
|
|
}
|
|
{ $description
|
|
"Emits machine code for copying from a register to another."
|
|
}
|
|
{ $examples
|
|
{ $unchecked-example
|
|
"USING: cpu.x86 make ;"
|
|
"[ XMM1 XMM2 double-rep copy-register* ] B{ } make disassemble"
|
|
"0000000533c61fe0: 0f28ca movaps xmm1, xmm2"
|
|
}
|
|
} ;
|
|
|
|
ARTICLE: "cpu.x86" "CPU x86 compiler backend"
|
|
"Implementation of " { $vocab-link "cpu.architecture" } " for x86 machines."
|
|
$nl
|
|
{ $link ADD } " and " { $link SUB } " variants:"
|
|
{ $subsections (%inc) decr-stack-reg incr-stack-reg } ;
|
|
|
|
ABOUT: "cpu.x86"
|