diff options
| author | David Goodwin <david_goodwin@apple.com> | 2009-07-01 00:01:13 +0000 | 
|---|---|---|
| committer | David Goodwin <david_goodwin@apple.com> | 2009-07-01 00:01:13 +0000 | 
| commit | 86c7e20ca6aaa4049dd2be489bbd8f5acecf95e6 (patch) | |
| tree | dc08259948610d03ab8b5241df45c9022d86ce61 | |
| parent | 89026b501810331593b0704b88c99936588af181 (diff) | |
| download | bcm5719-llvm-86c7e20ca6aaa4049dd2be489bbd8f5acecf95e6.tar.gz bcm5719-llvm-86c7e20ca6aaa4049dd2be489bbd8f5acecf95e6.zip | |
Add PIC load and store patterns for Thumb-2.
llvm-svn: 74577
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb2.td | 28 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Thumb2/load-global.ll | 14 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Thumb2/tls1.ll | 20 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Thumb2/tls2.ll | 19 | 
4 files changed, 79 insertions, 2 deletions
| diff --git a/llvm/lib/Target/ARM/ARMInstrThumb2.td b/llvm/lib/Target/ARM/ARMInstrThumb2.td index 2bc71f87310..e135c8153a5 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb2.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb2.td @@ -419,6 +419,18 @@ multiclass T2I_st<string opc, PatFrag opnode> {                     [(opnode GPR:$src, t2addrmode_so_reg:$addr)]>;  } +/// T2I_picld - Defines the PIC load pattern. +class T2I_picld<string opc, PatFrag opnode> : +      T2I<(outs GPR:$dst), (ins addrmodepc:$addr), +          !strconcat("${addr:label}:\n\t", opc), " $dst, $addr", +          [(set GPR:$dst, (opnode addrmodepc:$addr))]>; + +/// T2I_picst - Defines the PIC store pattern. +class T2I_picst<string opc, PatFrag opnode> : +      T2I<(outs), (ins GPR:$src, addrmodepc:$addr), +          !strconcat("${addr:label}:\n\t", opc), " $src, $addr", +          [(opnode GPR:$src, addrmodepc:$addr)]>; +  //===----------------------------------------------------------------------===//  // Instructions  //===----------------------------------------------------------------------===// @@ -539,6 +551,22 @@ let mayLoad = 1 in  def t2STRDi8 : T2Ii8s4<(outs), (ins GPR:$src, t2addrmode_imm8s4:$addr),                          "strd", " $src, $addr", []>; + +// Address computation and loads and stores in PIC mode. +let isNotDuplicable = 1, AddedComplexity = 10 in { +let canFoldAsLoad = 1 in +def t2PICLDR   : T2I_picld<"ldr",  UnOpFrag<(load node:$Src)>>; + +def t2PICLDRH  : T2I_picld<"ldrh", UnOpFrag<(zextloadi16 node:$Src)>>; +def t2PICLDRB  : T2I_picld<"ldrb", UnOpFrag<(zextloadi8 node:$Src)>>; +def t2PICLDRSH : T2I_picld<"ldrsh", UnOpFrag<(sextloadi16 node:$Src)>>; +def t2PICLDRSB : T2I_picld<"ldrsb", UnOpFrag<(sextloadi8 node:$Src)>>; + +def t2PICSTR   : T2I_picst<"str", BinOpFrag<(store node:$LHS, node:$RHS)>>; +def t2PICSTRH  : T2I_picst<"strh", BinOpFrag<(truncstorei16 node:$LHS, node:$RHS)>>; +def t2PICSTRB  : T2I_picst<"strb", BinOpFrag<(truncstorei8 node:$LHS, node:$RHS)>>; +} // isNotDuplicable = 1, AddedComplexity = 10 +  //===----------------------------------------------------------------------===//  //  Move Instructions.  // diff --git a/llvm/test/CodeGen/Thumb2/load-global.ll b/llvm/test/CodeGen/Thumb2/load-global.ll index 0ffcb9575d5..1b1fe7b1b5f 100644 --- a/llvm/test/CodeGen/Thumb2/load-global.ll +++ b/llvm/test/CodeGen/Thumb2/load-global.ll @@ -1,5 +1,15 @@ -; RUN: llvm-as < %s | llc -mtriple=thumbv7-apple-darwin -; RUN: llvm-as < %s | llc -mtriple=thumbv7-apple-darwin -relocation-model=pic | grep add | grep pc +; RUN: llvm-as < %s | \ +; RUN:   llc -mtriple=thumbv7-apple-darwin -relocation-model=static | \ +; RUN:   not grep {L_G\$non_lazy_ptr} +; RUN: llvm-as < %s | \ +; RUN:   llc -mtriple=thumbv7-apple-darwin -relocation-model=dynamic-no-pic | \ +; RUN:   grep {L_G\$non_lazy_ptr} | count 2 +; RUN: llvm-as < %s | \ +; RUN:   llc -mtriple=thumbv7-apple-darwin -relocation-model=pic | \ +; RUN:   grep {ldr.*pc} | count 1 +; RUN: llvm-as < %s | \ +; RUN:   llc -mtriple=thumbv7-linux-gnueabi -relocation-model=pic | \ +; RUN:   grep {GOT} | count 1  @G = external global i32 diff --git a/llvm/test/CodeGen/Thumb2/tls1.ll b/llvm/test/CodeGen/Thumb2/tls1.ll new file mode 100644 index 00000000000..6abb6eba630 --- /dev/null +++ b/llvm/test/CodeGen/Thumb2/tls1.ll @@ -0,0 +1,20 @@ +; RUN: llvm-as < %s | llc -mtriple=thumbv7-linux-gnueabi | \ +; RUN:     grep {i(tpoff)} +; RUN: llvm-as < %s | llc -mtriple=thumbv7-linux-gnueabi | \ +; RUN:     grep {__aeabi_read_tp} +; RUN: llvm-as < %s | llc -mtriple=thumbv7-linux-gnueabi \ +; RUN:     -relocation-model=pic | grep {__tls_get_addr} + + +@i = thread_local global i32 15		; <i32*> [#uses=2] + +define i32 @f() { +entry: +	%tmp1 = load i32* @i		; <i32> [#uses=1] +	ret i32 %tmp1 +} + +define i32* @g() { +entry: +	ret i32* @i +} diff --git a/llvm/test/CodeGen/Thumb2/tls2.ll b/llvm/test/CodeGen/Thumb2/tls2.ll new file mode 100644 index 00000000000..3396b0ba43f --- /dev/null +++ b/llvm/test/CodeGen/Thumb2/tls2.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as < %s | llc -mtriple=thumbv7-linux-gnueabi | \ +; RUN:     grep {i(gottpoff)} +; RUN: llvm-as < %s | llc -mtriple=thumbv7-linux-gnueabi | \ +; RUN:     grep {ldr r., \[pc, r.\]} +; RUN: llvm-as < %s | llc -mtriple=thumbv7-linux-gnueabi \ +; RUN:     -relocation-model=pic | grep {__tls_get_addr} + +@i = external thread_local global i32		; <i32*> [#uses=2] + +define i32 @f() { +entry: +	%tmp1 = load i32* @i		; <i32> [#uses=1] +	ret i32 %tmp1 +} + +define i32* @g() { +entry: +	ret i32* @i +} | 

