Skip to content
  • Chris Lattner's avatar
    it turns out that when ".with.overflow" intrinsics were added to the X86 · 364bb0a0
    Chris Lattner authored
    backend that they were all implemented except umul.  This one fell back
    to the default implementation that did a hi/lo multiply and compared the
    top.  Fix this to check the overflow flag that the 'mul' instruction
    sets, so we can avoid an explicit test.  Now we compile:
    
    void *func(long count) {
          return new int[count];
    }
    
    into:
    
    __Z4funcl:                              ## @_Z4funcl
    	movl	$4, %ecx                ## encoding: [0xb9,0x04,0x00,0x00,0x00]
    	movq	%rdi, %rax              ## encoding: [0x48,0x89,0xf8]
    	mulq	%rcx                    ## encoding: [0x48,0xf7,0xe1]
    	seto	%cl                     ## encoding: [0x0f,0x90,0xc1]
    	testb	%cl, %cl                ## encoding: [0x84,0xc9]
    	movq	$-1, %rdi               ## encoding: [0x48,0xc7,0xc7,0xff,0xff,0xff,0xff]
    	cmoveq	%rax, %rdi              ## encoding: [0x48,0x0f,0x44,0xf8]
    	jmp	__Znam                  ## TAILCALL
    
    instead of:
    
    __Z4funcl:                              ## @_Z4funcl
    	movl	$4, %ecx                ## encoding: [0xb9,0x04,0x00,0x00,0x00]
    	movq	%rdi, %rax              ## encoding: [0x48,0x89,0xf8]
    	mulq	%rcx                    ## encoding: [0x48,0xf7,0xe1]
    	testq	%rdx, %rdx              ## encoding: [0x48,0x85,0xd2]
    	movq	$-1, %rdi               ## encoding: [0x48,0xc7,0xc7,0xff,0xff,0xff,0xff]
    	cmoveq	%rax, %rdi              ## encoding: [0x48,0x0f,0x44,0xf8]
    	jmp	__Znam                  ## TAILCALL
    
    Other than the silly seto+test, this is using the o bit directly, so it's going in the right
    direction.
    
    llvm-svn: 120935
    364bb0a0
Loading