aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGen/ARC
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen/ARC')
-rw-r--r--test/CodeGen/ARC/alu.ll255
-rw-r--r--test/CodeGen/ARC/brcc.ll37
-rw-r--r--test/CodeGen/ARC/call.ll88
-rw-r--r--test/CodeGen/ARC/ldst.ll272
-rw-r--r--test/CodeGen/ARC/lit.local.cfg3
5 files changed, 655 insertions, 0 deletions
diff --git a/test/CodeGen/ARC/alu.ll b/test/CodeGen/ARC/alu.ll
new file mode 100644
index 0000000000000..a5e07636fec08
--- /dev/null
+++ b/test/CodeGen/ARC/alu.ll
@@ -0,0 +1,255 @@
+; RUN: llc -march=arc < %s | FileCheck %s
+
+; CHECK-LABEL: add_r
+; CHECK: add %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @add_r(i32 %a, i32 %b) nounwind {
+entry:
+ %v = add i32 %a, %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: add_u6
+; CHECK: add %r0, %r0, 15
+define i32 @add_u6(i32 %a) nounwind {
+ %v = add i32 %a, 15
+ ret i32 %v
+}
+
+; CHECK-LABEL: add_limm
+; CHECK: add %r0, %r0, 12345
+define i32 @add_limm(i32 %a) nounwind {
+ %v = add i32 %a, 12345
+ ret i32 %v
+}
+
+; CHECK-LABEL: mpy_r
+; CHECK: mpy %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @mpy_r(i32 %a, i32 %b) nounwind {
+entry:
+ %v = mul i32 %a, %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: mpy_u6
+; CHECK: mpy %r0, %r0, 10
+define i32 @mpy_u6(i32 %a) nounwind {
+ %v = mul i32 %a, 10
+ ret i32 %v
+}
+
+; CHECK-LABEL: mpy_limm
+; CHECK: mpy %r0, %r0, 12345
+define i32 @mpy_limm(i32 %a) nounwind {
+ %v = mul i32 %a, 12345
+ ret i32 %v
+}
+
+; CHECK-LABEL: max_r
+; CHECK: max %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @max_r(i32 %a, i32 %b) nounwind {
+ %i = icmp sgt i32 %a, %b
+ %v = select i1 %i, i32 %a, i32 %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: max_u6
+; CHECK: max %r0, %r0, 12
+define i32 @max_u6(i32 %a) nounwind {
+ %i = icmp sgt i32 %a, 12
+ %v = select i1 %i, i32 %a, i32 12
+ ret i32 %v
+}
+
+; CHECK-LABEL: max_limm
+; CHECK: max %r0, %r0, 2345
+define i32 @max_limm(i32 %a) nounwind {
+ %i = icmp sgt i32 %a, 2345
+ %v = select i1 %i, i32 %a, i32 2345
+ ret i32 %v
+}
+
+; CHECK-LABEL: min_r
+; CHECK: min %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @min_r(i32 %a, i32 %b) nounwind {
+ %i = icmp slt i32 %a, %b
+ %v = select i1 %i, i32 %a, i32 %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: min_u6
+; CHECK: min %r0, %r0, 20
+define i32 @min_u6(i32 %a) nounwind {
+ %i = icmp slt i32 %a, 20
+ %v = select i1 %i, i32 %a, i32 20
+ ret i32 %v
+}
+
+; CHECK-LABEL: min_limm
+; CHECK: min %r0, %r0, 2040
+define i32 @min_limm(i32 %a) nounwind {
+ %i = icmp slt i32 %a, 2040
+ %v = select i1 %i, i32 %a, i32 2040
+ ret i32 %v
+}
+
+; CHECK-LABEL: and_r
+; CHECK: and %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @and_r(i32 %a, i32 %b) nounwind {
+ %v = and i32 %a, %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: and_u6
+; CHECK: and %r0, %r0, 7
+define i32 @and_u6(i32 %a) nounwind {
+ %v = and i32 %a, 7
+ ret i32 %v
+}
+
+; 0xfffff == 1048575
+; CHECK-LABEL: and_limm
+; CHECK: and %r0, %r0, 1048575
+define i32 @and_limm(i32 %a) nounwind {
+ %v = and i32 %a, 1048575
+ ret i32 %v
+}
+
+; CHECK-LABEL: or_r
+; CHECK: or %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @or_r(i32 %a, i32 %b) nounwind {
+ %v = or i32 %a, %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: or_u6
+; CHECK: or %r0, %r0, 7
+define i32 @or_u6(i32 %a) nounwind {
+ %v = or i32 %a, 7
+ ret i32 %v
+}
+
+; 0xf0f0f == 986895
+; CHECK-LABEL: or_limm
+define i32 @or_limm(i32 %a) nounwind {
+ %v = or i32 %a, 986895
+ ret i32 %v
+}
+
+; CHECK-LABEL: xor_r
+; CHECK: xor %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @xor_r(i32 %a, i32 %b) nounwind {
+ %v = xor i32 %a, %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: xor_u6
+; CHECK: xor %r0, %r0, 3
+define i32 @xor_u6(i32 %a) nounwind {
+ %v = xor i32 %a, 3
+ ret i32 %v
+}
+
+; CHECK-LABEL: xor_limm
+; CHECK: xor %r0, %r0, 986895
+define i32 @xor_limm(i32 %a) nounwind {
+ %v = xor i32 %a, 986895
+ ret i32 %v
+}
+
+; CHECK-LABEL: asl_r
+; CHECK: asl %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @asl_r(i32 %a, i32 %b) nounwind {
+ %v = shl i32 %a, %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: asl_u6
+; CHECK: asl %r0, %r0, 4
+define i32 @asl_u6(i32 %a) nounwind {
+ %v = shl i32 %a, 4
+ ret i32 %v
+}
+
+; CHECK-LABEL: lsr_r
+; CHECK: lsr %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @lsr_r(i32 %a, i32 %b) nounwind {
+ %v = lshr i32 %a, %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: lsr_u6
+; CHECK: lsr %r0, %r0, 6
+define i32 @lsr_u6(i32 %a) nounwind {
+ %v = lshr i32 %a, 6
+ ret i32 %v
+}
+
+; CHECK-LABEL: asr_r
+; CHECK: asr %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @asr_r(i32 %a, i32 %b) nounwind {
+ %v = ashr i32 %a, %b
+ ret i32 %v
+}
+
+; CHECK-LABEL: asr_u6
+; CHECK: asr %r0, %r0, 8
+define i32 @asr_u6(i32 %a) nounwind {
+ %v = ashr i32 %a, 8
+ ret i32 %v
+}
+
+; CHECK-LABEL: ror_r
+; CHECK: ror %r0, %r{{[01]}}, %r{{[01]}}
+define i32 @ror_r(i32 %a, i32 %b) nounwind {
+ %v1 = lshr i32 %a, %b
+ %ls = sub i32 32, %b
+ %v2 = shl i32 %a, %ls
+ %v = or i32 %v1, %v2
+ ret i32 %v
+}
+
+; CHECK-LABEL: ror_u6
+; CHECK: ror %r0, %r0, 10
+define i32 @ror_u6(i32 %a) nounwind {
+ %v1 = lshr i32 %a, 10
+ %v2 = shl i32 %a, 22
+ %v = or i32 %v1, %v2
+ ret i32 %v
+}
+
+; CHECK-LABEL: sexh_r
+; CHECK: sexh %r0, %r0
+define i32 @sexh_r(i32 %a) nounwind {
+ %v1 = shl i32 %a, 16
+ %v = ashr i32 %v1, 16
+ ret i32 %v
+}
+
+; CHECK-LABEL: sexb_r
+; CHECK: sexb %r0, %r0
+define i32 @sexb_r(i32 %a) nounwind {
+ %v1 = shl i32 %a, 24
+ %v = ashr i32 %v1, 24
+ ret i32 %v
+}
+
+; CHECK-LABEL: mulu64
+; CHECK-DAG: mpy %r[[REG:[0-9]+]], %r{{[01]}}, %r{{[01]}}
+; CHECK-DAG: mpymu %r[[REG:[0-9]+]], %r{{[01]}}, %r{{[01]}}
+define i64 @mulu64(i32 %a, i32 %b) nounwind {
+ %a64 = zext i32 %a to i64
+ %b64 = zext i32 %b to i64
+ %v = mul i64 %a64, %b64
+ ret i64 %v
+}
+
+; CHECK-LABEL: muls64
+; CHECK-DAG: mpy %r[[REG:[0-9]+]], %r{{[01]}}, %r{{[01]}}
+; CHECK-DAG: mpym %r[[REG:[0-9]+]], %r{{[01]}}, %r{{[01]}}
+define i64 @muls64(i32 %a, i32 %b) nounwind {
+ %a64 = sext i32 %a to i64
+ %b64 = sext i32 %b to i64
+ %v = mul i64 %a64, %b64
+ ret i64 %v
+}
+
diff --git a/test/CodeGen/ARC/brcc.ll b/test/CodeGen/ARC/brcc.ll
new file mode 100644
index 0000000000000..ca4035e35987e
--- /dev/null
+++ b/test/CodeGen/ARC/brcc.ll
@@ -0,0 +1,37 @@
+; RUN: llc -march=arc < %s | FileCheck %s
+
+; CHECK-LABEL: brcc1
+; CHECK: brne %r0, %r1
+define i32 @brcc1(i32 %a, i32 %b) nounwind {
+entry:
+ %wb = icmp eq i32 %a, %b
+ br i1 %wb, label %t1, label %t2
+t1:
+ %t1v = add i32 %a, 4
+ br label %exit
+t2:
+ %t2v = add i32 %b, 8
+ br label %exit
+exit:
+ %v = phi i32 [ %t1v, %t1 ], [ %t2v, %t2 ]
+ ret i32 %v
+}
+
+; CHECK-LABEL: brcc2
+; CHECK: breq %r0, %r1
+define i32 @brcc2(i32 %a, i32 %b) nounwind {
+entry:
+ %wb = icmp ne i32 %a, %b
+ br i1 %wb, label %t1, label %t2
+t1:
+ %t1v = add i32 %a, 4
+ br label %exit
+t2:
+ %t2v = add i32 %b, 8
+ br label %exit
+exit:
+ %v = phi i32 [ %t1v, %t1 ], [ %t2v, %t2 ]
+ ret i32 %v
+}
+
+
diff --git a/test/CodeGen/ARC/call.ll b/test/CodeGen/ARC/call.ll
new file mode 100644
index 0000000000000..2985439b5f10d
--- /dev/null
+++ b/test/CodeGen/ARC/call.ll
@@ -0,0 +1,88 @@
+; RUN: llc -march=arc < %s | FileCheck %s
+
+
+declare i32 @goo1(i32) nounwind
+
+; CHECK-LABEL: call1
+; CHECK: bl @goo1
+define i32 @call1(i32 %a) nounwind {
+entry:
+ %x = call i32 @goo1(i32 %a)
+ ret i32 %x
+}
+
+declare i32 @goo2(i32, i32, i32, i32, i32, i32, i32, i32) nounwind
+
+; CHECK-LABEL: call2
+; CHECK-DAG: mov %r0, 0
+; CHECK-DAG: mov %r1, 1
+; CHECK-DAG: mov %r2, 2
+; CHECK-DAG: mov %r3, 3
+; CHECK-DAG: mov %r4, 4
+; CHECK-DAG: mov %r5, 5
+; CHECK-DAG: mov %r6, 6
+; CHECK-DAG: mov %r7, 7
+; CHECK: bl @goo2
+define i32 @call2() nounwind {
+entry:
+ %x = call i32 @goo2(i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7)
+ ret i32 %x
+}
+
+declare i32 @goo3(i64, i32, i64) nounwind
+; call goo3(0xEEEEEEEE77777777, 0x55555555, 0xAAAAAAAA33333333)
+; 0xEEEEEEEE == -286331154
+; 0x77777777 == 2004318071
+; 0x55555555 == 1431655765
+; 0xAAAAAAAA == -1431655766
+; 0x33333333 == 858993459
+; CHECK-LABEL: call3
+; CHECK-DAG: mov %r0, 2004318071
+; CHECK-DAG: mov %r1, -286331154
+; CHECK-DAG: mov %r2, 1431655765
+; CHECK-DAG: mov %r3, 858993459
+; CHECK-DAG: mov %r4, -1431655766
+; CHECK: bl @goo3
+define i32 @call3() nounwind {
+entry:
+ %x = call i32 @goo3(i64 17216961133457930103,
+ i32 1431655765,
+ i64 12297829380468716339)
+ ret i32 %x
+}
+
+declare i64 @goo4()
+
+; 64-bit values are returned in r0r1
+; CHECK-LABEL: call4
+; CHECK: bl @goo4
+; CHECK: lsr %r0, %r1, 16
+define i32 @call4() nounwind {
+ %x = call i64 @goo4()
+ %v1 = lshr i64 %x, 48
+ %v = trunc i64 %v1 to i32
+ ret i32 %v
+}
+
+; 0x0000ffff00ff00ff=281470698455295
+; returned as r0=0x00ff00ff=16711935, r1=0x0000ffff=65535
+; CHECK-LABEL: ret1
+; CHECK-DAG: mov %r1, 65535
+; CHECK-DAG: mov %r0, 16711935
+define i64 @ret1() nounwind {
+ ret i64 281470698455295
+}
+
+@funcptr = external global i32 (i32)*, align 4
+; Indirect calls use JL
+; CHECK-LABEL: call_indirect
+; CHECK-DAG: ld %r[[REG:[0-9]+]], [@funcptr]
+; CHECK-DAG: mov %r0, 12
+; CHECK: jl [%r[[REG]]]
+define i32 @call_indirect(i32 %x) nounwind {
+ %f = load i32 (i32)*, i32 (i32)** @funcptr, align 4
+ %call = call i32 %f(i32 12)
+ %add = add nsw i32 %call, %x
+ ret i32 %add
+}
+
diff --git a/test/CodeGen/ARC/ldst.ll b/test/CodeGen/ARC/ldst.ll
new file mode 100644
index 0000000000000..67f938a652ca7
--- /dev/null
+++ b/test/CodeGen/ARC/ldst.ll
@@ -0,0 +1,272 @@
+; RUN: llc -march=arc < %s | FileCheck %s
+
+; CHECK-LABEL: load32
+; CHECK: ld %r0, [%r0,16000]
+
+define i32 @load32(i32* %bp) nounwind {
+entry:
+ %gep = getelementptr i32, i32* %bp, i32 4000
+ %v = load i32, i32* %gep, align 4
+ ret i32 %v
+}
+
+; CHECK-LABEL: load16
+; CHECK: ldh %r0, [%r0,8000]
+
+define i16 @load16(i16* %bp) nounwind {
+entry:
+ %gep = getelementptr i16, i16* %bp, i32 4000
+ %v = load i16, i16* %gep, align 2
+ ret i16 %v
+}
+
+; CHECK-LABEL: load8
+; CHECK: ldb %r0, [%r0,4000]
+
+define i8 @load8(i8* %bp) nounwind {
+entry:
+ %gep = getelementptr i8, i8* %bp, i32 4000
+ %v = load i8, i8* %gep, align 1
+ ret i8 %v
+}
+
+; CHECK-LABEL: sextload16
+; CHECK: ldh.x %r0, [%r0,8000]
+
+define i32 @sextload16(i16* %bp) nounwind {
+entry:
+ %gep = getelementptr i16, i16* %bp, i32 4000
+ %vl = load i16, i16* %gep, align 2
+ %v = sext i16 %vl to i32
+ ret i32 %v
+}
+
+; CHECK-LABEL: sextload8
+; CHECK: ldb.x %r0, [%r0,4000]
+
+define i32 @sextload8(i8* %bp) nounwind {
+entry:
+ %gep = getelementptr i8, i8* %bp, i32 4000
+ %vl = load i8, i8* %gep, align 1
+ %v = sext i8 %vl to i32
+ ret i32 %v
+}
+
+; CHECK-LABEL: s_sextload16
+; CHECK: ldh.x %r0, [%r0,32]
+
+define i32 @s_sextload16(i16* %bp) nounwind {
+entry:
+ %gep = getelementptr i16, i16* %bp, i32 16
+ %vl = load i16, i16* %gep, align 2
+ %v = sext i16 %vl to i32
+ ret i32 %v
+}
+
+; CHECK-LABEL: s_sextload8
+; CHECK: ldb.x %r0, [%r0,16]
+
+define i32 @s_sextload8(i8* %bp) nounwind {
+entry:
+ %gep = getelementptr i8, i8* %bp, i32 16
+ %vl = load i8, i8* %gep, align 1
+ %v = sext i8 %vl to i32
+ ret i32 %v
+}
+
+; CHECK-LABEL: store32
+; CHECK: add %r[[REG:[0-9]+]], %r1, 16000
+; CHECK: st %r0, [%r[[REG]],0]
+
+; Long range stores (offset does not fit in s9) must be add followed by st.
+define void @store32(i32 %val, i32* %bp) nounwind {
+entry:
+ %gep = getelementptr i32, i32* %bp, i32 4000
+ store i32 %val, i32* %gep, align 4
+ ret void
+}
+
+; CHECK-LABEL: store16
+; CHECK: add %r[[REG:[0-9]+]], %r1, 8000
+; CHECK: sth %r0, [%r[[REG]],0]
+
+define void @store16(i16 zeroext %val, i16* %bp) nounwind {
+entry:
+ %gep = getelementptr i16, i16* %bp, i32 4000
+ store i16 %val, i16* %gep, align 2
+ ret void
+}
+
+; CHECK-LABEL: store8
+; CHECK: add %r[[REG:[0-9]+]], %r1, 4000
+; CHECK: stb %r0, [%r[[REG]],0]
+
+define void @store8(i8 zeroext %val, i8* %bp) nounwind {
+entry:
+ %gep = getelementptr i8, i8* %bp, i32 4000
+ store i8 %val, i8* %gep, align 1
+ ret void
+}
+
+; Short range stores can be done with [reg, s9].
+; CHECK-LABEL: s_store32
+; CHECK-NOT: add
+; CHECK: st %r0, [%r1,64]
+define void @s_store32(i32 %val, i32* %bp) nounwind {
+entry:
+ %gep = getelementptr i32, i32* %bp, i32 16
+ store i32 %val, i32* %gep, align 4
+ ret void
+}
+
+; CHECK-LABEL: s_store16
+; CHECK-NOT: add
+; CHECK: sth %r0, [%r1,32]
+define void @s_store16(i16 zeroext %val, i16* %bp) nounwind {
+entry:
+ %gep = getelementptr i16, i16* %bp, i32 16
+ store i16 %val, i16* %gep, align 2
+ ret void
+}
+
+; CHECK-LABEL: s_store8
+; CHECK-NOT: add
+; CHECK: stb %r0, [%r1,16]
+define void @s_store8(i8 zeroext %val, i8* %bp) nounwind {
+entry:
+ %gep = getelementptr i8, i8* %bp, i32 16
+ store i8 %val, i8* %gep, align 1
+ ret void
+}
+
+
+@aaaa = internal global [128 x i32] zeroinitializer
+@bbbb = internal global [128 x i16] zeroinitializer
+@cccc = internal global [128 x i8] zeroinitializer
+
+; CHECK-LABEL: g_store32
+; CHECK-NOT: add
+; CHECK: st %r0, [@aaaa+64]
+define void @g_store32(i32 %val) nounwind {
+entry:
+ store i32 %val, i32* getelementptr inbounds ([128 x i32], [128 x i32]* @aaaa, i32 0, i32 16), align 4
+ ret void
+}
+
+; CHECK-LABEL: g_load32
+; CHECK-NOT: add
+; CHECK: ld %r0, [@aaaa+64]
+define i32 @g_load32() nounwind {
+ %gep = getelementptr inbounds [128 x i32], [128 x i32]* @aaaa, i32 0, i32 16
+ %v = load i32, i32* %gep, align 4
+ ret i32 %v
+}
+
+; CHECK-LABEL: g_store16
+; CHECK-NOT: add
+; CHECK: sth %r0, [@bbbb+32]
+define void @g_store16(i16 %val) nounwind {
+entry:
+ store i16 %val, i16* getelementptr inbounds ([128 x i16], [128 x i16]* @bbbb, i16 0, i16 16), align 2
+ ret void
+}
+
+; CHECK-LABEL: g_load16
+; CHECK-NOT: add
+; CHECK: ldh %r0, [@bbbb+32]
+define i16 @g_load16() nounwind {
+ %gep = getelementptr inbounds [128 x i16], [128 x i16]* @bbbb, i16 0, i16 16
+ %v = load i16, i16* %gep, align 2
+ ret i16 %v
+}
+
+; CHECK-LABEL: g_store8
+; CHECK-NOT: add
+; CHECK: stb %r0, [@cccc+16]
+define void @g_store8(i8 %val) nounwind {
+entry:
+ store i8 %val, i8* getelementptr inbounds ([128 x i8], [128 x i8]* @cccc, i8 0, i8 16), align 1
+ ret void
+}
+
+; CHECK-LABEL: g_load8
+; CHECK-NOT: add
+; CHECK: ldb %r0, [@cccc+16]
+define i8 @g_load8() nounwind {
+ %gep = getelementptr inbounds [128 x i8], [128 x i8]* @cccc, i8 0, i8 16
+ %v = load i8, i8* %gep, align 1
+ ret i8 %v
+}
+
+; CHECK-LABEL: align2_load32
+; CHECK-DAG: ldh %r[[REG0:[0-9]+]], [%r0,0]
+; CHECK-DAG: ldh %r[[REG1:[0-9]+]], [%r0,2]
+; CHECK-DAG: asl %r[[REG2:[0-9]+]], %r[[REG1]], 16
+define i32 @align2_load32(i8* %p) nounwind {
+entry:
+ %bp = bitcast i8* %p to i32*
+ %v = load i32, i32* %bp, align 2
+ ret i32 %v
+}
+
+; CHECK-LABEL: align1_load32
+; CHECK-DAG: ldb %r[[REG0:[0-9]+]], [%r0,0]
+; CHECK-DAG: ldb %r[[REG1:[0-9]+]], [%r0,1]
+; CHECK-DAG: ldb %r[[REG2:[0-9]+]], [%r0,2]
+; CHECK-DAG: ldb %r[[REG3:[0-9]+]], [%r0,3]
+; CHECK-DAG: asl %r[[AREG1:[0-9]+]], %r[[REG1]], 8
+; CHECK-DAG: asl %r[[AREG3:[0-9]+]], %r[[REG3]], 8
+define i32 @align1_load32(i8* %p) nounwind {
+entry:
+ %bp = bitcast i8* %p to i32*
+ %v = load i32, i32* %bp, align 1
+ ret i32 %v
+}
+
+; CHECK-LABEL: align1_load16
+; CHECK-DAG: ldb %r[[REG0:[0-9]+]], [%r0,0]
+; CHECK-DAG: ldb %r[[REG1:[0-9]+]], [%r0,1]
+; CHECK-DAG: asl %r[[REG2:[0-9]+]], %r[[REG1]], 8
+define i16 @align1_load16(i8* %p) nounwind {
+entry:
+ %bp = bitcast i8* %p to i16*
+ %v = load i16, i16* %bp, align 1
+ ret i16 %v
+}
+
+; CHECK-LABEL: align2_store32
+; CHECK-DAG: lsr %r[[REG:[0-9]+]], %r1, 16
+; CHECK-DAG: sth %r1, [%r0,0]
+; CHECK-DAG: sth %r[[REG:[0-9]+]], [%r0,2]
+define void @align2_store32(i8* %p, i32 %v) nounwind {
+entry:
+ %bp = bitcast i8* %p to i32*
+ store i32 %v, i32* %bp, align 2
+ ret void
+}
+
+; CHECK-LABEL: align1_store16
+; CHECK-DAG: lsr %r[[REG:[0-9]+]], %r1, 8
+; CHECK-DAG: stb %r1, [%r0,0]
+; CHECK-DAG: stb %r[[REG:[0-9]+]], [%r0,1]
+define void @align1_store16(i8* %p, i16 %v) nounwind {
+entry:
+ %bp = bitcast i8* %p to i16*
+ store i16 %v, i16* %bp, align 1
+ ret void
+}
+
+; CHECK-LABEL: align1_store32
+; CHECK-DAG: lsr %r[[REG0:[0-9]+]], %r1, 8
+; CHECK-DAG: lsr %r[[REG1:[0-9]+]], %r1, 16
+; CHECK-DAG: lsr %r[[REG2:[0-9]+]], %r1, 24
+; CHECK-DAG: stb %r1, [%r0,0]
+; CHECK-DAG: stb %r[[REG0]], [%r0,1]
+; CHECK-DAG: stb %r[[REG1]], [%r0,2]
+; CHECK-DAG: stb %r[[REG2]], [%r0,3]
+define void @align1_store32(i8* %p, i32 %v) nounwind {
+entry:
+ %bp = bitcast i8* %p to i32*
+ store i32 %v, i32* %bp, align 1
+ ret void
+}
diff --git a/test/CodeGen/ARC/lit.local.cfg b/test/CodeGen/ARC/lit.local.cfg
new file mode 100644
index 0000000000000..9070deb0db5fd
--- /dev/null
+++ b/test/CodeGen/ARC/lit.local.cfg
@@ -0,0 +1,3 @@
+if not 'ARC' in config.root.targets:
+ config.unsupported = True
+