375 lines · plain
1; RUN: llc -mattr=sram,addsubiw < %s -mtriple=avr | FileCheck %s2; RUN: llc -mattr=sram,avrtiny < %s -mtriple=avr | FileCheck %s --check-prefix=CHECK-TINY3 4@char = common global i8 05@char.array = common global [3 x i8] zeroinitializer6@char.static = internal global i8 07 8@int = common global i16 09@int.array = common global [3 x i16] zeroinitializer10@int.static = internal global i16 011 12@long = common global i32 013@long.array = common global [3 x i32] zeroinitializer14@long.static = internal global i32 015 16@longlong = common global i64 017@longlong.array = common global [3 x i64] zeroinitializer18@longlong.static = internal global i64 019 20define void @global8_store() {21; CHECK-LABEL: global8_store:22; CHECK: ldi [[REG:r[0-9]+]], 623; CHECK: sts char, [[REG]]24;25; CHECK-TINY-LABEL: global8_store:26; CHECK-TINY: ldi [[REG:r[0-9]+]], 627; CHECK-TINY: sts char, [[REG]]28 store i8 6, ptr @char29 ret void30}31 32define i8 @global8_load() {33; CHECK-LABEL: global8_load:34; CHECK: lds r24, char35;36; CHECK-TINY-LABEL: global8_load:37; CHECK-TINY: lds r24, char38 %result = load i8, ptr @char39 ret i8 %result40}41 42define void @array8_store() {43; CHECK-LABEL: array8_store:44; CHECK: ldi [[REG1:r[0-9]+]], 345; CHECK: sts char.array+2, [[REG1]]46; CHECK: ldi [[REG3:r[0-9]+]], 147; CHECK: ldi [[REG2:r[0-9]+]], 248; CHECK: sts char.array+1, [[REG2]]49; CHECK: sts char.array, [[REG3]]50;51; CHECK-TINY-LABEL: array8_store:52; CHECK-TINY: ldi [[REG1:r[0-9]+]], 353; CHECK-TINY: sts char.array+2, [[REG1]]54 store i8 1, ptr @char.array55 store i8 2, ptr getelementptr inbounds ([3 x i8], ptr @char.array, i32 0, i64 1)56 store i8 3, ptr getelementptr inbounds ([3 x i8], ptr @char.array, i32 0, i64 2)57 ret void58}59 60define i8 @array8_load() {61; CHECK-LABEL: array8_load:62; CHECK: lds r24, char.array+263;64; CHECK-TINY-LABEL: array8_load:65; CHECK-TINY: lds r24, char.array+266 %result = load i8, ptr getelementptr inbounds ([3 x i8], ptr @char.array, i32 0, i64 2)67 ret i8 %result68}69 70define i8 @static8_inc() {71; CHECK-LABEL: static8_inc:72; CHECK: lds r24, char.static73; CHECK: inc r2474; CHECK: sts char.static, r2475;76; CHECK-TINY-LABEL: static8_inc:77; CHECK-TINY: lds r24, char.static78; CHECK-TINY: inc r2479; CHECK-TINY: sts char.static, r2480 %1 = load i8, ptr @char.static81 %inc = add nsw i8 %1, 182 store i8 %inc, ptr @char.static83 ret i8 %inc84}85 86define void @global16_store() {87; CHECK-LABEL: global16_store:88; CHECK: ldi [[REG1:r[0-9]+]], 18789; CHECK: ldi [[REG2:r[0-9]+]], 17090; CHECK: sts int+1, [[REG2]]91; CHECK: sts int, [[REG1]]92 store i16 43707, ptr @int93 ret void94}95 96define i16 @global16_load() {97; CHECK-LABEL: global16_load:98; CHECK: lds r24, int99; CHECK: lds r25, int+1100 %result = load i16, ptr @int101 ret i16 %result102}103 104define void @array16_store() {105; CHECK-LABEL: array16_store:106 107; CHECK: ldi [[REG1:r[0-9]+]], 221108; CHECK: ldi [[REG2:r[0-9]+]], 170109; CHECK: sts int.array+5, [[REG2]]110; CHECK: sts int.array+4, [[REG1]]111 112; CHECK: ldi [[REG1:r[0-9]+]], 204113; CHECK: ldi [[REG2:r[0-9]+]], 170114; CHECK: sts int.array+3, [[REG2]]115; CHECK: sts int.array+2, [[REG1]]116 117; CHECK: ldi [[REG1:r[0-9]+]], 187118; CHECK: ldi [[REG2:r[0-9]+]], 170119; CHECK: sts int.array+1, [[REG2]]120; CHECK: sts int.array, [[REG1]]121 store i16 43707, ptr @int.array122 store i16 43724, ptr getelementptr inbounds ([3 x i16], ptr @int.array, i32 0, i64 1)123 store i16 43741, ptr getelementptr inbounds ([3 x i16], ptr @int.array, i32 0, i64 2)124 ret void125}126 127define i16 @array16_load() {128; CHECK-LABEL: array16_load:129; CHECK: lds r24, int.array+4130; CHECK: lds r25, int.array+5131 %result = load i16, ptr getelementptr inbounds ([3 x i16], ptr @int.array, i32 0, i64 2)132 ret i16 %result133}134 135define i16 @static16_inc() {136; CHECK-LABEL: static16_inc:137; CHECK: lds r24, int.static138; CHECK: lds r25, int.static+1139; CHECK: adiw r24, 1140; CHECK: sts int.static+1, r25141; CHECK: sts int.static, r24142 %1 = load i16, ptr @int.static143 %inc = add nsw i16 %1, 1144 store i16 %inc, ptr @int.static145 ret i16 %inc146}147 148define void @global32_store() {149; CHECK-LABEL: global32_store:150; CHECK: ldi [[REG1:r[0-9]+]], 187151; CHECK: ldi [[REG2:r[0-9]+]], 170152; CHECK: sts long+3, [[REG2]]153; CHECK: sts long+2, [[REG1]]154; CHECK: ldi [[REG1:r[0-9]+]], 221155; CHECK: ldi [[REG2:r[0-9]+]], 204156; CHECK: sts long+1, [[REG2]]157; CHECK: sts long, [[REG1]]158 store i32 2864434397, ptr @long159 ret void160}161 162define i32 @global32_load() {163; CHECK-LABEL: global32_load:164; CHECK: lds r22, long165; CHECK: lds r23, long+1166; CHECK: lds r24, long+2167; CHECK: lds r25, long+3168 %result = load i32, ptr @long169 ret i32 %result170}171 172define void @array32_store() {173; CHECK-LABEL: array32_store:174 175; CHECK: ldi [[REG1:r[0-9]+]], 170176; CHECK: ldi [[REG2:r[0-9]+]], 153177; CHECK: sts long.array+11, [[REG2]]178; CHECK: sts long.array+10, [[REG1]]179 180; CHECK: ldi [[REG1:r[0-9]+]], 204181; CHECK: ldi [[REG2:r[0-9]+]], 187182; CHECK: sts long.array+9, [[REG2]]183; CHECK: sts long.array+8, [[REG1]]184 185; CHECK: ldi [[REG1:r[0-9]+]], 102186; CHECK: ldi [[REG2:r[0-9]+]], 85187; CHECK: sts long.array+7, [[REG2]]188; CHECK: sts long.array+6, [[REG1]]189 190; CHECK: ldi [[REG1:r[0-9]+]], 136191; CHECK: ldi [[REG2:r[0-9]+]], 119192; CHECK: sts long.array+5, [[REG2]]193; CHECK: sts long.array+4, [[REG1]]194 195; CHECK: ldi [[REG1:r[0-9]+]], 27196; CHECK: ldi [[REG2:r[0-9]+]], 172197; CHECK: sts long.array+3, [[REG2]]198; CHECK: sts long.array+2, [[REG1]]199 200; CHECK: ldi [[REG1:r[0-9]+]], 68201; CHECK: ldi [[REG2:r[0-9]+]], 13202; CHECK: sts long.array+1, [[REG2]]203; CHECK: sts long.array, [[REG1]]204 store i32 2887454020, ptr @long.array205 store i32 1432778632, ptr getelementptr inbounds ([3 x i32], ptr @long.array, i32 0, i64 1)206 store i32 2578103244, ptr getelementptr inbounds ([3 x i32], ptr @long.array, i32 0, i64 2)207 ret void208}209 210define i32 @array32_load() {211; CHECK-LABEL: array32_load:212; CHECK: lds r22, long.array+8213; CHECK: lds r23, long.array+9214; CHECK: lds r24, long.array+10215; CHECK: lds r25, long.array+11216 %result = load i32, ptr getelementptr inbounds ([3 x i32], ptr @long.array, i32 0, i64 2)217 ret i32 %result218}219 220define i32 @static32_inc() {221; CHECK-LABEL: static32_inc:222; CHECK: lds r22, long.static223; CHECK: lds r23, long.static+1224; CHECK: lds r24, long.static+2225; CHECK: lds r25, long.static+3226; CHECK: subi r22, 255227; CHECK: sbci r23, 255228; CHECK: sbci r24, 255229; CHECK: sbci r25, 255230; CHECK-DAG: sts long.static+3, r25231; CHECK-DAG: sts long.static+2, r24232; CHECK-DAG: sts long.static+1, r23233; CHECK-DAG: sts long.static, r22234 %1 = load i32, ptr @long.static235 %inc = add nsw i32 %1, 1236 store i32 %inc, ptr @long.static237 ret i32 %inc238}239 240define void @global64_store() {241; CHECK-LABEL: global64_store:242; CHECK: ldi [[REG1:r[0-9]+]], 34243; CHECK: ldi [[REG2:r[0-9]+]], 17244; CHECK: sts longlong+7, [[REG2]]245; CHECK: sts longlong+6, [[REG1]]246; CHECK: ldi [[REG1:r[0-9]+]], 68247; CHECK: ldi [[REG2:r[0-9]+]], 51248; CHECK: sts longlong+5, [[REG2]]249; CHECK: sts longlong+4, [[REG1]]250; CHECK: ldi [[REG1:r[0-9]+]], 102251; CHECK: ldi [[REG2:r[0-9]+]], 85252; CHECK: sts longlong+3, [[REG2]]253; CHECK: sts longlong+2, [[REG1]]254; CHECK: ldi [[REG1:r[0-9]+]], 136255; CHECK: ldi [[REG2:r[0-9]+]], 119256; CHECK: sts longlong+1, [[REG2]]257; CHECK: sts longlong, [[REG1]]258 store i64 1234605616436508552, ptr @longlong259 ret void260}261 262define i64 @global64_load() {263; CHECK-LABEL: global64_load:264; CHECK: lds r18, longlong265; CHECK: lds r19, longlong+1266; CHECK: lds r20, longlong+2267; CHECK: lds r21, longlong+3268; CHECK: lds r22, longlong+4269; CHECK: lds r23, longlong+5270; CHECK: lds r24, longlong+6271; CHECK: lds r25, longlong+7272 %result = load i64, ptr @longlong273 ret i64 %result274}275 276define void @array64_store() {277; CHECK-LABEL: array64_store:278; CHECK: ldi [[REG1:r[0-9]+]], 34279; CHECK: ldi [[REG2:r[0-9]+]], 17280; CHECK: sts longlong.array+7, [[REG2]]281; CHECK: sts longlong.array+6, [[REG1]]282; CHECK: ldi [[REG1:r[0-9]+]], 68283; CHECK: ldi [[REG2:r[0-9]+]], 51284; CHECK: sts longlong.array+5, [[REG2]]285; CHECK: sts longlong.array+4, [[REG1]]286; CHECK: ldi [[REG1:r[0-9]+]], 102287; CHECK: ldi [[REG2:r[0-9]+]], 85288; CHECK: sts longlong.array+3, [[REG2]]289; CHECK: sts longlong.array+2, [[REG1]]290; CHECK: ldi [[REG1:r[0-9]+]], 136291; CHECK: ldi [[REG2:r[0-9]+]], 119292; CHECK: sts longlong.array+1, [[REG2]]293; CHECK: sts longlong.array, [[REG1]]294 store i64 1234605616436508552, ptr @longlong.array295 store i64 81985529216486895, ptr getelementptr inbounds ([3 x i64], ptr @longlong.array, i64 0, i64 1)296 store i64 1836475854449306472, ptr getelementptr inbounds ([3 x i64], ptr @longlong.array, i64 0, i64 2)297 ret void298}299 300define i64 @array64_load() {301; CHECK-LABEL: array64_load:302; CHECK: lds r18, longlong.array+16303; CHECK: lds r19, longlong.array+17304; CHECK: lds r20, longlong.array+18305; CHECK: lds r21, longlong.array+19306; CHECK: lds r22, longlong.array+20307; CHECK: lds r23, longlong.array+21308; CHECK: lds r24, longlong.array+22309; CHECK: lds r25, longlong.array+23310 %result = load i64, ptr getelementptr inbounds ([3 x i64], ptr @longlong.array, i64 0, i64 2)311 ret i64 %result312}313 314define i64 @static64_inc() {315; CHECK-LABEL: static64_inc:316; CHECK: lds r18, longlong.static317; CHECK: lds r19, longlong.static+1318; CHECK: lds r20, longlong.static+2319; CHECK: lds r21, longlong.static+3320; CHECK: lds r22, longlong.static+4321; CHECK: lds r23, longlong.static+5322; CHECK: lds r24, longlong.static+6323; CHECK: lds r25, longlong.static+7324; CHECK: subi r18, 255325; CHECK: sbci r19, 255326; CHECK: sbci r20, 255327; CHECK: sbci r21, 255328; CHECK: sbci r22, 255329; CHECK: sbci r23, 255330; CHECK: sbci r24, 255331; CHECK: sbci r25, 255332; CHECK-DAG: sts longlong.static+7, r25333; CHECK-DAG: sts longlong.static+6, r24334; CHECK-DAG: sts longlong.static+5, r23335; CHECK-DAG: sts longlong.static+4, r22336; CHECK-DAG: sts longlong.static+3, r21337; CHECK-DAG: sts longlong.static+2, r20338; CHECK-DAG: sts longlong.static+1, r19339; CHECK-DAG: sts longlong.static, r18340 %1 = load i64, ptr @longlong.static341 %inc = add nsw i64 %1, 1342 store i64 %inc, ptr @longlong.static343 ret i64 %inc344}345 346define i8 @constantaddr_read8() {347; CHECK-LABEL: constantaddr_read8:348; CHECK: lds r24, 1234349 %1 = load i8, ptr inttoptr (i16 1234 to ptr)350 ret i8 %1351}352 353define i16 @constantaddr_read16() {354; CHECK-LABEL: constantaddr_read16:355; CHECK: lds r24, 1234356; CHECK: lds r25, 1235357 %1 = load i16, ptr inttoptr (i16 1234 to ptr)358 ret i16 %1359}360 361define void @constantaddr_write8() {362; CHECK-LABEL: constantaddr_write8:363; CHECK: sts 1234364 store i8 22, ptr inttoptr (i16 1234 to ptr)365 ret void366}367 368define void @constantaddr_write16() {369; CHECK-LABEL: constantaddr_write16:370; CHECK: sts 1235371; CHECK: sts 1234372 store i16 2222, ptr inttoptr (i16 1234 to ptr)373 ret void374}375