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