Home | History | Annotate | Download | only in SystemZ
      1 ; Test high-part i32->i64 multiplications.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      4 
      5 ; We don't provide *MUL_LOHI or MULH* for the patterns in this file,
      6 ; but they should at least still work.
      7 
      8 ; Check zero-extended multiplication in which only the high part is used.
      9 define i32 @f1(i32 %a, i32 %b) {
     10 ; CHECK-LABEL: f1:
     11 ; CHECK: msgr
     12 ; CHECK: br %r14
     13   %ax = zext i32 %a to i64
     14   %bx = zext i32 %b to i64
     15   %mulx = mul i64 %ax, %bx
     16   %highx = lshr i64 %mulx, 32
     17   %high = trunc i64 %highx to i32
     18   ret i32 %high
     19 }
     20 
     21 ; Check sign-extended multiplication in which only the high part is used.
     22 define i32 @f2(i32 %a, i32 %b) {
     23 ; CHECK-LABEL: f2:
     24 ; CHECK: msgfr
     25 ; CHECK: br %r14
     26   %ax = sext i32 %a to i64
     27   %bx = sext i32 %b to i64
     28   %mulx = mul i64 %ax, %bx
     29   %highx = lshr i64 %mulx, 32
     30   %high = trunc i64 %highx to i32
     31   ret i32 %high
     32 }
     33 
     34 ; Check zero-extended multiplication in which the result is split into
     35 ; high and low halves.
     36 define i32 @f3(i32 %a, i32 %b) {
     37 ; CHECK-LABEL: f3:
     38 ; CHECK: msgr
     39 ; CHECK: br %r14
     40   %ax = zext i32 %a to i64
     41   %bx = zext i32 %b to i64
     42   %mulx = mul i64 %ax, %bx
     43   %highx = lshr i64 %mulx, 32
     44   %high = trunc i64 %highx to i32
     45   %low = trunc i64 %mulx to i32
     46   %or = or i32 %high, %low
     47   ret i32 %or
     48 }
     49 
     50 ; Check sign-extended multiplication in which the result is split into
     51 ; high and low halves.
     52 define i32 @f4(i32 %a, i32 %b) {
     53 ; CHECK-LABEL: f4:
     54 ; CHECK: msgfr
     55 ; CHECK: br %r14
     56   %ax = sext i32 %a to i64
     57   %bx = sext i32 %b to i64
     58   %mulx = mul i64 %ax, %bx
     59   %highx = lshr i64 %mulx, 32
     60   %high = trunc i64 %highx to i32
     61   %low = trunc i64 %mulx to i32
     62   %or = or i32 %high, %low
     63   ret i32 %or
     64 }
     65