[lreg, local, scratch("?")] -> { x86_mov_reg_reg(inst, $3, $1, 4); x86_imul_reg_membase(inst, $3, X86_EBP, $2 + 4); x86_imul_reg_membase(inst, %1, X86_EBP, $2); x86_alu_reg_reg(inst, X86_ADD, %1, $3); if(%1==X86_EDX || %1 == X86_EAX) x86_mov_reg_reg(inst, $3, %1, 4); if($1!=X86_EAX) x86_mov_reg_reg(inst, X86_EAX, $1, 4); x86_mul_membase(inst, X86_EBP, $2, 0); if(%1==X86_EDX || %1 == X86_EAX) { x86_alu_reg_reg(inst, X86_ADD, $3, X86_EDX); x86_mov_reg_reg(inst, %1, $3, 4); } else { x86_alu_reg_reg(inst, X86_ADD, %1, X86_EDX); } if($1!=X86_EAX) x86_mov_reg_reg(inst, $1, X86_EAX, 4); } [lreg, lreg, scratch("?")] -> } i thought of sometning like this: source1 : S1L : S1H source2: S2L : S2H temp: RH S1L * S2H -> RH /* RH = low dword of the multiply resulr */ S1H * S2L -> eax /* eax = low dword of result */ RH += eax /* RH S1L * S2L -> eax: edx edx += RH result in eax:edx