1; Test the MSA floating point to integer intrinsics that are encoded with the 2; 2RF instruction format. This includes conversions but other instructions such 3; as fclass are also here. 4 5; RUN: llc -march=mips -mattr=+msa,+fp64 < %s | FileCheck %s 6; RUN: llc -march=mipsel -mattr=+msa,+fp64 < %s | FileCheck %s 7 8@llvm_mips_fclass_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16 9@llvm_mips_fclass_w_RES = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16 10 11define void @llvm_mips_fclass_w_test() nounwind { 12entry: 13 %0 = load <4 x float>, <4 x float>* @llvm_mips_fclass_w_ARG1 14 %1 = tail call <4 x i32> @llvm.mips.fclass.w(<4 x float> %0) 15 store <4 x i32> %1, <4 x i32>* @llvm_mips_fclass_w_RES 16 ret void 17} 18 19declare <4 x i32> @llvm.mips.fclass.w(<4 x float>) nounwind 20 21; CHECK: llvm_mips_fclass_w_test: 22; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_fclass_w_ARG1) 23; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]]) 24; CHECK-DAG: fclass.w [[WD:\$w[0-9]+]], [[WS]] 25; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_fclass_w_RES) 26; CHECK-DAG: st.w [[WD]], 0([[R2]]) 27; CHECK: .size llvm_mips_fclass_w_test 28; 29@llvm_mips_fclass_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16 30@llvm_mips_fclass_d_RES = global <2 x i64> <i64 0, i64 0>, align 16 31 32define void @llvm_mips_fclass_d_test() nounwind { 33entry: 34 %0 = load <2 x double>, <2 x double>* @llvm_mips_fclass_d_ARG1 35 %1 = tail call <2 x i64> @llvm.mips.fclass.d(<2 x double> %0) 36 store <2 x i64> %1, <2 x i64>* @llvm_mips_fclass_d_RES 37 ret void 38} 39 40declare <2 x i64> @llvm.mips.fclass.d(<2 x double>) nounwind 41 42; CHECK: llvm_mips_fclass_d_test: 43; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_fclass_d_ARG1) 44; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]]) 45; CHECK-DAG: fclass.d [[WD:\$w[0-9]+]], [[WS]] 46; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_fclass_d_RES) 47; CHECK-DAG: st.d [[WD]], 0([[R2]]) 48; CHECK: .size llvm_mips_fclass_d_test 49; 50@llvm_mips_ftrunc_s_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16 51@llvm_mips_ftrunc_s_w_RES = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16 52 53define void @llvm_mips_ftrunc_s_w_test() nounwind { 54entry: 55 %0 = load <4 x float>, <4 x float>* @llvm_mips_ftrunc_s_w_ARG1 56 %1 = tail call <4 x i32> @llvm.mips.ftrunc.s.w(<4 x float> %0) 57 store <4 x i32> %1, <4 x i32>* @llvm_mips_ftrunc_s_w_RES 58 ret void 59} 60 61declare <4 x i32> @llvm.mips.ftrunc.s.w(<4 x float>) nounwind 62 63; CHECK: llvm_mips_ftrunc_s_w_test: 64; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ftrunc_s_w_ARG1) 65; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]]) 66; CHECK-DAG: ftrunc_s.w [[WD:\$w[0-9]+]], [[WS]] 67; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ftrunc_s_w_RES) 68; CHECK-DAG: st.w [[WD]], 0([[R2]]) 69; CHECK: .size llvm_mips_ftrunc_s_w_test 70; 71@llvm_mips_ftrunc_s_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16 72@llvm_mips_ftrunc_s_d_RES = global <2 x i64> <i64 0, i64 0>, align 16 73 74define void @llvm_mips_ftrunc_s_d_test() nounwind { 75entry: 76 %0 = load <2 x double>, <2 x double>* @llvm_mips_ftrunc_s_d_ARG1 77 %1 = tail call <2 x i64> @llvm.mips.ftrunc.s.d(<2 x double> %0) 78 store <2 x i64> %1, <2 x i64>* @llvm_mips_ftrunc_s_d_RES 79 ret void 80} 81 82declare <2 x i64> @llvm.mips.ftrunc.s.d(<2 x double>) nounwind 83 84; CHECK: llvm_mips_ftrunc_s_d_test: 85; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ftrunc_s_d_ARG1) 86; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]]) 87; CHECK-DAG: ftrunc_s.d [[WD:\$w[0-9]+]], [[WS]] 88; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ftrunc_s_d_RES) 89; CHECK-DAG: st.d [[WD]], 0([[R2]]) 90; CHECK: .size llvm_mips_ftrunc_s_d_test 91; 92@llvm_mips_ftrunc_u_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16 93@llvm_mips_ftrunc_u_w_RES = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16 94 95define void @llvm_mips_ftrunc_u_w_test() nounwind { 96entry: 97 %0 = load <4 x float>, <4 x float>* @llvm_mips_ftrunc_u_w_ARG1 98 %1 = tail call <4 x i32> @llvm.mips.ftrunc.u.w(<4 x float> %0) 99 store <4 x i32> %1, <4 x i32>* @llvm_mips_ftrunc_u_w_RES 100 ret void 101} 102 103declare <4 x i32> @llvm.mips.ftrunc.u.w(<4 x float>) nounwind 104 105; CHECK: llvm_mips_ftrunc_u_w_test: 106; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ftrunc_u_w_ARG1) 107; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]]) 108; CHECK-DAG: ftrunc_u.w [[WD:\$w[0-9]+]], [[WS]] 109; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ftrunc_u_w_RES) 110; CHECK-DAG: st.w [[WD]], 0([[R2]]) 111; CHECK: .size llvm_mips_ftrunc_u_w_test 112; 113@llvm_mips_ftrunc_u_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16 114@llvm_mips_ftrunc_u_d_RES = global <2 x i64> <i64 0, i64 0>, align 16 115 116define void @llvm_mips_ftrunc_u_d_test() nounwind { 117entry: 118 %0 = load <2 x double>, <2 x double>* @llvm_mips_ftrunc_u_d_ARG1 119 %1 = tail call <2 x i64> @llvm.mips.ftrunc.u.d(<2 x double> %0) 120 store <2 x i64> %1, <2 x i64>* @llvm_mips_ftrunc_u_d_RES 121 ret void 122} 123 124declare <2 x i64> @llvm.mips.ftrunc.u.d(<2 x double>) nounwind 125 126; CHECK: llvm_mips_ftrunc_u_d_test: 127; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ftrunc_u_d_ARG1) 128; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]]) 129; CHECK-DAG: ftrunc_u.d [[WD:\$w[0-9]+]], [[WS]] 130; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ftrunc_u_d_RES) 131; CHECK-DAG: st.d [[WD]], 0([[R2]]) 132; CHECK: .size llvm_mips_ftrunc_u_d_test 133; 134@llvm_mips_ftint_s_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16 135@llvm_mips_ftint_s_w_RES = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16 136 137define void @llvm_mips_ftint_s_w_test() nounwind { 138entry: 139 %0 = load <4 x float>, <4 x float>* @llvm_mips_ftint_s_w_ARG1 140 %1 = tail call <4 x i32> @llvm.mips.ftint.s.w(<4 x float> %0) 141 store <4 x i32> %1, <4 x i32>* @llvm_mips_ftint_s_w_RES 142 ret void 143} 144 145declare <4 x i32> @llvm.mips.ftint.s.w(<4 x float>) nounwind 146 147; CHECK: llvm_mips_ftint_s_w_test: 148; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ftint_s_w_ARG1) 149; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]]) 150; CHECK-DAG: ftint_s.w [[WD:\$w[0-9]+]], [[WS]] 151; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ftint_s_w_RES) 152; CHECK-DAG: st.w [[WD]], 0([[R2]]) 153; CHECK: .size llvm_mips_ftint_s_w_test 154; 155@llvm_mips_ftint_s_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16 156@llvm_mips_ftint_s_d_RES = global <2 x i64> <i64 0, i64 0>, align 16 157 158define void @llvm_mips_ftint_s_d_test() nounwind { 159entry: 160 %0 = load <2 x double>, <2 x double>* @llvm_mips_ftint_s_d_ARG1 161 %1 = tail call <2 x i64> @llvm.mips.ftint.s.d(<2 x double> %0) 162 store <2 x i64> %1, <2 x i64>* @llvm_mips_ftint_s_d_RES 163 ret void 164} 165 166declare <2 x i64> @llvm.mips.ftint.s.d(<2 x double>) nounwind 167 168; CHECK: llvm_mips_ftint_s_d_test: 169; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ftint_s_d_ARG1) 170; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]]) 171; CHECK-DAG: ftint_s.d [[WD:\$w[0-9]+]], [[WS]] 172; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ftint_s_d_RES) 173; CHECK-DAG: st.d [[WD]], 0([[R2]]) 174; CHECK: .size llvm_mips_ftint_s_d_test 175; 176@llvm_mips_ftint_u_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16 177@llvm_mips_ftint_u_w_RES = global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 16 178 179define void @llvm_mips_ftint_u_w_test() nounwind { 180entry: 181 %0 = load <4 x float>, <4 x float>* @llvm_mips_ftint_u_w_ARG1 182 %1 = tail call <4 x i32> @llvm.mips.ftint.u.w(<4 x float> %0) 183 store <4 x i32> %1, <4 x i32>* @llvm_mips_ftint_u_w_RES 184 ret void 185} 186 187declare <4 x i32> @llvm.mips.ftint.u.w(<4 x float>) nounwind 188 189; CHECK: llvm_mips_ftint_u_w_test: 190; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ftint_u_w_ARG1) 191; CHECK-DAG: ld.w [[WS:\$w[0-9]+]], 0([[R1]]) 192; CHECK-DAG: ftint_u.w [[WD:\$w[0-9]+]], [[WS]] 193; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ftint_u_w_RES) 194; CHECK-DAG: st.w [[WD]], 0([[R2]]) 195; CHECK: .size llvm_mips_ftint_u_w_test 196; 197@llvm_mips_ftint_u_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16 198@llvm_mips_ftint_u_d_RES = global <2 x i64> <i64 0, i64 0>, align 16 199 200define void @llvm_mips_ftint_u_d_test() nounwind { 201entry: 202 %0 = load <2 x double>, <2 x double>* @llvm_mips_ftint_u_d_ARG1 203 %1 = tail call <2 x i64> @llvm.mips.ftint.u.d(<2 x double> %0) 204 store <2 x i64> %1, <2 x i64>* @llvm_mips_ftint_u_d_RES 205 ret void 206} 207 208declare <2 x i64> @llvm.mips.ftint.u.d(<2 x double>) nounwind 209 210; CHECK: llvm_mips_ftint_u_d_test: 211; CHECK-DAG: lw [[R1:\$[0-9]+]], %got(llvm_mips_ftint_u_d_ARG1) 212; CHECK-DAG: ld.d [[WS:\$w[0-9]+]], 0([[R1]]) 213; CHECK-DAG: ftint_u.d [[WD:\$w[0-9]+]], [[WS]] 214; CHECK-DAG: lw [[R2:\$[0-9]+]], %got(llvm_mips_ftint_u_d_RES) 215; CHECK-DAG: st.d [[WD]], 0([[R2]]) 216; CHECK: .size llvm_mips_ftint_u_d_test 217; 218