Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc < %s -march=arm -mattr=+v6 | FileCheck %s
      2 
      3 ; CHECK: test1
      4 ; CHECK: pkhbt   r0, r0, r1, lsl #16
      5 define i32 @test1(i32 %X, i32 %Y) {
      6 	%tmp1 = and i32 %X, 65535
      7 	%tmp4 = shl i32 %Y, 16
      8 	%tmp5 = or i32 %tmp4, %tmp1
      9 	ret i32 %tmp5
     10 }
     11 
     12 ; CHECK: test2
     13 ; CHECK: pkhbt   r0, r0, r1, lsl #12
     14 define i32 @test2(i32 %X, i32 %Y) {
     15 	%tmp1 = and i32 %X, 65535
     16 	%tmp3 = shl i32 %Y, 12
     17 	%tmp4 = and i32 %tmp3, -65536
     18 	%tmp57 = or i32 %tmp4, %tmp1
     19 	ret i32 %tmp57
     20 }
     21 
     22 ; CHECK: test3
     23 ; CHECK: pkhbt   r0, r0, r1, lsl #18
     24 define i32 @test3(i32 %X, i32 %Y) {
     25 	%tmp19 = and i32 %X, 65535
     26 	%tmp37 = shl i32 %Y, 18
     27 	%tmp5 = or i32 %tmp37, %tmp19
     28 	ret i32 %tmp5
     29 }
     30 
     31 ; CHECK: test4
     32 ; CHECK: pkhbt   r0, r0, r1
     33 define i32 @test4(i32 %X, i32 %Y) {
     34 	%tmp1 = and i32 %X, 65535
     35 	%tmp3 = and i32 %Y, -65536
     36 	%tmp46 = or i32 %tmp3, %tmp1
     37 	ret i32 %tmp46
     38 }
     39 
     40 ; CHECK: test5
     41 ; CHECK: pkhtb   r0, r0, r1, asr #16
     42 define i32 @test5(i32 %X, i32 %Y) {
     43 	%tmp17 = and i32 %X, -65536
     44 	%tmp2 = bitcast i32 %Y to i32
     45 	%tmp4 = lshr i32 %tmp2, 16
     46 	%tmp5 = or i32 %tmp4, %tmp17
     47 	ret i32 %tmp5
     48 }
     49 
     50 ; CHECK: test5a
     51 ; CHECK: pkhtb   r0, r0, r1, asr #16
     52 define i32 @test5a(i32 %X, i32 %Y) {
     53 	%tmp110 = and i32 %X, -65536
     54 	%tmp37 = lshr i32 %Y, 16
     55 	%tmp39 = bitcast i32 %tmp37 to i32
     56 	%tmp5 = or i32 %tmp39, %tmp110
     57 	ret i32 %tmp5
     58 }
     59 
     60 ; CHECK: test6
     61 ; CHECK: pkhtb   r0, r0, r1, asr #12
     62 define i32 @test6(i32 %X, i32 %Y) {
     63 	%tmp1 = and i32 %X, -65536
     64 	%tmp37 = lshr i32 %Y, 12
     65 	%tmp38 = bitcast i32 %tmp37 to i32
     66 	%tmp4 = and i32 %tmp38, 65535
     67 	%tmp59 = or i32 %tmp4, %tmp1
     68 	ret i32 %tmp59
     69 }
     70 
     71 ; CHECK: test7
     72 ; CHECK: pkhtb   r0, r0, r1, asr #18
     73 define i32 @test7(i32 %X, i32 %Y) {
     74 	%tmp1 = and i32 %X, -65536
     75 	%tmp3 = ashr i32 %Y, 18
     76 	%tmp4 = and i32 %tmp3, 65535
     77 	%tmp57 = or i32 %tmp4, %tmp1
     78 	ret i32 %tmp57
     79 }
     80 
     81 ; Arithmetic and logic right shift does not have the same semantics if shifting
     82 ; by more than 16 in this context.
     83 
     84 ; CHECK: test8
     85 ; CHECK-NOT: pkhtb   r0, r0, r1, asr #22
     86 define i32 @test8(i32 %X, i32 %Y) {
     87 	%tmp1 = and i32 %X, -65536
     88 	%tmp3 = lshr i32 %Y, 22
     89 	%tmp57 = or i32 %tmp3, %tmp1
     90 	ret i32 %tmp57
     91 }
     92 
     93 ; CHECK-LABEL: test9:
     94 ; CHECK: pkhtb r0, r0, r1, asr #16
     95 define i32 @test9(i32 %src1, i32 %src2) {
     96 entry:
     97     %tmp = and i32 %src1, -65536
     98     %tmp2 = lshr i32 %src2, 16
     99     %tmp3 = or i32 %tmp, %tmp2
    100     ret i32 %tmp3
    101 }
    102 
    103 ; CHECK-LABEL: test10:
    104 ; CHECK: pkhtb r0, r0, r1, asr #17
    105 define i32 @test10(i32 %src1, i32 %src2) {
    106 entry:
    107     %tmp = and i32 %src1, -65536
    108     %tmp2 = ashr i32 %src2, 17
    109     %tmp3 = or i32 %tmp, %tmp2
    110     ret i32 %tmp3
    111 }
    112