simd_common.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "simd_common.h"
  6. LLVMValueRef
  7. simd_pop_v128_and_bitcast(const AOTCompContext *comp_ctx,
  8. const AOTFuncContext *func_ctx,
  9. LLVMTypeRef vec_type,
  10. const char *name)
  11. {
  12. LLVMValueRef number;
  13. POP_V128(number);
  14. if (!(number =
  15. LLVMBuildBitCast(comp_ctx->builder, number, vec_type, name))) {
  16. HANDLE_FAILURE("LLVMBuildBitCast");
  17. goto fail;
  18. }
  19. return number;
  20. fail:
  21. return NULL;
  22. }
  23. bool
  24. simd_bitcast_and_push_v128(const AOTCompContext *comp_ctx,
  25. const AOTFuncContext *func_ctx,
  26. LLVMValueRef vector,
  27. const char *name)
  28. {
  29. if (!(vector = LLVMBuildBitCast(comp_ctx->builder, vector, V128_i64x2_TYPE,
  30. name))) {
  31. HANDLE_FAILURE("LLVMBuildBitCast");
  32. goto fail;
  33. }
  34. /* push result into the stack */
  35. PUSH_V128(vector);
  36. return true;
  37. fail:
  38. return false;
  39. }
  40. LLVMValueRef
  41. simd_lane_id_to_llvm_value(AOTCompContext *comp_ctx, uint8 lane_id)
  42. {
  43. LLVMValueRef lane_indexes[] = {
  44. LLVM_CONST(i32_zero), LLVM_CONST(i32_one),
  45. LLVM_CONST(i32_two), LLVM_CONST(i32_three),
  46. LLVM_CONST(i32_four), LLVM_CONST(i32_five),
  47. LLVM_CONST(i32_six), LLVM_CONST(i32_seven),
  48. LLVM_CONST(i32_eight), LLVM_CONST(i32_nine),
  49. LLVM_CONST(i32_ten), LLVM_CONST(i32_eleven),
  50. LLVM_CONST(i32_twelve), LLVM_CONST(i32_thirteen),
  51. LLVM_CONST(i32_fourteen), LLVM_CONST(i32_fifteen),
  52. };
  53. return lane_id < 16 ? lane_indexes[lane_id] : NULL;
  54. }
  55. LLVMValueRef
  56. simd_build_const_integer_vector(const AOTCompContext *comp_ctx,
  57. const LLVMTypeRef element_type,
  58. const int *element_value,
  59. uint32 length)
  60. {
  61. LLVMValueRef vector = NULL;
  62. LLVMValueRef *elements;
  63. unsigned i;
  64. if (!(elements = wasm_runtime_malloc(sizeof(LLVMValueRef) * length))) {
  65. return NULL;
  66. }
  67. for (i = 0; i < length; i++) {
  68. if (!(elements[i] =
  69. LLVMConstInt(element_type, element_value[i], true))) {
  70. HANDLE_FAILURE("LLVMConstInst");
  71. goto fail;
  72. }
  73. }
  74. if (!(vector = LLVMConstVector(elements, length))) {
  75. HANDLE_FAILURE("LLVMConstVector");
  76. goto fail;
  77. }
  78. fail:
  79. wasm_runtime_free(elements);
  80. return vector;
  81. }
  82. LLVMValueRef
  83. simd_build_splat_const_integer_vector(const AOTCompContext *comp_ctx,
  84. const LLVMTypeRef element_type,
  85. const int64 element_value,
  86. uint32 length)
  87. {
  88. LLVMValueRef vector = NULL, element;
  89. LLVMValueRef *elements;
  90. unsigned i;
  91. if (!(elements = wasm_runtime_malloc(sizeof(LLVMValueRef) * length))) {
  92. return NULL;
  93. }
  94. if (!(element = LLVMConstInt(element_type, element_value, true))) {
  95. HANDLE_FAILURE("LLVMConstInt");
  96. goto fail;
  97. }
  98. for (i = 0; i < length; i++) {
  99. elements[i] = element;
  100. }
  101. if (!(vector = LLVMConstVector(elements, length))) {
  102. HANDLE_FAILURE("LLVMConstVector");
  103. goto fail;
  104. }
  105. fail:
  106. wasm_runtime_free(elements);
  107. return vector;
  108. }
  109. LLVMValueRef
  110. simd_build_splat_const_float_vector(const AOTCompContext *comp_ctx,
  111. const LLVMTypeRef element_type,
  112. const float element_value,
  113. uint32 length)
  114. {
  115. LLVMValueRef vector = NULL, element;
  116. LLVMValueRef *elements;
  117. unsigned i;
  118. if (!(elements = wasm_runtime_malloc(sizeof(LLVMValueRef) * length))) {
  119. return NULL;
  120. }
  121. if (!(element = LLVMConstReal(element_type, element_value))) {
  122. HANDLE_FAILURE("LLVMConstReal");
  123. goto fail;
  124. }
  125. for (i = 0; i < length; i++) {
  126. elements[i] = element;
  127. }
  128. if (!(vector = LLVMConstVector(elements, length))) {
  129. HANDLE_FAILURE("LLVMConstVector");
  130. goto fail;
  131. }
  132. fail:
  133. wasm_runtime_free(elements);
  134. return vector;
  135. }