143 lines · plain
1; RUN: not llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_KHR_bfloat16 %s -o %t.spvt 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR2; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bfloat16_arithmetic,+SPV_KHR_bfloat16 %s -o - | FileCheck %s3; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_bfloat16_arithmetic,+SPV_KHR_bfloat16 %s -o - -filetype=obj | spirv-val %}4 5; CHECK-ERROR: LLVM ERROR: Arithmetic instructions with bfloat16 arguments require the following SPIR-V extension: SPV_INTEL_bfloat16_arithmetic6 7; CHECK-DAG: OpCapability BFloat16TypeKHR8; CHECK-DAG: OpCapability BFloat16ArithmeticINTEL9; CHECK-DAG: OpExtension "SPV_KHR_bfloat16"10; CHECK-DAG: OpExtension "SPV_INTEL_bfloat16_arithmetic"11; CHECK-DAG: OpName [[NEG:%.*]] "neg"12; CHECK-DAG: OpName [[NEGV:%.*]] "negv"13; CHECK-DAG: OpName [[ADD:%.*]] "add"14; CHECK-DAG: OpName [[ADDV:%.*]] "addv"15; CHECK-DAG: OpName [[SUB:%.*]] "sub"16; CHECK-DAG: OpName [[SUBV:%.*]] "subv"17; CHECK-DAG: OpName [[MUL:%.*]] "mul"18; CHECK-DAG: OpName [[MULV:%.*]] "mulv"19; CHECK-DAG: OpName [[DIV:%.*]] "div"20; CHECK-DAG: OpName [[DIVV:%.*]] "divv"21; CHECK-DAG: OpName [[REM:%.*]] "rem"22; CHECK-DAG: OpName [[REMV:%.*]] "remv"23; CHECK: [[BFLOAT:%.*]] = OpTypeFloat 16 024; CHECK: [[BFLOATV:%.*]] = OpTypeVector [[BFLOAT]] 425 26; CHECK-DAG: [[NEG]] = OpFunction [[BFLOAT]]27; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOAT]]28; CHECK-DAG: [[R:%.*]] = OpFNegate [[BFLOAT]] [[X]]29define spir_func bfloat @neg(bfloat %x) {30entry:31 %r = fneg bfloat %x32 ret bfloat %r33}34 35; CHECK-DAG: [[NEGV]] = OpFunction [[BFLOATV]]36; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOATV]]37; CHECK-DAG: [[R:%.*]] = OpFNegate [[BFLOATV]] [[X]]38define spir_func <4 x bfloat> @negv(<4 x bfloat> %x) {39entry:40 %r = fneg <4 x bfloat> %x41 ret <4 x bfloat> %r42}43 44; CHECK-DAG: [[ADD]] = OpFunction [[BFLOAT]]45; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOAT]]46; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOAT]]47; CHECK-DAG: [[R:%.*]] = OpFAdd [[BFLOAT]] [[X]] [[Y]]48define spir_func bfloat @add(bfloat %x, bfloat %y) {49entry:50 %r = fadd bfloat %x, %y51 ret bfloat %r52}53 54; CHECK-DAG: [[ADDV]] = OpFunction [[BFLOATV]]55; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOATV]]56; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOATV]]57; CHECK-DAG: [[R:%.*]] = OpFAdd [[BFLOATV]] [[X]] [[Y]]58define spir_func <4 x bfloat> @addv(<4 x bfloat> %x, <4 x bfloat> %y) {59entry:60 %r = fadd <4 x bfloat> %x, %y61 ret <4 x bfloat> %r62}63 64; CHECK-DAG: [[SUB]] = OpFunction [[BFLOAT]]65; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOAT]]66; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOAT]]67; CHECK-DAG: [[R:%.*]] = OpFSub [[BFLOAT]] [[X]] [[Y]]68define spir_func bfloat @sub(bfloat %x, bfloat %y) {69entry:70 %r = fsub bfloat %x, %y71 ret bfloat %r72}73 74; CHECK-DAG: [[SUBV]] = OpFunction [[BFLOATV]]75; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOATV]]76; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOATV]]77; CHECK-DAG: [[R:%.*]] = OpFSub [[BFLOATV]] [[X]] [[Y]]78define spir_func <4 x bfloat> @subv(<4 x bfloat> %x, <4 x bfloat> %y) {79entry:80 %r = fsub <4 x bfloat> %x, %y81 ret <4 x bfloat> %r82}83 84; CHECK-DAG: [[MUL]] = OpFunction [[BFLOAT]]85; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOAT]]86; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOAT]]87; CHECK-DAG: [[R:%.*]] = OpFMul [[BFLOAT]] [[X]] [[Y]]88define spir_func bfloat @mul(bfloat %x, bfloat %y) {89entry:90 %r = fmul bfloat %x, %y91 ret bfloat %r92}93 94; CHECK-DAG: [[MULV]] = OpFunction [[BFLOATV]]95; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOATV]]96; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOATV]]97; CHECK-DAG: [[R:%.*]] = OpFMul [[BFLOATV]] [[X]] [[Y]]98define spir_func <4 x bfloat> @mulv(<4 x bfloat> %x, <4 x bfloat> %y) {99entry:100 %r = fmul <4 x bfloat> %x, %y101 ret <4 x bfloat> %r102}103 104; CHECK-DAG: [[DIV]] = OpFunction [[BFLOAT]]105; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOAT]]106; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOAT]]107; CHECK-DAG: [[R:%.*]] = OpFDiv [[BFLOAT]] [[X]] [[Y]]108define spir_func bfloat @div(bfloat %x, bfloat %y) {109entry:110 %r = fdiv bfloat %x, %y111 ret bfloat %r112}113 114; CHECK-DAG: [[DIVV]] = OpFunction [[BFLOATV]]115; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOATV]]116; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOATV]]117; CHECK-DAG: [[R:%.*]] = OpFDiv [[BFLOATV]] [[X]] [[Y]]118define spir_func <4 x bfloat> @divv(<4 x bfloat> %x, <4 x bfloat> %y) {119entry:120 %r = fdiv <4 x bfloat> %x, %y121 ret <4 x bfloat> %r122}123 124; CHECK-DAG: [[REM]] = OpFunction [[BFLOAT]]125; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOAT]]126; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOAT]]127; CHECK-DAG: [[R:%.*]] = OpFRem [[BFLOAT]] [[X]] [[Y]]128define spir_func bfloat @rem(bfloat %x, bfloat %y) {129entry:130 %r = frem bfloat %x, %y131 ret bfloat %r132}133 134; CHECK-DAG: [[REMV]] = OpFunction [[BFLOATV]]135; CHECK: [[X:%.*]] = OpFunctionParameter [[BFLOATV]]136; CHECK: [[Y:%.*]] = OpFunctionParameter [[BFLOATV]]137; CHECK-DAG: [[R:%.*]] = OpFRem [[BFLOATV]] [[X]] [[Y]]138define spir_func <4 x bfloat> @remv(<4 x bfloat> %x, <4 x bfloat> %y) {139entry:140 %r = frem <4 x bfloat> %x, %y141 ret <4 x bfloat> %r142}143