1 /* 2 * Copyright © 2014 Advanced Micro Devices, Inc. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 15 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 16 * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS 17 * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20 * USE OR OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * The above copyright notice and this permission notice (including the 23 * next paragraph) shall be included in all copies or substantial portions 24 * of the Software. 25 */ 26 27 /** 28 *************************************************************************************************** 29 * @file addrtypes.h 30 * @brief Contains the helper function and constants 31 *************************************************************************************************** 32 */ 33 #ifndef __ADDR_TYPES_H__ 34 #define __ADDR_TYPES_H__ 35 36 #if defined(__APPLE__) || defined(TCORE_BUILD) 37 // External definitions header maintained by Mac driver team (and TCORE team) 38 // Helps address compilation issues & reduces code covered by NDA 39 #include "addrExtDef.h" 40 41 #else 42 43 // Windows and/or Linux 44 #if !defined(VOID) 45 typedef void VOID; 46 #endif 47 48 #if !defined(FLOAT) 49 typedef float FLOAT; 50 #endif 51 52 #if !defined(CHAR) 53 typedef char CHAR; 54 #endif 55 56 #if !defined(INT) 57 typedef int INT; 58 #endif 59 60 #include <stdarg.h> // va_list...etc need this header 61 62 #endif // defined (__APPLE__) 63 64 /** 65 *************************************************************************************************** 66 * Calling conventions 67 *************************************************************************************************** 68 */ 69 #ifndef ADDR_CDECL 70 #if defined(__GNUC__) 71 #define ADDR_CDECL __attribute__((cdecl)) 72 #else 73 #define ADDR_CDECL __cdecl 74 #endif 75 #endif 76 77 #ifndef ADDR_STDCALL 78 #if defined(__GNUC__) 79 #if defined(__AMD64__) 80 #define ADDR_STDCALL 81 #else 82 #define ADDR_STDCALL __attribute__((stdcall)) 83 #endif 84 #else 85 #define ADDR_STDCALL __stdcall 86 #endif 87 #endif 88 89 #ifndef ADDR_FASTCALL 90 #if defined(__GNUC__) 91 #if defined(__i386__) 92 #define ADDR_FASTCALL __attribute__((regparm(0))) 93 #else 94 #define ADDR_FASTCALL 95 #endif 96 #else 97 #define ADDR_FASTCALL __fastcall 98 #endif 99 #endif 100 101 #ifndef GC_CDECL 102 #define GC_CDECL ADDR_CDECL 103 #endif 104 105 #ifndef GC_STDCALL 106 #define GC_STDCALL ADDR_STDCALL 107 #endif 108 109 #ifndef GC_FASTCALL 110 #define GC_FASTCALL ADDR_FASTCALL 111 #endif 112 113 114 #if defined(__GNUC__) 115 #define ADDR_INLINE static inline // inline needs to be static to link 116 #else 117 // win32, win64, other platforms 118 #define ADDR_INLINE __inline 119 #endif // #if defined(__GNUC__) 120 121 #define ADDR_API ADDR_FASTCALL //default call convention is fast call 122 123 /** 124 *************************************************************************************************** 125 * Global defines used by other modules 126 *************************************************************************************************** 127 */ 128 #if !defined(TILEINDEX_INVALID) 129 #define TILEINDEX_INVALID -1 130 #endif 131 132 #if !defined(TILEINDEX_LINEAR_GENERAL) 133 #define TILEINDEX_LINEAR_GENERAL -2 134 #endif 135 136 #if !defined(TILEINDEX_LINEAR_ALIGNED) 137 #define TILEINDEX_LINEAR_ALIGNED 8 138 #endif 139 140 /** 141 *************************************************************************************************** 142 * Return codes 143 *************************************************************************************************** 144 */ 145 typedef enum _ADDR_E_RETURNCODE 146 { 147 // General Return 148 ADDR_OK = 0, 149 ADDR_ERROR = 1, 150 151 // Specific Errors 152 ADDR_OUTOFMEMORY, 153 ADDR_INVALIDPARAMS, 154 ADDR_NOTSUPPORTED, 155 ADDR_NOTIMPLEMENTED, 156 ADDR_PARAMSIZEMISMATCH, 157 ADDR_INVALIDGBREGVALUES, 158 159 } ADDR_E_RETURNCODE; 160 161 /** 162 *************************************************************************************************** 163 * @brief 164 * Neutral enums that define tile modes for all H/W 165 * @note 166 * R600/R800 tiling mode can be cast to hw enums directly but never cast into HW enum from 167 * ADDR_TM_2D_TILED_XTHICK 168 * 169 *************************************************************************************************** 170 */ 171 typedef enum _AddrTileMode 172 { 173 ADDR_TM_LINEAR_GENERAL = 0, ///< Least restrictions, pitch: multiple of 8 if not buffer 174 ADDR_TM_LINEAR_ALIGNED = 1, ///< Requests pitch or slice to be multiple of 64 pixels 175 ADDR_TM_1D_TILED_THIN1 = 2, ///< Linear array of 8x8 tiles 176 ADDR_TM_1D_TILED_THICK = 3, ///< Linear array of 8x8x4 tiles 177 ADDR_TM_2D_TILED_THIN1 = 4, ///< A set of macro tiles consist of 8x8 tiles 178 ADDR_TM_2D_TILED_THIN2 = 5, ///< 600 HWL only, macro tile ratio is 1:4 179 ADDR_TM_2D_TILED_THIN4 = 6, ///< 600 HWL only, macro tile ratio is 1:16 180 ADDR_TM_2D_TILED_THICK = 7, ///< A set of macro tiles consist of 8x8x4 tiles 181 ADDR_TM_2B_TILED_THIN1 = 8, ///< 600 HWL only, with bank swap 182 ADDR_TM_2B_TILED_THIN2 = 9, ///< 600 HWL only, with bank swap and ratio is 1:4 183 ADDR_TM_2B_TILED_THIN4 = 10, ///< 600 HWL only, with bank swap and ratio is 1:16 184 ADDR_TM_2B_TILED_THICK = 11, ///< 600 HWL only, with bank swap, consists of 8x8x4 tiles 185 ADDR_TM_3D_TILED_THIN1 = 12, ///< Macro tiling w/ pipe rotation between slices 186 ADDR_TM_3D_TILED_THICK = 13, ///< Macro tiling w/ pipe rotation bwtween slices, thick 187 ADDR_TM_3B_TILED_THIN1 = 14, ///< 600 HWL only, with bank swap 188 ADDR_TM_3B_TILED_THICK = 15, ///< 600 HWL only, with bank swap, thick 189 ADDR_TM_2D_TILED_XTHICK = 16, ///< Tile is 8x8x8, valid from NI 190 ADDR_TM_3D_TILED_XTHICK = 17, ///< Tile is 8x8x8, valid from NI 191 ADDR_TM_POWER_SAVE = 18, ///< Power save mode, only used by KMD on NI 192 ADDR_TM_PRT_TILED_THIN1 = 19, ///< No bank/pipe rotation or hashing beyond macrotile size 193 ADDR_TM_PRT_2D_TILED_THIN1 = 20, ///< Same as 2D_TILED_THIN1, PRT only 194 ADDR_TM_PRT_3D_TILED_THIN1 = 21, ///< Same as 3D_TILED_THIN1, PRT only 195 ADDR_TM_PRT_TILED_THICK = 22, ///< No bank/pipe rotation or hashing beyond macrotile size 196 ADDR_TM_PRT_2D_TILED_THICK = 23, ///< Same as 2D_TILED_THICK, PRT only 197 ADDR_TM_PRT_3D_TILED_THICK = 24, ///< Same as 3D_TILED_THICK, PRT only 198 ADDR_TM_COUNT = 25, ///< Must be the value of the last tile mode 199 } AddrTileMode; 200 201 /** 202 *************************************************************************************************** 203 * AddrFormat 204 * 205 * @brief 206 * Neutral enum for SurfaceFormat 207 * 208 *************************************************************************************************** 209 */ 210 typedef enum _AddrFormat { 211 ADDR_FMT_INVALID = 0x00000000, 212 ADDR_FMT_8 = 0x00000001, 213 ADDR_FMT_4_4 = 0x00000002, 214 ADDR_FMT_3_3_2 = 0x00000003, 215 ADDR_FMT_RESERVED_4 = 0x00000004, 216 ADDR_FMT_16 = 0x00000005, 217 ADDR_FMT_16_FLOAT = 0x00000006, 218 ADDR_FMT_8_8 = 0x00000007, 219 ADDR_FMT_5_6_5 = 0x00000008, 220 ADDR_FMT_6_5_5 = 0x00000009, 221 ADDR_FMT_1_5_5_5 = 0x0000000a, 222 ADDR_FMT_4_4_4_4 = 0x0000000b, 223 ADDR_FMT_5_5_5_1 = 0x0000000c, 224 ADDR_FMT_32 = 0x0000000d, 225 ADDR_FMT_32_FLOAT = 0x0000000e, 226 ADDR_FMT_16_16 = 0x0000000f, 227 ADDR_FMT_16_16_FLOAT = 0x00000010, 228 ADDR_FMT_8_24 = 0x00000011, 229 ADDR_FMT_8_24_FLOAT = 0x00000012, 230 ADDR_FMT_24_8 = 0x00000013, 231 ADDR_FMT_24_8_FLOAT = 0x00000014, 232 ADDR_FMT_10_11_11 = 0x00000015, 233 ADDR_FMT_10_11_11_FLOAT = 0x00000016, 234 ADDR_FMT_11_11_10 = 0x00000017, 235 ADDR_FMT_11_11_10_FLOAT = 0x00000018, 236 ADDR_FMT_2_10_10_10 = 0x00000019, 237 ADDR_FMT_8_8_8_8 = 0x0000001a, 238 ADDR_FMT_10_10_10_2 = 0x0000001b, 239 ADDR_FMT_X24_8_32_FLOAT = 0x0000001c, 240 ADDR_FMT_32_32 = 0x0000001d, 241 ADDR_FMT_32_32_FLOAT = 0x0000001e, 242 ADDR_FMT_16_16_16_16 = 0x0000001f, 243 ADDR_FMT_16_16_16_16_FLOAT = 0x00000020, 244 ADDR_FMT_RESERVED_33 = 0x00000021, 245 ADDR_FMT_32_32_32_32 = 0x00000022, 246 ADDR_FMT_32_32_32_32_FLOAT = 0x00000023, 247 ADDR_FMT_RESERVED_36 = 0x00000024, 248 ADDR_FMT_1 = 0x00000025, 249 ADDR_FMT_1_REVERSED = 0x00000026, 250 ADDR_FMT_GB_GR = 0x00000027, 251 ADDR_FMT_BG_RG = 0x00000028, 252 ADDR_FMT_32_AS_8 = 0x00000029, 253 ADDR_FMT_32_AS_8_8 = 0x0000002a, 254 ADDR_FMT_5_9_9_9_SHAREDEXP = 0x0000002b, 255 ADDR_FMT_8_8_8 = 0x0000002c, 256 ADDR_FMT_16_16_16 = 0x0000002d, 257 ADDR_FMT_16_16_16_FLOAT = 0x0000002e, 258 ADDR_FMT_32_32_32 = 0x0000002f, 259 ADDR_FMT_32_32_32_FLOAT = 0x00000030, 260 ADDR_FMT_BC1 = 0x00000031, 261 ADDR_FMT_BC2 = 0x00000032, 262 ADDR_FMT_BC3 = 0x00000033, 263 ADDR_FMT_BC4 = 0x00000034, 264 ADDR_FMT_BC5 = 0x00000035, 265 ADDR_FMT_BC6 = 0x00000036, 266 ADDR_FMT_BC7 = 0x00000037, 267 ADDR_FMT_32_AS_32_32_32_32 = 0x00000038, 268 ADDR_FMT_APC3 = 0x00000039, 269 ADDR_FMT_APC4 = 0x0000003a, 270 ADDR_FMT_APC5 = 0x0000003b, 271 ADDR_FMT_APC6 = 0x0000003c, 272 ADDR_FMT_APC7 = 0x0000003d, 273 ADDR_FMT_CTX1 = 0x0000003e, 274 ADDR_FMT_RESERVED_63 = 0x0000003f, 275 } AddrFormat; 276 277 /** 278 *************************************************************************************************** 279 * AddrDepthFormat 280 * 281 * @brief 282 * Neutral enum for addrFlt32ToDepthPixel 283 * 284 *************************************************************************************************** 285 */ 286 typedef enum _AddrDepthFormat 287 { 288 ADDR_DEPTH_INVALID = 0x00000000, 289 ADDR_DEPTH_16 = 0x00000001, 290 ADDR_DEPTH_X8_24 = 0x00000002, 291 ADDR_DEPTH_8_24 = 0x00000003, 292 ADDR_DEPTH_X8_24_FLOAT = 0x00000004, 293 ADDR_DEPTH_8_24_FLOAT = 0x00000005, 294 ADDR_DEPTH_32_FLOAT = 0x00000006, 295 ADDR_DEPTH_X24_8_32_FLOAT = 0x00000007, 296 297 } AddrDepthFormat; 298 299 /** 300 *************************************************************************************************** 301 * AddrColorFormat 302 * 303 * @brief 304 * Neutral enum for ColorFormat 305 * 306 *************************************************************************************************** 307 */ 308 typedef enum _AddrColorFormat 309 { 310 ADDR_COLOR_INVALID = 0x00000000, 311 ADDR_COLOR_8 = 0x00000001, 312 ADDR_COLOR_4_4 = 0x00000002, 313 ADDR_COLOR_3_3_2 = 0x00000003, 314 ADDR_COLOR_RESERVED_4 = 0x00000004, 315 ADDR_COLOR_16 = 0x00000005, 316 ADDR_COLOR_16_FLOAT = 0x00000006, 317 ADDR_COLOR_8_8 = 0x00000007, 318 ADDR_COLOR_5_6_5 = 0x00000008, 319 ADDR_COLOR_6_5_5 = 0x00000009, 320 ADDR_COLOR_1_5_5_5 = 0x0000000a, 321 ADDR_COLOR_4_4_4_4 = 0x0000000b, 322 ADDR_COLOR_5_5_5_1 = 0x0000000c, 323 ADDR_COLOR_32 = 0x0000000d, 324 ADDR_COLOR_32_FLOAT = 0x0000000e, 325 ADDR_COLOR_16_16 = 0x0000000f, 326 ADDR_COLOR_16_16_FLOAT = 0x00000010, 327 ADDR_COLOR_8_24 = 0x00000011, 328 ADDR_COLOR_8_24_FLOAT = 0x00000012, 329 ADDR_COLOR_24_8 = 0x00000013, 330 ADDR_COLOR_24_8_FLOAT = 0x00000014, 331 ADDR_COLOR_10_11_11 = 0x00000015, 332 ADDR_COLOR_10_11_11_FLOAT = 0x00000016, 333 ADDR_COLOR_11_11_10 = 0x00000017, 334 ADDR_COLOR_11_11_10_FLOAT = 0x00000018, 335 ADDR_COLOR_2_10_10_10 = 0x00000019, 336 ADDR_COLOR_8_8_8_8 = 0x0000001a, 337 ADDR_COLOR_10_10_10_2 = 0x0000001b, 338 ADDR_COLOR_X24_8_32_FLOAT = 0x0000001c, 339 ADDR_COLOR_32_32 = 0x0000001d, 340 ADDR_COLOR_32_32_FLOAT = 0x0000001e, 341 ADDR_COLOR_16_16_16_16 = 0x0000001f, 342 ADDR_COLOR_16_16_16_16_FLOAT = 0x00000020, 343 ADDR_COLOR_RESERVED_33 = 0x00000021, 344 ADDR_COLOR_32_32_32_32 = 0x00000022, 345 ADDR_COLOR_32_32_32_32_FLOAT = 0x00000023, 346 } AddrColorFormat; 347 348 /** 349 *************************************************************************************************** 350 * AddrSurfaceNumber 351 * 352 * @brief 353 * Neutral enum for SurfaceNumber 354 * 355 *************************************************************************************************** 356 */ 357 typedef enum _AddrSurfaceNumber { 358 ADDR_NUMBER_UNORM = 0x00000000, 359 ADDR_NUMBER_SNORM = 0x00000001, 360 ADDR_NUMBER_USCALED = 0x00000002, 361 ADDR_NUMBER_SSCALED = 0x00000003, 362 ADDR_NUMBER_UINT = 0x00000004, 363 ADDR_NUMBER_SINT = 0x00000005, 364 ADDR_NUMBER_SRGB = 0x00000006, 365 ADDR_NUMBER_FLOAT = 0x00000007, 366 } AddrSurfaceNumber; 367 368 /** 369 *************************************************************************************************** 370 * AddrSurfaceSwap 371 * 372 * @brief 373 * Neutral enum for SurfaceSwap 374 * 375 *************************************************************************************************** 376 */ 377 typedef enum _AddrSurfaceSwap { 378 ADDR_SWAP_STD = 0x00000000, 379 ADDR_SWAP_ALT = 0x00000001, 380 ADDR_SWAP_STD_REV = 0x00000002, 381 ADDR_SWAP_ALT_REV = 0x00000003, 382 } AddrSurfaceSwap; 383 384 /** 385 *************************************************************************************************** 386 * AddrHtileBlockSize 387 * 388 * @brief 389 * Size of HTILE blocks, valid values are 4 or 8 for now 390 *************************************************************************************************** 391 */ 392 typedef enum _AddrHtileBlockSize 393 { 394 ADDR_HTILE_BLOCKSIZE_4 = 4, 395 ADDR_HTILE_BLOCKSIZE_8 = 8, 396 } AddrHtileBlockSize; 397 398 399 /** 400 *************************************************************************************************** 401 * AddrPipeCfg 402 * 403 * @brief 404 * The pipe configuration field specifies both the number of pipes and 405 * how pipes are interleaved on the surface. 406 * The expression of number of pipes, the shader engine tile size, and packer tile size 407 * is encoded in a PIPE_CONFIG register field. 408 * In general the number of pipes usually matches the number of memory channels of the 409 * hardware configuration. 410 * For hw configurations w/ non-pow2 memory number of memory channels, it usually matches 411 * the number of ROP units(? TODO: which registers??) 412 * The enum value = hw enum + 1 which is to reserve 0 for requesting default. 413 *************************************************************************************************** 414 */ 415 typedef enum _AddrPipeCfg 416 { 417 ADDR_PIPECFG_INVALID = 0, 418 ADDR_PIPECFG_P2 = 1, /// 2 pipes, 419 ADDR_PIPECFG_P4_8x16 = 5, /// 4 pipes, 420 ADDR_PIPECFG_P4_16x16 = 6, 421 ADDR_PIPECFG_P4_16x32 = 7, 422 ADDR_PIPECFG_P4_32x32 = 8, 423 ADDR_PIPECFG_P8_16x16_8x16 = 9, /// 8 pipes 424 ADDR_PIPECFG_P8_16x32_8x16 = 10, 425 ADDR_PIPECFG_P8_32x32_8x16 = 11, 426 ADDR_PIPECFG_P8_16x32_16x16 = 12, 427 ADDR_PIPECFG_P8_32x32_16x16 = 13, 428 ADDR_PIPECFG_P8_32x32_16x32 = 14, 429 ADDR_PIPECFG_P8_32x64_32x32 = 15, 430 ADDR_PIPECFG_P16_32x32_8x16 = 17, /// 16 pipes 431 ADDR_PIPECFG_P16_32x32_16x16 = 18, 432 ADDR_PIPECFG_MAX = 19, 433 } AddrPipeCfg; 434 435 /** 436 *************************************************************************************************** 437 * AddrTileType 438 * 439 * @brief 440 * Neutral enums that specifies micro tile type (MICRO_TILE_MODE) 441 *************************************************************************************************** 442 */ 443 typedef enum _AddrTileType 444 { 445 ADDR_DISPLAYABLE = 0, ///< Displayable tiling 446 ADDR_NON_DISPLAYABLE = 1, ///< Non-displayable tiling, a.k.a thin micro tiling 447 ADDR_DEPTH_SAMPLE_ORDER = 2, ///< Same as non-displayable plus depth-sample-order 448 ADDR_ROTATED = 3, ///< Rotated displayable tiling 449 ADDR_THICK = 4, ///< Thick micro-tiling, only valid for THICK and XTHICK 450 } AddrTileType; 451 452 /////////////////////////////////////////////////////////////////////////////////////////////////// 453 // 454 // Type definitions: short system-independent names for address library types 455 // 456 /////////////////////////////////////////////////////////////////////////////////////////////////// 457 458 #if !defined(__APPLE__) 459 460 #ifndef BOOL_32 // no bool type in C 461 /// @brief Boolean type, since none is defined in C 462 /// @ingroup type 463 #define BOOL_32 int 464 #endif 465 466 #ifndef INT_32 467 #define INT_32 int 468 #endif 469 470 #ifndef UINT_32 471 #define UINT_32 unsigned int 472 #endif 473 474 #ifndef INT_16 475 #define INT_16 short 476 #endif 477 478 #ifndef UINT_16 479 #define UINT_16 unsigned short 480 #endif 481 482 #ifndef INT_8 483 #define INT_8 char 484 #endif 485 486 #ifndef UINT_8 487 #define UINT_8 unsigned char 488 #endif 489 490 #ifndef NULL 491 #define NULL 0 492 #endif 493 494 #ifndef TRUE 495 #define TRUE 1 496 #endif 497 498 #ifndef FALSE 499 #define FALSE 0 500 #endif 501 502 // 503 // 64-bit integer types depend on the compiler 504 // 505 #if defined( __GNUC__ ) || defined( __WATCOMC__ ) 506 #define INT_64 long long 507 #define UINT_64 unsigned long long 508 509 #elif defined( _WIN32 ) 510 #define INT_64 __int64 511 #define UINT_64 unsigned __int64 512 513 #else 514 #error Unsupported compiler and/or operating system for 64-bit integers 515 516 /// @brief 64-bit signed integer type (compiler dependent) 517 /// @ingroup type 518 /// 519 /// The addrlib defines a 64-bit signed integer type for either 520 /// Gnu/Watcom compilers (which use the first syntax) or for 521 /// the Windows VCC compiler (which uses the second syntax). 522 #define INT_64 long long OR __int64 523 524 /// @brief 64-bit unsigned integer type (compiler dependent) 525 /// @ingroup type 526 /// 527 /// The addrlib defines a 64-bit unsigned integer type for either 528 /// Gnu/Watcom compilers (which use the first syntax) or for 529 /// the Windows VCC compiler (which uses the second syntax). 530 /// 531 #define UINT_64 unsigned long long OR unsigned __int64 532 #endif 533 534 #endif // #if !defined(__APPLE__) 535 536 // ADDR64X is used to print addresses in hex form on both Windows and Linux 537 // 538 #if defined( __GNUC__ ) || defined( __WATCOMC__ ) 539 #define ADDR64X "llx" 540 #define ADDR64D "lld" 541 542 #elif defined( _WIN32 ) 543 #define ADDR64X "I64x" 544 #define ADDR64D "I64d" 545 546 #else 547 #error Unsupported compiler and/or operating system for 64-bit integers 548 549 /// @brief Addrlib device address 64-bit printf tag (compiler dependent) 550 /// @ingroup type 551 /// 552 /// This allows printf to display an ADDR_64 for either the Windows VCC compiler 553 /// (which used this value) or the Gnu/Watcom compilers (which use "llx". 554 /// An example of use is printf("addr 0x%"ADDR64X"\n", address); 555 /// 556 #define ADDR64X "llx" OR "I64x" 557 #define ADDR64D "lld" OR "I64d" 558 #endif 559 560 561 /// @brief Union for storing a 32-bit float or 32-bit integer 562 /// @ingroup type 563 /// 564 /// This union provides a simple way to convert between a 32-bit float 565 /// and a 32-bit integer. It also prevents the compiler from producing 566 /// code that alters NaN values when assiging or coying floats. 567 /// Therefore, all address library routines that pass or return 32-bit 568 /// floating point data do so by passing or returning a FLT_32. 569 /// 570 typedef union { 571 INT_32 i; 572 UINT_32 u; 573 float f; 574 } ADDR_FLT_32; 575 576 577 /////////////////////////////////////////////////////////////////////////////////////////////////// 578 // 579 // Macros for controlling linking and building on multiple systems 580 // 581 /////////////////////////////////////////////////////////////////////////////////////////////////// 582 #if defined(_MSC_VER) 583 #if defined(va_copy) 584 #undef va_copy //redefine va_copy to support VC2013 585 #endif 586 #endif 587 588 #if !defined(va_copy) 589 #define va_copy(dst, src) \ 590 ((void) memcpy(&(dst), &(src), sizeof(va_list))) 591 #endif 592 593 #endif // __ADDR_TYPES_H__ 594 595