reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -constprop -S | FileCheck %s

;-----------------------------------------------------------------------------
; Simple test using scalar layout.
;-----------------------------------------------------------------------------

declare i32 @llvm.smul.fix.sat.i32(i32, i32, i32)

define i32 @test_smul_fix_sat_i32_0() {
; CHECK-LABEL: @test_smul_fix_sat_i32_0(
; CHECK-NEXT:    ret i32 536870912
;
  %r = call i32 @llvm.smul.fix.sat.i32(i32 1073741824, i32 1073741824, i32 31) ; 0.5 * 0.5
  ret i32 %r
}

;-----------------------------------------------------------------------------
; More extensive tests based on vectors (basically using the scalar fold
; for each index).
;-----------------------------------------------------------------------------

declare <8 x i3> @llvm.smul.fix.sat.v8i3(<8 x i3>, <8 x i3>, i32)

define <8 x i3> @test_smul_fix_sat_v8i3_0() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_0(
; CHECK-NEXT:    ret <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 0, i3 -4, i3 -4, i3 -4>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
  i32 0)
  ret <8 x i3> %r
}

define <8 x i3> @test_smul_fix_sat_v8i3_1() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_1(
; CHECK-NEXT:    ret <8 x i3> <i3 3, i3 3, i3 3, i3 2, i3 0, i3 -2, i3 -4, i3 -4>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
  i32 1)
  ret <8 x i3> %r
}

define <8 x i3> @test_smul_fix_sat_v8i3_2() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_2(
; CHECK-NEXT:    ret <8 x i3> <i3 3, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4, i3 -4>,
  i32 2)
  ret <8 x i3> %r
}

define <8 x i3> @test_smul_fix_sat_v8i3_3() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_3(
; CHECK-NEXT:    ret <8 x i3> <i3 3, i3 3, i3 2, i3 1, i3 0, i3 -1, i3 -2, i3 -3>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
  i32 0)
  ret <8 x i3> %r
}

define <8 x i3> @test_smul_fix_sat_v8i3_4() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_4(
; CHECK-NEXT:    ret <8 x i3> <i3 2, i3 1, i3 1, i3 0, i3 0, i3 -1, i3 -1, i3 -2>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
  i32 1)
  ret <8 x i3> %r
}

define <8 x i3> @test_smul_fix_sat_v8i3_5() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_5(
; CHECK-NEXT:    ret <8 x i3> <i3 1, i3 0, i3 0, i3 0, i3 0, i3 -1, i3 -1, i3 -1>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1, i3 -1>,
  i32 2)
  ret <8 x i3> %r
}

define <8 x i3> @test_smul_fix_sat_v8i3_6() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_6(
; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 -4, i3 -4, i3 -3, i3 0, i3 3, i3 3, i3 3>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
  i32 0)
  ret <8 x i3> %r
}

define <8 x i3> @test_smul_fix_sat_v8i3_7() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_7(
; CHECK-NEXT:    ret <8 x i3> <i3 -4, i3 -4, i3 -3, i3 -2, i3 0, i3 1, i3 3, i3 3>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
  i32 1)
  ret <8 x i3> %r
}

define <8 x i3> @test_smul_fix_sat_v8i3_8() {
; CHECK-LABEL: @test_smul_fix_sat_v8i3_8(
; CHECK-NEXT:    ret <8 x i3> <i3 -3, i3 -3, i3 -2, i3 -1, i3 0, i3 0, i3 1, i3 2>
;
  %r = call <8 x i3> @llvm.smul.fix.sat.v8i3(
  <8 x i3> <i3 -4, i3 -3, i3 -2, i3 -1, i3 0, i3 1, i3 2, i3 3>,
  <8 x i3> <i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3, i3 3>,
  i32 2)
  ret <8 x i3> %r
}