Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc -mtriple=arm-eabi -mcpu=generic %s -o /dev/null
      2 ; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s
      3 ; RUN: llc -mtriple=thumb--none-eabi -mcpu=cortex-a8 %s -o - | FileCheck %s
      4 
      5 @x = weak global i16 0          ; <i16*> [#uses=1]
      6 @y = weak global i16 0          ; <i16*> [#uses=0]
      7 
      8 define i32 @f1(i32 %y) {
      9 ; CHECK-LABEL: f1:
     10 ; CHECK: smulbt
     11         %tmp = load i16, i16* @x             ; <i16> [#uses=1]
     12         %tmp1 = add i16 %tmp, 2         ; <i16> [#uses=1]
     13         %tmp2 = sext i16 %tmp1 to i32           ; <i32> [#uses=1]
     14         %tmp3 = ashr i32 %y, 16         ; <i32> [#uses=1]
     15         %tmp4 = mul i32 %tmp2, %tmp3            ; <i32> [#uses=1]
     16         ret i32 %tmp4
     17 }
     18 
     19 define i32 @f2(i32 %x, i32 %y) {
     20 ; CHECK-LABEL: f2:
     21 ; CHECK: smultt
     22         %tmp1 = ashr i32 %x, 16         ; <i32> [#uses=1]
     23         %tmp3 = ashr i32 %y, 16         ; <i32> [#uses=1]
     24         %tmp4 = mul i32 %tmp3, %tmp1            ; <i32> [#uses=1]
     25         ret i32 %tmp4
     26 }
     27 
     28 define i32 @f3(i32 %a, i16 %x, i32 %y) {
     29 ; CHECK-LABEL: f3:
     30 ; CHECK: smlabt
     31         %tmp = sext i16 %x to i32               ; <i32> [#uses=1]
     32         %tmp2 = ashr i32 %y, 16         ; <i32> [#uses=1]
     33         %tmp3 = mul i32 %tmp2, %tmp             ; <i32> [#uses=1]
     34         %tmp5 = add i32 %tmp3, %a               ; <i32> [#uses=1]
     35         ret i32 %tmp5
     36 }
     37 
     38 define i32 @f4(i32 %a, i32 %x, i32 %y) {
     39 ; CHECK-LABEL: f4:
     40 ; CHECK: smlatt
     41         %tmp1 = ashr i32 %x, 16
     42         %tmp3 = ashr i32 %y, 16
     43         %tmp4 = mul i32 %tmp3, %tmp1
     44         %tmp5 = add i32 %tmp4, %a
     45         ret i32 %tmp5
     46 }
     47 
     48 define i32 @f5(i32 %a, i16 %x, i16 %y) {
     49 ; CHECK-LABEL: f5:
     50 ; CHECK: smlabb
     51         %tmp1 = sext i16 %x to i32
     52         %tmp3 = sext i16 %y to i32
     53         %tmp4 = mul i32 %tmp3, %tmp1
     54         %tmp5 = add i32 %tmp4, %a
     55         ret i32 %tmp5
     56 }
     57 
     58 define i32 @f6(i32 %a, i16 %x, i32 %y) {
     59 ; CHECK-LABEL: f6:
     60 ; CHECK: smlabt
     61         %tmp1 = sext i16 %x to i32
     62         %tmp3 = ashr i32 %y, 16
     63         %tmp4 = mul i32 %tmp3, %tmp1
     64         %tmp5 = add i32 %tmp4, %a
     65         ret i32 %tmp5
     66 }
     67 
     68 define i32 @f7(i32 %a, i32 %b, i32 %c) {
     69 ; CHECK-LABEL: f7:
     70 ; CHECK: smlawb
     71         %shl = shl i32 %b, 16
     72         %shr = ashr exact i32 %shl, 16
     73         %conv = sext i32 %a to i64
     74         %conv2 = sext i32 %shr to i64
     75         %mul = mul nsw i64 %conv2, %conv
     76         %shr49 = lshr i64 %mul, 16
     77         %conv5 = trunc i64 %shr49 to i32
     78         %add = add nsw i32 %conv5, %c
     79         ret i32 %add
     80 }
     81 
     82 define i32 @f8(i32 %a, i16 signext %b, i32 %c) {
     83 ; CHECK-LABEL: f8:
     84 ; CHECK: smlawb
     85         %conv = sext i32 %a to i64
     86         %conv1 = sext i16 %b to i64
     87         %mul = mul nsw i64 %conv1, %conv
     88         %shr5 = lshr i64 %mul, 16
     89         %conv2 = trunc i64 %shr5 to i32
     90         %add = add nsw i32 %conv2, %c
     91         ret i32 %add
     92 }
     93 
     94 define i32 @f9(i32 %a, i32 %b, i32 %c) {
     95 ; CHECK-LABEL: f9:
     96 ; CHECK: smlawt
     97         %conv = sext i32 %a to i64
     98         %shr = ashr i32 %b, 16
     99         %conv1 = sext i32 %shr to i64
    100         %mul = mul nsw i64 %conv1, %conv
    101         %shr26 = lshr i64 %mul, 16
    102         %conv3 = trunc i64 %shr26 to i32
    103         %add = add nsw i32 %conv3, %c
    104         ret i32 %add
    105 }
    106 
    107 define i32 @f10(i32 %a, i32 %b, i32 %c) {
    108 ; CHECK-LABEL: f10:
    109 ; CHECK: smulwb
    110         %shl = shl i32 %b, 16
    111         %shr = ashr exact i32 %shl, 16
    112         %conv = sext i32 %a to i64
    113         %conv2 = sext i32 %shr to i64
    114         %mul = mul nsw i64 %conv2, %conv
    115         %shr37 = lshr i64 %mul, 16
    116         %conv4 = trunc i64 %shr37 to i32
    117         ret i32 %conv4
    118 }
    119 
    120 define i32 @f11(i32 %a, i16 signext %b, i32 %c) {
    121 ; CHECK-LABEL: f11:
    122 ; CHECK: smulwb
    123         %conv = sext i32 %a to i64
    124         %conv1 = sext i16 %b to i64
    125         %mul = mul nsw i64 %conv1, %conv
    126         %shr4 = lshr i64 %mul, 16
    127         %conv2 = trunc i64 %shr4 to i32
    128         ret i32 %conv2
    129 }
    130 
    131 define i32 @f12(i32 %a, i32 %b, i32 %c) {
    132 ; CHECK-LABEL: f12:
    133 ; CHECK: smulwt
    134         %conv = sext i32 %a to i64
    135         %shr = ashr i32 %b, 16
    136         %conv1 = sext i32 %shr to i64
    137         %mul = mul nsw i64 %conv1, %conv
    138         %shr25 = lshr i64 %mul, 16
    139         %conv3 = trunc i64 %shr25 to i32
    140         ret i32 %conv3
    141 }
    142