| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py | |
| // REQUIRES: powerpc-registered-target | |
| // RUN: %clang_cc1 -flax-vector-conversions=none -triple powerpc-unknown-unknown \ | |
| // RUN: -target-cpu future -emit-llvm %s -o - | FileCheck %s | |
| // RUN: %clang_cc1 -flax-vector-conversions=none -triple powerpc64le-unknown-unknown \ | |
| // RUN: -target-cpu future -emit-llvm %s -o - | FileCheck %s | |
| // AI Generated. | |
| vector unsigned char vuca, vucb, vucc; | |
| // CHECK-LABEL: @test_xxmulmul( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xxmulmul(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]], i32 3) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xxmulmul() { | |
| return __builtin_xxmulmul(vuca, vucb, 3); | |
| } | |
| // CHECK-LABEL: @test_xxmulmulhiadd( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xxmulmulhiadd(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]], i32 0, i32 1, i32 0) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xxmulmulhiadd() { | |
| return __builtin_xxmulmulhiadd(vuca, vucb, 0, 1, 0); | |
| } | |
| // CHECK-LABEL: @test_xxmulmulloadd( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xxmulmulloadd(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]], i32 1, i32 0) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xxmulmulloadd() { | |
| return __builtin_xxmulmulloadd(vuca, vucb, 1, 0); | |
| } | |
| // CHECK-LABEL: @test_xxssumudm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xxssumudm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]], i32 1) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xxssumudm() { | |
| return __builtin_xxssumudm(vuca, vucb, 1); | |
| } | |
| // CHECK-LABEL: @test_xxssumudmc( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xxssumudmc(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]], i32 0) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xxssumudmc() { | |
| return __builtin_xxssumudmc(vuca, vucb, 0); | |
| } | |
| // CHECK-LABEL: @test_xxssumudmcext( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @vucc, align 16 | |
| // CHECK-NEXT: [[TMP3:%.*]] = call <16 x i8> @llvm.ppc.xxssumudmcext(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]], <16 x i8> [[TMP2]], i32 1) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP3]] | |
| // | |
| vector unsigned char test_xxssumudmcext() { | |
| return __builtin_xxssumudmcext(vuca, vucb, vucc, 1); | |
| } | |
| // CHECK-LABEL: @test_xsaddadduqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsaddadduqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsaddadduqm() { | |
| return __builtin_xsaddadduqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsaddaddsuqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsaddaddsuqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsaddaddsuqm() { | |
| return __builtin_xsaddaddsuqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsaddsubuqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsaddsubuqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsaddsubuqm() { | |
| return __builtin_xsaddsubuqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsaddsubsuqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsaddsubsuqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsaddsubsuqm() { | |
| return __builtin_xsaddsubsuqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsmerge2t1uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsmerge2t1uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsmerge2t1uqm() { | |
| return __builtin_xsmerge2t1uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsmerge2t2uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsmerge2t2uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsmerge2t2uqm() { | |
| return __builtin_xsmerge2t2uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsmerge2t3uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsmerge2t3uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsmerge2t3uqm() { | |
| return __builtin_xsmerge2t3uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsmerge3t1uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsmerge3t1uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsmerge3t1uqm() { | |
| return __builtin_xsmerge3t1uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsrebase2t1uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsrebase2t1uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsrebase2t1uqm() { | |
| return __builtin_xsrebase2t1uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsrebase2t2uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsrebase2t2uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsrebase2t2uqm() { | |
| return __builtin_xsrebase2t2uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsrebase2t3uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsrebase2t3uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsrebase2t3uqm() { | |
| return __builtin_xsrebase2t3uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsrebase2t4uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsrebase2t4uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsrebase2t4uqm() { | |
| return __builtin_xsrebase2t4uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsrebase3t1uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsrebase3t1uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsrebase3t1uqm() { | |
| return __builtin_xsrebase3t1uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsrebase3t2uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsrebase3t2uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsrebase3t2uqm() { | |
| return __builtin_xsrebase3t2uqm(vuca, vucb); | |
| } | |
| // CHECK-LABEL: @test_xsrebase3t3uqm( | |
| // CHECK-NEXT: entry: | |
| // CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr @vuca, align 16 | |
| // CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr @vucb, align 16 | |
| // CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.ppc.xsrebase3t3uqm(<16 x i8> [[TMP0]], <16 x i8> [[TMP1]]) | |
| // CHECK-NEXT: ret <16 x i8> [[TMP2]] | |
| // | |
| vector unsigned char test_xsrebase3t3uqm() { | |
| return __builtin_xsrebase3t3uqm(vuca, vucb); | |
| } |