1 ; RUN: llc < %s -march=thumb -mattr=+thumb2 | FileCheck %s 2 3 define i16 @f1(i16 %a, i16* %v) { 4 ; CHECK: f1: 5 ; CHECK: strh r0, [r1] 6 store i16 %a, i16* %v 7 ret i16 %a 8 } 9 10 define i16 @f2(i16 %a, i16* %v) { 11 ; CHECK: f2: 12 ; CHECK: strh.w r0, [r1, #4092] 13 %tmp2 = getelementptr i16* %v, i32 2046 14 store i16 %a, i16* %tmp2 15 ret i16 %a 16 } 17 18 define i16 @f2a(i16 %a, i16* %v) { 19 ; CHECK: f2a: 20 ; CHECK: strh r0, [r1, #-128] 21 %tmp2 = getelementptr i16* %v, i32 -64 22 store i16 %a, i16* %tmp2 23 ret i16 %a 24 } 25 26 define i16 @f3(i16 %a, i16* %v) { 27 ; CHECK: f3: 28 ; CHECK: mov.w r2, #4096 29 ; CHECK: strh r0, [r1, r2] 30 %tmp2 = getelementptr i16* %v, i32 2048 31 store i16 %a, i16* %tmp2 32 ret i16 %a 33 } 34 35 define i16 @f4(i16 %a, i32 %base) { 36 entry: 37 ; CHECK: f4: 38 ; CHECK: strh r0, [r1, #-128] 39 %tmp1 = sub i32 %base, 128 40 %tmp2 = inttoptr i32 %tmp1 to i16* 41 store i16 %a, i16* %tmp2 42 ret i16 %a 43 } 44 45 define i16 @f5(i16 %a, i32 %base, i32 %offset) { 46 entry: 47 ; CHECK: f5: 48 ; CHECK: strh r0, [r1, r2] 49 %tmp1 = add i32 %base, %offset 50 %tmp2 = inttoptr i32 %tmp1 to i16* 51 store i16 %a, i16* %tmp2 52 ret i16 %a 53 } 54 55 define i16 @f6(i16 %a, i32 %base, i32 %offset) { 56 entry: 57 ; CHECK: f6: 58 ; CHECK: strh.w r0, [r1, r2, lsl #2] 59 %tmp1 = shl i32 %offset, 2 60 %tmp2 = add i32 %base, %tmp1 61 %tmp3 = inttoptr i32 %tmp2 to i16* 62 store i16 %a, i16* %tmp3 63 ret i16 %a 64 } 65 66 define i16 @f7(i16 %a, i32 %base, i32 %offset) { 67 entry: 68 ; CHECK: f7: 69 ; CHECK: lsrs r2, r2, #2 70 ; CHECK: strh r0, [r1, r2] 71 %tmp1 = lshr i32 %offset, 2 72 %tmp2 = add i32 %base, %tmp1 73 %tmp3 = inttoptr i32 %tmp2 to i16* 74 store i16 %a, i16* %tmp3 75 ret i16 %a 76 } 77