diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2009-10-14 17:57:32 +0000 |
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2009-10-14 17:57:32 +0000 |
| commit | 59850d0874429601812bc13408cb1f776649027c (patch) | |
| tree | b21f6de4e08b89bb7931806bab798fc2a5e3a686 /test/CodeGen/XCore | |
| parent | 18f153bdb9db52e7089a2d5293b96c45a3124a26 (diff) | |
Notes
Diffstat (limited to 'test/CodeGen/XCore')
32 files changed, 394 insertions, 22 deletions
diff --git a/test/CodeGen/XCore/2008-11-17-Shl64.ll b/test/CodeGen/XCore/2008-11-17-Shl64.ll index 97ea41b8d0c0..04b1b5a0016e 100644 --- a/test/CodeGen/XCore/2008-11-17-Shl64.ll +++ b/test/CodeGen/XCore/2008-11-17-Shl64.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; PR3080 define i64 @test(i64 %a) { %result = shl i64 %a, 1 diff --git a/test/CodeGen/XCore/2009-01-08-Crash.ll b/test/CodeGen/XCore/2009-01-08-Crash.ll index 6f5fb7c6871e..a31ea1e2e9be 100644 --- a/test/CodeGen/XCore/2009-01-08-Crash.ll +++ b/test/CodeGen/XCore/2009-01-08-Crash.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ;; This caused a compilation failure since the ;; address arithmetic was folded into the LDWSP instruction, ;; resulting in a negative offset which eliminateFrameIndex was diff --git a/test/CodeGen/XCore/2009-01-14-Remat-Crash.ll b/test/CodeGen/XCore/2009-01-14-Remat-Crash.ll index b9333c94abe3..b2bbcb1183d1 100644 --- a/test/CodeGen/XCore/2009-01-14-Remat-Crash.ll +++ b/test/CodeGen/XCore/2009-01-14-Remat-Crash.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; PR3324 define double @f1(double %a, double %b, double %c, double %d, double %e, double %f, double %g) nounwind { entry: diff --git a/test/CodeGen/XCore/2009-03-27-v2f64-param.ll b/test/CodeGen/XCore/2009-03-27-v2f64-param.ll index e834d66df241..a6b9699987eb 100644 --- a/test/CodeGen/XCore/2009-03-27-v2f64-param.ll +++ b/test/CodeGen/XCore/2009-03-27-v2f64-param.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore +; RUN: llc < %s -march=xcore ; PR3898 define i32 @vector_param(<2 x double> %x) nounwind { diff --git a/test/CodeGen/XCore/2009-07-15-store192.ll b/test/CodeGen/XCore/2009-07-15-store192.ll new file mode 100644 index 000000000000..5278af8ac229 --- /dev/null +++ b/test/CodeGen/XCore/2009-07-15-store192.ll @@ -0,0 +1,7 @@ +; RUN: llc < %s -march=xcore > %t1.s +define void @store32(i8* %p) nounwind { +entry: + %0 = bitcast i8* %p to i192* + store i192 0, i192* %0, align 4 + ret void +} diff --git a/test/CodeGen/XCore/addsub64.ll b/test/CodeGen/XCore/addsub64.ll index 41224fca1cc2..a1494adfcc46 100644 --- a/test/CodeGen/XCore/addsub64.ll +++ b/test/CodeGen/XCore/addsub64.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore -mcpu=xs1b-generic > %t1.s +; RUN: llc < %s -march=xcore -mcpu=xs1b-generic > %t1.s ; RUN: grep ladd %t1.s | count 2 ; RUN: grep lsub %t1.s | count 2 define i64 @add64(i64 %a, i64 %b) { diff --git a/test/CodeGen/XCore/ashr.ll b/test/CodeGen/XCore/ashr.ll new file mode 100644 index 000000000000..d585e8b10d98 --- /dev/null +++ b/test/CodeGen/XCore/ashr.ll @@ -0,0 +1,76 @@ +; RUN: llc < %s -march=xcore | FileCheck %s +define i32 @ashr(i32 %a, i32 %b) { + %1 = ashr i32 %a, %b + ret i32 %1 +} +; CHECK: ashr: +; CHECK-NEXT: ashr r0, r0, r1 + +define i32 @ashri1(i32 %a) { + %1 = ashr i32 %a, 24 + ret i32 %1 +} +; CHECK: ashri1: +; CHECK-NEXT: ashr r0, r0, 24 + +define i32 @ashri2(i32 %a) { + %1 = ashr i32 %a, 31 + ret i32 %1 +} +; CHECK: ashri2: +; CHECK-NEXT: ashr r0, r0, 32 + +define i32 @f1(i32 %a) { + %1 = icmp slt i32 %a, 0 + br i1 %1, label %less, label %not_less +less: + ret i32 10 +not_less: + ret i32 17 +} +; CHECK: f1: +; CHECK-NEXT: ashr r0, r0, 32 +; CHECK-NEXT: bf r0 + +define i32 @f2(i32 %a) { + %1 = icmp sge i32 %a, 0 + br i1 %1, label %greater, label %not_greater +greater: + ret i32 10 +not_greater: + ret i32 17 +} +; CHECK: f2: +; CHECK-NEXT: ashr r0, r0, 32 +; CHECK-NEXT: bt r0 + +define i32 @f3(i32 %a) { + %1 = icmp slt i32 %a, 0 + %2 = select i1 %1, i32 10, i32 17 + ret i32 %2 +} +; CHECK: f3: +; CHECK-NEXT: ashr r1, r0, 32 +; CHECK-NEXT: ldc r0, 10 +; CHECK-NEXT: bt r1 +; CHECK: ldc r0, 17 + +define i32 @f4(i32 %a) { + %1 = icmp sge i32 %a, 0 + %2 = select i1 %1, i32 10, i32 17 + ret i32 %2 +} +; CHECK: f4: +; CHECK-NEXT: ashr r1, r0, 32 +; CHECK-NEXT: ldc r0, 17 +; CHECK-NEXT: bt r1 +; CHECK: ldc r0, 10 + +define i32 @f5(i32 %a) { + %1 = icmp sge i32 %a, 0 + %2 = zext i1 %1 to i32 + ret i32 %2 +} +; CHECK: f5: +; CHECK-NEXT: ashr r0, r0, 32 +; CHECK-NEXT: eq r0, r0, 0 diff --git a/test/CodeGen/XCore/basictest.ll b/test/CodeGen/XCore/basictest.ll index 803ffcb74cc1..de5eaff08073 100644 --- a/test/CodeGen/XCore/basictest.ll +++ b/test/CodeGen/XCore/basictest.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore +; RUN: llc < %s -march=xcore define i32 @test(i32 %X) { %tmp.1 = add i32 %X, 1 diff --git a/test/CodeGen/XCore/bitrev.ll b/test/CodeGen/XCore/bitrev.ll index 38f394869763..09202d365678 100644 --- a/test/CodeGen/XCore/bitrev.ll +++ b/test/CodeGen/XCore/bitrev.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep bitrev %t1.s | count 1 declare i32 @llvm.xcore.bitrev(i32) diff --git a/test/CodeGen/XCore/constants.ll b/test/CodeGen/XCore/constants.ll new file mode 100644 index 000000000000..95fa11e77470 --- /dev/null +++ b/test/CodeGen/XCore/constants.ll @@ -0,0 +1,11 @@ +; RUN: llc < %s -march=xcore -mcpu=xs1b-generic | FileCheck %s + +; CHECK: .section .cp.rodata.cst4,"aMc",@progbits,4 +; CHECK: .LCPI1_0: +; CHECK: .long 12345678 +; CHECK: f: +; CHECK: ldw r0, cp[.LCPI1_0] +define i32 @f() { +entry: + ret i32 12345678 +} diff --git a/test/CodeGen/XCore/cos.ll b/test/CodeGen/XCore/cos.ll index 334f0d50561d..8211f85b9bc2 100644 --- a/test/CodeGen/XCore/cos.ll +++ b/test/CodeGen/XCore/cos.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl cosf" %t1.s | count 1 ; RUN: grep "bl cos" %t1.s | count 2 declare double @llvm.cos.f64(double) diff --git a/test/CodeGen/XCore/exp.ll b/test/CodeGen/XCore/exp.ll index 8412e7a59956..d23d484ed62e 100644 --- a/test/CodeGen/XCore/exp.ll +++ b/test/CodeGen/XCore/exp.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl expf" %t1.s | count 1 ; RUN: grep "bl exp" %t1.s | count 2 declare double @llvm.exp.f64(double) diff --git a/test/CodeGen/XCore/exp2.ll b/test/CodeGen/XCore/exp2.ll index a53b767ad0d0..4c4d17f4bbf7 100644 --- a/test/CodeGen/XCore/exp2.ll +++ b/test/CodeGen/XCore/exp2.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl exp2f" %t1.s | count 1 ; RUN: grep "bl exp2" %t1.s | count 2 declare double @llvm.exp2.f64(double) diff --git a/test/CodeGen/XCore/fneg.ll b/test/CodeGen/XCore/fneg.ll index 3fb7b0186940..e3dd3dd45c23 100644 --- a/test/CodeGen/XCore/fneg.ll +++ b/test/CodeGen/XCore/fneg.ll @@ -1,5 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s -; RUN: grep "xor" %t1.s | count 1 +; RUN: llc < %s -march=xcore | grep "xor" | count 1 define i1 @test(double %F) nounwind { entry: %0 = fsub double -0.000000e+00, %F diff --git a/test/CodeGen/XCore/getid.ll b/test/CodeGen/XCore/getid.ll index 810e8ad6e75c..ecab65c0e92e 100644 --- a/test/CodeGen/XCore/getid.ll +++ b/test/CodeGen/XCore/getid.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "get r11, id" %t1.s | count 1 declare i32 @llvm.xcore.getid() diff --git a/test/CodeGen/XCore/globals.ll b/test/CodeGen/XCore/globals.ll new file mode 100644 index 000000000000..342e5932dd10 --- /dev/null +++ b/test/CodeGen/XCore/globals.ll @@ -0,0 +1,92 @@ +; RUN: llc < %s -march=xcore -mcpu=xs1b-generic | FileCheck %s + +define i32 *@addr_G1() { +entry: +; CHECK: addr_G1: +; CHECK: ldaw r0, dp[G1] + ret i32* @G1 +} + +define i32 *@addr_G2() { +entry: +; CHECK: addr_G2: +; CHECK: ldaw r0, dp[G2] + ret i32* @G2 +} + +define i32 *@addr_G3() { +entry: +; CHECK: addr_G3: +; CHECK: ldaw r11, cp[G3] +; CHECK: mov r0, r11 + ret i32* @G3 +} + +define i32 **@addr_G4() { +entry: +; CHECK: addr_G4: +; CHECK: ldaw r0, dp[G4] + ret i32** @G4 +} + +define i32 **@addr_G5() { +entry: +; CHECK: addr_G5: +; CHECK: ldaw r11, cp[G5] +; CHECK: mov r0, r11 + ret i32** @G5 +} + +define i32 **@addr_G6() { +entry: +; CHECK: addr_G6: +; CHECK: ldaw r0, dp[G6] + ret i32** @G6 +} + +define i32 **@addr_G7() { +entry: +; CHECK: addr_G7: +; CHECK: ldaw r11, cp[G7] +; CHECK: mov r0, r11 + ret i32** @G7 +} + +define i32 *@addr_G8() { +entry: +; CHECK: addr_G8: +; CHECK: ldaw r0, dp[G8] + ret i32* @G8 +} + +@G1 = global i32 4712 +; CHECK: .section .dp.data,"awd",@progbits +; CHECK: G1: + +@G2 = global i32 0 +; CHECK: .section .dp.bss,"awd",@nobits +; CHECK: G2: + +@G3 = constant i32 9401 +; CHECK: .section .cp.rodata.cst4,"aMc",@progbits,4 +; CHECK: G3: + +@G4 = global i32* @G1 +; CHECK: .section .dp.data,"awd",@progbits +; CHECK: G4: + +@G5 = constant i32* @G1 +; CHECK: .section .cp.rodata,"ac",@progbits +; CHECK: G5: + +@G6 = global i32* @G8 +; CHECK: .section .dp.data,"awd",@progbits +; CHECK: G6: + +@G7 = constant i32* @G8 +; CHECK: .section .cp.rodata,"ac",@progbits +; CHECK: G7: + +@G8 = internal global i32 9312 +; CHECK: .section .dp.data,"awd",@progbits +; CHECK: G8: diff --git a/test/CodeGen/XCore/load.ll b/test/CodeGen/XCore/load.ll new file mode 100644 index 000000000000..adfea212a279 --- /dev/null +++ b/test/CodeGen/XCore/load.ll @@ -0,0 +1,39 @@ +; RUN: llc < %s -march=xcore > %t1.s +; RUN: not grep add %t1.s +; RUN: not grep ldaw %t1.s +; RUN: not grep lda16 %t1.s +; RUN: not grep zext %t1.s +; RUN: not grep sext %t1.s +; RUN: grep "ldw" %t1.s | count 2 +; RUN: grep "ld16s" %t1.s | count 1 +; RUN: grep "ld8u" %t1.s | count 1 + +define i32 @load32(i32* %p, i32 %offset) nounwind { +entry: + %0 = getelementptr i32* %p, i32 %offset + %1 = load i32* %0, align 4 + ret i32 %1 +} + +define i32 @load32_imm(i32* %p) nounwind { +entry: + %0 = getelementptr i32* %p, i32 11 + %1 = load i32* %0, align 4 + ret i32 %1 +} + +define i32 @load16(i16* %p, i32 %offset) nounwind { +entry: + %0 = getelementptr i16* %p, i32 %offset + %1 = load i16* %0, align 2 + %2 = sext i16 %1 to i32 + ret i32 %2 +} + +define i32 @load8(i8* %p, i32 %offset) nounwind { +entry: + %0 = getelementptr i8* %p, i32 %offset + %1 = load i8* %0, align 1 + %2 = zext i8 %1 to i32 + ret i32 %2 +} diff --git a/test/CodeGen/XCore/log.ll b/test/CodeGen/XCore/log.ll index 88d9d7ffcd39..a08471f48e4a 100644 --- a/test/CodeGen/XCore/log.ll +++ b/test/CodeGen/XCore/log.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl logf" %t1.s | count 1 ; RUN: grep "bl log" %t1.s | count 2 declare double @llvm.log.f64(double) diff --git a/test/CodeGen/XCore/log10.ll b/test/CodeGen/XCore/log10.ll index f844d8fc6a24..a72b8bfaf6b9 100644 --- a/test/CodeGen/XCore/log10.ll +++ b/test/CodeGen/XCore/log10.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl log10f" %t1.s | count 1 ; RUN: grep "bl log10" %t1.s | count 2 declare double @llvm.log10.f64(double) diff --git a/test/CodeGen/XCore/log2.ll b/test/CodeGen/XCore/log2.ll index b8a3dbd2317f..d257433a01a7 100644 --- a/test/CodeGen/XCore/log2.ll +++ b/test/CodeGen/XCore/log2.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl log2f" %t1.s | count 1 ; RUN: grep "bl log2" %t1.s | count 2 declare double @llvm.log2.f64(double) diff --git a/test/CodeGen/XCore/pow.ll b/test/CodeGen/XCore/pow.ll index a7b6318c1091..b461185b7fde 100644 --- a/test/CodeGen/XCore/pow.ll +++ b/test/CodeGen/XCore/pow.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl powf" %t1.s | count 1 ; RUN: grep "bl pow" %t1.s | count 2 declare double @llvm.pow.f64(double, double) diff --git a/test/CodeGen/XCore/powi.ll b/test/CodeGen/XCore/powi.ll index 30e6d7ea88f3..de31cbed00c0 100644 --- a/test/CodeGen/XCore/powi.ll +++ b/test/CodeGen/XCore/powi.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl __powidf2" %t1.s | count 1 ; RUN: grep "bl __powisf2" %t1.s | count 1 declare double @llvm.powi.f64(double, i32) diff --git a/test/CodeGen/XCore/private.ll b/test/CodeGen/XCore/private.ll index 888ccdf297d5..9a2f5b32dc39 100644 --- a/test/CodeGen/XCore/private.ll +++ b/test/CodeGen/XCore/private.ll @@ -1,6 +1,6 @@ ; Test to make sure that the 'private' is used correctly. ; -; RUN: llvm-as < %s | llc -march=xcore > %t +; RUN: llc < %s -march=xcore > %t ; RUN: grep .Lfoo: %t ; RUN: grep bl.*\.Lfoo %t ; RUN: grep .Lbaz: %t diff --git a/test/CodeGen/XCore/sext.ll b/test/CodeGen/XCore/sext.ll new file mode 100644 index 000000000000..9cd4ad66a5cd --- /dev/null +++ b/test/CodeGen/XCore/sext.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s -march=xcore | FileCheck %s +define i32 @sext1(i32 %a) { + %1 = trunc i32 %a to i1 + %2 = sext i1 %1 to i32 + ret i32 %2 +} +; CHECK: sext1: +; CHECK: sext r0, 1 + +define i32 @sext2(i32 %a) { + %1 = trunc i32 %a to i2 + %2 = sext i2 %1 to i32 + ret i32 %2 +} +; CHECK: sext2: +; CHECK: sext r0, 2 + +define i32 @sext8(i32 %a) { + %1 = trunc i32 %a to i8 + %2 = sext i8 %1 to i32 + ret i32 %2 +} +; CHECK: sext8: +; CHECK: sext r0, 8 + +define i32 @sext16(i32 %a) { + %1 = trunc i32 %a to i16 + %2 = sext i16 %1 to i32 + ret i32 %2 +} +; CHECK: sext16: +; CHECK: sext r0, 16 diff --git a/test/CodeGen/XCore/sin.ll b/test/CodeGen/XCore/sin.ll index 41aab675953f..ced026f1d3e1 100644 --- a/test/CodeGen/XCore/sin.ll +++ b/test/CodeGen/XCore/sin.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl sinf" %t1.s | count 1 ; RUN: grep "bl sin" %t1.s | count 2 declare double @llvm.sin.f64(double) diff --git a/test/CodeGen/XCore/sqrt.ll b/test/CodeGen/XCore/sqrt.ll index 221d1ac1a781..364d1a14c6ae 100644 --- a/test/CodeGen/XCore/sqrt.ll +++ b/test/CodeGen/XCore/sqrt.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "bl sqrtf" %t1.s | count 1 ; RUN: grep "bl sqrt" %t1.s | count 2 declare double @llvm.sqrt.f64(double) diff --git a/test/CodeGen/XCore/store.ll b/test/CodeGen/XCore/store.ll new file mode 100644 index 000000000000..2213743ff897 --- /dev/null +++ b/test/CodeGen/XCore/store.ll @@ -0,0 +1,35 @@ +; RUN: llc < %s -march=xcore > %t1.s +; RUN: not grep add %t1.s +; RUN: not grep ldaw %t1.s +; RUN: not grep lda16 %t1.s +; RUN: grep "stw" %t1.s | count 2 +; RUN: grep "st16" %t1.s | count 1 +; RUN: grep "st8" %t1.s | count 1 + +define void @store32(i32* %p, i32 %offset, i32 %val) nounwind { +entry: + %0 = getelementptr i32* %p, i32 %offset + store i32 %val, i32* %0, align 4 + ret void +} + +define void @store32_imm(i32* %p, i32 %val) nounwind { +entry: + %0 = getelementptr i32* %p, i32 11 + store i32 %val, i32* %0, align 4 + ret void +} + +define void @store16(i16* %p, i32 %offset, i16 %val) nounwind { +entry: + %0 = getelementptr i16* %p, i32 %offset + store i16 %val, i16* %0, align 2 + ret void +} + +define void @store8(i8* %p, i32 %offset, i8 %val) nounwind { +entry: + %0 = getelementptr i8* %p, i32 %offset + store i8 %val, i8* %0, align 1 + ret void +} diff --git a/test/CodeGen/XCore/tls.ll b/test/CodeGen/XCore/tls.ll new file mode 100644 index 000000000000..ed41afae0996 --- /dev/null +++ b/test/CodeGen/XCore/tls.ll @@ -0,0 +1,20 @@ +; RUN: llc < %s -march=xcore -mcpu=xs1b-generic | FileCheck %s + +define i32 *@addr_G() { +entry: +; CHECK: addr_G: +; CHECK: get r11, id + ret i32* @G +} + +@G = thread_local global i32 15 +; CHECK: .section .dp.data,"awd",@progbits +; CHECK: G: +; CHECK: .long 15 +; CHECK: .long 15 +; CHECK: .long 15 +; CHECK: .long 15 +; CHECK: .long 15 +; CHECK: .long 15 +; CHECK: .long 15 +; CHECK: .long 15 diff --git a/test/CodeGen/XCore/trap.ll b/test/CodeGen/XCore/trap.ll index b3d3bc2270e3..45f886d332aa 100644 --- a/test/CodeGen/XCore/trap.ll +++ b/test/CodeGen/XCore/trap.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | llc -march=xcore > %t1.s +; RUN: llc < %s -march=xcore > %t1.s ; RUN: grep "ecallf" %t1.s | count 1 ; RUN: grep "ldc" %t1.s | count 1 define i32 @test() noreturn nounwind { diff --git a/test/CodeGen/XCore/unaligned_load.ll b/test/CodeGen/XCore/unaligned_load.ll new file mode 100644 index 000000000000..0ee8e1c32667 --- /dev/null +++ b/test/CodeGen/XCore/unaligned_load.ll @@ -0,0 +1,31 @@ +; RUN: llc < %s -march=xcore > %t1.s +; RUN: grep "bl __misaligned_load" %t1.s | count 1 +; RUN: grep ld16s %t1.s | count 2 +; RUN: grep ldw %t1.s | count 2 +; RUN: grep shl %t1.s | count 2 +; RUN: grep shr %t1.s | count 1 +; RUN: grep zext %t1.s | count 1 +; RUN: grep "or " %t1.s | count 2 + +; Byte aligned load. Expands to call to __misaligned_load. +define i32 @align1(i32* %p) nounwind { +entry: + %0 = load i32* %p, align 1 ; <i32> [#uses=1] + ret i32 %0 +} + +; Half word aligned load. Expands to two 16bit loads. +define i32 @align2(i32* %p) nounwind { +entry: + %0 = load i32* %p, align 2 ; <i32> [#uses=1] + ret i32 %0 +} + +@a = global [5 x i8] zeroinitializer, align 4 + +; Constant offset from word aligned base. Expands to two 32bit loads. +define i32 @align3() nounwind { +entry: + %0 = load i32* bitcast (i8* getelementptr ([5 x i8]* @a, i32 0, i32 1) to i32*), align 1 + ret i32 %0 +} diff --git a/test/CodeGen/XCore/unaligned_store.ll b/test/CodeGen/XCore/unaligned_store.ll new file mode 100644 index 000000000000..62078e6f6077 --- /dev/null +++ b/test/CodeGen/XCore/unaligned_store.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -march=xcore > %t1.s +; RUN: grep "bl __misaligned_store" %t1.s | count 1 +; RUN: grep st16 %t1.s | count 2 +; RUN: grep shr %t1.s | count 1 + +; Byte aligned store. Expands to call to __misaligned_store. +define void @align1(i32* %p, i32 %val) nounwind { +entry: + store i32 %val, i32* %p, align 1 + ret void +} + +; Half word aligned store. Expands to two 16bit stores. +define void @align2(i32* %p, i32 %val) nounwind { +entry: + store i32 %val, i32* %p, align 2 + ret void +} diff --git a/test/CodeGen/XCore/unaligned_store_combine.ll b/test/CodeGen/XCore/unaligned_store_combine.ll new file mode 100644 index 000000000000..493ca6a975f8 --- /dev/null +++ b/test/CodeGen/XCore/unaligned_store_combine.ll @@ -0,0 +1,12 @@ +; RUN: llc < %s -march=xcore > %t1.s +; RUN: grep "bl memmove" %t1.s | count 1 +; RUN: grep "ldc r., 8" %t1.s | count 1 + +; Unaligned load / store pair. Should be combined into a memmove +; of size 8 +define void @f(i64* %dst, i64* %src) nounwind { +entry: + %0 = load i64* %src, align 1 + store i64 %0, i64* %dst, align 1 + ret void +} |
