mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
Add thumb-2 store word, halfword, and byte.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74555 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f67799501c
commit
73b8f16b36
@ -399,6 +399,19 @@ multiclass T2I_ld<string opc, PatFrag opnode> {
|
||||
[(set GPR:$dst, (opnode (ARMWrapper tconstpool:$addr)))]>;
|
||||
}
|
||||
|
||||
/// T2I_st - Defines a set of (op r, {imm12|imm8|so_reg}) store patterns.
|
||||
multiclass T2I_st<string opc, PatFrag opnode> {
|
||||
def i12 : T2Ii12<(outs), (ins GPR:$src, t2addrmode_imm12:$addr),
|
||||
opc, " $src, $addr",
|
||||
[(opnode GPR:$src, t2addrmode_imm12:$addr)]>;
|
||||
def i8 : T2Ii8 <(outs), (ins GPR:$src, t2addrmode_imm8:$addr),
|
||||
opc, " $src, $addr",
|
||||
[(opnode GPR:$src, t2addrmode_imm8:$addr)]>;
|
||||
def s : T2Iso <(outs), (ins GPR:$src, t2addrmode_so_reg:$addr),
|
||||
opc, " $src, $addr",
|
||||
[(opnode GPR:$src, t2addrmode_so_reg:$addr)]>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Instructions
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -509,6 +522,11 @@ def : T2Pat<(extloadi16 t2addrmode_so_reg:$addr),
|
||||
def : T2Pat<(extloadi16 (ARMWrapper tconstpool:$addr)),
|
||||
(t2LDRHpci tconstpool:$addr)>;
|
||||
|
||||
// Store
|
||||
defm t2STR : T2I_st<"str", BinOpFrag<(store node:$LHS, node:$RHS)>>;
|
||||
defm t2STRB : T2I_st<"strb", BinOpFrag<(truncstorei8 node:$LHS, node:$RHS)>>;
|
||||
defm t2STRH : T2I_st<"strh", BinOpFrag<(truncstorei16 node:$LHS, node:$RHS)>>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Move Instructions.
|
||||
//
|
||||
|
63
test/CodeGen/Thumb2/thumb2-str.ll
Normal file
63
test/CodeGen/Thumb2/thumb2-str.ll
Normal file
@ -0,0 +1,63 @@
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {str\\W*r\[0-9\],\\W*\\\[r\[0-9\]*\\\]$} | count 1
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {str\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#+4092\\\]$} | count 1
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {str\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#-128\\\]$} | count 2
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | not grep {str\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#+4096\\\]$}
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {str\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*+r\[0-9\]*\\\]$} | count 3
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {str\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*+r\[0-9\]*,\\Wlsl #2\\\]$} | count 1
|
||||
|
||||
define i32 @f1(i32 %a, i32* %v) {
|
||||
store i32 %a, i32* %v
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
define i32 @f2(i32 %a, i32* %v) {
|
||||
%tmp2 = getelementptr i32* %v, i32 1023
|
||||
store i32 %a, i32* %tmp2
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
define i32 @f2a(i32 %a, i32* %v) {
|
||||
%tmp2 = getelementptr i32* %v, i32 -32
|
||||
store i32 %a, i32* %tmp2
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
define i32 @f3(i32 %a, i32* %v) {
|
||||
%tmp2 = getelementptr i32* %v, i32 1024
|
||||
store i32 %a, i32* %tmp2
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
define i32 @f4(i32 %a, i32 %base) {
|
||||
entry:
|
||||
%tmp1 = sub i32 %base, 128
|
||||
%tmp2 = inttoptr i32 %tmp1 to i32*
|
||||
store i32 %a, i32* %tmp2
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
define i32 @f5(i32 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = add i32 %base, %offset
|
||||
%tmp2 = inttoptr i32 %tmp1 to i32*
|
||||
store i32 %a, i32* %tmp2
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
define i32 @f6(i32 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = shl i32 %offset, 2
|
||||
%tmp2 = add i32 %base, %tmp1
|
||||
%tmp3 = inttoptr i32 %tmp2 to i32*
|
||||
store i32 %a, i32* %tmp3
|
||||
ret i32 %a
|
||||
}
|
||||
|
||||
define i32 @f7(i32 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = lshr i32 %offset, 2
|
||||
%tmp2 = add i32 %base, %tmp1
|
||||
%tmp3 = inttoptr i32 %tmp2 to i32*
|
||||
store i32 %a, i32* %tmp3
|
||||
ret i32 %a
|
||||
}
|
63
test/CodeGen/Thumb2/thumb2-strb.ll
Normal file
63
test/CodeGen/Thumb2/thumb2-strb.ll
Normal file
@ -0,0 +1,63 @@
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strb\\W*r\[0-9\],\\W*\\\[r\[0-9\]*\\\]$} | count 1
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strb\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#+4092\\\]$} | count 1
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strb\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#-128\\\]$} | count 2
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | not grep {strb\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#+4096\\\]$}
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strb\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*+r\[0-9\]*\\\]$} | count 3
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strb\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*+r\[0-9\]*,\\Wlsl #2\\\]$} | count 1
|
||||
|
||||
define i8 @f1(i8 %a, i8* %v) {
|
||||
store i8 %a, i8* %v
|
||||
ret i8 %a
|
||||
}
|
||||
|
||||
define i8 @f2(i8 %a, i8* %v) {
|
||||
%tmp2 = getelementptr i8* %v, i32 4092
|
||||
store i8 %a, i8* %tmp2
|
||||
ret i8 %a
|
||||
}
|
||||
|
||||
define i8 @f2a(i8 %a, i8* %v) {
|
||||
%tmp2 = getelementptr i8* %v, i32 -128
|
||||
store i8 %a, i8* %tmp2
|
||||
ret i8 %a
|
||||
}
|
||||
|
||||
define i8 @f3(i8 %a, i8* %v) {
|
||||
%tmp2 = getelementptr i8* %v, i32 4096
|
||||
store i8 %a, i8* %tmp2
|
||||
ret i8 %a
|
||||
}
|
||||
|
||||
define i8 @f4(i8 %a, i32 %base) {
|
||||
entry:
|
||||
%tmp1 = sub i32 %base, 128
|
||||
%tmp2 = inttoptr i32 %tmp1 to i8*
|
||||
store i8 %a, i8* %tmp2
|
||||
ret i8 %a
|
||||
}
|
||||
|
||||
define i8 @f5(i8 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = add i32 %base, %offset
|
||||
%tmp2 = inttoptr i32 %tmp1 to i8*
|
||||
store i8 %a, i8* %tmp2
|
||||
ret i8 %a
|
||||
}
|
||||
|
||||
define i8 @f6(i8 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = shl i32 %offset, 2
|
||||
%tmp2 = add i32 %base, %tmp1
|
||||
%tmp3 = inttoptr i32 %tmp2 to i8*
|
||||
store i8 %a, i8* %tmp3
|
||||
ret i8 %a
|
||||
}
|
||||
|
||||
define i8 @f7(i8 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = lshr i32 %offset, 2
|
||||
%tmp2 = add i32 %base, %tmp1
|
||||
%tmp3 = inttoptr i32 %tmp2 to i8*
|
||||
store i8 %a, i8* %tmp3
|
||||
ret i8 %a
|
||||
}
|
63
test/CodeGen/Thumb2/thumb2-strh.ll
Normal file
63
test/CodeGen/Thumb2/thumb2-strh.ll
Normal file
@ -0,0 +1,63 @@
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strh\\W*r\[0-9\],\\W*\\\[r\[0-9\]*\\\]$} | count 1
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strh\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#+4092\\\]$} | count 1
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strh\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#-128\\\]$} | count 2
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | not grep {strh\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*#+4096\\\]$}
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strh\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*+r\[0-9\]*\\\]$} | count 3
|
||||
; RUN: llvm-as < %s | llc -march=thumb -mattr=+thumb2 | grep {strh\\W*r\[0-9\],\\W*\\\[r\[0-9\]*,\\W*+r\[0-9\]*,\\Wlsl #2\\\]$} | count 1
|
||||
|
||||
define i16 @f1(i16 %a, i16* %v) {
|
||||
store i16 %a, i16* %v
|
||||
ret i16 %a
|
||||
}
|
||||
|
||||
define i16 @f2(i16 %a, i16* %v) {
|
||||
%tmp2 = getelementptr i16* %v, i32 2046
|
||||
store i16 %a, i16* %tmp2
|
||||
ret i16 %a
|
||||
}
|
||||
|
||||
define i16 @f2a(i16 %a, i16* %v) {
|
||||
%tmp2 = getelementptr i16* %v, i32 -64
|
||||
store i16 %a, i16* %tmp2
|
||||
ret i16 %a
|
||||
}
|
||||
|
||||
define i16 @f3(i16 %a, i16* %v) {
|
||||
%tmp2 = getelementptr i16* %v, i32 2048
|
||||
store i16 %a, i16* %tmp2
|
||||
ret i16 %a
|
||||
}
|
||||
|
||||
define i16 @f4(i16 %a, i32 %base) {
|
||||
entry:
|
||||
%tmp1 = sub i32 %base, 128
|
||||
%tmp2 = inttoptr i32 %tmp1 to i16*
|
||||
store i16 %a, i16* %tmp2
|
||||
ret i16 %a
|
||||
}
|
||||
|
||||
define i16 @f5(i16 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = add i32 %base, %offset
|
||||
%tmp2 = inttoptr i32 %tmp1 to i16*
|
||||
store i16 %a, i16* %tmp2
|
||||
ret i16 %a
|
||||
}
|
||||
|
||||
define i16 @f6(i16 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = shl i32 %offset, 2
|
||||
%tmp2 = add i32 %base, %tmp1
|
||||
%tmp3 = inttoptr i32 %tmp2 to i16*
|
||||
store i16 %a, i16* %tmp3
|
||||
ret i16 %a
|
||||
}
|
||||
|
||||
define i16 @f7(i16 %a, i32 %base, i32 %offset) {
|
||||
entry:
|
||||
%tmp1 = lshr i32 %offset, 2
|
||||
%tmp2 = add i32 %base, %tmp1
|
||||
%tmp3 = inttoptr i32 %tmp2 to i16*
|
||||
store i16 %a, i16* %tmp3
|
||||
ret i16 %a
|
||||
}
|
Loading…
Reference in New Issue
Block a user