Skip to content
  1. Sep 20, 2006
    • Chris Lattner's avatar
      Legalize is no longer limited to cleverness with just constant shift amounts. · 601b8651
      Chris Lattner authored
      Allow it to be clever when possible and fall back to the gross code when needed.
      
      This allows us to compile:
      
      long long foo1(long long X, int C) {
        return X << (C|32);
      }
      long long foo2(long long X, int C) {
        return X << (C&~32);
      }
      
      to:
      _foo1:
              rlwinm r2, r5, 0, 27, 31
              slw r3, r4, r2
              li r4, 0
              blr
      
      
              .globl  _foo2
              .align  4
      _foo2:
              rlwinm r2, r5, 0, 27, 25
              subfic r5, r2, 32
              slw r3, r3, r2
              srw r5, r4, r5
              or r3, r3, r5
              slw r4, r4, r2
              blr
      
      instead of:
      
      _foo1:
              ori r2, r5, 32
              subfic r5, r2, 32
              addi r6, r2, -32
              srw r5, r4, r5
              slw r3, r3, r2
              slw r6, r4, r6
              or r3, r3, r5
              slw r4, r4, r2
              or r3, r3, r6
              blr
      
      
              .globl  _foo2
              .align  4
      _foo2:
              rlwinm r2, r5, 0, 27, 25
              subfic r5, r2, 32
              addi r6, r2, -32
              srw r5, r4, r5
              slw r3, r3, r2
              slw r6, r4, r6
              or r3, r3, r5
              slw r4, r4, r2
              or r3, r3, r6
              blr
      
      llvm-svn: 30507
      601b8651
    • Chris Lattner's avatar
      Expand 64-bit shifts more optimally if we know that the high bit of the · 875ea0cd
      Chris Lattner authored
      shift amount is one or zero.  For example, for:
      
      long long foo1(long long X, int C) {
        return X << (C|32);
      }
      
      long long foo2(long long X, int C) {
        return X << (C&~32);
      }
      
      we get:
      
      _foo1:
              movb $31, %cl
              movl 4(%esp), %edx
              andb 12(%esp), %cl
              shll %cl, %edx
              xorl %eax, %eax
              ret
      _foo2:
              movb $223, %cl
              movl 4(%esp), %eax
              movl 8(%esp), %edx
              andb 12(%esp), %cl
              shldl %cl, %eax, %edx
              shll %cl, %eax
              ret
      
      instead of:
      
      _foo1:
              subl $4, %esp
              movl %ebx, (%esp)
              movb $32, %bl
              movl 8(%esp), %eax
              movl 12(%esp), %edx
              movb %bl, %cl
              orb 16(%esp), %cl
              shldl %cl, %eax, %edx
              shll %cl, %eax
              xorl %ecx, %ecx
              testb %bl, %bl
              cmovne %eax, %edx
              cmovne %ecx, %eax
              movl (%esp), %ebx
              addl $4, %esp
              ret
      _foo2:
              subl $4, %esp
              movl %ebx, (%esp)
              movb $223, %cl
              movl 8(%esp), %eax
              movl 12(%esp), %edx
              andb 16(%esp), %cl
              shldl %cl, %eax, %edx
              shll %cl, %eax
              xorl %ecx, %ecx
              xorb %bl, %bl
              testb %bl, %bl
              cmovne %eax, %edx
              cmovne %ecx, %eax
              movl (%esp), %ebx
              addl $4, %esp
              ret
      
      llvm-svn: 30506
      875ea0cd
    • Evan Cheng's avatar
      cd3f6ff0
    • Evan Cheng's avatar
      80 col. · 453280b9
      Evan Cheng authored
      llvm-svn: 30504
      453280b9
  2. Sep 19, 2006
  3. Sep 18, 2006
Loading