| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. |
| 3 * Copyright (C) 2009 Torch Mobile, Inc. | 3 * Copyright (C) 2009 Torch Mobile, Inc. |
| 4 * Copyright (C) 2013 Google Inc. All rights reserved. | 4 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1142 "fmla v7.2d, v31.2d, v23.d[1] \t\n" | 1142 "fmla v7.2d, v31.2d, v23.d[1] \t\n" |
| 1143 | 1143 |
| 1144 "st1 {v0.2d - v3.2d}, [x9], 64 \t\n" | 1144 "st1 {v0.2d - v3.2d}, [x9], 64 \t\n" |
| 1145 "st1 {v4.2d - v7.2d}, [x9] \t\n" | 1145 "st1 {v4.2d - v7.2d}, [x9] \t\n" |
| 1146 : [leftMatrix]"+r"(leftMatrix), [rightMatrix]"+r"(rightMatrix) | 1146 : [leftMatrix]"+r"(leftMatrix), [rightMatrix]"+r"(rightMatrix) |
| 1147 : | 1147 : |
| 1148 : "memory", "x9", "v16", "v17", "v18", "v19", "v20", "v21", "v22", | 1148 : "memory", "x9", "v16", "v17", "v18", "v19", "v20", "v21", "v22", |
| 1149 "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", | 1149 "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", |
| 1150 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7" | 1150 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7" |
| 1151 ); | 1151 ); |
| 1152 #elif CPU(APPLE_ARMV7S) | |
| 1153 double* leftMatrix = &(m_matrix[0][0]); | |
| 1154 const double* rightMatrix = &(mat.m_matrix[0][0]); | |
| 1155 asm volatile (// First row of leftMatrix. | |
| 1156 "mov r3, %[leftMatrix]\n\t" | |
| 1157 "vld1.64 { d16-d19 }, [%[leftMatrix], :128]!\n\t" | |
| 1158 "vld1.64 { d0-d3}, [%[rightMatrix], :128]!\n\t" | |
| 1159 "vmul.f64 d4, d0, d16\n\t" | |
| 1160 "vld1.64 { d20-d23 }, [%[leftMatrix], :128]!\n\t" | |
| 1161 "vmla.f64 d4, d1, d20\n\t" | |
| 1162 "vld1.64 { d24-d27 }, [%[leftMatrix], :128]!\n\t" | |
| 1163 "vmla.f64 d4, d2, d24\n\t" | |
| 1164 "vld1.64 { d28-d31 }, [%[leftMatrix], :128]!\n\t" | |
| 1165 "vmla.f64 d4, d3, d28\n\t" | |
| 1166 | |
| 1167 "vmul.f64 d5, d0, d17\n\t" | |
| 1168 "vmla.f64 d5, d1, d21\n\t" | |
| 1169 "vmla.f64 d5, d2, d25\n\t" | |
| 1170 "vmla.f64 d5, d3, d29\n\t" | |
| 1171 | |
| 1172 "vmul.f64 d6, d0, d18\n\t" | |
| 1173 "vmla.f64 d6, d1, d22\n\t" | |
| 1174 "vmla.f64 d6, d2, d26\n\t" | |
| 1175 "vmla.f64 d6, d3, d30\n\t" | |
| 1176 | |
| 1177 "vmul.f64 d7, d0, d19\n\t" | |
| 1178 "vmla.f64 d7, d1, d23\n\t" | |
| 1179 "vmla.f64 d7, d2, d27\n\t" | |
| 1180 "vmla.f64 d7, d3, d31\n\t" | |
| 1181 "vld1.64 { d0-d3}, [%[rightMatrix], :128]!\n\t" | |
| 1182 "vst1.64 { d4-d7 }, [r3, :128]!\n\t" | |
| 1183 | |
| 1184 // Second row of leftMatrix. | |
| 1185 "vmul.f64 d4, d0, d16\n\t" | |
| 1186 "vmla.f64 d4, d1, d20\n\t" | |
| 1187 "vmla.f64 d4, d2, d24\n\t" | |
| 1188 "vmla.f64 d4, d3, d28\n\t" | |
| 1189 | |
| 1190 "vmul.f64 d5, d0, d17\n\t" | |
| 1191 "vmla.f64 d5, d1, d21\n\t" | |
| 1192 "vmla.f64 d5, d2, d25\n\t" | |
| 1193 "vmla.f64 d5, d3, d29\n\t" | |
| 1194 | |
| 1195 "vmul.f64 d6, d0, d18\n\t" | |
| 1196 "vmla.f64 d6, d1, d22\n\t" | |
| 1197 "vmla.f64 d6, d2, d26\n\t" | |
| 1198 "vmla.f64 d6, d3, d30\n\t" | |
| 1199 | |
| 1200 "vmul.f64 d7, d0, d19\n\t" | |
| 1201 "vmla.f64 d7, d1, d23\n\t" | |
| 1202 "vmla.f64 d7, d2, d27\n\t" | |
| 1203 "vmla.f64 d7, d3, d31\n\t" | |
| 1204 "vld1.64 { d0-d3}, [%[rightMatrix], :128]!\n\t" | |
| 1205 "vst1.64 { d4-d7 }, [r3, :128]!\n\t" | |
| 1206 | |
| 1207 // Third row of leftMatrix. | |
| 1208 "vmul.f64 d4, d0, d16\n\t" | |
| 1209 "vmla.f64 d4, d1, d20\n\t" | |
| 1210 "vmla.f64 d4, d2, d24\n\t" | |
| 1211 "vmla.f64 d4, d3, d28\n\t" | |
| 1212 | |
| 1213 "vmul.f64 d5, d0, d17\n\t" | |
| 1214 "vmla.f64 d5, d1, d21\n\t" | |
| 1215 "vmla.f64 d5, d2, d25\n\t" | |
| 1216 "vmla.f64 d5, d3, d29\n\t" | |
| 1217 | |
| 1218 "vmul.f64 d6, d0, d18\n\t" | |
| 1219 "vmla.f64 d6, d1, d22\n\t" | |
| 1220 "vmla.f64 d6, d2, d26\n\t" | |
| 1221 "vmla.f64 d6, d3, d30\n\t" | |
| 1222 | |
| 1223 "vmul.f64 d7, d0, d19\n\t" | |
| 1224 "vmla.f64 d7, d1, d23\n\t" | |
| 1225 "vmla.f64 d7, d2, d27\n\t" | |
| 1226 "vmla.f64 d7, d3, d31\n\t" | |
| 1227 "vld1.64 { d0-d3}, [%[rightMatrix], :128]\n\t" | |
| 1228 "vst1.64 { d4-d7 }, [r3, :128]!\n\t" | |
| 1229 | |
| 1230 // Fourth and last row of leftMatrix. | |
| 1231 "vmul.f64 d4, d0, d16\n\t" | |
| 1232 "vmla.f64 d4, d1, d20\n\t" | |
| 1233 "vmla.f64 d4, d2, d24\n\t" | |
| 1234 "vmla.f64 d4, d3, d28\n\t" | |
| 1235 | |
| 1236 "vmul.f64 d5, d0, d17\n\t" | |
| 1237 "vmla.f64 d5, d1, d21\n\t" | |
| 1238 "vmla.f64 d5, d2, d25\n\t" | |
| 1239 "vmla.f64 d5, d3, d29\n\t" | |
| 1240 | |
| 1241 "vmul.f64 d6, d0, d18\n\t" | |
| 1242 "vmla.f64 d6, d1, d22\n\t" | |
| 1243 "vmla.f64 d6, d2, d26\n\t" | |
| 1244 "vmla.f64 d6, d3, d30\n\t" | |
| 1245 | |
| 1246 "vmul.f64 d7, d0, d19\n\t" | |
| 1247 "vmla.f64 d7, d1, d23\n\t" | |
| 1248 "vmla.f64 d7, d2, d27\n\t" | |
| 1249 "vmla.f64 d7, d3, d31\n\t" | |
| 1250 "vst1.64 { d4-d7 }, [r3, :128]\n\t" | |
| 1251 : [leftMatrix]"+r"(leftMatrix), [rightMatrix]"+r"(rightMatrix) | |
| 1252 : | |
| 1253 : "memory", "r3", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16",
"d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d
28", "d29", "d30", "d31"); | |
| 1254 #elif defined(TRANSFORMATION_MATRIX_USE_X86_64_SSE2) | 1152 #elif defined(TRANSFORMATION_MATRIX_USE_X86_64_SSE2) |
| 1255 // x86_64 has 16 XMM registers which is enough to do the multiplication full
y in registers. | 1153 // x86_64 has 16 XMM registers which is enough to do the multiplication full
y in registers. |
| 1256 __m128d matrixBlockA = _mm_load_pd(&(m_matrix[0][0])); | 1154 __m128d matrixBlockA = _mm_load_pd(&(m_matrix[0][0])); |
| 1257 __m128d matrixBlockC = _mm_load_pd(&(m_matrix[1][0])); | 1155 __m128d matrixBlockC = _mm_load_pd(&(m_matrix[1][0])); |
| 1258 __m128d matrixBlockE = _mm_load_pd(&(m_matrix[2][0])); | 1156 __m128d matrixBlockE = _mm_load_pd(&(m_matrix[2][0])); |
| 1259 __m128d matrixBlockG = _mm_load_pd(&(m_matrix[3][0])); | 1157 __m128d matrixBlockG = _mm_load_pd(&(m_matrix[3][0])); |
| 1260 | 1158 |
| 1261 // First row. | 1159 // First row. |
| 1262 __m128d otherMatrixFirstParam = _mm_set1_pd(mat.m_matrix[0][0]); | 1160 __m128d otherMatrixFirstParam = _mm_set1_pd(mat.m_matrix[0][0]); |
| 1263 __m128d otherMatrixSecondParam = _mm_set1_pd(mat.m_matrix[0][1]); | 1161 __m128d otherMatrixSecondParam = _mm_set1_pd(mat.m_matrix[0][1]); |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1669 ret.setDouble(2, 2, matrix.m33()); | 1567 ret.setDouble(2, 2, matrix.m33()); |
| 1670 ret.setDouble(2, 3, matrix.m43()); | 1568 ret.setDouble(2, 3, matrix.m43()); |
| 1671 ret.setDouble(3, 0, matrix.m14()); | 1569 ret.setDouble(3, 0, matrix.m14()); |
| 1672 ret.setDouble(3, 1, matrix.m24()); | 1570 ret.setDouble(3, 1, matrix.m24()); |
| 1673 ret.setDouble(3, 2, matrix.m34()); | 1571 ret.setDouble(3, 2, matrix.m34()); |
| 1674 ret.setDouble(3, 3, matrix.m44()); | 1572 ret.setDouble(3, 3, matrix.m44()); |
| 1675 return ret; | 1573 return ret; |
| 1676 } | 1574 } |
| 1677 | 1575 |
| 1678 } // namespace blink | 1576 } // namespace blink |
| OLD | NEW |