|
| 1 | +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 |
| 2 | +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library %s \ |
| 3 | +// RUN: -emit-llvm -disable-llvm-passes -o - | \ |
| 4 | +// RUN: FileCheck %s --check-prefixes=CHECK |
| 5 | + |
| 6 | + |
| 7 | +// CHECK-LABEL: define noundef <2 x i32> @_Z20test_AddUint64_uint2Dv2_jS_( |
| 8 | +// CHECK-SAME: <2 x i32> noundef [[A:%.*]], <2 x i32> noundef [[B:%.*]]) #[[ATTR0:[0-9]+]] { |
| 9 | +// CHECK-NEXT: [[ENTRY:.*:]] |
| 10 | +// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <2 x i32>, align 8 |
| 11 | +// CHECK-NEXT: [[B_ADDR:%.*]] = alloca <2 x i32>, align 8 |
| 12 | +// CHECK-NEXT: store <2 x i32> [[A]], ptr [[A_ADDR]], align 8 |
| 13 | +// CHECK-NEXT: store <2 x i32> [[B]], ptr [[B_ADDR]], align 8 |
| 14 | +// CHECK-NEXT: [[TMP0:%.*]] = load <2 x i32>, ptr [[A_ADDR]], align 8 |
| 15 | +// CHECK-NEXT: [[TMP1:%.*]] = load <2 x i32>, ptr [[B_ADDR]], align 8 |
| 16 | +// CHECK-NEXT: [[LOWA:%.*]] = extractelement <2 x i32> [[TMP0]], i64 0 |
| 17 | +// CHECK-NEXT: [[HIGHA:%.*]] = extractelement <2 x i32> [[TMP0]], i64 1 |
| 18 | +// CHECK-NEXT: [[LOWB:%.*]] = extractelement <2 x i32> [[TMP1]], i64 0 |
| 19 | +// CHECK-NEXT: [[HIGHB:%.*]] = extractelement <2 x i32> [[TMP1]], i64 1 |
| 20 | +// CHECK-NEXT: [[TMP2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[LOWA]], i32 [[LOWB]]) |
| 21 | +// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1 |
| 22 | +// CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0 |
| 23 | +// CHECK-NEXT: [[CARRYZEXT:%.*]] = zext i1 [[TMP3]] to i32 |
| 24 | +// CHECK-NEXT: [[HIGHSUM:%.*]] = add i32 [[HIGHA]], [[HIGHB]] |
| 25 | +// CHECK-NEXT: [[HIGHSUMPLUSCARRY:%.*]] = add i32 [[HIGHSUM]], [[CARRYZEXT]] |
| 26 | +// CHECK-NEXT: [[HLSL_ADDUINT64_UPTO0:%.*]] = insertelement <2 x i32> poison, i32 [[TMP4]], i64 0 |
| 27 | +// CHECK-NEXT: [[HLSL_ADDUINT64:%.*]] = insertelement <2 x i32> [[HLSL_ADDUINT64_UPTO0]], i32 [[HIGHSUMPLUSCARRY]], i64 1 |
| 28 | +// CHECK-NEXT: ret <2 x i32> [[HLSL_ADDUINT64]] |
| 29 | +// |
| 30 | +uint2 test_AddUint64_uint2(uint2 a, uint2 b) { |
| 31 | + return AddUint64(a, b); |
| 32 | +} |
| 33 | + |
| 34 | +// CHECK-LABEL: define noundef <4 x i32> @_Z20test_AddUint64_uint4Dv4_jS_( |
| 35 | +// CHECK-SAME: <4 x i32> noundef [[A:%.*]], <4 x i32> noundef [[B:%.*]]) #[[ATTR0]] { |
| 36 | +// CHECK-NEXT: [[ENTRY:.*:]] |
| 37 | +// CHECK-NEXT: [[A_ADDR:%.*]] = alloca <4 x i32>, align 16 |
| 38 | +// CHECK-NEXT: [[B_ADDR:%.*]] = alloca <4 x i32>, align 16 |
| 39 | +// CHECK-NEXT: store <4 x i32> [[A]], ptr [[A_ADDR]], align 16 |
| 40 | +// CHECK-NEXT: store <4 x i32> [[B]], ptr [[B_ADDR]], align 16 |
| 41 | +// CHECK-NEXT: [[TMP0:%.*]] = load <4 x i32>, ptr [[A_ADDR]], align 16 |
| 42 | +// CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[B_ADDR]], align 16 |
| 43 | +// CHECK-NEXT: [[LOWA:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> poison, <2 x i32> <i32 0, i32 2> |
| 44 | +// CHECK-NEXT: [[HIGHA:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> poison, <2 x i32> <i32 1, i32 3> |
| 45 | +// CHECK-NEXT: [[LOWB:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <2 x i32> <i32 0, i32 2> |
| 46 | +// CHECK-NEXT: [[HIGHB:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <2 x i32> <i32 1, i32 3> |
| 47 | +// CHECK-NEXT: [[TMP2:%.*]] = call { <2 x i32>, <2 x i1> } @llvm.uadd.with.overflow.v2i32(<2 x i32> [[LOWA]], <2 x i32> [[LOWB]]) |
| 48 | +// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { <2 x i32>, <2 x i1> } [[TMP2]], 1 |
| 49 | +// CHECK-NEXT: [[TMP4:%.*]] = extractvalue { <2 x i32>, <2 x i1> } [[TMP2]], 0 |
| 50 | +// CHECK-NEXT: [[CARRYZEXT:%.*]] = zext <2 x i1> [[TMP3]] to <2 x i32> |
| 51 | +// CHECK-NEXT: [[HIGHSUM:%.*]] = add <2 x i32> [[HIGHA]], [[HIGHB]] |
| 52 | +// CHECK-NEXT: [[HIGHSUMPLUSCARRY:%.*]] = add <2 x i32> [[HIGHSUM]], [[CARRYZEXT]] |
| 53 | +// CHECK-NEXT: [[HLSL_ADDUINT64:%.*]] = shufflevector <2 x i32> [[TMP4]], <2 x i32> [[HIGHSUMPLUSCARRY]], <4 x i32> <i32 0, i32 2, i32 1, i32 3> |
| 54 | +// CHECK-NEXT: ret <4 x i32> [[HLSL_ADDUINT64]] |
| 55 | +// |
| 56 | +uint4 test_AddUint64_uint4(uint4 a, uint4 b) { |
| 57 | + return AddUint64(a, b); |
| 58 | +} |
0 commit comments