Author: wmb Date: Mon Jan 17 22:44:52 2011 New Revision: 2110 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2110
Log: X86 assembler - added imul-imm and imul2 for assembling alternative forms of the IMUL instruction. Trying to work out the instruction form automatically from the operands is just too hard.
Modified: cpu/x86/assem.fth
Modified: cpu/x86/assem.fth ============================================================================== --- cpu/x86/assem.fth Mon Jan 17 07:20:26 2011 (r2109) +++ cpu/x86/assem.fth Mon Jan 17 22:44:52 2011 (r2110) @@ -749,6 +749,25 @@ : rdmsr ( -- ) prefix-0f h# 32 asm8, ; : cpuid ( -- ) prefix-0f h# a2 asm8, ; \ Arg in %eax, results in ax,bx,dx,cx
+: imul2 ( MR REG -- ) \ REG <- REG * R/M + prefix-0f h# AF asm8, r/m, +; + +: imul-imm ( imm # MR REG -- ) \ REG <- R/M * imm16/32 "500 # bx cx imul-imm" + here >r ( imm # MR r: adr ) + h# 69 asm8, ( imm # MR ) + r/m, ( imm # ) + # <> abort" Expecting # in imul-imm" ( imm ) + dup big? if ( imm r: adr ) + 16bit? if asm16, else asm32, then ( r: adr ) + r> drop ( ) + else ( imm r: adr ) + asm8, ( r: adr ) + \ Change the opcode from 69 to 6b + h# 6b r> asm8! ( ) + then +; + \ Structured Conditionals \ single pass forces fixed size. optimize for small, fast structures: \ always use 8-bit offsets.