Skip to content
  1. Jul 28, 2009
  2. Jul 25, 2009
    • Evan Cheng's avatar
      Change Thumb2 jumptable codegen to one that uses two level jumps: · f3a1fce8
      Evan Cheng authored
      Before:
            adr r12, #LJTI3_0_0
            ldr pc, [r12, +r0, lsl #2]
      LJTI3_0_0:
            .long    LBB3_24
            .long    LBB3_30
            .long    LBB3_31
            .long    LBB3_32
      
      After:
            adr r12, #LJTI3_0_0
            add pc, r12, +r0, lsl #2
      LJTI3_0_0:
            b.w    LBB3_24
            b.w    LBB3_30
            b.w    LBB3_31
            b.w    LBB3_32
      
      This has several advantages.
      1. This will make it easier to optimize this to a TBB / TBH instruction +
         (smaller) table.
      2. This eliminate the need for ugly asm printer hack to force the address
         into thumb addresses (bit 0 is one).
      3. Same codegen for pic and non-pic.
      4. This eliminate the need to align the table so constantpool island pass
         won't have to over-estimate the size.
      
      Based on my calculation, the later is probably slightly faster as well since
      ldr pc with shifter address is very slow. That is, it should be a win as long
      as the HW implementation can do a reasonable job of branch predict the second
      branch.
      
      llvm-svn: 77024
      f3a1fce8
  3. Jul 23, 2009
  4. Jul 22, 2009
  5. Jul 14, 2009
  6. Jul 11, 2009
    • Evan Cheng's avatar
      Major changes to Thumb (not Thumb2). Many 16-bit instructions either modifies... · cd4cdd11
      Evan Cheng authored
      Major changes to Thumb (not Thumb2). Many 16-bit instructions either modifies CPSR  when they are outside the IT blocks, or they can predicated when in Thumb2. Move the implicit def of CPSR to an optional def which defaults CPSR. This allows the 's' bit to be toggled dynamically.
      
      A side-effect of this change is asm printer is now using unified assembly. There are some minor clean ups and fixes as well.
      
      llvm-svn: 75359
      cd4cdd11
  7. Jul 10, 2009
  8. Jul 08, 2009
  9. Jul 07, 2009
  10. Jul 02, 2009
  11. Jun 29, 2009
    • David Goodwin's avatar
      Rename ARMcmpNZ to ARMcmpZ and use it to represent comparisons that set only... · dbf11ba8
      David Goodwin authored
      Rename ARMcmpNZ to ARMcmpZ and use it to represent comparisons that set only the Z flag (i.e. eq and ne). Make ARMcmpZ commutative.
      
      llvm-svn: 74423
      dbf11ba8
    • Evan Cheng's avatar
      Implement Thumb2 ldr. · b23b50d5
      Evan Cheng authored
      After much back and forth, I decided to deviate from ARM design and split LDR into 4 instructions (r + imm12, r + imm8, r + r << imm12, constantpool). The advantage of this is 1) it follows the latest ARM technical manual, and 2) makes it easier to reduce the width of the instruction later. The down side is this creates more inconsistency between the two sub-targets. We should split ARM LDR instruction in a similar fashion later. I've added a README entry for this.
      
      llvm-svn: 74420
      b23b50d5
  12. Jun 26, 2009
  13. Jun 25, 2009
  14. Jun 23, 2009
  15. Jun 22, 2009
  16. Jun 19, 2009
  17. Jun 17, 2009
  18. Jun 15, 2009
    • Anton Korobeynikov's avatar
      Rename methods for the sake of consistency. · 409105fc
      Anton Korobeynikov authored
      llvm-svn: 73428
      409105fc
    • Evan Cheng's avatar
      Part 1. · 1283c6a0
      Evan Cheng authored
      - Change register allocation hint to a pair of unsigned integers. The hint type is zero (which means prefer the register specified as second part of the pair) or entirely target dependent.
      - Allow targets to specify alternative register allocation orders based on allocation hint.
      
      Part 2.
      - Use the register allocation hint system to implement more aggressive load / store multiple formation.
      - Aggressively form LDRD / STRD. These are formed *before* register allocation. It has to be done this way to shorten live interval of base and offset registers. e.g.
      v1025 = LDR v1024, 0
      v1026 = LDR v1024, 0
      =>
      v1025,v1026 = LDRD v1024, 0
      
      If this transformation isn't done before allocation, v1024 will overlap v1025 which means it more difficult to allocate a register pair.
      
      - Even with the register allocation hint, it may not be possible to get the desired allocation. In that case, the post-allocation load / store multiple pass must fix the ldrd / strd instructions. They can either become ldm / stm instructions or back to a pair of ldr / str instructions.
      
      This is work in progress, not yet enabled.
      
      llvm-svn: 73381
      1283c6a0
  19. Jun 12, 2009
  20. May 30, 2009
  21. May 14, 2009
  22. May 13, 2009
  23. Feb 05, 2009
  24. Dec 03, 2008
  25. Nov 14, 2008
Loading