aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/AVR
diff options
context:
space:
mode:
authorBen Shi <powerman1st@163.com>2023-01-14 16:40:43 +0800
committerBen Shi <powerman1st@163.com>2023-04-17 15:35:33 +0800
commit2a528760bf20004066effcf8f91fedaabd261903 (patch)
treea0c84a79c7cc9180fda53ab7c8cc8d1360b45a5a /llvm/test/CodeGen/AVR
parent82fdd5b5123ee8528267a5bed1c443a30f3f93d7 (diff)
downloadllvm-2a528760bf20004066effcf8f91fedaabd261903.zip
llvm-2a528760bf20004066effcf8f91fedaabd261903.tar.gz
llvm-2a528760bf20004066effcf8f91fedaabd261903.tar.bz2
[AVR] Fix an issue of writing 16-bit ports
For 16-bit ports, the normal devices reqiure writing high byte first and then low byte. But the XMEGA devices require the reverse order. Fixes https://github.com/llvm/llvm-project/issues/58395 Reviewed By: aykevl, jacquesguan Differential Revision: https://reviews.llvm.org/D141752
Diffstat (limited to 'llvm/test/CodeGen/AVR')
-rw-r--r--llvm/test/CodeGen/AVR/PR37143.ll4
-rw-r--r--llvm/test/CodeGen/AVR/alloca.ll6
-rw-r--r--llvm/test/CodeGen/AVR/atomics/load16.ll10
-rw-r--r--llvm/test/CodeGen/AVR/atomics/store.ll4
-rw-r--r--llvm/test/CodeGen/AVR/atomics/store16.ll4
-rw-r--r--llvm/test/CodeGen/AVR/call.ll26
-rw-r--r--llvm/test/CodeGen/AVR/dynalloca.ll10
-rw-r--r--llvm/test/CodeGen/AVR/lpmx.ll8
-rw-r--r--llvm/test/CodeGen/AVR/pr43443-ctor-alias.ll2
-rw-r--r--llvm/test/CodeGen/AVR/pseudo/OUTWARr.mir18
-rw-r--r--llvm/test/CodeGen/AVR/pseudo/STDWPtrQRr.mir41
-rw-r--r--llvm/test/CodeGen/AVR/pseudo/STSWKRr.mir9
-rw-r--r--llvm/test/CodeGen/AVR/pseudo/STWPtrRr.mir21
-rw-r--r--llvm/test/CodeGen/AVR/shift32.ll4
-rw-r--r--llvm/test/CodeGen/AVR/store.ll10
-rw-r--r--llvm/test/CodeGen/AVR/struct.ll12
-rw-r--r--llvm/test/CodeGen/AVR/varargs.ll6
17 files changed, 115 insertions, 80 deletions
diff --git a/llvm/test/CodeGen/AVR/PR37143.ll b/llvm/test/CodeGen/AVR/PR37143.ll
index c7cabd3..fe9529a 100644
--- a/llvm/test/CodeGen/AVR/PR37143.ll
+++ b/llvm/test/CodeGen/AVR/PR37143.ll
@@ -2,8 +2,8 @@
; CHECK: ld {{r[0-9]+}}, [[PTR:[XYZ]]]
; CHECK: ldd {{r[0-9]+}}, [[PTR]]+1
-; CHECK: st [[PTR2:[XYZ]]], {{r[0-9]+}}
-; CHECK: std [[PTR2]]+1, {{r[0-9]+}}
+; CHECK: std [[PTR2:[XYZ]]]+1, {{r[0-9]+}}
+; CHECK: st [[PTR2]], {{r[0-9]+}}
define void @load_store_16(i16* nocapture %ptr) local_unnamed_addr #1 {
entry:
%0 = load i16, i16* %ptr, align 2
diff --git a/llvm/test/CodeGen/AVR/alloca.ll b/llvm/test/CodeGen/AVR/alloca.ll
index 37c0e62..30842f8 100644
--- a/llvm/test/CodeGen/AVR/alloca.ll
+++ b/llvm/test/CodeGen/AVR/alloca.ll
@@ -46,12 +46,12 @@ define i16 @alloca_write(i16 %x) {
entry:
; CHECK-LABEL: alloca_write:
; Small offset here
-; CHECK: std Y+23, {{.*}}
; CHECK: std Y+24, {{.*}}
+; CHECK: std Y+23, {{.*}}
; Big offset here
; CHECK: adiw r28, 57
-; CHECK: std Y+62, {{.*}}
; CHECK: std Y+63, {{.*}}
+; CHECK: std Y+62, {{.*}}
; CHECK: sbiw r28, 57
%p = alloca [15 x i16]
%k = alloca [14 x i16]
@@ -71,8 +71,8 @@ define void @alloca_write_huge() {
; CHECK-LABEL: alloca_write_huge:
; CHECK: subi r28, 41
; CHECK: sbci r29, 255
-; CHECK: std Y+62, {{.*}}
; CHECK: std Y+63, {{.*}}
+; CHECK: std Y+62, {{.*}}
; CHECK: subi r28, 215
; CHECK: sbci r29, 0
%k = alloca [140 x i16]
diff --git a/llvm/test/CodeGen/AVR/atomics/load16.ll b/llvm/test/CodeGen/AVR/atomics/load16.ll
index d019bf3..5046332 100644
--- a/llvm/test/CodeGen/AVR/atomics/load16.ll
+++ b/llvm/test/CodeGen/AVR/atomics/load16.ll
@@ -33,8 +33,8 @@ define i16 @atomic_load_cmp_swap16(i16* %foo) {
; CHECK-NEXT: ldd [[RDH:r[0-9]+]], [[RR]]+1
; CHECK-NEXT: add [[RR1L:r[0-9]+]], [[RDL]]
; CHECK-NEXT: adc [[RR1H:r[0-9]+]], [[RDH]]
-; CHECK-NEXT: st [[RR]], [[RR1L]]
; CHECK-NEXT: std [[RR]]+1, [[RR1H]]
+; CHECK-NEXT: st [[RR]], [[RR1L]]
; CHECK-NEXT: out 63, r0
define i16 @atomic_load_add16(i16* %foo) {
%val = atomicrmw add i16* %foo, i16 13 seq_cst
@@ -49,8 +49,8 @@ define i16 @atomic_load_add16(i16* %foo) {
; CHECK-NEXT: movw [[TMPL:r[0-9]+]], [[RDL]]
; CHECK-NEXT: sub [[TMPL]], [[RR1L:r[0-9]+]]
; CHECK-NEXT: sbc [[TMPH:r[0-9]+]], [[RR1H:r[0-9]+]]
-; CHECK-NEXT: st [[RR]], [[TMPL]]
; CHECK-NEXT: std [[RR]]+1, [[TMPH]]
+; CHECK-NEXT: st [[RR]], [[TMPL]]
; CHECK-NEXT: out 63, r0
define i16 @atomic_load_sub16(i16* %foo) {
%val = atomicrmw sub i16* %foo, i16 13 seq_cst
@@ -64,8 +64,8 @@ define i16 @atomic_load_sub16(i16* %foo) {
; CHECK-NEXT: ldd [[RDH:r[0-9]+]], [[RR]]+1
; CHECK-NEXT: and [[RD1L:r[0-9]+]], [[RDL]]
; CHECK-NEXT: and [[RD1H:r[0-9]+]], [[RDH]]
-; CHECK-NEXT: st [[RR]], [[RD1L]]
; CHECK-NEXT: std [[RR]]+1, [[RD1H]]
+; CHECK-NEXT: st [[RR]], [[RD1L]]
; CHECK-NEXT: out 63, r0
define i16 @atomic_load_and16(i16* %foo) {
%val = atomicrmw and i16* %foo, i16 13 seq_cst
@@ -79,8 +79,8 @@ define i16 @atomic_load_and16(i16* %foo) {
; CHECK-NEXT: ldd [[RDH:r[0-9]+]], [[RR]]+1
; CHECK-NEXT: or [[RD1L:r[0-9]+]], [[RDL]]
; CHECK-NEXT: or [[RD1H:r[0-9]+]], [[RDH]]
-; CHECK-NEXT: st [[RR]], [[RD1L]]
; CHECK-NEXT: std [[RR]]+1, [[RD1H]]
+; CHECK-NEXT: st [[RR]], [[RD1L]]
; CHECK-NEXT: out 63, r0
define i16 @atomic_load_or16(i16* %foo) {
%val = atomicrmw or i16* %foo, i16 13 seq_cst
@@ -94,8 +94,8 @@ define i16 @atomic_load_or16(i16* %foo) {
; CHECK-NEXT: ldd [[RDH:r[0-9]+]], [[RR]]+1
; CHECK-NEXT: eor [[RD1L:r[0-9]+]], [[RDL]]
; CHECK-NEXT: eor [[RD1H:r[0-9]+]], [[RDH]]
-; CHECK-NEXT: st [[RR]], [[RD1L]]
; CHECK-NEXT: std [[RR]]+1, [[RD1H]]
+; CHECK-NEXT: st [[RR]], [[RD1L]]
; CHECK-NEXT: out 63, r0
define i16 @atomic_load_xor16(i16* %foo) {
%val = atomicrmw xor i16* %foo, i16 13 seq_cst
diff --git a/llvm/test/CodeGen/AVR/atomics/store.ll b/llvm/test/CodeGen/AVR/atomics/store.ll
index e1231c2..0eb6b51 100644
--- a/llvm/test/CodeGen/AVR/atomics/store.ll
+++ b/llvm/test/CodeGen/AVR/atomics/store.ll
@@ -13,8 +13,8 @@ define void @atomic_store8(i8* %foo) {
; CHECK-LABEL: atomic_store16
; CHECK: in r0, 63
; CHECK-NEXT: cli
-; CHECK-NEXT: st [[RD:(X|Y|Z)]], [[RR:r[0-9]+]]
-; CHECK-NEXT: std [[RD]]+1, [[RR:r[0-9]+]]
+; CHECK-NEXT: std [[RD:(X|Y|Z)]]+1, [[RR:r[0-9]+]]
+; CHECK-NEXT: st [[RD]], [[RR:r[0-9]+]]
; CHECK-NEXT: out 63, r0
define void @atomic_store16(i16* %foo) {
store atomic i16 1, i16* %foo unordered, align 2
diff --git a/llvm/test/CodeGen/AVR/atomics/store16.ll b/llvm/test/CodeGen/AVR/atomics/store16.ll
index 610a53f..779ea18 100644
--- a/llvm/test/CodeGen/AVR/atomics/store16.ll
+++ b/llvm/test/CodeGen/AVR/atomics/store16.ll
@@ -3,8 +3,8 @@
; CHECK-LABEL: atomic_store16
; CHECK: in r0, 63
; CHECK-NEXT: cli
-; CHECK-NEXT: st [[RD:(X|Y|Z)]], [[RR:r[0-9]+]]
; CHECK-NEXT: std [[RD:(X|Y|Z)]]+1, [[RR:r[0-9]+]]
+; CHECK-NEXT: st [[RD:(X|Y|Z)]], [[RR:r[0-9]+]]
; CHECK-NEXT: out 63, r0
define void @atomic_store16(i16* %foo) {
store atomic i16 1, i16* %foo unordered, align 2
@@ -14,8 +14,8 @@ define void @atomic_store16(i16* %foo) {
; CHECK-LABEL: monotonic
; CHECK: in r0, 63
; CHECK-NEXT: cli
-; CHECK-NEXT: st Z, r24
; CHECK-NEXT: std Z+1, r25
+; CHECK-NEXT: st Z, r24
; CHECK-NEXT: out 63, r0
define void @monotonic(i16) {
entry-block:
diff --git a/llvm/test/CodeGen/AVR/call.ll b/llvm/test/CodeGen/AVR/call.ll
index ec91480..39382bc 100644
--- a/llvm/test/CodeGen/AVR/call.ll
+++ b/llvm/test/CodeGen/AVR/call.ll
@@ -35,8 +35,8 @@ define i8 @calli8_stack() {
; CHECK-LABEL: calli8_stack:
; CHECK: ldi [[REG1:r[0-9]+]], 10
; CHECK: ldi [[REG2:r[0-9]+]], 11
-; CHECK: std Z+1, [[REG1]]
; CHECK: std Z+2, [[REG2]]
+; CHECK: std Z+1, [[REG1]]
; AVR6: call foo8_3
; AVR2: rcall foo8_3
%result1 = call i8 @foo8_3(i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11)
@@ -59,12 +59,12 @@ define i16 @calli16_stack() {
; CHECK-LABEL: calli16_stack:
; CHECK: ldi [[REG1:r[0-9]+]], 10
; CHECK: ldi [[REG2:r[0-9]+]], 2
-; CHECK: std Z+3, [[REG1]]
; CHECK: std Z+4, [[REG2]]
+; CHECK: std Z+3, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 9
; CHECK: ldi [[REG2:r[0-9]+]], 2
-; CHECK: std Z+1, [[REG1]]
; CHECK: std Z+2, [[REG2]]
+; CHECK: std Z+1, [[REG1]]
; AVR6: call foo16_2
; AVR2: rcall foo16_2
%result1 = call i16 @foo16_2(i16 512, i16 513, i16 514, i16 515, i16 516, i16 517, i16 518, i16 519, i16 520, i16 521, i16 522)
@@ -91,12 +91,12 @@ define i32 @calli32_stack() {
; CHECK-LABEL: calli32_stack:
; CHECK: ldi [[REG1:r[0-9]+]], 15
; CHECK: ldi [[REG2:r[0-9]+]], 2
-; CHECK: std Z+3, [[REG1]]
; CHECK: std Z+4, [[REG2]]
+; CHECK: std Z+3, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 64
; CHECK: ldi [[REG2:r[0-9]+]], 66
-; CHECK: std Z+1, [[REG1]]
; CHECK: std Z+2, [[REG2]]
+; CHECK: std Z+1, [[REG1]]
; AVR6: call foo32_2
; AVR2: rcall foo32_2
%result1 = call i32 @foo32_2(i32 1, i32 2, i32 3, i32 4, i32 34554432)
@@ -124,20 +124,20 @@ define i64 @calli64_stack() {
; CHECK: ldi [[REG1:r[0-9]+]], 31
; CHECK: ldi [[REG2:r[0-9]+]], 242
-; CHECK: std Z+7, [[REG1]]
; CHECK: std Z+8, [[REG2]]
+; CHECK: std Z+7, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 76
; CHECK: ldi [[REG2:r[0-9]+]], 73
-; CHECK: std Z+5, [[REG1]]
; CHECK: std Z+6, [[REG2]]
+; CHECK: std Z+5, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 155
; CHECK: ldi [[REG2:r[0-9]+]], 88
-; CHECK: std Z+3, [[REG1]]
; CHECK: std Z+4, [[REG2]]
+; CHECK: std Z+3, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 255
; CHECK: ldi [[REG2:r[0-9]+]], 255
-; CHECK: std Z+1, [[REG1]]
; CHECK: std Z+2, [[REG2]]
+; CHECK: std Z+1, [[REG1]]
; AVR6: call foo64_2
; AVR2: rcall foo64_2
%result1 = call i64 @foo64_2(i64 1, i64 2, i64 17446744073709551615)
@@ -157,20 +157,20 @@ define void @testcallprologue() {
; CHECK: std Y+9, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 11
; CHECK: ldi [[REG2:r[0-9]+]], 10
-; CHECK: std Y+7, [[REG1]]
; CHECK: std Y+8, [[REG2]]
+; CHECK: std Y+7, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 13
; CHECK: ldi [[REG2:r[0-9]+]], 12
-; CHECK: std Y+5, [[REG1]]
; CHECK: std Y+6, [[REG2]]
+; CHECK: std Y+5, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 15
; CHECK: ldi [[REG2:r[0-9]+]], 14
-; CHECK: std Y+3, [[REG1]]
; CHECK: std Y+4, [[REG2]]
+; CHECK: std Y+3, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 8
; CHECK: ldi [[REG2:r[0-9]+]], 9
-; CHECK: std Y+1, [[REG1]]
; CHECK: std Y+2, [[REG2]]
+; CHECK: std Y+1, [[REG1]]
; CHECK: pop r29
; CHECK: pop r28
%p = alloca [8 x i16]
diff --git a/llvm/test/CodeGen/AVR/dynalloca.ll b/llvm/test/CodeGen/AVR/dynalloca.ll
index 7f69966..28c743c 100644
--- a/llvm/test/CodeGen/AVR/dynalloca.ll
+++ b/llvm/test/CodeGen/AVR/dynalloca.ll
@@ -19,8 +19,8 @@ define void @test1(i16 %x) {
; CHECK-NEXT: out 63, r0
; CHECK-NEXT: out 61, {{.*}}
; Test writes
-; CHECK: std Z+12, {{.*}}
; CHECK: std Z+13, {{.*}}
+; CHECK: std Z+12, {{.*}}
; CHECK: std Z+7, {{.*}}
; CHECK-NOT: std
; Test SP restore
@@ -66,14 +66,14 @@ define void @dynalloca2(i16 %x) {
; Store values on the stack
; CHECK: ldi r16, 0
; CHECK: ldi r17, 0
-; CHECK: std Z+7, r16
; CHECK: std Z+8, r17
-; CHECK: std Z+5, r16
+; CHECK: std Z+7, r16
; CHECK: std Z+6, r17
-; CHECK: std Z+3, r16
+; CHECK: std Z+5, r16
; CHECK: std Z+4, r17
-; CHECK: std Z+1, r16
+; CHECK: std Z+3, r16
; CHECK: std Z+2, r17
+; CHECK: std Z+1, r16
; CHECK: call
; Call frame restore
; CHECK-NEXT: in r30, 61
diff --git a/llvm/test/CodeGen/AVR/lpmx.ll b/llvm/test/CodeGen/AVR/lpmx.ll
index e84caf4..db8fdb4 100644
--- a/llvm/test/CodeGen/AVR/lpmx.ll
+++ b/llvm/test/CodeGen/AVR/lpmx.ll
@@ -20,8 +20,8 @@ define i16 @foo0(i16 %a) addrspace(1) {
; CHECK-O0-NEXT: out 62, r29
; CHECK-O0-NEXT: out 63, r0
; CHECK-O0-NEXT: out 61, r28
-; CHECK-O0-NEXT: std Y+1, r24
; CHECK-O0-NEXT: std Y+2, r25
+; CHECK-O0-NEXT: std Y+1, r24
; CHECK-O0-NEXT: ldd r30, Y+1
; CHECK-O0-NEXT: ldd r31, Y+2
; CHECK-O0-NEXT: lsl r30
@@ -52,8 +52,8 @@ define i16 @foo0(i16 %a) addrspace(1) {
; CHECK-O3-NEXT: out 62, r29
; CHECK-O3-NEXT: out 63, r0
; CHECK-O3-NEXT: out 61, r28
-; CHECK-O3-NEXT: std Y+1, r24
; CHECK-O3-NEXT: std Y+2, r25
+; CHECK-O3-NEXT: std Y+1, r24
; CHECK-O3-NEXT: lsl r24
; CHECK-O3-NEXT: rol r25
; CHECK-O3-NEXT: subi r24, lo8(-(arr0))
@@ -92,8 +92,8 @@ define i8 @foo1(i16 %a) addrspace(1) {
; CHECK-O0-NEXT: out 62, r29
; CHECK-O0-NEXT: out 63, r0
; CHECK-O0-NEXT: out 61, r28
-; CHECK-O0-NEXT: std Y+1, r24
; CHECK-O0-NEXT: std Y+2, r25
+; CHECK-O0-NEXT: std Y+1, r24
; CHECK-O0-NEXT: ldd r30, Y+1
; CHECK-O0-NEXT: ldd r31, Y+2
; CHECK-O0-NEXT: subi r30, lo8(-(arr1))
@@ -121,8 +121,8 @@ define i8 @foo1(i16 %a) addrspace(1) {
; CHECK-O3-NEXT: out 62, r29
; CHECK-O3-NEXT: out 63, r0
; CHECK-O3-NEXT: out 61, r28
-; CHECK-O3-NEXT: std Y+1, r24
; CHECK-O3-NEXT: std Y+2, r25
+; CHECK-O3-NEXT: std Y+1, r24
; CHECK-O3-NEXT: subi r24, lo8(-(arr1))
; CHECK-O3-NEXT: sbci r25, hi8(-(arr1))
; CHECK-O3-NEXT: movw r30, r24
diff --git a/llvm/test/CodeGen/AVR/pr43443-ctor-alias.ll b/llvm/test/CodeGen/AVR/pr43443-ctor-alias.ll
index 7aa6803..9175e8c 100644
--- a/llvm/test/CodeGen/AVR/pr43443-ctor-alias.ll
+++ b/llvm/test/CodeGen/AVR/pr43443-ctor-alias.ll
@@ -30,8 +30,8 @@ define void @_ZN3fooC2Ev(%struct.foo* dereferenceable(1) %this) {
; CHECK-NEXT: out 62, r29
; CHECK-NEXT: out 63, r0
; CHECK-NEXT: out 61, r28
-; CHECK-NEXT: std Y+1, r24
; CHECK-NEXT: std Y+2, r25
+; CHECK-NEXT: std Y+1, r24
; CHECK-NEXT: adiw r28, 2
; CHECK-NEXT: in r0, 63
; CHECK-NEXT: cli
diff --git a/llvm/test/CodeGen/AVR/pseudo/OUTWARr.mir b/llvm/test/CodeGen/AVR/pseudo/OUTWARr.mir
index 3152085..8b9c0fd 100644
--- a/llvm/test/CodeGen/AVR/pseudo/OUTWARr.mir
+++ b/llvm/test/CodeGen/AVR/pseudo/OUTWARr.mir
@@ -1,4 +1,13 @@
-# RUN: llc -O0 -run-pass=avr-expand-pseudo %s -o - | FileCheck %s
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mtriple=avr -mcpu=attiny11 %s -o - \
+# RUN: | FileCheck %s
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mtriple=avr -mcpu=atmega328 %s -o - \
+# RUN: | FileCheck %s
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mtriple=avr -mcpu=attiny817 %s -o - \
+# RUN: | FileCheck --check-prefix=XMEGA %s
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mtriple=avr -mcpu=atxmega64a1 %s -o - \
+# RUN: | FileCheck --check-prefix=XMEGA %s
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mtriple=avr -mcpu=atxmega256a3u %s -o - \
+# RUN: | FileCheck --check-prefix=XMEGA %s
--- |
target triple = "avr--"
@@ -15,9 +24,12 @@ body: |
liveins: $r15r14
; CHECK-LABEL: test
+ ; CHECK: OUTARr 32, $r15
+ ; CHECK-NEXT: OUTARr 31, $r14
- ; CHECK: OUTARr 32, $r15
- ; CHECK-NEXT: OUTARr 31, $r14
+ ; XMEGA-LABEL: test
+ ; XMEGA: OUTARr 31, $r14
+ ; XMEGA-NEXT: OUTARr 32, $r15
OUTWARr 31, $r15r14
...
diff --git a/llvm/test/CodeGen/AVR/pseudo/STDWPtrQRr.mir b/llvm/test/CodeGen/AVR/pseudo/STDWPtrQRr.mir
index 535296d..89b124d 100644
--- a/llvm/test/CodeGen/AVR/pseudo/STDWPtrQRr.mir
+++ b/llvm/test/CodeGen/AVR/pseudo/STDWPtrQRr.mir
@@ -1,5 +1,8 @@
# RUN: llc -O0 -run-pass=avr-expand-pseudo -verify-machineinstrs %s -o - | FileCheck %s
-# RUN: llc -O0 -run-pass=avr-expand-pseudo -verify-machineinstrs -mattr=avrtiny %s -o - | FileCheck %s --check-prefix=CHECK-TINY
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -verify-machineinstrs -mattr=avrtiny %s -o - \
+# RUN: | FileCheck %s --check-prefix=CHECK-TINY
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -verify-machineinstrs -mattr=lowbytefirst %s -o - \
+# RUN: | FileCheck %s --check-prefix=CHECK-XMEGA
--- |
target triple = "avr--"
@@ -17,29 +20,37 @@ body: |
; CHECK-LABEL: test
; Small displacement (<63):
- ; CHECK: STDPtrQRr $r29r28, 3, $r0
- ; CHECK-NEXT: STDPtrQRr $r29r28, 4, $r1
- ; CHECK-TINY: $r28 = SUBIRdK killed $r28, 253, implicit-def $sreg
- ; CHECK-TINY-NEXT: $r29 = SBCIRdK killed $r29, 255, implicit-def $sreg, implicit killed $sreg
- ; CHECK-TINY-NEXT: early-clobber $r29r28 = STPtrPiRr killed $r29r28, $r0, 0
- ; CHECK-TINY-NEXT: early-clobber $r29r28 = STPtrPiRr killed $r29r28, $r1, 0
- ; CHECK-TINY-NEXT: $r28 = SUBIRdK killed $r28, 5, implicit-def $sreg
- ; CHECK-TINY-NEXT: $r29 = SBCIRdK killed $r29, 0, implicit-def $sreg, implicit killed $sreg
+ ; CHECK: STDPtrQRr $r29r28, 4, $r1
+ ; CHECK-NEXT: STDPtrQRr $r29r28, 3, $r0
+ ; CHECK-XMEGA: STDPtrQRr $r29r28, 3, $r0
+ ; CHECK-XMEGA-NEXT: STDPtrQRr $r29r28, 4, $r1
+ ; CHECK-TINY: $r28 = SUBIRdK killed $r28, 253, implicit-def $sreg
+ ; CHECK-TINY-NEXT: $r29 = SBCIRdK killed $r29, 255, implicit-def $sreg, implicit killed $sreg
+ ; CHECK-TINY-NEXT: early-clobber $r29r28 = STPtrPiRr killed $r29r28, $r0, 0
+ ; CHECK-TINY-NEXT: early-clobber $r29r28 = STPtrPiRr killed $r29r28, $r1, 0
+ ; CHECK-TINY-NEXT: $r28 = SUBIRdK killed $r28, 5, implicit-def $sreg
+ ; CHECK-TINY-NEXT: $r29 = SBCIRdK killed $r29, 0, implicit-def $sreg, implicit killed $sreg
STDWPtrQRr $r29r28, 3, $r1r0
; Small displacement where the destination register is killed:
- ; CHECK: STDPtrQRr $r29r28, 3, $r0
- ; CHECK-NEXT: STDPtrQRr killed $r29r28, 4, $r1
+ ; CHECK-NEXT: STDPtrQRr $r29r28, 4, $r1
+ ; CHECK-NEXT: STDPtrQRr killed $r29r28, 3, $r0
+ ; CHECK-XMEGA-NEXT: STDPtrQRr $r29r28, 3, $r0
+ ; CHECK-XMEGA-NEXT: STDPtrQRr killed $r29r28, 4, $r1
STDWPtrQRr killed $r29r28, 3, $r1r0
; Small displacement where the source register is killed:
- ; CHECK: STDPtrQRr $r29r28, 3, killed $r0
- ; CHECK-NEXT: STDPtrQRr $r29r28, 4, killed $r1
+ ; CHECK: STDPtrQRr $r29r28, 4, killed $r1
+ ; CHECK-NEXT: STDPtrQRr $r29r28, 3, killed $r0
+ ; CHECK-XMEGA: STDPtrQRr $r29r28, 3, killed $r0
+ ; CHECK-XMEGA-NEXT: STDPtrQRr $r29r28, 4, killed $r1
STDWPtrQRr $r29r28, 3, killed $r1r0
; Small displacement, near the limit (=62):
- ; CHECK: STDPtrQRr $r29r28, 62, $r0
- ; CHECK-NEXT: STDPtrQRr $r29r28, 63, $r1
+ ; CHECK: STDPtrQRr $r29r28, 63, $r1
+ ; CHECK-NEXT: STDPtrQRr $r29r28, 62, $r0
+ ; CHECK-XMEGA: STDPtrQRr $r29r28, 62, $r0
+ ; CHECK-XMEGA-NEXT: STDPtrQRr $r29r28, 63, $r1
STDWPtrQRr $r29r28, 62, $r1r0
; Large displacement (>=63):
diff --git a/llvm/test/CodeGen/AVR/pseudo/STSWKRr.mir b/llvm/test/CodeGen/AVR/pseudo/STSWKRr.mir
index 96a648b..cd45feb 100644
--- a/llvm/test/CodeGen/AVR/pseudo/STSWKRr.mir
+++ b/llvm/test/CodeGen/AVR/pseudo/STSWKRr.mir
@@ -1,4 +1,6 @@
# RUN: llc -O0 -run-pass=avr-expand-pseudo %s -o - | FileCheck %s
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mcpu=atxmega64a1 %s -o - \
+# RUN: | FileCheck --check-prefix=XMEGA %s
# This test checks the expansion of the 16-bit STSWRdK pseudo instruction.
@@ -17,9 +19,12 @@ body: |
liveins: $r31r30
; CHECK-LABEL: test_stswkrr
+ ; CHECK: STSKRr 2560, $r31
+ ; CHECK-NEXT: STSKRr 2559, $r30
- ; CHECK: STSKRr 2560, $r31
- ; CHECK-NEXT: STSKRr 2559, $r30
+ ; XMEGA-LABEL: test_stswkrr
+ ; XMEGA: STSKRr 2559, $r30
+ ; XMEGA-NEXT: STSKRr 2560, $r31
STSWKRr 2559, $r31r30
...
diff --git a/llvm/test/CodeGen/AVR/pseudo/STWPtrRr.mir b/llvm/test/CodeGen/AVR/pseudo/STWPtrRr.mir
index b6449ae..3350e6c 100644
--- a/llvm/test/CodeGen/AVR/pseudo/STWPtrRr.mir
+++ b/llvm/test/CodeGen/AVR/pseudo/STWPtrRr.mir
@@ -1,5 +1,8 @@
# RUN: llc -O0 -run-pass=avr-expand-pseudo %s -o - | FileCheck %s
-# RUN: llc -O0 -run-pass=avr-expand-pseudo -mattr=avrtiny %s -o - | FileCheck %s --check-prefix=CHECK-TINY
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mattr=avrtiny %s -o - \
+# RUN: | FileCheck %s --check-prefix=CHECK-TINY
+# RUN: llc -O0 -run-pass=avr-expand-pseudo -mattr=lowbytefirst %s -o - \
+# RUN: | FileCheck %s --check-prefix=CHECK-XMEGA
# This test checks the expansion of the 16-bit STSWRdK pseudo instruction.
@@ -18,14 +21,18 @@ body: |
liveins: $r31r30, $r17r16
; CHECK-LABEL: test_stwptrrr
+ ; CHECK: STDPtrQRr $r31r30, 1, $r17
+ ; CHECK-NEXT: STPtrRr $r31r30, $r16
- ; CHECK: STPtrRr $r31r30, $r16
- ; CHECK-NEXT: STDPtrQRr $r31r30, 1, $r17
+ ; CHECK-TINY-LABEL: test_stwptrrr
+ ; CHECK-TINY: $r31r30 = STPtrPiRr killed $r31r30, $r16, 0
+ ; CHECK-TINY-NEXT: $r31r30 = STPtrPiRr killed $r31r30, $r17, 0
+ ; CHECK-TINY-NEXT: $r30 = SUBIRdK killed $r30, 2, implicit-def $sreg
+ ; CHECK-TINY-NEXT: $r31 = SBCIRdK killed $r31, 0, implicit-def $sreg, implicit killed $sreg
- ; CHECK-TINY: $r31r30 = STPtrPiRr killed $r31r30, $r16, 0
- ; CHECK-TINY-NEXT: $r31r30 = STPtrPiRr killed $r31r30, $r17, 0
- ; CHECK-TINY-NEXT: $r30 = SUBIRdK killed $r30, 2, implicit-def $sreg
- ; CHECK-TINY-NEXT: $r31 = SBCIRdK killed $r31, 0, implicit-def $sreg, implicit killed $sreg
+ ; CHECK-XMEGA-LABEL: test_stwptrrr
+ ; CHECK-XMEGA: STPtrRr $r31r30, $r16
+ ; CHECK-XMEGA-NEXT: STDPtrQRr $r31r30, 1, $r17
STWPtrRr $r31r30, $r17r16
...
diff --git a/llvm/test/CodeGen/AVR/shift32.ll b/llvm/test/CodeGen/AVR/shift32.ll
index 820419b..9e97fac 100644
--- a/llvm/test/CodeGen/AVR/shift32.ll
+++ b/llvm/test/CodeGen/AVR/shift32.ll
@@ -208,12 +208,12 @@ define void @shl_i32_16_ptr(i32 %a, ptr %ptr) {
; CHECK-LABEL: shl_i32_16_ptr:
; CHECK: ; %bb.0:
; CHECK-NEXT: movw r30, r20
-; CHECK-NEXT: std Z+2, r22
; CHECK-NEXT: std Z+3, r23
+; CHECK-NEXT: std Z+2, r22
; CHECK-NEXT: ldi r24, 0
; CHECK-NEXT: ldi r25, 0
-; CHECK-NEXT: st Z, r24
; CHECK-NEXT: std Z+1, r25
+; CHECK-NEXT: st Z, r24
; CHECK-NEXT: ret
%res = shl i32 %a, 16
store i32 %res, ptr %ptr
diff --git a/llvm/test/CodeGen/AVR/store.ll b/llvm/test/CodeGen/AVR/store.ll
index 81bad77..8bfbcb0 100644
--- a/llvm/test/CodeGen/AVR/store.ll
+++ b/llvm/test/CodeGen/AVR/store.ll
@@ -9,8 +9,8 @@ define void @store8(i8* %x, i8 %y) {
define void @store16(i16* %x, i16 %y) {
; CHECK-LABEL: store16:
-; CHECK: st {{[YZ]}}, r22
; CHECK: std {{[YZ]}}+1, r23
+; CHECK: st {{[YZ]}}, r22
store i16 %y, i16* %x
ret void
}
@@ -36,8 +36,8 @@ define void @store8nodisp(i8* %x, i8 %y) {
define void @store16disp(i16* %x, i16 %y) {
; CHECK-LABEL: store16disp:
-; CHECK: std {{[YZ]}}+62, r22
; CHECK: std {{[YZ]}}+63, r23
+; CHECK: std {{[YZ]}}+62, r22
%arrayidx = getelementptr inbounds i16, i16* %x, i16 31
store i16 %y, i16* %arrayidx
ret void
@@ -48,8 +48,8 @@ define void @store16nodisp(i16* %x, i16 %y) {
; CHECK: subi r24, 192
; CHECK: sbci r25, 255
; CHECK: movw r30, r24
-; CHECK: st {{[YZ]}}, r22
; CHECK: std {{[YZ]}}+1, r23
+; CHECK: st {{[YZ]}}, r22
%arrayidx = getelementptr inbounds i16, i16* %x, i16 32
store i16 %y, i16* %arrayidx
ret void
@@ -75,8 +75,8 @@ while.end: ; preds = %while.body, %entry
define void @store16postinc(i16* %x, i16 %y) {
; CHECK-LABEL: store16postinc:
-; CHECK: st {{[XYZ]}}+, {{.*}}
-; CHECK: st {{[XYZ]}}+, {{.*}}
+; CHECK: std {{[XYZ]}}+1, {{.*}}
+; CHECK: st {{[XYZ]}}, {{.*}}
entry:
%tobool3 = icmp eq i16 %y, 0
br i1 %tobool3, label %while.end, label %while.body
diff --git a/llvm/test/CodeGen/AVR/struct.ll b/llvm/test/CodeGen/AVR/struct.ll
index 3d1eb83..1064236 100644
--- a/llvm/test/CodeGen/AVR/struct.ll
+++ b/llvm/test/CodeGen/AVR/struct.ll
@@ -11,23 +11,23 @@ define void @foo10(%struct.s10* sret(%struct.s10) %0, i16 %1, i16 %2, i16 %3) ad
; CHECKA: ; %bb.0:
; CHECKA-NEXT: mov r30, r24
; CHECKA-NEXT: mov r31, r25
-; CHECKA-NEXT: std Z+4, r22
; CHECKA-NEXT: std Z+5, r23
-; CHECKA-NEXT: std Z+2, r20
+; CHECKA-NEXT: std Z+4, r22
; CHECKA-NEXT: std Z+3, r21
-; CHECKA-NEXT: st Z, r18
+; CHECKA-NEXT: std Z+2, r20
; CHECKA-NEXT: std Z+1, r19
+; CHECKA-NEXT: st Z, r18
; CHECKA-NEXT: ret
;
; CHECKB-LABEL: foo10:
; CHECKB: ; %bb.0:
; CHECKB-NEXT: movw r30, r24
-; CHECKB-NEXT: std Z+4, r22
; CHECKB-NEXT: std Z+5, r23
-; CHECKB-NEXT: std Z+2, r20
+; CHECKB-NEXT: std Z+4, r22
; CHECKB-NEXT: std Z+3, r21
-; CHECKB-NEXT: st Z, r18
+; CHECKB-NEXT: std Z+2, r20
; CHECKB-NEXT: std Z+1, r19
+; CHECKB-NEXT: st Z, r18
; CHECKB-NEXT: ret
%5 = getelementptr inbounds %struct.s10, %struct.s10* %0, i16 0, i32 0
store i16 %3, i16* %5
diff --git a/llvm/test/CodeGen/AVR/varargs.ll b/llvm/test/CodeGen/AVR/varargs.ll
index 5bd5cba..00952af 100644
--- a/llvm/test/CodeGen/AVR/varargs.ll
+++ b/llvm/test/CodeGen/AVR/varargs.ll
@@ -42,16 +42,16 @@ define void @varargcall() {
; CHECK-LABEL: varargcall:
; CHECK: ldi [[REG1:r[0-9]+]], 191
; CHECK: ldi [[REG2:r[0-9]+]], 223
-; CHECK: std Z+5, [[REG1]]
; CHECK: std Z+6, [[REG2]]
+; CHECK: std Z+5, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 189
; CHECK: ldi [[REG2:r[0-9]+]], 205
-; CHECK: std Z+3, [[REG1]]
; CHECK: std Z+4, [[REG2]]
+; CHECK: std Z+3, [[REG1]]
; CHECK: ldi [[REG1:r[0-9]+]], 205
; CHECK: ldi [[REG2:r[0-9]+]], 171
-; CHECK: std Z+1, [[REG1]]
; CHECK: std Z+2, [[REG2]]
+; CHECK: std Z+1, [[REG1]]
; CHECK: call
; CHECK: adiw r30, 6
tail call void (i16, ...) @var1223(i16 -21555, i16 -12867, i16 -8257)