blob: 1a0587e92f0944bc62176311719aba2eb5f26901 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -mcpu=sm_100 -mattr=+ptx93 | FileCheck %s
; RUN: %if ptxas-sm_100 && ptxas-isa-9.3 %{ llc < %s -mcpu=sm_100 -mattr=+ptx93 | %ptxas-verify -arch=sm_100 %}
target triple = "nvptx64-nvidia-cuda"
define i64 @clmad_lo(i64 %a, i64 %b, i64 %c) {
; CHECK-LABEL: clmad_lo(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<5>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param::func.b64 %rd1, [clmad_lo_param_0];
; CHECK-NEXT: ld.param::func.b64 %rd2, [clmad_lo_param_1];
; CHECK-NEXT: ld.param::func.b64 %rd3, [clmad_lo_param_2];
; CHECK-NEXT: clmad.lo.u64 %rd4, %rd1, %rd2, %rd3;
; CHECK-NEXT: st.param::func.b64 [func_retval0], %rd4;
; CHECK-NEXT: ret;
%product = call i64 @llvm.clmul.i64(i64 %a, i64 %b)
%result = xor i64 %product, %c
ret i64 %result
}
define i64 @clmad_hi(i64 %a, i64 %b, i64 %c) {
; CHECK-LABEL: clmad_hi(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<5>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param::func.b64 %rd1, [clmad_hi_param_0];
; CHECK-NEXT: ld.param::func.b64 %rd2, [clmad_hi_param_1];
; CHECK-NEXT: ld.param::func.b64 %rd3, [clmad_hi_param_2];
; CHECK-NEXT: clmad.hi.u64 %rd4, %rd1, %rd2, %rd3;
; CHECK-NEXT: st.param::func.b64 [func_retval0], %rd4;
; CHECK-NEXT: ret;
%a.wide = zext i64 %a to i128
%b.wide = zext i64 %b to i128
%product = call i128 @llvm.clmul.i128(i128 %a.wide, i128 %b.wide)
%shifted = lshr i128 %product, 64
%high = trunc i128 %shifted to i64
%result = xor i64 %high, %c
ret i64 %result
}
define i64 @clmul_lo(i64 %a, i64 %b) {
; CHECK-LABEL: clmul_lo(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param::func.b64 %rd1, [clmul_lo_param_0];
; CHECK-NEXT: ld.param::func.b64 %rd2, [clmul_lo_param_1];
; CHECK-NEXT: clmad.lo.u64 %rd3, %rd1, %rd2, 0;
; CHECK-NEXT: st.param::func.b64 [func_retval0], %rd3;
; CHECK-NEXT: ret;
%product = call i64 @llvm.clmul.i64(i64 %a, i64 %b)
ret i64 %product
}
define i64 @clmul_hi(i64 %a, i64 %b) {
; CHECK-LABEL: clmul_hi(
; CHECK: {
; CHECK-NEXT: .reg .b64 %rd<4>;
; CHECK-EMPTY:
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: ld.param::func.b64 %rd1, [clmul_hi_param_0];
; CHECK-NEXT: ld.param::func.b64 %rd2, [clmul_hi_param_1];
; CHECK-NEXT: clmad.hi.u64 %rd3, %rd1, %rd2, 0;
; CHECK-NEXT: st.param::func.b64 [func_retval0], %rd3;
; CHECK-NEXT: ret;
%a.wide = zext i64 %a to i128
%b.wide = zext i64 %b to i128
%product = call i128 @llvm.clmul.i128(i128 %a.wide, i128 %b.wide)
%shifted = lshr i128 %product, 64
%high = trunc i128 %shifted to i64
ret i64 %high
}
declare i64 @llvm.clmul.i64(i64, i64)
declare i128 @llvm.clmul.i128(i128, i128)