1//===- IntrinsicsPowerPC.td - Defines PowerPC intrinsics ---*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines all of the PowerPC-specific intrinsics. 11// 12//===----------------------------------------------------------------------===// 13 14//===----------------------------------------------------------------------===// 15// Definitions for all PowerPC intrinsics. 16// 17 18// Non-altivec intrinsics. 19let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.". 20 // dcba/dcbf/dcbi/dcbst/dcbt/dcbz/dcbzl(PPC970) instructions. 21 def int_ppc_dcba : Intrinsic<[], [llvm_ptr_ty], []>; 22 def int_ppc_dcbf : Intrinsic<[], [llvm_ptr_ty], []>; 23 def int_ppc_dcbi : Intrinsic<[], [llvm_ptr_ty], []>; 24 def int_ppc_dcbst : Intrinsic<[], [llvm_ptr_ty], []>; 25 def int_ppc_dcbt : Intrinsic<[], [llvm_ptr_ty], 26 [IntrReadWriteArgMem, NoCapture<0>]>; 27 def int_ppc_dcbtst: Intrinsic<[], [llvm_ptr_ty], []>; 28 def int_ppc_dcbz : Intrinsic<[], [llvm_ptr_ty], []>; 29 def int_ppc_dcbzl : Intrinsic<[], [llvm_ptr_ty], []>; 30 31 // sync instruction (i.e. sync 0, a.k.a hwsync) 32 def int_ppc_sync : Intrinsic<[], [], []>; 33 // lwsync is sync 1 34 def int_ppc_lwsync : Intrinsic<[], [], []>; 35 36 // Intrinsics used to generate ctr-based loops. These should only be 37 // generated by the PowerPC backend! 38 def int_ppc_mtctr : Intrinsic<[], [llvm_anyint_ty], []>; 39 def int_ppc_is_decremented_ctr_nonzero : Intrinsic<[llvm_i1_ty], [], []>; 40} 41 42 43let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.". 44 /// PowerPC_Vec_Intrinsic - Base class for all altivec intrinsics. 45 class PowerPC_Vec_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types, 46 list<LLVMType> param_types, 47 list<IntrinsicProperty> properties> 48 : GCCBuiltin<!strconcat("__builtin_altivec_", GCCIntSuffix)>, 49 Intrinsic<ret_types, param_types, properties>; 50 51 /// PowerPC_VSX_Intrinsic - Base class for all VSX intrinsics. 52 class PowerPC_VSX_Intrinsic<string GCCIntSuffix, list<LLVMType> ret_types, 53 list<LLVMType> param_types, 54 list<IntrinsicProperty> properties> 55 : GCCBuiltin<!strconcat("__builtin_vsx_", GCCIntSuffix)>, 56 Intrinsic<ret_types, param_types, properties>; 57} 58 59//===----------------------------------------------------------------------===// 60// PowerPC Altivec Intrinsic Class Definitions. 61// 62 63/// PowerPC_Vec_FF_Intrinsic - A PowerPC intrinsic that takes one v4f32 64/// vector and returns one. These intrinsics have no side effects. 65class PowerPC_Vec_FF_Intrinsic<string GCCIntSuffix> 66 : PowerPC_Vec_Intrinsic<GCCIntSuffix, 67 [llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>; 68 69/// PowerPC_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32 70/// vectors and returns one. These intrinsics have no side effects. 71class PowerPC_Vec_FFF_Intrinsic<string GCCIntSuffix> 72 : PowerPC_Vec_Intrinsic<GCCIntSuffix, 73 [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty], 74 [IntrNoMem]>; 75 76/// PowerPC_Vec_BBB_Intrinsic - A PowerPC intrinsic that takes two v16f8 77/// vectors and returns one. These intrinsics have no side effects. 78class PowerPC_Vec_BBB_Intrinsic<string GCCIntSuffix> 79 : PowerPC_Vec_Intrinsic<GCCIntSuffix, 80 [llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], 81 [IntrNoMem]>; 82 83/// PowerPC_Vec_HHH_Intrinsic - A PowerPC intrinsic that takes two v8i16 84/// vectors and returns one. These intrinsics have no side effects. 85class PowerPC_Vec_HHH_Intrinsic<string GCCIntSuffix> 86 : PowerPC_Vec_Intrinsic<GCCIntSuffix, 87 [llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 88 [IntrNoMem]>; 89 90/// PowerPC_Vec_WWW_Intrinsic - A PowerPC intrinsic that takes two v4i32 91/// vectors and returns one. These intrinsics have no side effects. 92class PowerPC_Vec_WWW_Intrinsic<string GCCIntSuffix> 93 : PowerPC_Vec_Intrinsic<GCCIntSuffix, 94 [llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 95 [IntrNoMem]>; 96 97 98//===----------------------------------------------------------------------===// 99// PowerPC VSX Intrinsic Class Definitions. 100// 101 102/// PowerPC_VSX_Vec_DDD_Intrinsic - A PowerPC intrinsic that takes two v2f64 103/// vectors and returns one. These intrinsics have no side effects. 104class PowerPC_VSX_Vec_DDD_Intrinsic<string GCCIntSuffix> 105 : PowerPC_VSX_Intrinsic<GCCIntSuffix, 106 [llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty], 107 [IntrNoMem]>; 108 109/// PowerPC_VSX_Vec_FFF_Intrinsic - A PowerPC intrinsic that takes two v4f32 110/// vectors and returns one. These intrinsics have no side effects. 111class PowerPC_VSX_Vec_FFF_Intrinsic<string GCCIntSuffix> 112 : PowerPC_VSX_Intrinsic<GCCIntSuffix, 113 [llvm_v4f32_ty], [llvm_v4f32_ty, llvm_v4f32_ty], 114 [IntrNoMem]>; 115 116/// PowerPC_VSX_Sca_DDD_Intrinsic - A PowerPC intrinsic that takes two f64 117/// scalars and returns one. These intrinsics have no side effects. 118class PowerPC_VSX_Sca_DDD_Intrinsic<string GCCIntSuffix> 119 : PowerPC_VSX_Intrinsic<GCCIntSuffix, 120 [llvm_double_ty], [llvm_double_ty, llvm_double_ty], 121 [IntrNoMem]>; 122 123 124//===----------------------------------------------------------------------===// 125// PowerPC Altivec Intrinsic Definitions. 126 127let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.". 128 // Data Stream Control. 129 def int_ppc_altivec_dss : GCCBuiltin<"__builtin_altivec_dss">, 130 Intrinsic<[], [llvm_i32_ty], []>; 131 def int_ppc_altivec_dssall : GCCBuiltin<"__builtin_altivec_dssall">, 132 Intrinsic<[], [], []>; 133 def int_ppc_altivec_dst : GCCBuiltin<"__builtin_altivec_dst">, 134 Intrinsic<[], 135 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], 136 []>; 137 def int_ppc_altivec_dstt : GCCBuiltin<"__builtin_altivec_dstt">, 138 Intrinsic<[], 139 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], 140 []>; 141 def int_ppc_altivec_dstst : GCCBuiltin<"__builtin_altivec_dstst">, 142 Intrinsic<[], 143 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], 144 []>; 145 def int_ppc_altivec_dststt : GCCBuiltin<"__builtin_altivec_dststt">, 146 Intrinsic<[], 147 [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], 148 []>; 149 150 // VSCR access. 151 def int_ppc_altivec_mfvscr : GCCBuiltin<"__builtin_altivec_mfvscr">, 152 Intrinsic<[llvm_v8i16_ty], [], [IntrReadMem]>; 153 def int_ppc_altivec_mtvscr : GCCBuiltin<"__builtin_altivec_mtvscr">, 154 Intrinsic<[], [llvm_v4i32_ty], []>; 155 156 157 // Loads. These don't map directly to GCC builtins because they represent the 158 // source address with a single pointer. 159 def int_ppc_altivec_lvx : 160 Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadArgMem]>; 161 def int_ppc_altivec_lvxl : 162 Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadArgMem]>; 163 def int_ppc_altivec_lvebx : 164 Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrReadArgMem]>; 165 def int_ppc_altivec_lvehx : 166 Intrinsic<[llvm_v8i16_ty], [llvm_ptr_ty], [IntrReadArgMem]>; 167 def int_ppc_altivec_lvewx : 168 Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadArgMem]>; 169 170 // Stores. These don't map directly to GCC builtins because they represent the 171 // source address with a single pointer. 172 def int_ppc_altivec_stvx : 173 Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty], 174 [IntrReadWriteArgMem]>; 175 def int_ppc_altivec_stvxl : 176 Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty], 177 [IntrReadWriteArgMem]>; 178 def int_ppc_altivec_stvebx : 179 Intrinsic<[], [llvm_v16i8_ty, llvm_ptr_ty], 180 [IntrReadWriteArgMem]>; 181 def int_ppc_altivec_stvehx : 182 Intrinsic<[], [llvm_v8i16_ty, llvm_ptr_ty], 183 [IntrReadWriteArgMem]>; 184 def int_ppc_altivec_stvewx : 185 Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty], 186 [IntrReadWriteArgMem]>; 187 188 // Comparisons setting a vector. 189 def int_ppc_altivec_vcmpbfp : GCCBuiltin<"__builtin_altivec_vcmpbfp">, 190 Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty], 191 [IntrNoMem]>; 192 def int_ppc_altivec_vcmpeqfp : GCCBuiltin<"__builtin_altivec_vcmpeqfp">, 193 Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty], 194 [IntrNoMem]>; 195 def int_ppc_altivec_vcmpgefp : GCCBuiltin<"__builtin_altivec_vcmpgefp">, 196 Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty], 197 [IntrNoMem]>; 198 def int_ppc_altivec_vcmpgtfp : GCCBuiltin<"__builtin_altivec_vcmpgtfp">, 199 Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_v4f32_ty], 200 [IntrNoMem]>; 201 202 def int_ppc_altivec_vcmpequw : GCCBuiltin<"__builtin_altivec_vcmpequw">, 203 Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 204 [IntrNoMem]>; 205 def int_ppc_altivec_vcmpgtsw : GCCBuiltin<"__builtin_altivec_vcmpgtsw">, 206 Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 207 [IntrNoMem]>; 208 def int_ppc_altivec_vcmpgtuw : GCCBuiltin<"__builtin_altivec_vcmpgtuw">, 209 Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 210 [IntrNoMem]>; 211 212 def int_ppc_altivec_vcmpequh : GCCBuiltin<"__builtin_altivec_vcmpequh">, 213 Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 214 [IntrNoMem]>; 215 def int_ppc_altivec_vcmpgtsh : GCCBuiltin<"__builtin_altivec_vcmpgtsh">, 216 Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 217 [IntrNoMem]>; 218 def int_ppc_altivec_vcmpgtuh : GCCBuiltin<"__builtin_altivec_vcmpgtuh">, 219 Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 220 [IntrNoMem]>; 221 222 def int_ppc_altivec_vcmpequb : GCCBuiltin<"__builtin_altivec_vcmpequb">, 223 Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], 224 [IntrNoMem]>; 225 def int_ppc_altivec_vcmpgtsb : GCCBuiltin<"__builtin_altivec_vcmpgtsb">, 226 Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], 227 [IntrNoMem]>; 228 def int_ppc_altivec_vcmpgtub : GCCBuiltin<"__builtin_altivec_vcmpgtub">, 229 Intrinsic<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_v16i8_ty], 230 [IntrNoMem]>; 231 232 // Predicate Comparisons. The first operand specifies interpretation of CR6. 233 def int_ppc_altivec_vcmpbfp_p : GCCBuiltin<"__builtin_altivec_vcmpbfp_p">, 234 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty], 235 [IntrNoMem]>; 236 def int_ppc_altivec_vcmpeqfp_p : GCCBuiltin<"__builtin_altivec_vcmpeqfp_p">, 237 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty], 238 [IntrNoMem]>; 239 def int_ppc_altivec_vcmpgefp_p : GCCBuiltin<"__builtin_altivec_vcmpgefp_p">, 240 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty], 241 [IntrNoMem]>; 242 def int_ppc_altivec_vcmpgtfp_p : GCCBuiltin<"__builtin_altivec_vcmpgtfp_p">, 243 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4f32_ty,llvm_v4f32_ty], 244 [IntrNoMem]>; 245 246 def int_ppc_altivec_vcmpequw_p : GCCBuiltin<"__builtin_altivec_vcmpequw_p">, 247 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty], 248 [IntrNoMem]>; 249 def int_ppc_altivec_vcmpgtsw_p : GCCBuiltin<"__builtin_altivec_vcmpgtsw_p">, 250 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty], 251 [IntrNoMem]>; 252 def int_ppc_altivec_vcmpgtuw_p : GCCBuiltin<"__builtin_altivec_vcmpgtuw_p">, 253 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v4i32_ty,llvm_v4i32_ty], 254 [IntrNoMem]>; 255 256 def int_ppc_altivec_vcmpequh_p : GCCBuiltin<"__builtin_altivec_vcmpequh_p">, 257 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty], 258 [IntrNoMem]>; 259 def int_ppc_altivec_vcmpgtsh_p : GCCBuiltin<"__builtin_altivec_vcmpgtsh_p">, 260 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty], 261 [IntrNoMem]>; 262 def int_ppc_altivec_vcmpgtuh_p : GCCBuiltin<"__builtin_altivec_vcmpgtuh_p">, 263 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v8i16_ty,llvm_v8i16_ty], 264 [IntrNoMem]>; 265 266 def int_ppc_altivec_vcmpequb_p : GCCBuiltin<"__builtin_altivec_vcmpequb_p">, 267 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty], 268 [IntrNoMem]>; 269 def int_ppc_altivec_vcmpgtsb_p : GCCBuiltin<"__builtin_altivec_vcmpgtsb_p">, 270 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty], 271 [IntrNoMem]>; 272 def int_ppc_altivec_vcmpgtub_p : GCCBuiltin<"__builtin_altivec_vcmpgtub_p">, 273 Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_v16i8_ty,llvm_v16i8_ty], 274 [IntrNoMem]>; 275} 276 277// Vector average. 278def int_ppc_altivec_vavgsb : PowerPC_Vec_BBB_Intrinsic<"vavgsb">; 279def int_ppc_altivec_vavgsh : PowerPC_Vec_HHH_Intrinsic<"vavgsh">; 280def int_ppc_altivec_vavgsw : PowerPC_Vec_WWW_Intrinsic<"vavgsw">; 281def int_ppc_altivec_vavgub : PowerPC_Vec_BBB_Intrinsic<"vavgub">; 282def int_ppc_altivec_vavguh : PowerPC_Vec_HHH_Intrinsic<"vavguh">; 283def int_ppc_altivec_vavguw : PowerPC_Vec_WWW_Intrinsic<"vavguw">; 284 285// Vector maximum. 286def int_ppc_altivec_vmaxfp : PowerPC_Vec_FFF_Intrinsic<"vmaxfp">; 287def int_ppc_altivec_vmaxsb : PowerPC_Vec_BBB_Intrinsic<"vmaxsb">; 288def int_ppc_altivec_vmaxsh : PowerPC_Vec_HHH_Intrinsic<"vmaxsh">; 289def int_ppc_altivec_vmaxsw : PowerPC_Vec_WWW_Intrinsic<"vmaxsw">; 290def int_ppc_altivec_vmaxub : PowerPC_Vec_BBB_Intrinsic<"vmaxub">; 291def int_ppc_altivec_vmaxuh : PowerPC_Vec_HHH_Intrinsic<"vmaxuh">; 292def int_ppc_altivec_vmaxuw : PowerPC_Vec_WWW_Intrinsic<"vmaxuw">; 293 294// Vector minimum. 295def int_ppc_altivec_vminfp : PowerPC_Vec_FFF_Intrinsic<"vminfp">; 296def int_ppc_altivec_vminsb : PowerPC_Vec_BBB_Intrinsic<"vminsb">; 297def int_ppc_altivec_vminsh : PowerPC_Vec_HHH_Intrinsic<"vminsh">; 298def int_ppc_altivec_vminsw : PowerPC_Vec_WWW_Intrinsic<"vminsw">; 299def int_ppc_altivec_vminub : PowerPC_Vec_BBB_Intrinsic<"vminub">; 300def int_ppc_altivec_vminuh : PowerPC_Vec_HHH_Intrinsic<"vminuh">; 301def int_ppc_altivec_vminuw : PowerPC_Vec_WWW_Intrinsic<"vminuw">; 302 303// Saturating adds. 304def int_ppc_altivec_vaddubs : PowerPC_Vec_BBB_Intrinsic<"vaddubs">; 305def int_ppc_altivec_vaddsbs : PowerPC_Vec_BBB_Intrinsic<"vaddsbs">; 306def int_ppc_altivec_vadduhs : PowerPC_Vec_HHH_Intrinsic<"vadduhs">; 307def int_ppc_altivec_vaddshs : PowerPC_Vec_HHH_Intrinsic<"vaddshs">; 308def int_ppc_altivec_vadduws : PowerPC_Vec_WWW_Intrinsic<"vadduws">; 309def int_ppc_altivec_vaddsws : PowerPC_Vec_WWW_Intrinsic<"vaddsws">; 310def int_ppc_altivec_vaddcuw : PowerPC_Vec_WWW_Intrinsic<"vaddcuw">; 311 312// Saturating subs. 313def int_ppc_altivec_vsububs : PowerPC_Vec_BBB_Intrinsic<"vsububs">; 314def int_ppc_altivec_vsubsbs : PowerPC_Vec_BBB_Intrinsic<"vsubsbs">; 315def int_ppc_altivec_vsubuhs : PowerPC_Vec_HHH_Intrinsic<"vsubuhs">; 316def int_ppc_altivec_vsubshs : PowerPC_Vec_HHH_Intrinsic<"vsubshs">; 317def int_ppc_altivec_vsubuws : PowerPC_Vec_WWW_Intrinsic<"vsubuws">; 318def int_ppc_altivec_vsubsws : PowerPC_Vec_WWW_Intrinsic<"vsubsws">; 319def int_ppc_altivec_vsubcuw : PowerPC_Vec_WWW_Intrinsic<"vsubcuw">; 320 321let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.". 322 // Saturating multiply-adds. 323 def int_ppc_altivec_vmhaddshs : GCCBuiltin<"__builtin_altivec_vmhaddshs">, 324 Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, 325 llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>; 326 def int_ppc_altivec_vmhraddshs : GCCBuiltin<"__builtin_altivec_vmhraddshs">, 327 Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, 328 llvm_v8i16_ty, llvm_v8i16_ty], [IntrNoMem]>; 329 330 def int_ppc_altivec_vmaddfp : GCCBuiltin<"__builtin_altivec_vmaddfp">, 331 Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, 332 llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>; 333 def int_ppc_altivec_vnmsubfp : GCCBuiltin<"__builtin_altivec_vnmsubfp">, 334 Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty, 335 llvm_v4f32_ty, llvm_v4f32_ty], [IntrNoMem]>; 336 337 // Vector Multiply Sum Intructions. 338 def int_ppc_altivec_vmsummbm : GCCBuiltin<"__builtin_altivec_vmsummbm">, 339 Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty, 340 llvm_v4i32_ty], [IntrNoMem]>; 341 def int_ppc_altivec_vmsumshm : GCCBuiltin<"__builtin_altivec_vmsumshm">, 342 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty, 343 llvm_v4i32_ty], [IntrNoMem]>; 344 def int_ppc_altivec_vmsumshs : GCCBuiltin<"__builtin_altivec_vmsumshs">, 345 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty, 346 llvm_v4i32_ty], [IntrNoMem]>; 347 def int_ppc_altivec_vmsumubm : GCCBuiltin<"__builtin_altivec_vmsumubm">, 348 Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v16i8_ty, 349 llvm_v4i32_ty], [IntrNoMem]>; 350 def int_ppc_altivec_vmsumuhm : GCCBuiltin<"__builtin_altivec_vmsumuhm">, 351 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty, 352 llvm_v4i32_ty], [IntrNoMem]>; 353 def int_ppc_altivec_vmsumuhs : GCCBuiltin<"__builtin_altivec_vmsumuhs">, 354 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty, 355 llvm_v4i32_ty], [IntrNoMem]>; 356 357 // Vector Multiply Intructions. 358 def int_ppc_altivec_vmulesb : GCCBuiltin<"__builtin_altivec_vmulesb">, 359 Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty], 360 [IntrNoMem]>; 361 def int_ppc_altivec_vmulesh : GCCBuiltin<"__builtin_altivec_vmulesh">, 362 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 363 [IntrNoMem]>; 364 def int_ppc_altivec_vmuleub : GCCBuiltin<"__builtin_altivec_vmuleub">, 365 Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty], 366 [IntrNoMem]>; 367 def int_ppc_altivec_vmuleuh : GCCBuiltin<"__builtin_altivec_vmuleuh">, 368 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 369 [IntrNoMem]>; 370 371 def int_ppc_altivec_vmulosb : GCCBuiltin<"__builtin_altivec_vmulosb">, 372 Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty], 373 [IntrNoMem]>; 374 def int_ppc_altivec_vmulosh : GCCBuiltin<"__builtin_altivec_vmulosh">, 375 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 376 [IntrNoMem]>; 377 def int_ppc_altivec_vmuloub : GCCBuiltin<"__builtin_altivec_vmuloub">, 378 Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty, llvm_v16i8_ty], 379 [IntrNoMem]>; 380 def int_ppc_altivec_vmulouh : GCCBuiltin<"__builtin_altivec_vmulouh">, 381 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 382 [IntrNoMem]>; 383 384 // Vector Sum Intructions. 385 def int_ppc_altivec_vsumsws : GCCBuiltin<"__builtin_altivec_vsumsws">, 386 Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 387 [IntrNoMem]>; 388 def int_ppc_altivec_vsum2sws : GCCBuiltin<"__builtin_altivec_vsum2sws">, 389 Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 390 [IntrNoMem]>; 391 def int_ppc_altivec_vsum4sbs : GCCBuiltin<"__builtin_altivec_vsum4sbs">, 392 Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty], 393 [IntrNoMem]>; 394 def int_ppc_altivec_vsum4shs : GCCBuiltin<"__builtin_altivec_vsum4shs">, 395 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty, llvm_v4i32_ty], 396 [IntrNoMem]>; 397 def int_ppc_altivec_vsum4ubs : GCCBuiltin<"__builtin_altivec_vsum4ubs">, 398 Intrinsic<[llvm_v4i32_ty], [llvm_v16i8_ty, llvm_v4i32_ty], 399 [IntrNoMem]>; 400 401 // Other multiplies. 402 def int_ppc_altivec_vmladduhm : GCCBuiltin<"__builtin_altivec_vmladduhm">, 403 Intrinsic<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_v8i16_ty, 404 llvm_v8i16_ty], [IntrNoMem]>; 405 406 // Packs. 407 def int_ppc_altivec_vpkpx : GCCBuiltin<"__builtin_altivec_vpkpx">, 408 Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 409 [IntrNoMem]>; 410 def int_ppc_altivec_vpkshss : GCCBuiltin<"__builtin_altivec_vpkshss">, 411 Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 412 [IntrNoMem]>; 413 def int_ppc_altivec_vpkshus : GCCBuiltin<"__builtin_altivec_vpkshus">, 414 Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 415 [IntrNoMem]>; 416 def int_ppc_altivec_vpkswss : GCCBuiltin<"__builtin_altivec_vpkswss">, 417 Intrinsic<[llvm_v16i8_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 418 [IntrNoMem]>; 419 def int_ppc_altivec_vpkswus : GCCBuiltin<"__builtin_altivec_vpkswus">, 420 Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 421 [IntrNoMem]>; 422 // vpkuhum is lowered to a shuffle. 423 def int_ppc_altivec_vpkuhus : GCCBuiltin<"__builtin_altivec_vpkuhus">, 424 Intrinsic<[llvm_v16i8_ty], [llvm_v8i16_ty, llvm_v8i16_ty], 425 [IntrNoMem]>; 426 // vpkuwum is lowered to a shuffle. 427 def int_ppc_altivec_vpkuwus : GCCBuiltin<"__builtin_altivec_vpkuwus">, 428 Intrinsic<[llvm_v8i16_ty], [llvm_v4i32_ty, llvm_v4i32_ty], 429 [IntrNoMem]>; 430 431 // Unpacks. 432 def int_ppc_altivec_vupkhpx : GCCBuiltin<"__builtin_altivec_vupkhpx">, 433 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>; 434 def int_ppc_altivec_vupkhsb : GCCBuiltin<"__builtin_altivec_vupkhsb">, 435 Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>; 436 def int_ppc_altivec_vupkhsh : GCCBuiltin<"__builtin_altivec_vupkhsh">, 437 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>; 438 def int_ppc_altivec_vupklpx : GCCBuiltin<"__builtin_altivec_vupklpx">, 439 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>; 440 def int_ppc_altivec_vupklsb : GCCBuiltin<"__builtin_altivec_vupklsb">, 441 Intrinsic<[llvm_v8i16_ty], [llvm_v16i8_ty], [IntrNoMem]>; 442 def int_ppc_altivec_vupklsh : GCCBuiltin<"__builtin_altivec_vupklsh">, 443 Intrinsic<[llvm_v4i32_ty], [llvm_v8i16_ty], [IntrNoMem]>; 444 445 446 // FP <-> integer conversion. 447 def int_ppc_altivec_vcfsx : GCCBuiltin<"__builtin_altivec_vcfsx">, 448 Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty], 449 [IntrNoMem]>; 450 def int_ppc_altivec_vcfux : GCCBuiltin<"__builtin_altivec_vcfux">, 451 Intrinsic<[llvm_v4f32_ty], [llvm_v4i32_ty, llvm_i32_ty], 452 [IntrNoMem]>; 453 def int_ppc_altivec_vctsxs : GCCBuiltin<"__builtin_altivec_vctsxs">, 454 Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty], 455 [IntrNoMem]>; 456 def int_ppc_altivec_vctuxs : GCCBuiltin<"__builtin_altivec_vctuxs">, 457 Intrinsic<[llvm_v4i32_ty], [llvm_v4f32_ty, llvm_i32_ty], 458 [IntrNoMem]>; 459 460 def int_ppc_altivec_vrfim : GCCBuiltin<"__builtin_altivec_vrfim">, 461 Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>; 462 def int_ppc_altivec_vrfin : GCCBuiltin<"__builtin_altivec_vrfin">, 463 Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>; 464 def int_ppc_altivec_vrfip : GCCBuiltin<"__builtin_altivec_vrfip">, 465 Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>; 466 def int_ppc_altivec_vrfiz : GCCBuiltin<"__builtin_altivec_vrfiz">, 467 Intrinsic<[llvm_v4f32_ty], [llvm_v4f32_ty], [IntrNoMem]>; 468} 469 470def int_ppc_altivec_vsl : PowerPC_Vec_WWW_Intrinsic<"vsl">; 471def int_ppc_altivec_vslo : PowerPC_Vec_WWW_Intrinsic<"vslo">; 472 473def int_ppc_altivec_vslb : PowerPC_Vec_BBB_Intrinsic<"vslb">; 474def int_ppc_altivec_vslh : PowerPC_Vec_HHH_Intrinsic<"vslh">; 475def int_ppc_altivec_vslw : PowerPC_Vec_WWW_Intrinsic<"vslw">; 476 477// Right Shifts. 478def int_ppc_altivec_vsr : PowerPC_Vec_WWW_Intrinsic<"vsr">; 479def int_ppc_altivec_vsro : PowerPC_Vec_WWW_Intrinsic<"vsro">; 480 481def int_ppc_altivec_vsrb : PowerPC_Vec_BBB_Intrinsic<"vsrb">; 482def int_ppc_altivec_vsrh : PowerPC_Vec_HHH_Intrinsic<"vsrh">; 483def int_ppc_altivec_vsrw : PowerPC_Vec_WWW_Intrinsic<"vsrw">; 484def int_ppc_altivec_vsrab : PowerPC_Vec_BBB_Intrinsic<"vsrab">; 485def int_ppc_altivec_vsrah : PowerPC_Vec_HHH_Intrinsic<"vsrah">; 486def int_ppc_altivec_vsraw : PowerPC_Vec_WWW_Intrinsic<"vsraw">; 487 488// Rotates. 489def int_ppc_altivec_vrlb : PowerPC_Vec_BBB_Intrinsic<"vrlb">; 490def int_ppc_altivec_vrlh : PowerPC_Vec_HHH_Intrinsic<"vrlh">; 491def int_ppc_altivec_vrlw : PowerPC_Vec_WWW_Intrinsic<"vrlw">; 492 493let TargetPrefix = "ppc" in { // All PPC intrinsics start with "llvm.ppc.". 494 // Miscellaneous. 495 def int_ppc_altivec_lvsl : 496 Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>; 497 def int_ppc_altivec_lvsr : 498 Intrinsic<[llvm_v16i8_ty], [llvm_ptr_ty], [IntrNoMem]>; 499 500 def int_ppc_altivec_vperm : GCCBuiltin<"__builtin_altivec_vperm_4si">, 501 Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, 502 llvm_v4i32_ty, llvm_v16i8_ty], [IntrNoMem]>; 503 def int_ppc_altivec_vsel : GCCBuiltin<"__builtin_altivec_vsel_4si">, 504 Intrinsic<[llvm_v4i32_ty], [llvm_v4i32_ty, 505 llvm_v4i32_ty, llvm_v4i32_ty], [IntrNoMem]>; 506} 507 508def int_ppc_altivec_vexptefp : PowerPC_Vec_FF_Intrinsic<"vexptefp">; 509def int_ppc_altivec_vlogefp : PowerPC_Vec_FF_Intrinsic<"vlogefp">; 510def int_ppc_altivec_vrefp : PowerPC_Vec_FF_Intrinsic<"vrefp">; 511def int_ppc_altivec_vrsqrtefp : PowerPC_Vec_FF_Intrinsic<"vrsqrtefp">; 512 513 514//===----------------------------------------------------------------------===// 515// PowerPC VSX Intrinsic Definitions. 516 517let TargetPrefix = "ppc" in { // All intrinsics start with "llvm.ppc.". 518 519// Vector load. 520def int_ppc_vsx_lxvw4x : 521 Intrinsic<[llvm_v4i32_ty], [llvm_ptr_ty], [IntrReadArgMem]>; 522def int_ppc_vsx_lxvd2x : 523 Intrinsic<[llvm_v2f64_ty], [llvm_ptr_ty], [IntrReadArgMem]>; 524 525// Vector store. 526def int_ppc_vsx_stxvw4x : 527 Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty], [IntrReadWriteArgMem]>; 528def int_ppc_vsx_stxvd2x : 529 Intrinsic<[], [llvm_v2f64_ty, llvm_ptr_ty], [IntrReadWriteArgMem]>; 530 531// Vector and scalar maximum. 532def int_ppc_vsx_xvmaxdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmaxdp">; 533def int_ppc_vsx_xvmaxsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvmaxsp">; 534def int_ppc_vsx_xsmaxdp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmaxdp">; 535 536// Vector and scalar minimum. 537def int_ppc_vsx_xvmindp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmindp">; 538def int_ppc_vsx_xvminsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvminsp">; 539def int_ppc_vsx_xsmindp : PowerPC_VSX_Sca_DDD_Intrinsic<"xsmindp">; 540 541// Vector divide. 542def int_ppc_vsx_xvdivdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvdivdp">; 543def int_ppc_vsx_xvdivsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvdivsp">; 544} 545