fpoint.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // fpoint.h - [2020-04-13 11:57:47]
  2. #ifndef _FPOINT_H_
  3. #define _FPOINT_H_
  4. #include "common_type.h"
  5. #include "log.h"
  6. //-------------------------------------------------------------------------------------------------
  7. enum PointType : uint {
  8. PointType_0,
  9. PointType_14 = 14,
  10. PointType_16 = 16,
  11. PointType_18 = 18,
  12. PointType_26 = 26,
  13. };
  14. //-------------------------------------------------------------------------------------------------
  15. template <uint t>
  16. class fpoint {
  17. public:
  18. int var_0;
  19. // int test_4;//测试使用
  20. };
  21. //-------------------------------------------------------------------------------------------------
  22. template <PointType t>
  23. class fpoint2 {
  24. public:
  25. int x_0;
  26. int y_4;
  27. };
  28. //-------------------------------------------------------------------------------------------------
  29. template <uint t>
  30. class fpoint3 {
  31. public:
  32. fpoint3() {
  33. // x_0 = y_4 = z_8 = 0;
  34. }
  35. // 0016bea2 //^-^
  36. template <uint t1>
  37. __attribute__((noinline)) fpoint3(const fpoint3<t1>& pt1) {
  38. //这一段不知道为啥优化了
  39. x_0 = 0;
  40. y_4 = 0;
  41. z_8 = 0;
  42. x_0 = pt1.x_0 << 8;
  43. y_4 = pt1.y_4 << 8;
  44. z_8 = pt1.z_8 << 8;
  45. }
  46. int x_0;
  47. int y_4;
  48. int z_8;
  49. };
  50. //-------------------------------------------------------------------------------------------------
  51. template <uint t>
  52. class fpointQ {
  53. public:
  54. // 0016c652 //^_-
  55. fpointQ<t>& __attribute__((noinline)) operator+=(const fpointQ<t>& pt1) {
  56. /*
  57. 这几行赋值语句被优化成向量运算代码了
  58. 原始汇编:ldmia.w r0, {r2, r3, ip, lr}
  59. ldr r4, [r1, #0]
  60. add r2, r4
  61. str r2, [r0, #0]
  62. ...
  63. ldr r1, [r1, #12]
  64. add r1, lr
  65. str r1, [r0, #12]
  66. 自己汇编:adds r1,#36
  67. vld1.32 {d16,d17},[r1]
  68. vld1.32 {d18,d19},[r0]
  69. vadd q8,q9,q8
  70. vst1.32 {d16,d17{,[r0]
  71. */
  72. field_0 += pt1.field_0;
  73. field_4 += pt1.field_4;
  74. field_8 += pt1.field_8;
  75. field_C += pt1.field_C;
  76. return *this;
  77. }
  78. int field_0;
  79. int field_4;
  80. int field_8;
  81. int field_C;
  82. };
  83. //-------------------------------------------------------------------------------------------------
  84. template <uint t>
  85. class fpointQQ {
  86. public:
  87. fpointQQ() {
  88. for (int i = 0; i < 9; ++i) list_0[i] = 0;
  89. // field_24 = field_28 = field_2C = field_30 = 0;
  90. }
  91. // 0016da5e //^_-
  92. fpointQQ(const fpointQQ<t>& pt1) {
  93. int i = 0;
  94. // 16da6c
  95. for (i = 0; i < 9; ++i) list_0[i] = pt1.list_0[i];
  96. /*
  97. 这几行赋值语句被优化成向量运算代码了
  98. 原始汇编:ldr r2, [r1, #36]
  99. str r2, [r0, #36]
  100. ...
  101. ldr r1, [r1, #48]
  102. str r1, [r0, #48]
  103. 自己汇编:adds r1,#36
  104. vld1.32 {d16,d17},[r1]
  105. add.w r1,r0,#36
  106. vst1.32 {d16,d17{,[r1]
  107. */
  108. // field_24 = pt1.field_24;
  109. // field_28 = pt1.field_28;
  110. // field_2C = pt1.field_2C;
  111. // field_30 = pt1.field_30;
  112. fpointQ_24 = pt1.fpointQ_24;
  113. }
  114. // 0016c4ba //^_-
  115. void Cache() {
  116. LOGE("Cache%x=", (uint)this);
  117. // int tmp_r6 = (int)(((int64)(field_28 * 2) * (int64)field_24) >> 18);
  118. // int tmp_r5 = (int)(((int64)(field_2C * 2) * (int64)field_30) >> 18);
  119. // list_0[1] = tmp_r6 - tmp_r5;
  120. // int tmp_r8 = (int)(((int64)(field_2C * 2) * (int64)field_24) >> 18);
  121. // int tmp_r7 = (int)(((int64)(field_28 * 2) * (int64)field_30) >> 18);
  122. // list_0[3] = tmp_r5 + tmp_r6;
  123. // list_0[2] = tmp_r8 + tmp_r7;
  124. // int tmp_r4 = (int)(((int64)field_30 * (int64)(field_24 * 2)) >> 18);
  125. // int tmp_r1 = 0x40000 - (int)(((int64)(field_24 * 2) * (int64)field_24) >>
  126. // 18); tmp_r5 = (int)(((int64)(field_2C * 2) * (int64)field_28) >> 18);
  127. // list_0[5] = tmp_r5 - tmp_r4;
  128. // list_0[6] = tmp_r7 - tmp_r8;
  129. // list_0[7] = tmp_r4 + tmp_r5;
  130. // tmp_r7 = (int)(((int64)(field_28 * 2) * (int64)field_28) >> 18);
  131. // int tmp_r3 = (int)(((int64)(field_2C * 2) * (int64)field_2C) >> 18);
  132. // list_0[0] = 0x40000 - tmp_r7 - tmp_r3;
  133. // list_0[4] = tmp_r1 - tmp_r3;
  134. // list_0[8] = tmp_r1 - tmp_r7;
  135. }
  136. // 0016c2b8 //^_^
  137. fpointQQ<t> Conj() const {
  138. fpointQQ<t> pt(*this);
  139. pt.field_24 = -pt.field_24;
  140. pt.field_28 = -pt.field_28;
  141. pt.field_2C = -pt.field_2C;
  142. pt.list_0[5] = list_0[7];
  143. pt.list_0[6] = list_0[2];
  144. pt.list_0[7] = list_0[5];
  145. pt.list_0[1] = list_0[3];
  146. pt.list_0[2] = list_0[6];
  147. pt.list_0[3] = list_0[1];
  148. return pt;
  149. }
  150. // 0016c2f0 //^_^
  151. fpoint3<t> Multiply(fpoint3<t>& pt2) const {
  152. fpoint3<t> pt0;
  153. int tmp_r6 = (int)(((int64)list_0[0] * (int64)pt2.x_0) >> 18);
  154. int tmp_r5 = (int)(((int64)list_0[1] * (int64)pt2.y_4) >> 18);
  155. tmp_r6 += tmp_r5;
  156. int tmp_r7 = (int)(((int64)list_0[2] * (int64)pt2.z_8) >> 18);
  157. pt0.x_0 = tmp_r6 + tmp_r7;
  158. tmp_r7 = (int)(((int64)list_0[3] * (int64)pt2.x_0) >> 18);
  159. tmp_r6 = (int)(((int64)list_0[4] * (int64)pt2.y_4) >> 18);
  160. tmp_r7 += tmp_r6;
  161. tmp_r6 = (int)(((int64)list_0[5] * (int64)pt2.z_8) >> 18);
  162. pt0.y_4 = tmp_r7 + tmp_r6;
  163. int tmp_r3 = (int)(((int64)list_0[6] * (int64)pt2.x_0) >> 18);
  164. tmp_r7 = (int)(((int64)list_0[7] * (int64)pt2.y_4) >> 18);
  165. tmp_r3 += tmp_r7;
  166. int tmp_r1 = (int)(((int64)list_0[8] * (int64)pt2.z_8) >> 18);
  167. pt0.z_8 = tmp_r3 + tmp_r1;
  168. return pt0;
  169. }
  170. int list_0[9];
  171. // int field_24;
  172. // int field_28;
  173. // int field_2C;
  174. // int field_30;
  175. fpointQ<t> fpointQ_24;
  176. };
  177. //-------------------------------------------------------------------------------------------------
  178. #endif //_FPOINT_H_