178 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mattr=+amx-int8 -mattr=+avx512f | FileCheck %s --check-prefix=AVX5123 4@buf = dso_local global [1024 x i8] zeroinitializer, align 165@buf2 = dso_local global [1024 x i8] zeroinitializer, align 166 7define dso_local void @test_api(i32 %cond, i16 signext %row, i16 signext %col) nounwind {8; AVX512-LABEL: test_api:9; AVX512: # %bb.0: # %entry10; AVX512-NEXT: pushq %rbp11; AVX512-NEXT: movq %rsp, %rbp12; AVX512-NEXT: andq $-1024, %rsp # imm = 0xFC0013; AVX512-NEXT: subq $8192, %rsp # imm = 0x200014; AVX512-NEXT: vxorps %xmm0, %xmm0, %xmm015; AVX512-NEXT: vmovups %zmm0, {{[0-9]+}}(%rsp)16; AVX512-NEXT: movb $1, {{[0-9]+}}(%rsp)17; AVX512-NEXT: movw %dx, %ax18; AVX512-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill19; AVX512-NEXT: movw %si, %ax20; AVX512-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill21; AVX512-NEXT: cmpl $0, %edi22; AVX512-NEXT: je .LBB0_223; AVX512-NEXT: # %bb.1: # %if.then24; AVX512-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload25; AVX512-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %cx # 2-byte Reload26; AVX512-NEXT: movl $buf, %esi27; AVX512-NEXT: movl $32, %edi28; AVX512-NEXT: movw $8, %dx29; AVX512-NEXT: # implicit-def: $al30; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)31; AVX512-NEXT: movw %dx, {{[0-9]+}}(%rsp)32; AVX512-NEXT: ldtilecfg {{[0-9]+}}(%rsp)33; AVX512-NEXT: tileloadd (%rsi,%rdi), %tmm034; AVX512-NEXT: movl $64, %edi35; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rsi36; AVX512-NEXT: movw $8, %dx37; AVX512-NEXT: tilestored %tmm0, (%rsi,%rdi)38; AVX512-NEXT: movl $buf, %esi39; AVX512-NEXT: movl $32, %edi40; AVX512-NEXT: movw $8, %dx41; AVX512-NEXT: # implicit-def: $al42; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)43; AVX512-NEXT: movw %cx, {{[0-9]+}}(%rsp)44; AVX512-NEXT: # implicit-def: $dl45; AVX512-NEXT: movb %dl, {{[0-9]+}}(%rsp)46; AVX512-NEXT: movw %cx, {{[0-9]+}}(%rsp)47; AVX512-NEXT: ldtilecfg {{[0-9]+}}(%rsp)48; AVX512-NEXT: tileloadd (%rsi,%rdi), %tmm049; AVX512-NEXT: movl $64, %edi50; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rsi51; AVX512-NEXT: movw $8, %dx52; AVX512-NEXT: tilestored %tmm0, (%rsi,%rdi)53; AVX512-NEXT: movl $buf, %edx54; AVX512-NEXT: movl $32, %esi55; AVX512-NEXT: tileloadd (%rdx,%rsi), %tmm056; AVX512-NEXT: movl $64, %esi57; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rdx58; AVX512-NEXT: tilestored %tmm0, (%rdx,%rsi)59; AVX512-NEXT: jmp .LBB0_360; AVX512-NEXT: .LBB0_2: # %if.else61; AVX512-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload62; AVX512-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %cx # 2-byte Reload63; AVX512-NEXT: movl $buf2, %esi64; AVX512-NEXT: movl $32, %edi65; AVX512-NEXT: movw $8, %dx66; AVX512-NEXT: # implicit-def: $al67; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)68; AVX512-NEXT: movw %dx, {{[0-9]+}}(%rsp)69; AVX512-NEXT: ldtilecfg {{[0-9]+}}(%rsp)70; AVX512-NEXT: tileloadd (%rsi,%rdi), %tmm071; AVX512-NEXT: movl $64, %edi72; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rsi73; AVX512-NEXT: movw $8, %dx74; AVX512-NEXT: tilestored %tmm0, (%rsi,%rdi)75; AVX512-NEXT: movl $buf2, %esi76; AVX512-NEXT: movl $32, %edi77; AVX512-NEXT: movw $8, %dx78; AVX512-NEXT: # implicit-def: $al79; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)80; AVX512-NEXT: movw %cx, {{[0-9]+}}(%rsp)81; AVX512-NEXT: # implicit-def: $dl82; AVX512-NEXT: movb %dl, {{[0-9]+}}(%rsp)83; AVX512-NEXT: movw %cx, {{[0-9]+}}(%rsp)84; AVX512-NEXT: ldtilecfg {{[0-9]+}}(%rsp)85; AVX512-NEXT: tileloadd (%rsi,%rdi), %tmm086; AVX512-NEXT: movl $64, %edi87; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rsi88; AVX512-NEXT: movw $8, %dx89; AVX512-NEXT: tilestored %tmm0, (%rsi,%rdi)90; AVX512-NEXT: movl $buf2, %edx91; AVX512-NEXT: movl $32, %esi92; AVX512-NEXT: tileloadd (%rdx,%rsi), %tmm093; AVX512-NEXT: movl $64, %esi94; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rdx95; AVX512-NEXT: tilestored %tmm0, (%rdx,%rsi)96; AVX512-NEXT: .LBB0_3: # %if.end97; AVX512-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload98; AVX512-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %cx # 2-byte Reload99; AVX512-NEXT: movl $64, %edi100; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rdx101; AVX512-NEXT: movw $8, %si102; AVX512-NEXT: # implicit-def: $al103; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)104; AVX512-NEXT: movw %si, {{[0-9]+}}(%rsp)105; AVX512-NEXT: ldtilecfg {{[0-9]+}}(%rsp)106; AVX512-NEXT: tileloadd (%rdx,%rdi), %tmm0107; AVX512-NEXT: movabsq $64, %rdx108; AVX512-NEXT: tilestored %tmm0, 1024(%rsp,%rdx) # 1024-byte Folded Spill109; AVX512-NEXT: movl $64, %r8d110; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rdi111; AVX512-NEXT: movw $8, %dx112; AVX512-NEXT: # implicit-def: $al113; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)114; AVX512-NEXT: movw %cx, {{[0-9]+}}(%rsp)115; AVX512-NEXT: # implicit-def: $al116; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)117; AVX512-NEXT: movw %cx, {{[0-9]+}}(%rsp)118; AVX512-NEXT: # implicit-def: $al119; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)120; AVX512-NEXT: movw %si, {{[0-9]+}}(%rsp)121; AVX512-NEXT: # implicit-def: $al122; AVX512-NEXT: movb %al, {{[0-9]+}}(%rsp)123; AVX512-NEXT: movw %cx, {{[0-9]+}}(%rsp)124; AVX512-NEXT: # implicit-def: $dl125; AVX512-NEXT: movb %dl, {{[0-9]+}}(%rsp)126; AVX512-NEXT: movw %cx, {{[0-9]+}}(%rsp)127; AVX512-NEXT: ldtilecfg {{[0-9]+}}(%rsp)128; AVX512-NEXT: tileloadd (%rdi,%r8), %tmm2129; AVX512-NEXT: movl $64, %edi130; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rdx131; AVX512-NEXT: tileloadd (%rdx,%rdi), %tmm0132; AVX512-NEXT: movw $8, %dx133; AVX512-NEXT: movabsq $64, %rdi134; AVX512-NEXT: tileloadd 1024(%rsp,%rdi), %tmm1 # 1024-byte Folded Reload135; AVX512-NEXT: tdpbssd %tmm2, %tmm1, %tmm0136; AVX512-NEXT: movl $64, %esi137; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rdx138; AVX512-NEXT: tilestored %tmm0, (%rdx,%rsi)139; AVX512-NEXT: movl $64, %esi140; AVX512-NEXT: leaq {{[0-9]+}}(%rsp), %rdx141; AVX512-NEXT: tileloadd (%rdx,%rsi), %tmm0142; AVX512-NEXT: movl $buf, %edx143; AVX512-NEXT: movl $32, %esi144; AVX512-NEXT: tilestored %tmm0, (%rdx,%rsi)145; AVX512-NEXT: movq %rbp, %rsp146; AVX512-NEXT: popq %rbp147; AVX512-NEXT: tilerelease148; AVX512-NEXT: vzeroupper149; AVX512-NEXT: retq150entry:151 %tobool.not = icmp eq i32 %cond, 0152 br i1 %tobool.not, label %if.else, label %if.then153 154if.then: ; preds = %entry155 %0 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 %row, i16 8, ptr @buf, i64 32)156 %1 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 8, i16 %col, ptr @buf, i64 32)157 %2 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 %row, i16 %col, ptr @buf, i64 32)158 br label %if.end159 160if.else: ; preds = %entry161 %3 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 %row, i16 8, ptr @buf2, i64 32)162 %4 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 8, i16 %col, ptr @buf2, i64 32)163 %5 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 %row, i16 %col, ptr @buf2, i64 32)164 br label %if.end165 166if.end: ; preds = %if.else, %if.then167 %a.sroa.1094.0.in = phi x86_amx [ %3, %if.else ], [ %0, %if.then ]168 %b.sroa.1069.0.in = phi x86_amx [ %4, %if.else ], [ %1, %if.then ]169 %c.sroa.1044.0.in = phi x86_amx [ %5, %if.else ], [ %2, %if.then ]170 %6 = tail call x86_amx @llvm.x86.tdpbssd.internal(i16 %row, i16 %col, i16 8, x86_amx %c.sroa.1044.0.in, x86_amx %a.sroa.1094.0.in, x86_amx %b.sroa.1069.0.in)171 tail call void @llvm.x86.tilestored64.internal(i16 %row, i16 %col, ptr @buf, i64 32, x86_amx %6)172 ret void173}174 175declare x86_amx @llvm.x86.tileloadd64.internal(i16, i16, ptr, i64)176declare x86_amx @llvm.x86.tdpbssd.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)177declare void @llvm.x86.tilestored64.internal(i16, i16, ptr, i64, x86_amx)178