1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv6m-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T1 3; RUN: llc -mtriple=thumbv7m-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T2 4; RUN: llc -mtriple=armv7a-none-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-ARM 5 6define i8* @i32_0(i8* %p, i32 %v) { 7; CHECK-LABEL: i32_0: 8; CHECK: @ %bb.0: 9; CHECK-NEXT: str r1, [r0] 10; CHECK-NEXT: bx lr 11 %o = getelementptr inbounds i8, i8* %p, i32 0 12 %q = bitcast i8* %o to i32* 13 store i32 %v, i32* %q, align 4 14 ret i8* %o 15} 16 17define i8* @i32_3(i8* %p, i32 %v) { 18; CHECK-T1-LABEL: i32_3: 19; CHECK-T1: @ %bb.0: 20; CHECK-T1-NEXT: movs r2, #3 21; CHECK-T1-NEXT: str r1, [r0, r2] 22; CHECK-T1-NEXT: adds r0, r0, #3 23; CHECK-T1-NEXT: bx lr 24; 25; CHECK-T2-LABEL: i32_3: 26; CHECK-T2: @ %bb.0: 27; CHECK-T2-NEXT: str r1, [r0, #3]! 28; CHECK-T2-NEXT: bx lr 29; 30; CHECK-ARM-LABEL: i32_3: 31; CHECK-ARM: @ %bb.0: 32; CHECK-ARM-NEXT: str r1, [r0, #3]! 33; CHECK-ARM-NEXT: bx lr 34 %o = getelementptr inbounds i8, i8* %p, i32 3 35 %q = bitcast i8* %o to i32* 36 store i32 %v, i32* %q, align 4 37 ret i8* %o 38} 39 40define i8* @i32_4(i8* %p, i32 %v) { 41; CHECK-T1-LABEL: i32_4: 42; CHECK-T1: @ %bb.0: 43; CHECK-T1-NEXT: str r1, [r0, #4] 44; CHECK-T1-NEXT: adds r0, r0, #4 45; CHECK-T1-NEXT: bx lr 46; 47; CHECK-T2-LABEL: i32_4: 48; CHECK-T2: @ %bb.0: 49; CHECK-T2-NEXT: str r1, [r0, #4]! 50; CHECK-T2-NEXT: bx lr 51; 52; CHECK-ARM-LABEL: i32_4: 53; CHECK-ARM: @ %bb.0: 54; CHECK-ARM-NEXT: str r1, [r0, #4]! 55; CHECK-ARM-NEXT: bx lr 56 %o = getelementptr inbounds i8, i8* %p, i32 4 57 %q = bitcast i8* %o to i32* 58 store i32 %v, i32* %q, align 4 59 ret i8* %o 60} 61 62define i8* @i32_8(i8* %p, i32 %v) { 63; CHECK-T1-LABEL: i32_8: 64; CHECK-T1: @ %bb.0: 65; CHECK-T1-NEXT: str r1, [r0, #8] 66; CHECK-T1-NEXT: adds r0, #8 67; CHECK-T1-NEXT: bx lr 68; 69; CHECK-T2-LABEL: i32_8: 70; CHECK-T2: @ %bb.0: 71; CHECK-T2-NEXT: str r1, [r0, #8]! 72; CHECK-T2-NEXT: bx lr 73; 74; CHECK-ARM-LABEL: i32_8: 75; CHECK-ARM: @ %bb.0: 76; CHECK-ARM-NEXT: str r1, [r0, #8]! 77; CHECK-ARM-NEXT: bx lr 78 %o = getelementptr inbounds i8, i8* %p, i32 8 79 %q = bitcast i8* %o to i32* 80 store i32 %v, i32* %q, align 4 81 ret i8* %o 82} 83 84define i8* @i32_m1(i8* %p, i32 %v) { 85; CHECK-T1-LABEL: i32_m1: 86; CHECK-T1: @ %bb.0: 87; CHECK-T1-NEXT: subs r0, r0, #1 88; CHECK-T1-NEXT: str r1, [r0] 89; CHECK-T1-NEXT: bx lr 90; 91; CHECK-T2-LABEL: i32_m1: 92; CHECK-T2: @ %bb.0: 93; CHECK-T2-NEXT: str r1, [r0, #-1]! 94; CHECK-T2-NEXT: bx lr 95; 96; CHECK-ARM-LABEL: i32_m1: 97; CHECK-ARM: @ %bb.0: 98; CHECK-ARM-NEXT: str r1, [r0, #-1]! 99; CHECK-ARM-NEXT: bx lr 100 %o = getelementptr inbounds i8, i8* %p, i32 -1 101 %q = bitcast i8* %o to i32* 102 store i32 %v, i32* %q, align 4 103 ret i8* %o 104} 105 106define i8* @i32_m4(i8* %p, i32 %v) { 107; CHECK-T1-LABEL: i32_m4: 108; CHECK-T1: @ %bb.0: 109; CHECK-T1-NEXT: subs r0, r0, #4 110; CHECK-T1-NEXT: str r1, [r0] 111; CHECK-T1-NEXT: bx lr 112; 113; CHECK-T2-LABEL: i32_m4: 114; CHECK-T2: @ %bb.0: 115; CHECK-T2-NEXT: str r1, [r0, #-4]! 116; CHECK-T2-NEXT: bx lr 117; 118; CHECK-ARM-LABEL: i32_m4: 119; CHECK-ARM: @ %bb.0: 120; CHECK-ARM-NEXT: str r1, [r0, #-4]! 121; CHECK-ARM-NEXT: bx lr 122 %o = getelementptr inbounds i8, i8* %p, i32 -4 123 %q = bitcast i8* %o to i32* 124 store i32 %v, i32* %q, align 4 125 ret i8* %o 126} 127 128define i8* @i32_252(i8* %p, i32 %v) { 129; CHECK-T1-LABEL: i32_252: 130; CHECK-T1: @ %bb.0: 131; CHECK-T1-NEXT: movs r2, #252 132; CHECK-T1-NEXT: str r1, [r0, r2] 133; CHECK-T1-NEXT: adds r0, #252 134; CHECK-T1-NEXT: bx lr 135; 136; CHECK-T2-LABEL: i32_252: 137; CHECK-T2: @ %bb.0: 138; CHECK-T2-NEXT: str r1, [r0, #252]! 139; CHECK-T2-NEXT: bx lr 140; 141; CHECK-ARM-LABEL: i32_252: 142; CHECK-ARM: @ %bb.0: 143; CHECK-ARM-NEXT: str r1, [r0, #252]! 144; CHECK-ARM-NEXT: bx lr 145 %o = getelementptr inbounds i8, i8* %p, i32 252 146 %q = bitcast i8* %o to i32* 147 store i32 %v, i32* %q, align 4 148 ret i8* %o 149} 150 151define i8* @i32_255(i8* %p, i32 %v) { 152; CHECK-T1-LABEL: i32_255: 153; CHECK-T1: @ %bb.0: 154; CHECK-T1-NEXT: movs r2, #255 155; CHECK-T1-NEXT: str r1, [r0, r2] 156; CHECK-T1-NEXT: adds r0, #255 157; CHECK-T1-NEXT: bx lr 158; 159; CHECK-T2-LABEL: i32_255: 160; CHECK-T2: @ %bb.0: 161; CHECK-T2-NEXT: str r1, [r0, #255]! 162; CHECK-T2-NEXT: bx lr 163; 164; CHECK-ARM-LABEL: i32_255: 165; CHECK-ARM: @ %bb.0: 166; CHECK-ARM-NEXT: str r1, [r0, #255]! 167; CHECK-ARM-NEXT: bx lr 168 %o = getelementptr inbounds i8, i8* %p, i32 255 169 %q = bitcast i8* %o to i32* 170 store i32 %v, i32* %q, align 4 171 ret i8* %o 172} 173 174define i8* @i32_256(i8* %p, i32 %v) { 175; CHECK-T1-LABEL: i32_256: 176; CHECK-T1: @ %bb.0: 177; CHECK-T1-NEXT: movs r2, #1 178; CHECK-T1-NEXT: lsls r2, r2, #8 179; CHECK-T1-NEXT: str r1, [r0, r2] 180; CHECK-T1-NEXT: adds r0, r0, r2 181; CHECK-T1-NEXT: bx lr 182; 183; CHECK-T2-LABEL: i32_256: 184; CHECK-T2: @ %bb.0: 185; CHECK-T2-NEXT: str.w r1, [r0, #256] 186; CHECK-T2-NEXT: add.w r0, r0, #256 187; CHECK-T2-NEXT: bx lr 188; 189; CHECK-ARM-LABEL: i32_256: 190; CHECK-ARM: @ %bb.0: 191; CHECK-ARM-NEXT: str r1, [r0, #256]! 192; CHECK-ARM-NEXT: bx lr 193 %o = getelementptr inbounds i8, i8* %p, i32 256 194 %q = bitcast i8* %o to i32* 195 store i32 %v, i32* %q, align 4 196 ret i8* %o 197} 198 199define i8* @i32_m252(i8* %p, i32 %v) { 200; CHECK-T1-LABEL: i32_m252: 201; CHECK-T1: @ %bb.0: 202; CHECK-T1-NEXT: subs r0, #252 203; CHECK-T1-NEXT: str r1, [r0] 204; CHECK-T1-NEXT: bx lr 205; 206; CHECK-T2-LABEL: i32_m252: 207; CHECK-T2: @ %bb.0: 208; CHECK-T2-NEXT: str r1, [r0, #-252]! 209; CHECK-T2-NEXT: bx lr 210; 211; CHECK-ARM-LABEL: i32_m252: 212; CHECK-ARM: @ %bb.0: 213; CHECK-ARM-NEXT: str r1, [r0, #-252]! 214; CHECK-ARM-NEXT: bx lr 215 %o = getelementptr inbounds i8, i8* %p, i32 -252 216 %q = bitcast i8* %o to i32* 217 store i32 %v, i32* %q, align 4 218 ret i8* %o 219} 220 221define i8* @i32_m255(i8* %p, i32 %v) { 222; CHECK-T1-LABEL: i32_m255: 223; CHECK-T1: @ %bb.0: 224; CHECK-T1-NEXT: subs r0, #255 225; CHECK-T1-NEXT: str r1, [r0] 226; CHECK-T1-NEXT: bx lr 227; 228; CHECK-T2-LABEL: i32_m255: 229; CHECK-T2: @ %bb.0: 230; CHECK-T2-NEXT: str r1, [r0, #-255]! 231; CHECK-T2-NEXT: bx lr 232; 233; CHECK-ARM-LABEL: i32_m255: 234; CHECK-ARM: @ %bb.0: 235; CHECK-ARM-NEXT: str r1, [r0, #-255]! 236; CHECK-ARM-NEXT: bx lr 237 %o = getelementptr inbounds i8, i8* %p, i32 -255 238 %q = bitcast i8* %o to i32* 239 store i32 %v, i32* %q, align 4 240 ret i8* %o 241} 242 243define i8* @i32_m256(i8* %p, i32 %v) { 244; CHECK-T1-LABEL: i32_m256: 245; CHECK-T1: @ %bb.0: 246; CHECK-T1-NEXT: movs r2, #255 247; CHECK-T1-NEXT: mvns r2, r2 248; CHECK-T1-NEXT: str r1, [r0, r2] 249; CHECK-T1-NEXT: adds r0, r0, r2 250; CHECK-T1-NEXT: bx lr 251; 252; CHECK-T2-LABEL: i32_m256: 253; CHECK-T2: @ %bb.0: 254; CHECK-T2-NEXT: mvn r2, #255 255; CHECK-T2-NEXT: str r1, [r0, r2] 256; CHECK-T2-NEXT: sub.w r0, r0, #256 257; CHECK-T2-NEXT: bx lr 258; 259; CHECK-ARM-LABEL: i32_m256: 260; CHECK-ARM: @ %bb.0: 261; CHECK-ARM-NEXT: str r1, [r0, #-256]! 262; CHECK-ARM-NEXT: bx lr 263 %o = getelementptr inbounds i8, i8* %p, i32 -256 264 %q = bitcast i8* %o to i32* 265 store i32 %v, i32* %q, align 4 266 ret i8* %o 267} 268 269define i8* @i32_4095(i8* %p, i32 %v) { 270; CHECK-T1-LABEL: i32_4095: 271; CHECK-T1: @ %bb.0: 272; CHECK-T1-NEXT: ldr r2, .LCPI12_0 273; CHECK-T1-NEXT: str r1, [r0, r2] 274; CHECK-T1-NEXT: adds r0, r0, r2 275; CHECK-T1-NEXT: bx lr 276; CHECK-T1-NEXT: .p2align 2 277; CHECK-T1-NEXT: @ %bb.1: 278; CHECK-T1-NEXT: .LCPI12_0: 279; CHECK-T1-NEXT: .long 4095 @ 0xfff 280; 281; CHECK-T2-LABEL: i32_4095: 282; CHECK-T2: @ %bb.0: 283; CHECK-T2-NEXT: str.w r1, [r0, #4095] 284; CHECK-T2-NEXT: addw r0, r0, #4095 285; CHECK-T2-NEXT: bx lr 286; 287; CHECK-ARM-LABEL: i32_4095: 288; CHECK-ARM: @ %bb.0: 289; CHECK-ARM-NEXT: str r1, [r0, #4095]! 290; CHECK-ARM-NEXT: bx lr 291 %o = getelementptr inbounds i8, i8* %p, i32 4095 292 %q = bitcast i8* %o to i32* 293 store i32 %v, i32* %q, align 4 294 ret i8* %o 295} 296 297define i8* @i32_4096(i8* %p, i32 %v) { 298; CHECK-T1-LABEL: i32_4096: 299; CHECK-T1: @ %bb.0: 300; CHECK-T1-NEXT: movs r2, #1 301; CHECK-T1-NEXT: lsls r2, r2, #12 302; CHECK-T1-NEXT: str r1, [r0, r2] 303; CHECK-T1-NEXT: adds r0, r0, r2 304; CHECK-T1-NEXT: bx lr 305; 306; CHECK-T2-LABEL: i32_4096: 307; CHECK-T2: @ %bb.0: 308; CHECK-T2-NEXT: mov.w r2, #4096 309; CHECK-T2-NEXT: str r1, [r0, r2] 310; CHECK-T2-NEXT: add.w r0, r0, #4096 311; CHECK-T2-NEXT: bx lr 312; 313; CHECK-ARM-LABEL: i32_4096: 314; CHECK-ARM: @ %bb.0: 315; CHECK-ARM-NEXT: mov r2, #4096 316; CHECK-ARM-NEXT: str r1, [r0, r2]! 317; CHECK-ARM-NEXT: bx lr 318 %o = getelementptr inbounds i8, i8* %p, i32 4096 319 %q = bitcast i8* %o to i32* 320 store i32 %v, i32* %q, align 4 321 ret i8* %o 322} 323 324define i8* @i32_m4095(i8* %p, i32 %v) { 325; CHECK-T1-LABEL: i32_m4095: 326; CHECK-T1: @ %bb.0: 327; CHECK-T1-NEXT: ldr r2, .LCPI14_0 328; CHECK-T1-NEXT: str r1, [r0, r2] 329; CHECK-T1-NEXT: adds r0, r0, r2 330; CHECK-T1-NEXT: bx lr 331; CHECK-T1-NEXT: .p2align 2 332; CHECK-T1-NEXT: @ %bb.1: 333; CHECK-T1-NEXT: .LCPI14_0: 334; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001 335; 336; CHECK-T2-LABEL: i32_m4095: 337; CHECK-T2: @ %bb.0: 338; CHECK-T2-NEXT: movw r2, #61441 339; CHECK-T2-NEXT: movt r2, #65535 340; CHECK-T2-NEXT: str r1, [r0, r2] 341; CHECK-T2-NEXT: subw r0, r0, #4095 342; CHECK-T2-NEXT: bx lr 343; 344; CHECK-ARM-LABEL: i32_m4095: 345; CHECK-ARM: @ %bb.0: 346; CHECK-ARM-NEXT: str r1, [r0, #-4095]! 347; CHECK-ARM-NEXT: bx lr 348 %o = getelementptr inbounds i8, i8* %p, i32 -4095 349 %q = bitcast i8* %o to i32* 350 store i32 %v, i32* %q, align 4 351 ret i8* %o 352} 353 354define i8* @i32_m4096(i8* %p, i32 %v) { 355; CHECK-T1-LABEL: i32_m4096: 356; CHECK-T1: @ %bb.0: 357; CHECK-T1-NEXT: ldr r2, .LCPI15_0 358; CHECK-T1-NEXT: str r1, [r0, r2] 359; CHECK-T1-NEXT: adds r0, r0, r2 360; CHECK-T1-NEXT: bx lr 361; CHECK-T1-NEXT: .p2align 2 362; CHECK-T1-NEXT: @ %bb.1: 363; CHECK-T1-NEXT: .LCPI15_0: 364; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000 365; 366; CHECK-T2-LABEL: i32_m4096: 367; CHECK-T2: @ %bb.0: 368; CHECK-T2-NEXT: movw r2, #61440 369; CHECK-T2-NEXT: movt r2, #65535 370; CHECK-T2-NEXT: str r1, [r0, r2] 371; CHECK-T2-NEXT: sub.w r0, r0, #4096 372; CHECK-T2-NEXT: bx lr 373; 374; CHECK-ARM-LABEL: i32_m4096: 375; CHECK-ARM: @ %bb.0: 376; CHECK-ARM-NEXT: movw r2, #61440 377; CHECK-ARM-NEXT: movt r2, #65535 378; CHECK-ARM-NEXT: str r1, [r0, r2]! 379; CHECK-ARM-NEXT: bx lr 380 %o = getelementptr inbounds i8, i8* %p, i32 -4096 381 %q = bitcast i8* %o to i32* 382 store i32 %v, i32* %q, align 4 383 ret i8* %o 384} 385 386define i8* @i64_0(i8* %p, i64 %v) { 387; CHECK-T1-LABEL: i64_0: 388; CHECK-T1: @ %bb.0: 389; CHECK-T1-NEXT: stm r0!, {r2, r3} 390; CHECK-T1-NEXT: subs r0, #8 391; CHECK-T1-NEXT: bx lr 392; 393; CHECK-T2-LABEL: i64_0: 394; CHECK-T2: @ %bb.0: 395; CHECK-T2-NEXT: strd r2, r3, [r0] 396; CHECK-T2-NEXT: bx lr 397; 398; CHECK-ARM-LABEL: i64_0: 399; CHECK-ARM: @ %bb.0: 400; CHECK-ARM-NEXT: mov r1, r3 401; CHECK-ARM-NEXT: str r2, [r0] 402; CHECK-ARM-NEXT: str r1, [r0, #4] 403; CHECK-ARM-NEXT: bx lr 404 %o = getelementptr inbounds i8, i8* %p, i32 0 405 %q = bitcast i8* %o to i64* 406 store i64 %v, i64* %q, align 8 407 ret i8* %o 408} 409 410define i8* @i64_3(i8* %p, i64 %v) { 411; CHECK-T1-LABEL: i64_3: 412; CHECK-T1: @ %bb.0: 413; CHECK-T1-NEXT: movs r1, #3 414; CHECK-T1-NEXT: str r2, [r0, r1] 415; CHECK-T1-NEXT: adds r0, r0, #3 416; CHECK-T1-NEXT: str r3, [r0, #4] 417; CHECK-T1-NEXT: bx lr 418; 419; CHECK-T2-LABEL: i64_3: 420; CHECK-T2: @ %bb.0: 421; CHECK-T2-NEXT: str r2, [r0, #3]! 422; CHECK-T2-NEXT: str r3, [r0, #4] 423; CHECK-T2-NEXT: bx lr 424; 425; CHECK-ARM-LABEL: i64_3: 426; CHECK-ARM: @ %bb.0: 427; CHECK-ARM-NEXT: str r2, [r0, #3]! 428; CHECK-ARM-NEXT: str r3, [r0, #4] 429; CHECK-ARM-NEXT: bx lr 430 %o = getelementptr inbounds i8, i8* %p, i32 3 431 %q = bitcast i8* %o to i64* 432 store i64 %v, i64* %q, align 8 433 ret i8* %o 434} 435 436define i8* @i64_4(i8* %p, i64 %v) { 437; CHECK-T1-LABEL: i64_4: 438; CHECK-T1: @ %bb.0: 439; CHECK-T1-NEXT: str r2, [r0, #4] 440; CHECK-T1-NEXT: str r3, [r0, #8] 441; CHECK-T1-NEXT: adds r0, r0, #4 442; CHECK-T1-NEXT: bx lr 443; 444; CHECK-T2-LABEL: i64_4: 445; CHECK-T2: @ %bb.0: 446; CHECK-T2-NEXT: str r2, [r0, #4]! 447; CHECK-T2-NEXT: str r3, [r0, #4] 448; CHECK-T2-NEXT: bx lr 449; 450; CHECK-ARM-LABEL: i64_4: 451; CHECK-ARM: @ %bb.0: 452; CHECK-ARM-NEXT: str r2, [r0, #4]! 453; CHECK-ARM-NEXT: str r3, [r0, #4] 454; CHECK-ARM-NEXT: bx lr 455 %o = getelementptr inbounds i8, i8* %p, i32 4 456 %q = bitcast i8* %o to i64* 457 store i64 %v, i64* %q, align 8 458 ret i8* %o 459} 460 461define i8* @i64_8(i8* %p, i64 %v) { 462; CHECK-T1-LABEL: i64_8: 463; CHECK-T1: @ %bb.0: 464; CHECK-T1-NEXT: str r2, [r0, #8] 465; CHECK-T1-NEXT: str r3, [r0, #12] 466; CHECK-T1-NEXT: adds r0, #8 467; CHECK-T1-NEXT: bx lr 468; 469; CHECK-T2-LABEL: i64_8: 470; CHECK-T2: @ %bb.0: 471; CHECK-T2-NEXT: str r2, [r0, #8]! 472; CHECK-T2-NEXT: str r3, [r0, #4] 473; CHECK-T2-NEXT: bx lr 474; 475; CHECK-ARM-LABEL: i64_8: 476; CHECK-ARM: @ %bb.0: 477; CHECK-ARM-NEXT: str r2, [r0, #8]! 478; CHECK-ARM-NEXT: str r3, [r0, #4] 479; CHECK-ARM-NEXT: bx lr 480 %o = getelementptr inbounds i8, i8* %p, i32 8 481 %q = bitcast i8* %o to i64* 482 store i64 %v, i64* %q, align 8 483 ret i8* %o 484} 485 486define i8* @i64_m1(i8* %p, i64 %v) { 487; CHECK-T1-LABEL: i64_m1: 488; CHECK-T1: @ %bb.0: 489; CHECK-T1-NEXT: subs r0, r0, #1 490; CHECK-T1-NEXT: stm r0!, {r2, r3} 491; CHECK-T1-NEXT: subs r0, #8 492; CHECK-T1-NEXT: bx lr 493; 494; CHECK-T2-LABEL: i64_m1: 495; CHECK-T2: @ %bb.0: 496; CHECK-T2-NEXT: str r2, [r0, #-1]! 497; CHECK-T2-NEXT: str r3, [r0, #4] 498; CHECK-T2-NEXT: bx lr 499; 500; CHECK-ARM-LABEL: i64_m1: 501; CHECK-ARM: @ %bb.0: 502; CHECK-ARM-NEXT: str r2, [r0, #-1]! 503; CHECK-ARM-NEXT: str r3, [r0, #4] 504; CHECK-ARM-NEXT: bx lr 505 %o = getelementptr inbounds i8, i8* %p, i32 -1 506 %q = bitcast i8* %o to i64* 507 store i64 %v, i64* %q, align 8 508 ret i8* %o 509} 510 511define i8* @i64_m4(i8* %p, i64 %v) { 512; CHECK-T1-LABEL: i64_m4: 513; CHECK-T1: @ %bb.0: 514; CHECK-T1-NEXT: str r3, [r0] 515; CHECK-T1-NEXT: subs r0, r0, #4 516; CHECK-T1-NEXT: str r2, [r0] 517; CHECK-T1-NEXT: bx lr 518; 519; CHECK-T2-LABEL: i64_m4: 520; CHECK-T2: @ %bb.0: 521; CHECK-T2-NEXT: str r3, [r0] 522; CHECK-T2-NEXT: str r2, [r0, #-4]! 523; CHECK-T2-NEXT: bx lr 524; 525; CHECK-ARM-LABEL: i64_m4: 526; CHECK-ARM: @ %bb.0: 527; CHECK-ARM-NEXT: str r3, [r0] 528; CHECK-ARM-NEXT: str r2, [r0, #-4]! 529; CHECK-ARM-NEXT: bx lr 530 %o = getelementptr inbounds i8, i8* %p, i32 -4 531 %q = bitcast i8* %o to i64* 532 store i64 %v, i64* %q, align 8 533 ret i8* %o 534} 535 536define i8* @i64_252(i8* %p, i64 %v) { 537; CHECK-T1-LABEL: i64_252: 538; CHECK-T1: @ %bb.0: 539; CHECK-T1-NEXT: movs r1, #252 540; CHECK-T1-NEXT: str r2, [r0, r1] 541; CHECK-T1-NEXT: adds r0, #252 542; CHECK-T1-NEXT: str r3, [r0, #4] 543; CHECK-T1-NEXT: bx lr 544; 545; CHECK-T2-LABEL: i64_252: 546; CHECK-T2: @ %bb.0: 547; CHECK-T2-NEXT: str r2, [r0, #252]! 548; CHECK-T2-NEXT: str r3, [r0, #4] 549; CHECK-T2-NEXT: bx lr 550; 551; CHECK-ARM-LABEL: i64_252: 552; CHECK-ARM: @ %bb.0: 553; CHECK-ARM-NEXT: str r2, [r0, #252]! 554; CHECK-ARM-NEXT: str r3, [r0, #4] 555; CHECK-ARM-NEXT: bx lr 556 %o = getelementptr inbounds i8, i8* %p, i32 252 557 %q = bitcast i8* %o to i64* 558 store i64 %v, i64* %q, align 8 559 ret i8* %o 560} 561 562define i8* @i64_255(i8* %p, i64 %v) { 563; CHECK-T1-LABEL: i64_255: 564; CHECK-T1: @ %bb.0: 565; CHECK-T1-NEXT: movs r1, #255 566; CHECK-T1-NEXT: str r2, [r0, r1] 567; CHECK-T1-NEXT: adds r0, #255 568; CHECK-T1-NEXT: str r3, [r0, #4] 569; CHECK-T1-NEXT: bx lr 570; 571; CHECK-T2-LABEL: i64_255: 572; CHECK-T2: @ %bb.0: 573; CHECK-T2-NEXT: str r2, [r0, #255]! 574; CHECK-T2-NEXT: str r3, [r0, #4] 575; CHECK-T2-NEXT: bx lr 576; 577; CHECK-ARM-LABEL: i64_255: 578; CHECK-ARM: @ %bb.0: 579; CHECK-ARM-NEXT: str r2, [r0, #255]! 580; CHECK-ARM-NEXT: str r3, [r0, #4] 581; CHECK-ARM-NEXT: bx lr 582 %o = getelementptr inbounds i8, i8* %p, i32 255 583 %q = bitcast i8* %o to i64* 584 store i64 %v, i64* %q, align 8 585 ret i8* %o 586} 587 588define i8* @i64_256(i8* %p, i64 %v) { 589; CHECK-T1-LABEL: i64_256: 590; CHECK-T1: @ %bb.0: 591; CHECK-T1-NEXT: movs r1, #1 592; CHECK-T1-NEXT: lsls r1, r1, #8 593; CHECK-T1-NEXT: str r2, [r0, r1] 594; CHECK-T1-NEXT: adds r0, r0, r1 595; CHECK-T1-NEXT: str r3, [r0, #4] 596; CHECK-T1-NEXT: bx lr 597; 598; CHECK-T2-LABEL: i64_256: 599; CHECK-T2: @ %bb.0: 600; CHECK-T2-NEXT: strd r2, r3, [r0, #256] 601; CHECK-T2-NEXT: add.w r0, r0, #256 602; CHECK-T2-NEXT: bx lr 603; 604; CHECK-ARM-LABEL: i64_256: 605; CHECK-ARM: @ %bb.0: 606; CHECK-ARM-NEXT: str r2, [r0, #256]! 607; CHECK-ARM-NEXT: str r3, [r0, #4] 608; CHECK-ARM-NEXT: bx lr 609 %o = getelementptr inbounds i8, i8* %p, i32 256 610 %q = bitcast i8* %o to i64* 611 store i64 %v, i64* %q, align 8 612 ret i8* %o 613} 614 615define i8* @i64_m252(i8* %p, i64 %v) { 616; CHECK-T1-LABEL: i64_m252: 617; CHECK-T1: @ %bb.0: 618; CHECK-T1-NEXT: subs r0, #252 619; CHECK-T1-NEXT: stm r0!, {r2, r3} 620; CHECK-T1-NEXT: subs r0, #8 621; CHECK-T1-NEXT: bx lr 622; 623; CHECK-T2-LABEL: i64_m252: 624; CHECK-T2: @ %bb.0: 625; CHECK-T2-NEXT: str r2, [r0, #-252]! 626; CHECK-T2-NEXT: str r3, [r0, #4] 627; CHECK-T2-NEXT: bx lr 628; 629; CHECK-ARM-LABEL: i64_m252: 630; CHECK-ARM: @ %bb.0: 631; CHECK-ARM-NEXT: str r2, [r0, #-252]! 632; CHECK-ARM-NEXT: str r3, [r0, #4] 633; CHECK-ARM-NEXT: bx lr 634 %o = getelementptr inbounds i8, i8* %p, i32 -252 635 %q = bitcast i8* %o to i64* 636 store i64 %v, i64* %q, align 8 637 ret i8* %o 638} 639 640define i8* @i64_m255(i8* %p, i64 %v) { 641; CHECK-T1-LABEL: i64_m255: 642; CHECK-T1: @ %bb.0: 643; CHECK-T1-NEXT: subs r0, #255 644; CHECK-T1-NEXT: stm r0!, {r2, r3} 645; CHECK-T1-NEXT: subs r0, #8 646; CHECK-T1-NEXT: bx lr 647; 648; CHECK-T2-LABEL: i64_m255: 649; CHECK-T2: @ %bb.0: 650; CHECK-T2-NEXT: str r2, [r0, #-255]! 651; CHECK-T2-NEXT: str r3, [r0, #4] 652; CHECK-T2-NEXT: bx lr 653; 654; CHECK-ARM-LABEL: i64_m255: 655; CHECK-ARM: @ %bb.0: 656; CHECK-ARM-NEXT: str r2, [r0, #-255]! 657; CHECK-ARM-NEXT: str r3, [r0, #4] 658; CHECK-ARM-NEXT: bx lr 659 %o = getelementptr inbounds i8, i8* %p, i32 -255 660 %q = bitcast i8* %o to i64* 661 store i64 %v, i64* %q, align 8 662 ret i8* %o 663} 664 665define i8* @i64_m256(i8* %p, i64 %v) { 666; CHECK-T1-LABEL: i64_m256: 667; CHECK-T1: @ %bb.0: 668; CHECK-T1-NEXT: movs r1, #255 669; CHECK-T1-NEXT: mvns r1, r1 670; CHECK-T1-NEXT: str r2, [r0, r1] 671; CHECK-T1-NEXT: adds r0, r0, r1 672; CHECK-T1-NEXT: str r3, [r0, #4] 673; CHECK-T1-NEXT: bx lr 674; 675; CHECK-T2-LABEL: i64_m256: 676; CHECK-T2: @ %bb.0: 677; CHECK-T2-NEXT: mvn r1, #255 678; CHECK-T2-NEXT: str r3, [r0, #-252] 679; CHECK-T2-NEXT: str r2, [r0, r1] 680; CHECK-T2-NEXT: sub.w r0, r0, #256 681; CHECK-T2-NEXT: bx lr 682; 683; CHECK-ARM-LABEL: i64_m256: 684; CHECK-ARM: @ %bb.0: 685; CHECK-ARM-NEXT: str r2, [r0, #-256]! 686; CHECK-ARM-NEXT: str r3, [r0, #4] 687; CHECK-ARM-NEXT: bx lr 688 %o = getelementptr inbounds i8, i8* %p, i32 -256 689 %q = bitcast i8* %o to i64* 690 store i64 %v, i64* %q, align 8 691 ret i8* %o 692} 693 694define i8* @i64_4095(i8* %p, i64 %v) { 695; CHECK-T1-LABEL: i64_4095: 696; CHECK-T1: @ %bb.0: 697; CHECK-T1-NEXT: ldr r1, .LCPI28_0 698; CHECK-T1-NEXT: str r2, [r0, r1] 699; CHECK-T1-NEXT: adds r0, r0, r1 700; CHECK-T1-NEXT: str r3, [r0, #4] 701; CHECK-T1-NEXT: bx lr 702; CHECK-T1-NEXT: .p2align 2 703; CHECK-T1-NEXT: @ %bb.1: 704; CHECK-T1-NEXT: .LCPI28_0: 705; CHECK-T1-NEXT: .long 4095 @ 0xfff 706; 707; CHECK-T2-LABEL: i64_4095: 708; CHECK-T2: @ %bb.0: 709; CHECK-T2-NEXT: str.w r2, [r0, #4095] 710; CHECK-T2-NEXT: addw r0, r0, #4095 711; CHECK-T2-NEXT: str r3, [r0, #4] 712; CHECK-T2-NEXT: bx lr 713; 714; CHECK-ARM-LABEL: i64_4095: 715; CHECK-ARM: @ %bb.0: 716; CHECK-ARM-NEXT: str r2, [r0, #4095]! 717; CHECK-ARM-NEXT: str r3, [r0, #4] 718; CHECK-ARM-NEXT: bx lr 719 %o = getelementptr inbounds i8, i8* %p, i32 4095 720 %q = bitcast i8* %o to i64* 721 store i64 %v, i64* %q, align 8 722 ret i8* %o 723} 724 725define i8* @i64_4096(i8* %p, i64 %v) { 726; CHECK-T1-LABEL: i64_4096: 727; CHECK-T1: @ %bb.0: 728; CHECK-T1-NEXT: movs r1, #1 729; CHECK-T1-NEXT: lsls r1, r1, #12 730; CHECK-T1-NEXT: str r2, [r0, r1] 731; CHECK-T1-NEXT: adds r0, r0, r1 732; CHECK-T1-NEXT: str r3, [r0, #4] 733; CHECK-T1-NEXT: bx lr 734; 735; CHECK-T2-LABEL: i64_4096: 736; CHECK-T2: @ %bb.0: 737; CHECK-T2-NEXT: mov.w r1, #4096 738; CHECK-T2-NEXT: str r2, [r0, r1] 739; CHECK-T2-NEXT: add.w r0, r0, #4096 740; CHECK-T2-NEXT: str r3, [r0, #4] 741; CHECK-T2-NEXT: bx lr 742; 743; CHECK-ARM-LABEL: i64_4096: 744; CHECK-ARM: @ %bb.0: 745; CHECK-ARM-NEXT: mov r1, #4096 746; CHECK-ARM-NEXT: str r2, [r0, r1]! 747; CHECK-ARM-NEXT: str r3, [r0, #4] 748; CHECK-ARM-NEXT: bx lr 749 %o = getelementptr inbounds i8, i8* %p, i32 4096 750 %q = bitcast i8* %o to i64* 751 store i64 %v, i64* %q, align 8 752 ret i8* %o 753} 754 755define i8* @i64_m4095(i8* %p, i64 %v) { 756; CHECK-T1-LABEL: i64_m4095: 757; CHECK-T1: @ %bb.0: 758; CHECK-T1-NEXT: ldr r1, .LCPI30_0 759; CHECK-T1-NEXT: str r2, [r0, r1] 760; CHECK-T1-NEXT: adds r0, r0, r1 761; CHECK-T1-NEXT: str r3, [r0, #4] 762; CHECK-T1-NEXT: bx lr 763; CHECK-T1-NEXT: .p2align 2 764; CHECK-T1-NEXT: @ %bb.1: 765; CHECK-T1-NEXT: .LCPI30_0: 766; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001 767; 768; CHECK-T2-LABEL: i64_m4095: 769; CHECK-T2: @ %bb.0: 770; CHECK-T2-NEXT: movw r1, #61441 771; CHECK-T2-NEXT: movt r1, #65535 772; CHECK-T2-NEXT: str r2, [r0, r1] 773; CHECK-T2-NEXT: subw r0, r0, #4095 774; CHECK-T2-NEXT: str r3, [r0, #4] 775; CHECK-T2-NEXT: bx lr 776; 777; CHECK-ARM-LABEL: i64_m4095: 778; CHECK-ARM: @ %bb.0: 779; CHECK-ARM-NEXT: str r2, [r0, #-4095]! 780; CHECK-ARM-NEXT: str r3, [r0, #4] 781; CHECK-ARM-NEXT: bx lr 782 %o = getelementptr inbounds i8, i8* %p, i32 -4095 783 %q = bitcast i8* %o to i64* 784 store i64 %v, i64* %q, align 8 785 ret i8* %o 786} 787 788define i8* @i64_m4096(i8* %p, i64 %v) { 789; CHECK-T1-LABEL: i64_m4096: 790; CHECK-T1: @ %bb.0: 791; CHECK-T1-NEXT: ldr r1, .LCPI31_0 792; CHECK-T1-NEXT: str r2, [r0, r1] 793; CHECK-T1-NEXT: adds r0, r0, r1 794; CHECK-T1-NEXT: str r3, [r0, #4] 795; CHECK-T1-NEXT: bx lr 796; CHECK-T1-NEXT: .p2align 2 797; CHECK-T1-NEXT: @ %bb.1: 798; CHECK-T1-NEXT: .LCPI31_0: 799; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000 800; 801; CHECK-T2-LABEL: i64_m4096: 802; CHECK-T2: @ %bb.0: 803; CHECK-T2-NEXT: movw r1, #61440 804; CHECK-T2-NEXT: movt r1, #65535 805; CHECK-T2-NEXT: str r2, [r0, r1] 806; CHECK-T2-NEXT: sub.w r0, r0, #4096 807; CHECK-T2-NEXT: str r3, [r0, #4] 808; CHECK-T2-NEXT: bx lr 809; 810; CHECK-ARM-LABEL: i64_m4096: 811; CHECK-ARM: @ %bb.0: 812; CHECK-ARM-NEXT: movw r1, #61440 813; CHECK-ARM-NEXT: movt r1, #65535 814; CHECK-ARM-NEXT: str r2, [r0, r1]! 815; CHECK-ARM-NEXT: str r3, [r0, #4] 816; CHECK-ARM-NEXT: bx lr 817 %o = getelementptr inbounds i8, i8* %p, i32 -4096 818 %q = bitcast i8* %o to i64* 819 store i64 %v, i64* %q, align 8 820 ret i8* %o 821} 822 823define i8* @i128_0(i8* %p, i128 %v) { 824; CHECK-T1-LABEL: i128_0: 825; CHECK-T1: @ %bb.0: 826; CHECK-T1-NEXT: ldr r1, [sp, #4] 827; CHECK-T1-NEXT: str r1, [r0, #12] 828; CHECK-T1-NEXT: ldr r1, [sp] 829; CHECK-T1-NEXT: str r1, [r0, #8] 830; CHECK-T1-NEXT: stm r0!, {r2, r3} 831; CHECK-T1-NEXT: subs r0, #8 832; CHECK-T1-NEXT: bx lr 833; 834; CHECK-T2-LABEL: i128_0: 835; CHECK-T2: @ %bb.0: 836; CHECK-T2-NEXT: ldr r1, [sp, #4] 837; CHECK-T2-NEXT: str r1, [r0, #12] 838; CHECK-T2-NEXT: ldr r1, [sp] 839; CHECK-T2-NEXT: str r1, [r0, #8] 840; CHECK-T2-NEXT: strd r2, r3, [r0] 841; CHECK-T2-NEXT: bx lr 842; 843; CHECK-ARM-LABEL: i128_0: 844; CHECK-ARM: @ %bb.0: 845; CHECK-ARM-NEXT: ldm sp, {r1, r12} 846; CHECK-ARM-NEXT: stm r0, {r2, r3} 847; CHECK-ARM-NEXT: str r1, [r0, #8] 848; CHECK-ARM-NEXT: str r12, [r0, #12] 849; CHECK-ARM-NEXT: bx lr 850 %o = getelementptr inbounds i8, i8* %p, i32 0 851 %q = bitcast i8* %o to i128* 852 store i128 %v, i128* %q, align 16 853 ret i8* %o 854} 855 856define i8* @i128_3(i8* %p, i128 %v) { 857; CHECK-T1-LABEL: i128_3: 858; CHECK-T1: @ %bb.0: 859; CHECK-T1-NEXT: movs r1, #3 860; CHECK-T1-NEXT: str r2, [r0, r1] 861; CHECK-T1-NEXT: adds r0, r0, #3 862; CHECK-T1-NEXT: ldr r1, [sp, #4] 863; CHECK-T1-NEXT: str r1, [r0, #12] 864; CHECK-T1-NEXT: ldr r1, [sp] 865; CHECK-T1-NEXT: str r1, [r0, #8] 866; CHECK-T1-NEXT: str r3, [r0, #4] 867; CHECK-T1-NEXT: bx lr 868; 869; CHECK-T2-LABEL: i128_3: 870; CHECK-T2: @ %bb.0: 871; CHECK-T2-NEXT: str r2, [r0, #3]! 872; CHECK-T2-NEXT: ldr r1, [sp, #4] 873; CHECK-T2-NEXT: str r1, [r0, #12] 874; CHECK-T2-NEXT: ldr r1, [sp] 875; CHECK-T2-NEXT: strd r3, r1, [r0, #4] 876; CHECK-T2-NEXT: bx lr 877; 878; CHECK-ARM-LABEL: i128_3: 879; CHECK-ARM: @ %bb.0: 880; CHECK-ARM-NEXT: str r2, [r0, #3]! 881; CHECK-ARM-NEXT: ldm sp, {r1, r12} 882; CHECK-ARM-NEXT: str r3, [r0, #4] 883; CHECK-ARM-NEXT: str r1, [r0, #8] 884; CHECK-ARM-NEXT: str r12, [r0, #12] 885; CHECK-ARM-NEXT: bx lr 886 %o = getelementptr inbounds i8, i8* %p, i32 3 887 %q = bitcast i8* %o to i128* 888 store i128 %v, i128* %q, align 16 889 ret i8* %o 890} 891 892define i8* @i128_4(i8* %p, i128 %v) { 893; CHECK-T1-LABEL: i128_4: 894; CHECK-T1: @ %bb.0: 895; CHECK-T1-NEXT: ldr r1, [sp, #4] 896; CHECK-T1-NEXT: str r1, [r0, #16] 897; CHECK-T1-NEXT: ldr r1, [sp] 898; CHECK-T1-NEXT: str r1, [r0, #12] 899; CHECK-T1-NEXT: str r3, [r0, #8] 900; CHECK-T1-NEXT: str r2, [r0, #4] 901; CHECK-T1-NEXT: adds r0, r0, #4 902; CHECK-T1-NEXT: bx lr 903; 904; CHECK-T2-LABEL: i128_4: 905; CHECK-T2: @ %bb.0: 906; CHECK-T2-NEXT: str r2, [r0, #4]! 907; CHECK-T2-NEXT: ldr r1, [sp, #4] 908; CHECK-T2-NEXT: str r1, [r0, #12] 909; CHECK-T2-NEXT: ldr r1, [sp] 910; CHECK-T2-NEXT: strd r3, r1, [r0, #4] 911; CHECK-T2-NEXT: bx lr 912; 913; CHECK-ARM-LABEL: i128_4: 914; CHECK-ARM: @ %bb.0: 915; CHECK-ARM-NEXT: str r2, [r0, #4]! 916; CHECK-ARM-NEXT: ldm sp, {r1, r12} 917; CHECK-ARM-NEXT: str r3, [r0, #4] 918; CHECK-ARM-NEXT: str r1, [r0, #8] 919; CHECK-ARM-NEXT: str r12, [r0, #12] 920; CHECK-ARM-NEXT: bx lr 921 %o = getelementptr inbounds i8, i8* %p, i32 4 922 %q = bitcast i8* %o to i128* 923 store i128 %v, i128* %q, align 16 924 ret i8* %o 925} 926 927define i8* @i128_8(i8* %p, i128 %v) { 928; CHECK-T1-LABEL: i128_8: 929; CHECK-T1: @ %bb.0: 930; CHECK-T1-NEXT: ldr r1, [sp, #4] 931; CHECK-T1-NEXT: str r1, [r0, #20] 932; CHECK-T1-NEXT: ldr r1, [sp] 933; CHECK-T1-NEXT: str r1, [r0, #16] 934; CHECK-T1-NEXT: str r3, [r0, #12] 935; CHECK-T1-NEXT: str r2, [r0, #8] 936; CHECK-T1-NEXT: adds r0, #8 937; CHECK-T1-NEXT: bx lr 938; 939; CHECK-T2-LABEL: i128_8: 940; CHECK-T2: @ %bb.0: 941; CHECK-T2-NEXT: str r2, [r0, #8]! 942; CHECK-T2-NEXT: ldr r1, [sp, #4] 943; CHECK-T2-NEXT: str r1, [r0, #12] 944; CHECK-T2-NEXT: ldr r1, [sp] 945; CHECK-T2-NEXT: strd r3, r1, [r0, #4] 946; CHECK-T2-NEXT: bx lr 947; 948; CHECK-ARM-LABEL: i128_8: 949; CHECK-ARM: @ %bb.0: 950; CHECK-ARM-NEXT: str r2, [r0, #8]! 951; CHECK-ARM-NEXT: ldm sp, {r1, r12} 952; CHECK-ARM-NEXT: str r3, [r0, #4] 953; CHECK-ARM-NEXT: str r1, [r0, #8] 954; CHECK-ARM-NEXT: str r12, [r0, #12] 955; CHECK-ARM-NEXT: bx lr 956 %o = getelementptr inbounds i8, i8* %p, i32 8 957 %q = bitcast i8* %o to i128* 958 store i128 %v, i128* %q, align 16 959 ret i8* %o 960} 961 962define i8* @i128_16(i8* %p, i128 %v) { 963; CHECK-T1-LABEL: i128_16: 964; CHECK-T1: @ %bb.0: 965; CHECK-T1-NEXT: ldr r1, [sp, #4] 966; CHECK-T1-NEXT: str r1, [r0, #28] 967; CHECK-T1-NEXT: ldr r1, [sp] 968; CHECK-T1-NEXT: str r1, [r0, #24] 969; CHECK-T1-NEXT: str r3, [r0, #20] 970; CHECK-T1-NEXT: str r2, [r0, #16] 971; CHECK-T1-NEXT: adds r0, #16 972; CHECK-T1-NEXT: bx lr 973; 974; CHECK-T2-LABEL: i128_16: 975; CHECK-T2: @ %bb.0: 976; CHECK-T2-NEXT: str r2, [r0, #16]! 977; CHECK-T2-NEXT: ldr r1, [sp, #4] 978; CHECK-T2-NEXT: str r1, [r0, #12] 979; CHECK-T2-NEXT: ldr r1, [sp] 980; CHECK-T2-NEXT: strd r3, r1, [r0, #4] 981; CHECK-T2-NEXT: bx lr 982; 983; CHECK-ARM-LABEL: i128_16: 984; CHECK-ARM: @ %bb.0: 985; CHECK-ARM-NEXT: str r2, [r0, #16]! 986; CHECK-ARM-NEXT: ldm sp, {r1, r12} 987; CHECK-ARM-NEXT: str r3, [r0, #4] 988; CHECK-ARM-NEXT: str r1, [r0, #8] 989; CHECK-ARM-NEXT: str r12, [r0, #12] 990; CHECK-ARM-NEXT: bx lr 991 %o = getelementptr inbounds i8, i8* %p, i32 16 992 %q = bitcast i8* %o to i128* 993 store i128 %v, i128* %q, align 16 994 ret i8* %o 995} 996 997define i8* @i128_m1(i8* %p, i128 %v) { 998; CHECK-T1-LABEL: i128_m1: 999; CHECK-T1: @ %bb.0: 1000; CHECK-T1-NEXT: subs r0, r0, #1 1001; CHECK-T1-NEXT: ldr r1, [sp, #4] 1002; CHECK-T1-NEXT: str r1, [r0, #12] 1003; CHECK-T1-NEXT: ldr r1, [sp] 1004; CHECK-T1-NEXT: str r1, [r0, #8] 1005; CHECK-T1-NEXT: stm r0!, {r2, r3} 1006; CHECK-T1-NEXT: subs r0, #8 1007; CHECK-T1-NEXT: bx lr 1008; 1009; CHECK-T2-LABEL: i128_m1: 1010; CHECK-T2: @ %bb.0: 1011; CHECK-T2-NEXT: str r2, [r0, #-1]! 1012; CHECK-T2-NEXT: ldr r1, [sp, #4] 1013; CHECK-T2-NEXT: str r1, [r0, #12] 1014; CHECK-T2-NEXT: ldr r1, [sp] 1015; CHECK-T2-NEXT: strd r3, r1, [r0, #4] 1016; CHECK-T2-NEXT: bx lr 1017; 1018; CHECK-ARM-LABEL: i128_m1: 1019; CHECK-ARM: @ %bb.0: 1020; CHECK-ARM-NEXT: str r2, [r0, #-1]! 1021; CHECK-ARM-NEXT: ldm sp, {r1, r12} 1022; CHECK-ARM-NEXT: str r3, [r0, #4] 1023; CHECK-ARM-NEXT: str r1, [r0, #8] 1024; CHECK-ARM-NEXT: str r12, [r0, #12] 1025; CHECK-ARM-NEXT: bx lr 1026 %o = getelementptr inbounds i8, i8* %p, i32 -1 1027 %q = bitcast i8* %o to i128* 1028 store i128 %v, i128* %q, align 16 1029 ret i8* %o 1030} 1031 1032define i8* @i128_m4(i8* %p, i128 %v) { 1033; CHECK-T1-LABEL: i128_m4: 1034; CHECK-T1: @ %bb.0: 1035; CHECK-T1-NEXT: ldr r1, [sp, #4] 1036; CHECK-T1-NEXT: str r1, [r0, #8] 1037; CHECK-T1-NEXT: ldr r1, [sp] 1038; CHECK-T1-NEXT: str r1, [r0, #4] 1039; CHECK-T1-NEXT: str r3, [r0] 1040; CHECK-T1-NEXT: subs r0, r0, #4 1041; CHECK-T1-NEXT: str r2, [r0] 1042; CHECK-T1-NEXT: bx lr 1043; 1044; CHECK-T2-LABEL: i128_m4: 1045; CHECK-T2: @ %bb.0: 1046; CHECK-T2-NEXT: ldr r1, [sp, #4] 1047; CHECK-T2-NEXT: str r1, [r0, #8] 1048; CHECK-T2-NEXT: ldr r1, [sp] 1049; CHECK-T2-NEXT: strd r3, r1, [r0] 1050; CHECK-T2-NEXT: str r2, [r0, #-4]! 1051; CHECK-T2-NEXT: bx lr 1052; 1053; CHECK-ARM-LABEL: i128_m4: 1054; CHECK-ARM: @ %bb.0: 1055; CHECK-ARM-NEXT: ldm sp, {r1, r12} 1056; CHECK-ARM-NEXT: str r3, [r0] 1057; CHECK-ARM-NEXT: stmib r0, {r1, r12} 1058; CHECK-ARM-NEXT: str r2, [r0, #-4]! 1059; CHECK-ARM-NEXT: bx lr 1060 %o = getelementptr inbounds i8, i8* %p, i32 -4 1061 %q = bitcast i8* %o to i128* 1062 store i128 %v, i128* %q, align 16 1063 ret i8* %o 1064} 1065 1066define i8* @i16_0(i8* %p, i16 %v) { 1067; CHECK-LABEL: i16_0: 1068; CHECK: @ %bb.0: 1069; CHECK-NEXT: strh r1, [r0] 1070; CHECK-NEXT: bx lr 1071 %o = getelementptr inbounds i8, i8* %p, i32 0 1072 %q = bitcast i8* %o to i16* 1073 store i16 %v, i16* %q, align 2 1074 ret i8* %o 1075} 1076 1077define i8* @i16_3(i8* %p, i16 %v) { 1078; CHECK-T1-LABEL: i16_3: 1079; CHECK-T1: @ %bb.0: 1080; CHECK-T1-NEXT: movs r2, #3 1081; CHECK-T1-NEXT: strh r1, [r0, r2] 1082; CHECK-T1-NEXT: adds r0, r0, #3 1083; CHECK-T1-NEXT: bx lr 1084; 1085; CHECK-T2-LABEL: i16_3: 1086; CHECK-T2: @ %bb.0: 1087; CHECK-T2-NEXT: strh r1, [r0, #3]! 1088; CHECK-T2-NEXT: bx lr 1089; 1090; CHECK-ARM-LABEL: i16_3: 1091; CHECK-ARM: @ %bb.0: 1092; CHECK-ARM-NEXT: strh r1, [r0, #3]! 1093; CHECK-ARM-NEXT: bx lr 1094 %o = getelementptr inbounds i8, i8* %p, i32 3 1095 %q = bitcast i8* %o to i16* 1096 store i16 %v, i16* %q, align 2 1097 ret i8* %o 1098} 1099 1100define i8* @i16_4(i8* %p, i16 %v) { 1101; CHECK-T1-LABEL: i16_4: 1102; CHECK-T1: @ %bb.0: 1103; CHECK-T1-NEXT: strh r1, [r0, #4] 1104; CHECK-T1-NEXT: adds r0, r0, #4 1105; CHECK-T1-NEXT: bx lr 1106; 1107; CHECK-T2-LABEL: i16_4: 1108; CHECK-T2: @ %bb.0: 1109; CHECK-T2-NEXT: strh r1, [r0, #4]! 1110; CHECK-T2-NEXT: bx lr 1111; 1112; CHECK-ARM-LABEL: i16_4: 1113; CHECK-ARM: @ %bb.0: 1114; CHECK-ARM-NEXT: strh r1, [r0, #4]! 1115; CHECK-ARM-NEXT: bx lr 1116 %o = getelementptr inbounds i8, i8* %p, i32 4 1117 %q = bitcast i8* %o to i16* 1118 store i16 %v, i16* %q, align 2 1119 ret i8* %o 1120} 1121 1122define i8* @i16_8(i8* %p, i16 %v) { 1123; CHECK-T1-LABEL: i16_8: 1124; CHECK-T1: @ %bb.0: 1125; CHECK-T1-NEXT: strh r1, [r0, #8] 1126; CHECK-T1-NEXT: adds r0, #8 1127; CHECK-T1-NEXT: bx lr 1128; 1129; CHECK-T2-LABEL: i16_8: 1130; CHECK-T2: @ %bb.0: 1131; CHECK-T2-NEXT: strh r1, [r0, #8]! 1132; CHECK-T2-NEXT: bx lr 1133; 1134; CHECK-ARM-LABEL: i16_8: 1135; CHECK-ARM: @ %bb.0: 1136; CHECK-ARM-NEXT: strh r1, [r0, #8]! 1137; CHECK-ARM-NEXT: bx lr 1138 %o = getelementptr inbounds i8, i8* %p, i32 8 1139 %q = bitcast i8* %o to i16* 1140 store i16 %v, i16* %q, align 2 1141 ret i8* %o 1142} 1143 1144define i8* @i16_m1(i8* %p, i16 %v) { 1145; CHECK-T1-LABEL: i16_m1: 1146; CHECK-T1: @ %bb.0: 1147; CHECK-T1-NEXT: subs r0, r0, #1 1148; CHECK-T1-NEXT: strh r1, [r0] 1149; CHECK-T1-NEXT: bx lr 1150; 1151; CHECK-T2-LABEL: i16_m1: 1152; CHECK-T2: @ %bb.0: 1153; CHECK-T2-NEXT: strh r1, [r0, #-1]! 1154; CHECK-T2-NEXT: bx lr 1155; 1156; CHECK-ARM-LABEL: i16_m1: 1157; CHECK-ARM: @ %bb.0: 1158; CHECK-ARM-NEXT: strh r1, [r0, #-1]! 1159; CHECK-ARM-NEXT: bx lr 1160 %o = getelementptr inbounds i8, i8* %p, i32 -1 1161 %q = bitcast i8* %o to i16* 1162 store i16 %v, i16* %q, align 2 1163 ret i8* %o 1164} 1165 1166define i8* @i16_m4(i8* %p, i16 %v) { 1167; CHECK-T1-LABEL: i16_m4: 1168; CHECK-T1: @ %bb.0: 1169; CHECK-T1-NEXT: subs r0, r0, #4 1170; CHECK-T1-NEXT: strh r1, [r0] 1171; CHECK-T1-NEXT: bx lr 1172; 1173; CHECK-T2-LABEL: i16_m4: 1174; CHECK-T2: @ %bb.0: 1175; CHECK-T2-NEXT: strh r1, [r0, #-4]! 1176; CHECK-T2-NEXT: bx lr 1177; 1178; CHECK-ARM-LABEL: i16_m4: 1179; CHECK-ARM: @ %bb.0: 1180; CHECK-ARM-NEXT: strh r1, [r0, #-4]! 1181; CHECK-ARM-NEXT: bx lr 1182 %o = getelementptr inbounds i8, i8* %p, i32 -4 1183 %q = bitcast i8* %o to i16* 1184 store i16 %v, i16* %q, align 2 1185 ret i8* %o 1186} 1187 1188define i8* @i16_252(i8* %p, i16 %v) { 1189; CHECK-T1-LABEL: i16_252: 1190; CHECK-T1: @ %bb.0: 1191; CHECK-T1-NEXT: movs r2, #252 1192; CHECK-T1-NEXT: strh r1, [r0, r2] 1193; CHECK-T1-NEXT: adds r0, #252 1194; CHECK-T1-NEXT: bx lr 1195; 1196; CHECK-T2-LABEL: i16_252: 1197; CHECK-T2: @ %bb.0: 1198; CHECK-T2-NEXT: strh r1, [r0, #252]! 1199; CHECK-T2-NEXT: bx lr 1200; 1201; CHECK-ARM-LABEL: i16_252: 1202; CHECK-ARM: @ %bb.0: 1203; CHECK-ARM-NEXT: strh r1, [r0, #252]! 1204; CHECK-ARM-NEXT: bx lr 1205 %o = getelementptr inbounds i8, i8* %p, i32 252 1206 %q = bitcast i8* %o to i16* 1207 store i16 %v, i16* %q, align 2 1208 ret i8* %o 1209} 1210 1211define i8* @i16_255(i8* %p, i16 %v) { 1212; CHECK-T1-LABEL: i16_255: 1213; CHECK-T1: @ %bb.0: 1214; CHECK-T1-NEXT: movs r2, #255 1215; CHECK-T1-NEXT: strh r1, [r0, r2] 1216; CHECK-T1-NEXT: adds r0, #255 1217; CHECK-T1-NEXT: bx lr 1218; 1219; CHECK-T2-LABEL: i16_255: 1220; CHECK-T2: @ %bb.0: 1221; CHECK-T2-NEXT: strh r1, [r0, #255]! 1222; CHECK-T2-NEXT: bx lr 1223; 1224; CHECK-ARM-LABEL: i16_255: 1225; CHECK-ARM: @ %bb.0: 1226; CHECK-ARM-NEXT: strh r1, [r0, #255]! 1227; CHECK-ARM-NEXT: bx lr 1228 %o = getelementptr inbounds i8, i8* %p, i32 255 1229 %q = bitcast i8* %o to i16* 1230 store i16 %v, i16* %q, align 2 1231 ret i8* %o 1232} 1233 1234define i8* @i16_256(i8* %p, i16 %v) { 1235; CHECK-T1-LABEL: i16_256: 1236; CHECK-T1: @ %bb.0: 1237; CHECK-T1-NEXT: movs r2, #1 1238; CHECK-T1-NEXT: lsls r2, r2, #8 1239; CHECK-T1-NEXT: strh r1, [r0, r2] 1240; CHECK-T1-NEXT: adds r0, r0, r2 1241; CHECK-T1-NEXT: bx lr 1242; 1243; CHECK-T2-LABEL: i16_256: 1244; CHECK-T2: @ %bb.0: 1245; CHECK-T2-NEXT: strh.w r1, [r0, #256] 1246; CHECK-T2-NEXT: add.w r0, r0, #256 1247; CHECK-T2-NEXT: bx lr 1248; 1249; CHECK-ARM-LABEL: i16_256: 1250; CHECK-ARM: @ %bb.0: 1251; CHECK-ARM-NEXT: mov r2, #256 1252; CHECK-ARM-NEXT: strh r1, [r0, r2]! 1253; CHECK-ARM-NEXT: bx lr 1254 %o = getelementptr inbounds i8, i8* %p, i32 256 1255 %q = bitcast i8* %o to i16* 1256 store i16 %v, i16* %q, align 2 1257 ret i8* %o 1258} 1259 1260define i8* @i16_m252(i8* %p, i16 %v) { 1261; CHECK-T1-LABEL: i16_m252: 1262; CHECK-T1: @ %bb.0: 1263; CHECK-T1-NEXT: subs r0, #252 1264; CHECK-T1-NEXT: strh r1, [r0] 1265; CHECK-T1-NEXT: bx lr 1266; 1267; CHECK-T2-LABEL: i16_m252: 1268; CHECK-T2: @ %bb.0: 1269; CHECK-T2-NEXT: strh r1, [r0, #-252]! 1270; CHECK-T2-NEXT: bx lr 1271; 1272; CHECK-ARM-LABEL: i16_m252: 1273; CHECK-ARM: @ %bb.0: 1274; CHECK-ARM-NEXT: strh r1, [r0, #-252]! 1275; CHECK-ARM-NEXT: bx lr 1276 %o = getelementptr inbounds i8, i8* %p, i32 -252 1277 %q = bitcast i8* %o to i16* 1278 store i16 %v, i16* %q, align 2 1279 ret i8* %o 1280} 1281 1282define i8* @i16_m255(i8* %p, i16 %v) { 1283; CHECK-T1-LABEL: i16_m255: 1284; CHECK-T1: @ %bb.0: 1285; CHECK-T1-NEXT: subs r0, #255 1286; CHECK-T1-NEXT: strh r1, [r0] 1287; CHECK-T1-NEXT: bx lr 1288; 1289; CHECK-T2-LABEL: i16_m255: 1290; CHECK-T2: @ %bb.0: 1291; CHECK-T2-NEXT: strh r1, [r0, #-255]! 1292; CHECK-T2-NEXT: bx lr 1293; 1294; CHECK-ARM-LABEL: i16_m255: 1295; CHECK-ARM: @ %bb.0: 1296; CHECK-ARM-NEXT: strh r1, [r0, #-255]! 1297; CHECK-ARM-NEXT: bx lr 1298 %o = getelementptr inbounds i8, i8* %p, i32 -255 1299 %q = bitcast i8* %o to i16* 1300 store i16 %v, i16* %q, align 2 1301 ret i8* %o 1302} 1303 1304define i8* @i16_m256(i8* %p, i16 %v) { 1305; CHECK-T1-LABEL: i16_m256: 1306; CHECK-T1: @ %bb.0: 1307; CHECK-T1-NEXT: movs r2, #255 1308; CHECK-T1-NEXT: mvns r2, r2 1309; CHECK-T1-NEXT: strh r1, [r0, r2] 1310; CHECK-T1-NEXT: adds r0, r0, r2 1311; CHECK-T1-NEXT: bx lr 1312; 1313; CHECK-T2-LABEL: i16_m256: 1314; CHECK-T2: @ %bb.0: 1315; CHECK-T2-NEXT: mvn r2, #255 1316; CHECK-T2-NEXT: strh r1, [r0, r2] 1317; CHECK-T2-NEXT: sub.w r0, r0, #256 1318; CHECK-T2-NEXT: bx lr 1319; 1320; CHECK-ARM-LABEL: i16_m256: 1321; CHECK-ARM: @ %bb.0: 1322; CHECK-ARM-NEXT: mvn r2, #255 1323; CHECK-ARM-NEXT: strh r1, [r0, r2]! 1324; CHECK-ARM-NEXT: bx lr 1325 %o = getelementptr inbounds i8, i8* %p, i32 -256 1326 %q = bitcast i8* %o to i16* 1327 store i16 %v, i16* %q, align 2 1328 ret i8* %o 1329} 1330 1331define i8* @i16_4095(i8* %p, i16 %v) { 1332; CHECK-T1-LABEL: i16_4095: 1333; CHECK-T1: @ %bb.0: 1334; CHECK-T1-NEXT: ldr r2, .LCPI51_0 1335; CHECK-T1-NEXT: strh r1, [r0, r2] 1336; CHECK-T1-NEXT: adds r0, r0, r2 1337; CHECK-T1-NEXT: bx lr 1338; CHECK-T1-NEXT: .p2align 2 1339; CHECK-T1-NEXT: @ %bb.1: 1340; CHECK-T1-NEXT: .LCPI51_0: 1341; CHECK-T1-NEXT: .long 4095 @ 0xfff 1342; 1343; CHECK-T2-LABEL: i16_4095: 1344; CHECK-T2: @ %bb.0: 1345; CHECK-T2-NEXT: strh.w r1, [r0, #4095] 1346; CHECK-T2-NEXT: addw r0, r0, #4095 1347; CHECK-T2-NEXT: bx lr 1348; 1349; CHECK-ARM-LABEL: i16_4095: 1350; CHECK-ARM: @ %bb.0: 1351; CHECK-ARM-NEXT: movw r2, #4095 1352; CHECK-ARM-NEXT: strh r1, [r0, r2]! 1353; CHECK-ARM-NEXT: bx lr 1354 %o = getelementptr inbounds i8, i8* %p, i32 4095 1355 %q = bitcast i8* %o to i16* 1356 store i16 %v, i16* %q, align 2 1357 ret i8* %o 1358} 1359 1360define i8* @i16_4096(i8* %p, i16 %v) { 1361; CHECK-T1-LABEL: i16_4096: 1362; CHECK-T1: @ %bb.0: 1363; CHECK-T1-NEXT: movs r2, #1 1364; CHECK-T1-NEXT: lsls r2, r2, #12 1365; CHECK-T1-NEXT: strh r1, [r0, r2] 1366; CHECK-T1-NEXT: adds r0, r0, r2 1367; CHECK-T1-NEXT: bx lr 1368; 1369; CHECK-T2-LABEL: i16_4096: 1370; CHECK-T2: @ %bb.0: 1371; CHECK-T2-NEXT: mov.w r2, #4096 1372; CHECK-T2-NEXT: strh r1, [r0, r2] 1373; CHECK-T2-NEXT: add.w r0, r0, #4096 1374; CHECK-T2-NEXT: bx lr 1375; 1376; CHECK-ARM-LABEL: i16_4096: 1377; CHECK-ARM: @ %bb.0: 1378; CHECK-ARM-NEXT: mov r2, #4096 1379; CHECK-ARM-NEXT: strh r1, [r0, r2]! 1380; CHECK-ARM-NEXT: bx lr 1381 %o = getelementptr inbounds i8, i8* %p, i32 4096 1382 %q = bitcast i8* %o to i16* 1383 store i16 %v, i16* %q, align 2 1384 ret i8* %o 1385} 1386 1387define i8* @i16_m4095(i8* %p, i16 %v) { 1388; CHECK-T1-LABEL: i16_m4095: 1389; CHECK-T1: @ %bb.0: 1390; CHECK-T1-NEXT: ldr r2, .LCPI53_0 1391; CHECK-T1-NEXT: strh r1, [r0, r2] 1392; CHECK-T1-NEXT: adds r0, r0, r2 1393; CHECK-T1-NEXT: bx lr 1394; CHECK-T1-NEXT: .p2align 2 1395; CHECK-T1-NEXT: @ %bb.1: 1396; CHECK-T1-NEXT: .LCPI53_0: 1397; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001 1398; 1399; CHECK-T2-LABEL: i16_m4095: 1400; CHECK-T2: @ %bb.0: 1401; CHECK-T2-NEXT: movw r2, #61441 1402; CHECK-T2-NEXT: movt r2, #65535 1403; CHECK-T2-NEXT: strh r1, [r0, r2] 1404; CHECK-T2-NEXT: subw r0, r0, #4095 1405; CHECK-T2-NEXT: bx lr 1406; 1407; CHECK-ARM-LABEL: i16_m4095: 1408; CHECK-ARM: @ %bb.0: 1409; CHECK-ARM-NEXT: movw r2, #61441 1410; CHECK-ARM-NEXT: movt r2, #65535 1411; CHECK-ARM-NEXT: strh r1, [r0, r2]! 1412; CHECK-ARM-NEXT: bx lr 1413 %o = getelementptr inbounds i8, i8* %p, i32 -4095 1414 %q = bitcast i8* %o to i16* 1415 store i16 %v, i16* %q, align 2 1416 ret i8* %o 1417} 1418 1419define i8* @i16_m4096(i8* %p, i16 %v) { 1420; CHECK-T1-LABEL: i16_m4096: 1421; CHECK-T1: @ %bb.0: 1422; CHECK-T1-NEXT: ldr r2, .LCPI54_0 1423; CHECK-T1-NEXT: strh r1, [r0, r2] 1424; CHECK-T1-NEXT: adds r0, r0, r2 1425; CHECK-T1-NEXT: bx lr 1426; CHECK-T1-NEXT: .p2align 2 1427; CHECK-T1-NEXT: @ %bb.1: 1428; CHECK-T1-NEXT: .LCPI54_0: 1429; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000 1430; 1431; CHECK-T2-LABEL: i16_m4096: 1432; CHECK-T2: @ %bb.0: 1433; CHECK-T2-NEXT: movw r2, #61440 1434; CHECK-T2-NEXT: movt r2, #65535 1435; CHECK-T2-NEXT: strh r1, [r0, r2] 1436; CHECK-T2-NEXT: sub.w r0, r0, #4096 1437; CHECK-T2-NEXT: bx lr 1438; 1439; CHECK-ARM-LABEL: i16_m4096: 1440; CHECK-ARM: @ %bb.0: 1441; CHECK-ARM-NEXT: movw r2, #61440 1442; CHECK-ARM-NEXT: movt r2, #65535 1443; CHECK-ARM-NEXT: strh r1, [r0, r2]! 1444; CHECK-ARM-NEXT: bx lr 1445 %o = getelementptr inbounds i8, i8* %p, i32 -4096 1446 %q = bitcast i8* %o to i16* 1447 store i16 %v, i16* %q, align 2 1448 ret i8* %o 1449} 1450 1451define i8* @i8_0(i8* %p, i8 %v) { 1452; CHECK-LABEL: i8_0: 1453; CHECK: @ %bb.0: 1454; CHECK-NEXT: strb r1, [r0] 1455; CHECK-NEXT: bx lr 1456 %o = getelementptr inbounds i8, i8* %p, i32 0 1457 %q = bitcast i8* %o to i8* 1458 store i8 %v, i8* %q, align 1 1459 ret i8* %o 1460} 1461 1462define i8* @i8_3(i8* %p, i8 %v) { 1463; CHECK-T1-LABEL: i8_3: 1464; CHECK-T1: @ %bb.0: 1465; CHECK-T1-NEXT: strb r1, [r0, #3] 1466; CHECK-T1-NEXT: adds r0, r0, #3 1467; CHECK-T1-NEXT: bx lr 1468; 1469; CHECK-T2-LABEL: i8_3: 1470; CHECK-T2: @ %bb.0: 1471; CHECK-T2-NEXT: strb r1, [r0, #3]! 1472; CHECK-T2-NEXT: bx lr 1473; 1474; CHECK-ARM-LABEL: i8_3: 1475; CHECK-ARM: @ %bb.0: 1476; CHECK-ARM-NEXT: strb r1, [r0, #3]! 1477; CHECK-ARM-NEXT: bx lr 1478 %o = getelementptr inbounds i8, i8* %p, i32 3 1479 %q = bitcast i8* %o to i8* 1480 store i8 %v, i8* %q, align 1 1481 ret i8* %o 1482} 1483 1484define i8* @i8_4(i8* %p, i8 %v) { 1485; CHECK-T1-LABEL: i8_4: 1486; CHECK-T1: @ %bb.0: 1487; CHECK-T1-NEXT: strb r1, [r0, #4] 1488; CHECK-T1-NEXT: adds r0, r0, #4 1489; CHECK-T1-NEXT: bx lr 1490; 1491; CHECK-T2-LABEL: i8_4: 1492; CHECK-T2: @ %bb.0: 1493; CHECK-T2-NEXT: strb r1, [r0, #4]! 1494; CHECK-T2-NEXT: bx lr 1495; 1496; CHECK-ARM-LABEL: i8_4: 1497; CHECK-ARM: @ %bb.0: 1498; CHECK-ARM-NEXT: strb r1, [r0, #4]! 1499; CHECK-ARM-NEXT: bx lr 1500 %o = getelementptr inbounds i8, i8* %p, i32 4 1501 %q = bitcast i8* %o to i8* 1502 store i8 %v, i8* %q, align 1 1503 ret i8* %o 1504} 1505 1506define i8* @i8_8(i8* %p, i8 %v) { 1507; CHECK-T1-LABEL: i8_8: 1508; CHECK-T1: @ %bb.0: 1509; CHECK-T1-NEXT: strb r1, [r0, #8] 1510; CHECK-T1-NEXT: adds r0, #8 1511; CHECK-T1-NEXT: bx lr 1512; 1513; CHECK-T2-LABEL: i8_8: 1514; CHECK-T2: @ %bb.0: 1515; CHECK-T2-NEXT: strb r1, [r0, #8]! 1516; CHECK-T2-NEXT: bx lr 1517; 1518; CHECK-ARM-LABEL: i8_8: 1519; CHECK-ARM: @ %bb.0: 1520; CHECK-ARM-NEXT: strb r1, [r0, #8]! 1521; CHECK-ARM-NEXT: bx lr 1522 %o = getelementptr inbounds i8, i8* %p, i32 8 1523 %q = bitcast i8* %o to i8* 1524 store i8 %v, i8* %q, align 1 1525 ret i8* %o 1526} 1527 1528define i8* @i8_m1(i8* %p, i8 %v) { 1529; CHECK-T1-LABEL: i8_m1: 1530; CHECK-T1: @ %bb.0: 1531; CHECK-T1-NEXT: subs r0, r0, #1 1532; CHECK-T1-NEXT: strb r1, [r0] 1533; CHECK-T1-NEXT: bx lr 1534; 1535; CHECK-T2-LABEL: i8_m1: 1536; CHECK-T2: @ %bb.0: 1537; CHECK-T2-NEXT: strb r1, [r0, #-1]! 1538; CHECK-T2-NEXT: bx lr 1539; 1540; CHECK-ARM-LABEL: i8_m1: 1541; CHECK-ARM: @ %bb.0: 1542; CHECK-ARM-NEXT: strb r1, [r0, #-1]! 1543; CHECK-ARM-NEXT: bx lr 1544 %o = getelementptr inbounds i8, i8* %p, i32 -1 1545 %q = bitcast i8* %o to i8* 1546 store i8 %v, i8* %q, align 1 1547 ret i8* %o 1548} 1549 1550define i8* @i8_m4(i8* %p, i8 %v) { 1551; CHECK-T1-LABEL: i8_m4: 1552; CHECK-T1: @ %bb.0: 1553; CHECK-T1-NEXT: subs r0, r0, #4 1554; CHECK-T1-NEXT: strb r1, [r0] 1555; CHECK-T1-NEXT: bx lr 1556; 1557; CHECK-T2-LABEL: i8_m4: 1558; CHECK-T2: @ %bb.0: 1559; CHECK-T2-NEXT: strb r1, [r0, #-4]! 1560; CHECK-T2-NEXT: bx lr 1561; 1562; CHECK-ARM-LABEL: i8_m4: 1563; CHECK-ARM: @ %bb.0: 1564; CHECK-ARM-NEXT: strb r1, [r0, #-4]! 1565; CHECK-ARM-NEXT: bx lr 1566 %o = getelementptr inbounds i8, i8* %p, i32 -4 1567 %q = bitcast i8* %o to i8* 1568 store i8 %v, i8* %q, align 1 1569 ret i8* %o 1570} 1571 1572define i8* @i8_252(i8* %p, i8 %v) { 1573; CHECK-T1-LABEL: i8_252: 1574; CHECK-T1: @ %bb.0: 1575; CHECK-T1-NEXT: movs r2, #252 1576; CHECK-T1-NEXT: strb r1, [r0, r2] 1577; CHECK-T1-NEXT: adds r0, #252 1578; CHECK-T1-NEXT: bx lr 1579; 1580; CHECK-T2-LABEL: i8_252: 1581; CHECK-T2: @ %bb.0: 1582; CHECK-T2-NEXT: strb r1, [r0, #252]! 1583; CHECK-T2-NEXT: bx lr 1584; 1585; CHECK-ARM-LABEL: i8_252: 1586; CHECK-ARM: @ %bb.0: 1587; CHECK-ARM-NEXT: strb r1, [r0, #252]! 1588; CHECK-ARM-NEXT: bx lr 1589 %o = getelementptr inbounds i8, i8* %p, i32 252 1590 %q = bitcast i8* %o to i8* 1591 store i8 %v, i8* %q, align 1 1592 ret i8* %o 1593} 1594 1595define i8* @i8_255(i8* %p, i8 %v) { 1596; CHECK-T1-LABEL: i8_255: 1597; CHECK-T1: @ %bb.0: 1598; CHECK-T1-NEXT: movs r2, #255 1599; CHECK-T1-NEXT: strb r1, [r0, r2] 1600; CHECK-T1-NEXT: adds r0, #255 1601; CHECK-T1-NEXT: bx lr 1602; 1603; CHECK-T2-LABEL: i8_255: 1604; CHECK-T2: @ %bb.0: 1605; CHECK-T2-NEXT: strb r1, [r0, #255]! 1606; CHECK-T2-NEXT: bx lr 1607; 1608; CHECK-ARM-LABEL: i8_255: 1609; CHECK-ARM: @ %bb.0: 1610; CHECK-ARM-NEXT: strb r1, [r0, #255]! 1611; CHECK-ARM-NEXT: bx lr 1612 %o = getelementptr inbounds i8, i8* %p, i32 255 1613 %q = bitcast i8* %o to i8* 1614 store i8 %v, i8* %q, align 1 1615 ret i8* %o 1616} 1617 1618define i8* @i8_256(i8* %p, i8 %v) { 1619; CHECK-T1-LABEL: i8_256: 1620; CHECK-T1: @ %bb.0: 1621; CHECK-T1-NEXT: movs r2, #1 1622; CHECK-T1-NEXT: lsls r2, r2, #8 1623; CHECK-T1-NEXT: strb r1, [r0, r2] 1624; CHECK-T1-NEXT: adds r0, r0, r2 1625; CHECK-T1-NEXT: bx lr 1626; 1627; CHECK-T2-LABEL: i8_256: 1628; CHECK-T2: @ %bb.0: 1629; CHECK-T2-NEXT: strb.w r1, [r0, #256] 1630; CHECK-T2-NEXT: add.w r0, r0, #256 1631; CHECK-T2-NEXT: bx lr 1632; 1633; CHECK-ARM-LABEL: i8_256: 1634; CHECK-ARM: @ %bb.0: 1635; CHECK-ARM-NEXT: strb r1, [r0, #256]! 1636; CHECK-ARM-NEXT: bx lr 1637 %o = getelementptr inbounds i8, i8* %p, i32 256 1638 %q = bitcast i8* %o to i8* 1639 store i8 %v, i8* %q, align 1 1640 ret i8* %o 1641} 1642 1643define i8* @i8_m252(i8* %p, i8 %v) { 1644; CHECK-T1-LABEL: i8_m252: 1645; CHECK-T1: @ %bb.0: 1646; CHECK-T1-NEXT: subs r0, #252 1647; CHECK-T1-NEXT: strb r1, [r0] 1648; CHECK-T1-NEXT: bx lr 1649; 1650; CHECK-T2-LABEL: i8_m252: 1651; CHECK-T2: @ %bb.0: 1652; CHECK-T2-NEXT: strb r1, [r0, #-252]! 1653; CHECK-T2-NEXT: bx lr 1654; 1655; CHECK-ARM-LABEL: i8_m252: 1656; CHECK-ARM: @ %bb.0: 1657; CHECK-ARM-NEXT: strb r1, [r0, #-252]! 1658; CHECK-ARM-NEXT: bx lr 1659 %o = getelementptr inbounds i8, i8* %p, i32 -252 1660 %q = bitcast i8* %o to i8* 1661 store i8 %v, i8* %q, align 1 1662 ret i8* %o 1663} 1664 1665define i8* @i8_m255(i8* %p, i8 %v) { 1666; CHECK-T1-LABEL: i8_m255: 1667; CHECK-T1: @ %bb.0: 1668; CHECK-T1-NEXT: subs r0, #255 1669; CHECK-T1-NEXT: strb r1, [r0] 1670; CHECK-T1-NEXT: bx lr 1671; 1672; CHECK-T2-LABEL: i8_m255: 1673; CHECK-T2: @ %bb.0: 1674; CHECK-T2-NEXT: strb r1, [r0, #-255]! 1675; CHECK-T2-NEXT: bx lr 1676; 1677; CHECK-ARM-LABEL: i8_m255: 1678; CHECK-ARM: @ %bb.0: 1679; CHECK-ARM-NEXT: strb r1, [r0, #-255]! 1680; CHECK-ARM-NEXT: bx lr 1681 %o = getelementptr inbounds i8, i8* %p, i32 -255 1682 %q = bitcast i8* %o to i8* 1683 store i8 %v, i8* %q, align 1 1684 ret i8* %o 1685} 1686 1687define i8* @i8_m256(i8* %p, i8 %v) { 1688; CHECK-T1-LABEL: i8_m256: 1689; CHECK-T1: @ %bb.0: 1690; CHECK-T1-NEXT: movs r2, #255 1691; CHECK-T1-NEXT: mvns r2, r2 1692; CHECK-T1-NEXT: strb r1, [r0, r2] 1693; CHECK-T1-NEXT: adds r0, r0, r2 1694; CHECK-T1-NEXT: bx lr 1695; 1696; CHECK-T2-LABEL: i8_m256: 1697; CHECK-T2: @ %bb.0: 1698; CHECK-T2-NEXT: mvn r2, #255 1699; CHECK-T2-NEXT: strb r1, [r0, r2] 1700; CHECK-T2-NEXT: sub.w r0, r0, #256 1701; CHECK-T2-NEXT: bx lr 1702; 1703; CHECK-ARM-LABEL: i8_m256: 1704; CHECK-ARM: @ %bb.0: 1705; CHECK-ARM-NEXT: strb r1, [r0, #-256]! 1706; CHECK-ARM-NEXT: bx lr 1707 %o = getelementptr inbounds i8, i8* %p, i32 -256 1708 %q = bitcast i8* %o to i8* 1709 store i8 %v, i8* %q, align 1 1710 ret i8* %o 1711} 1712 1713define i8* @i8_4095(i8* %p, i8 %v) { 1714; CHECK-T1-LABEL: i8_4095: 1715; CHECK-T1: @ %bb.0: 1716; CHECK-T1-NEXT: ldr r2, .LCPI67_0 1717; CHECK-T1-NEXT: strb r1, [r0, r2] 1718; CHECK-T1-NEXT: adds r0, r0, r2 1719; CHECK-T1-NEXT: bx lr 1720; CHECK-T1-NEXT: .p2align 2 1721; CHECK-T1-NEXT: @ %bb.1: 1722; CHECK-T1-NEXT: .LCPI67_0: 1723; CHECK-T1-NEXT: .long 4095 @ 0xfff 1724; 1725; CHECK-T2-LABEL: i8_4095: 1726; CHECK-T2: @ %bb.0: 1727; CHECK-T2-NEXT: strb.w r1, [r0, #4095] 1728; CHECK-T2-NEXT: addw r0, r0, #4095 1729; CHECK-T2-NEXT: bx lr 1730; 1731; CHECK-ARM-LABEL: i8_4095: 1732; CHECK-ARM: @ %bb.0: 1733; CHECK-ARM-NEXT: strb r1, [r0, #4095]! 1734; CHECK-ARM-NEXT: bx lr 1735 %o = getelementptr inbounds i8, i8* %p, i32 4095 1736 %q = bitcast i8* %o to i8* 1737 store i8 %v, i8* %q, align 1 1738 ret i8* %o 1739} 1740 1741define i8* @i8_4096(i8* %p, i8 %v) { 1742; CHECK-T1-LABEL: i8_4096: 1743; CHECK-T1: @ %bb.0: 1744; CHECK-T1-NEXT: movs r2, #1 1745; CHECK-T1-NEXT: lsls r2, r2, #12 1746; CHECK-T1-NEXT: strb r1, [r0, r2] 1747; CHECK-T1-NEXT: adds r0, r0, r2 1748; CHECK-T1-NEXT: bx lr 1749; 1750; CHECK-T2-LABEL: i8_4096: 1751; CHECK-T2: @ %bb.0: 1752; CHECK-T2-NEXT: mov.w r2, #4096 1753; CHECK-T2-NEXT: strb r1, [r0, r2] 1754; CHECK-T2-NEXT: add.w r0, r0, #4096 1755; CHECK-T2-NEXT: bx lr 1756; 1757; CHECK-ARM-LABEL: i8_4096: 1758; CHECK-ARM: @ %bb.0: 1759; CHECK-ARM-NEXT: mov r2, #4096 1760; CHECK-ARM-NEXT: strb r1, [r0, r2]! 1761; CHECK-ARM-NEXT: bx lr 1762 %o = getelementptr inbounds i8, i8* %p, i32 4096 1763 %q = bitcast i8* %o to i8* 1764 store i8 %v, i8* %q, align 1 1765 ret i8* %o 1766} 1767 1768define i8* @i8_m4095(i8* %p, i8 %v) { 1769; CHECK-T1-LABEL: i8_m4095: 1770; CHECK-T1: @ %bb.0: 1771; CHECK-T1-NEXT: ldr r2, .LCPI69_0 1772; CHECK-T1-NEXT: strb r1, [r0, r2] 1773; CHECK-T1-NEXT: adds r0, r0, r2 1774; CHECK-T1-NEXT: bx lr 1775; CHECK-T1-NEXT: .p2align 2 1776; CHECK-T1-NEXT: @ %bb.1: 1777; CHECK-T1-NEXT: .LCPI69_0: 1778; CHECK-T1-NEXT: .long 4294963201 @ 0xfffff001 1779; 1780; CHECK-T2-LABEL: i8_m4095: 1781; CHECK-T2: @ %bb.0: 1782; CHECK-T2-NEXT: movw r2, #61441 1783; CHECK-T2-NEXT: movt r2, #65535 1784; CHECK-T2-NEXT: strb r1, [r0, r2] 1785; CHECK-T2-NEXT: subw r0, r0, #4095 1786; CHECK-T2-NEXT: bx lr 1787; 1788; CHECK-ARM-LABEL: i8_m4095: 1789; CHECK-ARM: @ %bb.0: 1790; CHECK-ARM-NEXT: strb r1, [r0, #-4095]! 1791; CHECK-ARM-NEXT: bx lr 1792 %o = getelementptr inbounds i8, i8* %p, i32 -4095 1793 %q = bitcast i8* %o to i8* 1794 store i8 %v, i8* %q, align 1 1795 ret i8* %o 1796} 1797 1798define i8* @i8_m4096(i8* %p, i8 %v) { 1799; CHECK-T1-LABEL: i8_m4096: 1800; CHECK-T1: @ %bb.0: 1801; CHECK-T1-NEXT: ldr r2, .LCPI70_0 1802; CHECK-T1-NEXT: strb r1, [r0, r2] 1803; CHECK-T1-NEXT: adds r0, r0, r2 1804; CHECK-T1-NEXT: bx lr 1805; CHECK-T1-NEXT: .p2align 2 1806; CHECK-T1-NEXT: @ %bb.1: 1807; CHECK-T1-NEXT: .LCPI70_0: 1808; CHECK-T1-NEXT: .long 4294963200 @ 0xfffff000 1809; 1810; CHECK-T2-LABEL: i8_m4096: 1811; CHECK-T2: @ %bb.0: 1812; CHECK-T2-NEXT: movw r2, #61440 1813; CHECK-T2-NEXT: movt r2, #65535 1814; CHECK-T2-NEXT: strb r1, [r0, r2] 1815; CHECK-T2-NEXT: sub.w r0, r0, #4096 1816; CHECK-T2-NEXT: bx lr 1817; 1818; CHECK-ARM-LABEL: i8_m4096: 1819; CHECK-ARM: @ %bb.0: 1820; CHECK-ARM-NEXT: movw r2, #61440 1821; CHECK-ARM-NEXT: movt r2, #65535 1822; CHECK-ARM-NEXT: strb r1, [r0, r2]! 1823; CHECK-ARM-NEXT: bx lr 1824 %o = getelementptr inbounds i8, i8* %p, i32 -4096 1825 %q = bitcast i8* %o to i8* 1826 store i8 %v, i8* %q, align 1 1827 ret i8* %o 1828} 1829