Home | History | Annotate | Download | only in Hexagon
      1 ; RUN: llc -march=hexagon < %s | FileCheck %s
      2 
      3 target triple = "hexagon-unknown--elf"
      4 
      5 ; CHECK-LABEL: mul_1
      6 ; CHECK: r1:0 = mpy(r2,r0)
      7 define i64 @mul_1(i64 %a0, i64 %a1) #0 {
      8 b2:
      9   %v3 = shl i64 %a0, 32
     10   %v4 = ashr exact i64 %v3, 32
     11   %v5 = shl i64 %a1, 32
     12   %v6 = ashr exact i64 %v5, 32
     13   %v7 = mul nsw i64 %v6, %v4
     14   ret i64 %v7
     15 }
     16 
     17 ; CHECK-LABEL: mul_2
     18 ; CHECK: r0 = memb(r0+#0)
     19 ; CHECK: r1:0 = mpy(r2,r0)
     20 ; CHECK: jumpr r31
     21 define i64 @mul_2(i8* %a0, i64 %a1) #0 {
     22 b2:
     23   %v3 = load i8, i8* %a0
     24   %v4 = sext i8 %v3 to i64
     25   %v5 = shl i64 %a1, 32
     26   %v6 = ashr exact i64 %v5, 32
     27   %v7 = mul nsw i64 %v6, %v4
     28   ret i64 %v7
     29 }
     30 
     31 ; CHECK-LABEL: mul_3
     32 ; CHECK: r[[REG30:[0-9]+]] = sxth(r2)
     33 ; CHECK: r1:0 = mpy(r[[REG30]],r0)
     34 ; CHECK: jumpr r31
     35 define i64 @mul_3(i64 %a0, i64 %a1) #0 {
     36 b2:
     37   %v3 = shl i64 %a0, 32
     38   %v4 = ashr exact i64 %v3, 32
     39   %v5 = shl i64 %a1, 48
     40   %v6 = ashr exact i64 %v5, 48
     41   %v7 = mul nsw i64 %v6, %v4
     42   ret i64 %v7
     43 }
     44 
     45 ; CHECK-LABEL: mul_4
     46 ; CHECK: r[[REG40:[0-9]+]] = asrh(r2)
     47 ; CHECK: r1:0 = mpy(r1,r[[REG40]])
     48 ; CHECK: jumpr r31
     49 define i64 @mul_4(i64 %a0, i64 %a1) #0 {
     50 b2:
     51   %v3 = ashr i64 %a0, 32
     52   %v4 = trunc i64 %a1 to i32
     53   %v5 = ashr i32 %v4, 16
     54   %v6 = sext i32 %v5 to i64
     55   %v7 = mul nsw i64 %v3, %v6
     56   ret i64 %v7
     57 }
     58 
     59 ; CHECK-LABEL: mul_acc_1
     60 ; CHECK: r5:4 += mpy(r2,r0)
     61 ; CHECK: r1:0 = combine(r5,r4)
     62 ; CHECK: jumpr r31
     63 define i64 @mul_acc_1(i64 %a0, i64 %a1, i64 %a2) #0 {
     64 b3:
     65   %v4 = shl i64 %a0, 32
     66   %v5 = ashr exact i64 %v4, 32
     67   %v6 = shl i64 %a1, 32
     68   %v7 = ashr exact i64 %v6, 32
     69   %v8 = mul nsw i64 %v7, %v5
     70   %v9 = add i64 %a2, %v8
     71   ret i64 %v9
     72 }
     73 
     74 ; CHECK-LABEL: mul_acc_2
     75 ; CHECK: r2 = memw(r2+#0)
     76 ; CHECK: r5:4 += mpy(r2,r0)
     77 ; CHECK: r1:0 = combine(r5,r4)
     78 ; CHECK: jumpr r31
     79 define i64 @mul_acc_2(i64 %a0, i32* %a1, i64 %a2) #0 {
     80 b3:
     81   %v4 = shl i64 %a0, 32
     82   %v5 = ashr exact i64 %v4, 32
     83   %v6 = load i32, i32* %a1
     84   %v7 = sext i32 %v6 to i64
     85   %v8 = mul nsw i64 %v7, %v5
     86   %v9 = add i64 %a2, %v8
     87   ret i64 %v9
     88 }
     89 
     90 ; CHECK-LABEL: mul_nac_1
     91 ; CHECK: r5:4 -= mpy(r2,r0)
     92 ; CHECK: r1:0 = combine(r5,r4)
     93 ; CHECK: jumpr r31
     94 define i64 @mul_nac_1(i64 %a0, i64 %a1, i64 %a2) #0 {
     95 b3:
     96   %v4 = shl i64 %a0, 32
     97   %v5 = ashr exact i64 %v4, 32
     98   %v6 = shl i64 %a1, 32
     99   %v7 = ashr exact i64 %v6, 32
    100   %v8 = mul nsw i64 %v7, %v5
    101   %v9 = sub i64 %a2, %v8
    102   ret i64 %v9
    103 }
    104 
    105 ; CHECK-LABEL: mul_nac_2
    106 ; CHECK: r1:0 = combine(r5,r4)
    107 ; CHECK: r6 = memw(r0+#0)
    108 ; CHECK: r1:0 -= mpy(r2,r6)
    109 ; CHECK: jumpr r31
    110 define i64 @mul_nac_2(i32* %a0, i64 %a1, i64 %a2) #0 {
    111 b3:
    112   %v4 = load i32, i32* %a0
    113   %v5 = sext i32 %v4 to i64
    114   %v6 = shl i64 %a1, 32
    115   %v7 = ashr exact i64 %v6, 32
    116   %v8 = mul nsw i64 %v7, %v5
    117   %v9 = sub i64 %a2, %v8
    118   ret i64 %v9
    119 }
    120 
    121 attributes #0 = { nounwind }
    122