SIMD (Single Instruction, Multiple Data) instruction sets are ubiquitous on modern hardware, but rarely used in software projects. A major reason for this is that efficient SIMD code requires data to be laid out in memory in an unconventional manner, forcing developers to explicitly refactor their code and data structures in order to make use of SIMD. In previous work, we proposed SHAPES, an abstract layout specification for enabling memory optimisations for managed, object-oriented languages. In this paper, we explain how, by extending SHAPES with well-known constructs from the literature, which are not specific to SIMD, we can extend SHAPES to compile programs to use SIMD instructions. The resulting language (sketch) seems able to exploit SIMD capabilities without sacrificing ease of development. 2018/6/26 26 __m128 pz = _mm_loadu_ps(&arr->pz[i]); 27 28 __m128 x2 = _mm_add_ps(x, x); 29 __m128 y2 = _mm_add_ps(y, y); 30 __m128 z2 = _mm_add_ps(z, z); 31 __m128 xx2 = _mm_mul_ps(x, x2); 32 __m128 yy2 = _mm_mul_ps(y, y2); 33 __m128 zz2 = _mm_mul_ps(z, z2); 34 35 __m128 xy2 = _mm_mul_ps(x, y2); 36 __m128 wz2 = _mm_mul_ps(w, z2); 37 __m128 xz2 = _mm_mul_ps(x, z2); 38 __m128 wy2 = _mm_mul_ps(w, y2); 39 __m128 yz2 = _mm_mul_ps(y, z2); 40 __m128 wx2 = _mm_mul_ps(w, x2); 41 42 __m128 a11 = _mm_sub_ps(_mm_sub_ps(ONES, yy2), zz2); 43 __m128 a12 = _mm_add_ps(xy2, wz2); 44 __m128 a13 = _mm_sub_ps(xz2, wy2); 45 __m128 a21 = _mm_sub_ps(xy2, wz2); 46 __m128 a22 = _mm_sub_ps(_mm_sub_ps(ONES, xx2), zz2);