Skip to content
  1. Apr 10, 2004
  2. Apr 09, 2004
  3. Apr 08, 2004
    • John Criswell's avatar
      Added the llvm.readport and llvm.writeport intrinsics for x86. These do · 10db062d
      John Criswell authored
      I/O port instructions on x86.  The specific code sequence is tailored to
      the parameters and return value of the intrinsic call.
      Added the ability for implicit defintions to be printed in the Instruction
      Printer.
      Added the ability for RawFrm instruction to print implict uses and
      defintions with correct comma output.  This required adjustment to some
      methods so that a leading comma would or would not be printed.
      
      llvm-svn: 12782
      10db062d
  4. Apr 07, 2004
  5. Apr 06, 2004
    • Jakub Staszak's avatar
      · b8955205
      Jakub Staszak authored
      file based off InstSelectSimple.cpp, slowly being replaced by generated code from the really simple X86 instruction selector tablegen backend
      
      llvm-svn: 12715
      b8955205
    • Jakub Staszak's avatar
      · de647007
      Jakub Staszak authored
      Tablgen files for really simple instruction selector
      
      llvm-svn: 12714
      de647007
    • Chris Lattner's avatar
      Fix PR313: [x86] JIT miscompiles unsigned short to floating point · 4b936125
      Chris Lattner authored
      llvm-svn: 12711
      4b936125
    • Chris Lattner's avatar
      Fix incorrect encoding of some ADC and SBB instuctions · ba33ae58
      Chris Lattner authored
      llvm-svn: 12710
      ba33ae58
    • Chris Lattner's avatar
      Fix a minor bug in previous checking · 19c8b13e
      Chris Lattner authored
      Enable folding of long seteq/setne comparisons into branches and select instructions
      Implement unfolded long relational comparisons against a constants a bit more efficiently
      
      Folding comparisons changes code that looks like this:
              mov %EAX, DWORD PTR [%ESP + 4]
              mov %EDX, DWORD PTR [%ESP + 8]
              mov %ECX, %EAX
              or %ECX, %EDX
              sete %CL
              test %CL, %CL
              je .LBB2 # PC rel: F
      
      into code that looks like this:
              mov %EAX, DWORD PTR [%ESP + 4]
              mov %EDX, DWORD PTR [%ESP + 8]
              mov %ECX, %EAX
              or %ECX, %EDX
              jne .LBB2 # PC rel: F
      
      This speeds up 186.crafty by 6% with llc-ls.
      
      llvm-svn: 12702
      19c8b13e
    • Chris Lattner's avatar
      Improve codegen of long == and != comparisons against constants. Before, · f2ee88eb
      Chris Lattner authored
      comparing a long against zero got us this:
      
              sub %ESP, 8
              mov DWORD PTR [%ESP + 4], %ESI
              mov DWORD PTR [%ESP], %EDI
              mov %EAX, DWORD PTR [%ESP + 12]
              mov %EDX, DWORD PTR [%ESP + 16]
              mov %ECX, 0
              mov %ESI, 0
              mov %EDI, %EAX
              xor %EDI, %ECX
              mov %ECX, %EDX
              xor %ECX, %ESI
              or %EDI, %ECX
              sete %CL
              test %CL, %CL
              je .LBB2 # PC rel: F
      
      Now it gets us this:
      
              mov %EAX, DWORD PTR [%ESP + 4]
              mov %EDX, DWORD PTR [%ESP + 8]
              mov %ECX, %EAX
              or %ECX, %EDX
              sete %CL
              test %CL, %CL
              je .LBB2 # PC rel: F
      
      llvm-svn: 12696
      f2ee88eb
    • Chris Lattner's avatar
      Handle various other important cases of multiplying a long constant immediate. For · 6c3bf13f
      Chris Lattner authored
      example, multiplying X*(1 + (1LL << 32)) now produces:
      
      test:
              mov %ECX, DWORD PTR [%ESP + 4]
              mov %EDX, DWORD PTR [%ESP + 8]
              mov %EAX, %ECX
              add %EDX, %ECX
              ret
      
      [[[Note to Alkis: why isn't linear scan generating this code??  This might be a
       problem with your intervals being too conservative:
      
      test:
              mov %EAX, DWORD PTR [%ESP + 4]
              mov %EDX, DWORD PTR [%ESP + 8]
              add %EDX, %EAX
              ret
      
      end note]]]
      
      Whereas GCC produces this:
      
      T:
              sub     %esp, 12
              mov     %edx, DWORD PTR [%esp+16]
              mov     DWORD PTR [%esp+8], %edi
              mov     %ecx, DWORD PTR [%esp+20]
              xor     %edi, %edi
              mov     DWORD PTR [%esp], %ebx
              mov     %ebx, %edi
              mov     %eax, %edx
              mov     DWORD PTR [%esp+4], %esi
              add     %ebx, %edx
              mov     %edi, DWORD PTR [%esp+8]
              lea     %edx, [%ecx+%ebx]
              mov     %esi, DWORD PTR [%esp+4]
              mov     %ebx, DWORD PTR [%esp]
              add     %esp, 12
              ret
      
      I'm not sure example what GCC is smoking here, but it looks like it has just
      confused itself with a bunch of stack slots or something.  The intel compiler
      is better, but still not good:
      
      T:
              movl      4(%esp), %edx                                 #2.11
              movl      8(%esp), %eax                                 #2.11
              lea       (%eax,%edx), %ecx                             #3.12
              movl      $1, %eax                                      #3.12
              mull      %edx                                          #3.12
              addl      %ecx, %edx                                    #3.12
              ret                                                     #3.12
      
      llvm-svn: 12693
      6c3bf13f
Loading