1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=avr --mcpu=atmega2560 -verify-machineinstrs | FileCheck %s 3 4@arr0 = addrspace(1) constant [4 x i16] [i16 123, i16 24, i16 56, i16 37], align 1 5@arr1 = addrspace(2) constant [4 x i16] [i16 123, i16 34, i16 46, i16 27], align 1 6@arr2 = addrspace(3) constant [4 x i16] [i16 123, i16 23, i16 45, i16 17], align 1 7 8define i16 @foo0(i16 %a, i16 %b) { 9; CHECK-LABEL: foo0: 10; CHECK: ; %bb.0: ; %entry 11; CHECK-NEXT: lsl r22 12; CHECK-NEXT: rol r23 13; CHECK-NEXT: subi r22, -lo8(arr0) 14; CHECK-NEXT: sbci r23, -hi8(arr0) 15; CHECK-NEXT: movw r30, r22 16; CHECK-NEXT: lpm r18, Z+ 17; CHECK-NEXT: lpm r19, Z 18; CHECK-NEXT: lsl r24 19; CHECK-NEXT: rol r25 20; CHECK-NEXT: subi r24, -lo8(arr0) 21; CHECK-NEXT: sbci r25, -hi8(arr0) 22; CHECK-NEXT: movw r30, r24 23; CHECK-NEXT: lpm r24, Z+ 24; CHECK-NEXT: lpm r25, Z 25; CHECK-NEXT: sub r24, r18 26; CHECK-NEXT: sbc r25, r19 27; CHECK-NEXT: ret 28entry: 29 %arrayidx = getelementptr inbounds [4 x i16], [4 x i16] addrspace(1)* @arr0, i16 0, i16 %a 30 %0 = load i16, i16 addrspace(1)* %arrayidx, align 1 31 %arrayidx1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(1)* @arr0, i16 0, i16 %b 32 %1 = load i16, i16 addrspace(1)* %arrayidx1, align 1 33 %sub = sub nsw i16 %0, %1 34 ret i16 %sub 35} 36 37define i16 @foo1(i16 %a, i16 %b) { 38; CHECK-LABEL: foo1: 39; CHECK: ; %bb.0: ; %entry 40; CHECK-NEXT: lsl r22 41; CHECK-NEXT: rol r23 42; CHECK-NEXT: subi r22, -lo8(arr1) 43; CHECK-NEXT: sbci r23, -hi8(arr1) 44; CHECK-NEXT: movw r30, r22 45; CHECK-NEXT: ldi r18, 1 46; CHECK-NEXT: out 59, r18 47; CHECK-NEXT: elpm r18, Z+ 48; CHECK-NEXT: elpm r19, Z 49; CHECK-NEXT: lsl r24 50; CHECK-NEXT: rol r25 51; CHECK-NEXT: subi r24, -lo8(arr0) 52; CHECK-NEXT: sbci r25, -hi8(arr0) 53; CHECK-NEXT: movw r30, r24 54; CHECK-NEXT: lpm r24, Z+ 55; CHECK-NEXT: lpm r25, Z 56; CHECK-NEXT: sub r24, r18 57; CHECK-NEXT: sbc r25, r19 58; CHECK-NEXT: ret 59entry: 60 %arrayidx = getelementptr inbounds [4 x i16], [4 x i16] addrspace(1)* @arr0, i16 0, i16 %a 61 %0 = load i16, i16 addrspace(1)* %arrayidx, align 1 62 %arrayidx1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(2)* @arr1, i16 0, i16 %b 63 %1 = load i16, i16 addrspace(2)* %arrayidx1, align 1 64 %sub = sub nsw i16 %0, %1 65 ret i16 %sub 66} 67 68define i16 @foo2(i16 %a, i16 %b) { 69; CHECK-LABEL: foo2: 70; CHECK: ; %bb.0: ; %entry 71; CHECK-NEXT: lsl r24 72; CHECK-NEXT: rol r25 73; CHECK-NEXT: subi r24, -lo8(arr2) 74; CHECK-NEXT: sbci r25, -hi8(arr2) 75; CHECK-NEXT: movw r30, r24 76; CHECK-NEXT: ldi r24, 2 77; CHECK-NEXT: out 59, r24 78; CHECK-NEXT: elpm r24, Z+ 79; CHECK-NEXT: elpm r25, Z 80; CHECK-NEXT: lsl r22 81; CHECK-NEXT: rol r23 82; CHECK-NEXT: subi r22, -lo8(arr0) 83; CHECK-NEXT: sbci r23, -hi8(arr0) 84; CHECK-NEXT: movw r30, r22 85; CHECK-NEXT: lpm r18, Z+ 86; CHECK-NEXT: lpm r19, Z 87; CHECK-NEXT: sub r24, r18 88; CHECK-NEXT: sbc r25, r19 89; CHECK-NEXT: ret 90entry: 91 %arrayidx = getelementptr inbounds [4 x i16], [4 x i16] addrspace(3)* @arr2, i16 0, i16 %a 92 %0 = load i16, i16 addrspace(3)* %arrayidx, align 1 93 %arrayidx1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(1)* @arr0, i16 0, i16 %b 94 %1 = load i16, i16 addrspace(1)* %arrayidx1, align 1 95 %sub = sub nsw i16 %0, %1 96 ret i16 %sub 97} 98 99define i16 @foo3(i16 %a, i16 %b) { 100; CHECK-LABEL: foo3: 101; CHECK: ; %bb.0: ; %entry 102; CHECK-NEXT: lsl r22 103; CHECK-NEXT: rol r23 104; CHECK-NEXT: subi r22, -lo8(arr1) 105; CHECK-NEXT: sbci r23, -hi8(arr1) 106; CHECK-NEXT: movw r30, r22 107; CHECK-NEXT: ldi r18, 1 108; CHECK-NEXT: out 59, r18 109; CHECK-NEXT: elpm r18, Z+ 110; CHECK-NEXT: elpm r19, Z 111; CHECK-NEXT: lsl r24 112; CHECK-NEXT: rol r25 113; CHECK-NEXT: subi r24, -lo8(arr2) 114; CHECK-NEXT: sbci r25, -hi8(arr2) 115; CHECK-NEXT: movw r30, r24 116; CHECK-NEXT: ldi r24, 2 117; CHECK-NEXT: out 59, r24 118; CHECK-NEXT: elpm r24, Z+ 119; CHECK-NEXT: elpm r25, Z 120; CHECK-NEXT: sub r24, r18 121; CHECK-NEXT: sbc r25, r19 122; CHECK-NEXT: ret 123entry: 124 %arrayidx = getelementptr inbounds [4 x i16], [4 x i16] addrspace(3)* @arr2, i16 0, i16 %a 125 %0 = load i16, i16 addrspace(3)* %arrayidx, align 1 126 %arrayidx1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(2)* @arr1, i16 0, i16 %b 127 %1 = load i16, i16 addrspace(2)* %arrayidx1, align 1 128 %sub = sub nsw i16 %0, %1 129 ret i16 %sub 130} 131 132@arrb1 = addrspace(1) constant [4 x i8] c"{\188%", align 1 133@arrb3 = addrspace(3) constant [4 x i8] c"{\22.\1B", align 1 134@arrb5 = addrspace(5) constant [4 x i8] c"{\17-\11", align 1 135 136define signext i8 @foob0(i16 %a, i16 %b) { 137; CHECK-LABEL: foob0: 138; CHECK: ; %bb.0: ; %entry 139; CHECK-NEXT: subi r22, -lo8(arrb1) 140; CHECK-NEXT: sbci r23, -hi8(arrb1) 141; CHECK-NEXT: movw r30, r22 142; CHECK-NEXT: lpm r18, Z 143; CHECK-NEXT: subi r24, -lo8(arrb1) 144; CHECK-NEXT: sbci r25, -hi8(arrb1) 145; CHECK-NEXT: movw r30, r24 146; CHECK-NEXT: lpm r24, Z 147; CHECK-NEXT: sub r24, r18 148; CHECK-NEXT: mov r25, r24 149; CHECK-NEXT: lsl r25 150; CHECK-NEXT: sbc r25, r25 151; CHECK-NEXT: ret 152entry: 153 %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(1)* @arrb1, i16 0, i16 %a 154 %0 = load i8, i8 addrspace(1)* %arrayidx, align 1 155 %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(1)* @arrb1, i16 0, i16 %b 156 %1 = load i8, i8 addrspace(1)* %arrayidx1, align 1 157 %sub = sub i8 %0, %1 158 ret i8 %sub 159} 160 161define signext i8 @foob1(i16 %a, i16 %b) { 162; CHECK-LABEL: foob1: 163; CHECK: ; %bb.0: ; %entry 164; CHECK-NEXT: subi r22, -lo8(arrb3) 165; CHECK-NEXT: sbci r23, -hi8(arrb3) 166; CHECK-NEXT: movw r30, r22 167; CHECK-NEXT: ldi r18, 2 168; CHECK-NEXT: out 59, r18 169; CHECK-NEXT: elpm r18, Z 170; CHECK-NEXT: subi r24, -lo8(arrb1) 171; CHECK-NEXT: sbci r25, -hi8(arrb1) 172; CHECK-NEXT: movw r30, r24 173; CHECK-NEXT: lpm r24, Z 174; CHECK-NEXT: sub r24, r18 175; CHECK-NEXT: mov r25, r24 176; CHECK-NEXT: lsl r25 177; CHECK-NEXT: sbc r25, r25 178; CHECK-NEXT: ret 179entry: 180 %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(1)* @arrb1, i16 0, i16 %a 181 %0 = load i8, i8 addrspace(1)* %arrayidx, align 1 182 %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(3)* @arrb3, i16 0, i16 %b 183 %1 = load i8, i8 addrspace(3)* %arrayidx1, align 1 184 %sub = sub i8 %0, %1 185 ret i8 %sub 186} 187 188define signext i8 @foob2(i16 %a, i16 %b) { 189; CHECK-LABEL: foob2: 190; CHECK: ; %bb.0: ; %entry 191; CHECK-NEXT: subi r24, -lo8(arrb5) 192; CHECK-NEXT: sbci r25, -hi8(arrb5) 193; CHECK-NEXT: movw r30, r24 194; CHECK-NEXT: ldi r24, 4 195; CHECK-NEXT: out 59, r24 196; CHECK-NEXT: elpm r24, Z 197; CHECK-NEXT: subi r22, -lo8(arrb1) 198; CHECK-NEXT: sbci r23, -hi8(arrb1) 199; CHECK-NEXT: movw r30, r22 200; CHECK-NEXT: lpm r25, Z 201; CHECK-NEXT: sub r24, r25 202; CHECK-NEXT: mov r25, r24 203; CHECK-NEXT: lsl r25 204; CHECK-NEXT: sbc r25, r25 205; CHECK-NEXT: ret 206entry: 207 %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(5)* @arrb5, i16 0, i16 %a 208 %0 = load i8, i8 addrspace(5)* %arrayidx, align 1 209 %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(1)* @arrb1, i16 0, i16 %b 210 %1 = load i8, i8 addrspace(1)* %arrayidx1, align 1 211 %sub = sub i8 %0, %1 212 ret i8 %sub 213} 214 215define signext i8 @foob3(i16 %a, i16 %b) { 216; CHECK-LABEL: foob3: 217; CHECK: ; %bb.0: ; %entry 218; CHECK-NEXT: subi r22, -lo8(arrb5) 219; CHECK-NEXT: sbci r23, -hi8(arrb5) 220; CHECK-NEXT: movw r30, r22 221; CHECK-NEXT: ldi r18, 4 222; CHECK-NEXT: out 59, r18 223; CHECK-NEXT: elpm r18, Z 224; CHECK-NEXT: subi r24, -lo8(arrb3) 225; CHECK-NEXT: sbci r25, -hi8(arrb3) 226; CHECK-NEXT: movw r30, r24 227; CHECK-NEXT: ldi r24, 2 228; CHECK-NEXT: out 59, r24 229; CHECK-NEXT: elpm r24, Z 230; CHECK-NEXT: sub r24, r18 231; CHECK-NEXT: mov r25, r24 232; CHECK-NEXT: lsl r25 233; CHECK-NEXT: sbc r25, r25 234; CHECK-NEXT: ret 235entry: 236 %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(3)* @arrb3, i16 0, i16 %a 237 %0 = load i8, i8 addrspace(3)* %arrayidx, align 1 238 %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(5)* @arrb5, i16 0, i16 %b 239 %1 = load i8, i8 addrspace(5)* %arrayidx1, align 1 240 %sub = sub i8 %0, %1 241 ret i8 %sub 242} 243 244define signext i8 @foob4(i16 %a, i16 %b) { 245; CHECK-LABEL: foob4: 246; CHECK: ; %bb.0: ; %entry 247; CHECK-NEXT: subi r22, -lo8(arrb3) 248; CHECK-NEXT: sbci r23, -hi8(arrb3) 249; CHECK-NEXT: movw r30, r22 250; CHECK-NEXT: ldi r18, 2 251; CHECK-NEXT: out 59, r18 252; CHECK-NEXT: elpm r19, Z 253; CHECK-NEXT: subi r24, -lo8(arrb3) 254; CHECK-NEXT: sbci r25, -hi8(arrb3) 255; CHECK-NEXT: movw r30, r24 256; CHECK-NEXT: out 59, r18 257; CHECK-NEXT: elpm r24, Z 258; CHECK-NEXT: sub r24, r19 259; CHECK-NEXT: mov r25, r24 260; CHECK-NEXT: lsl r25 261; CHECK-NEXT: sbc r25, r25 262; CHECK-NEXT: ret 263entry: 264 %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(3)* @arrb3, i16 0, i16 %a 265 %0 = load i8, i8 addrspace(3)* %arrayidx, align 1 266 %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(3)* @arrb3, i16 0, i16 %b 267 %1 = load i8, i8 addrspace(3)* %arrayidx1, align 1 268 %sub = sub i8 %0, %1 269 ret i8 %sub 270} 271