1 /*******************************************************************************
2 Copyright (c) 2016, The OpenBLAS Project
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
7 1. Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 2. Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
13 3. Neither the name of the OpenBLAS project nor the names of
14 its contributors may be used to endorse or promote products
15 derived from this software without specific prior written permission.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
25 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *******************************************************************************/
29 #include "macros_msa.h"
31 int CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y,
36 FLOAT tp0, tp1, tp2, tp3, tp4, tp5, tp6, tp7;
37 FLOAT fx0, fx1, fx2, fx3, fy0, fy1, fy2, fy3;
38 BLASLONG inc_x2, inc_y2;
39 v4f32 x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, y4, y5, y6, y7;
40 v4f32 out0, out1, out2, out3, out4, out5, out6, out7;
41 v4f32 out8, out9, out10, out11, out12, out13, out14, out15, c0, s0;
43 if (n <= 0) return (0);
48 if ((1 == inc_x) && (1 == inc_y))
50 if ((0 == c) && (0 == s))
52 v4f32 zero = __msa_cast_to_vector_float(0);
53 zero = (v4f32) __msa_insert_w((v4i32) zero, 0, 0.0);
54 zero = (v4f32) __msa_insert_w((v4i32) zero, 1, 0.0);
55 zero = (v4f32) __msa_insert_w((v4i32) zero, 2, 0.0);
56 zero = (v4f32) __msa_insert_w((v4i32) zero, 3, 0.0);
58 /* process 2 elements */
59 for (j = (n >> 1); j--;)
75 else if ((1 == c) && (1 == s))
79 BLASLONG pref_offsetx, pref_offsety;
81 pref_offsetx = (BLASLONG)px & (L1_DATA_LINESIZE - 1);
84 pref_offsetx = L1_DATA_LINESIZE - pref_offsetx;
85 pref_offsetx = pref_offsetx / sizeof(FLOAT);
88 pref_offsety = (BLASLONG)py & (L1_DATA_LINESIZE - 1);
91 pref_offsety = L1_DATA_LINESIZE - pref_offsety;
92 pref_offsety = pref_offsety / sizeof(FLOAT);
95 x0 = LD_SP(px); px += 4;
96 x1 = LD_SP(px); px += 4;
97 x2 = LD_SP(px); px += 4;
98 x3 = LD_SP(px); px += 4;
99 y0 = LD_SP(py); py += 4;
100 y1 = LD_SP(py); py += 4;
101 y2 = LD_SP(py); py += 4;
102 y3 = LD_SP(py); py += 4;
104 for (j = (n >> 4) - 1; j--;)
106 PREFETCH(px + pref_offsetx + 32);
107 PREFETCH(px + pref_offsetx + 40);
108 PREFETCH(px + pref_offsetx + 48);
109 PREFETCH(px + pref_offsetx + 56);
110 PREFETCH(py + pref_offsety + 32);
111 PREFETCH(py + pref_offsety + 40);
112 PREFETCH(py + pref_offsety + 48);
113 PREFETCH(py + pref_offsety + 56);
116 x4 = LD_SP(px); px += 4;
118 x5 = LD_SP(px); px += 4;
120 x6 = LD_SP(px); px += 4;
122 x7 = LD_SP(px); px += 4;
124 y4 = LD_SP(py); py += 4;
126 y5 = LD_SP(py); py += 4;
128 y6 = LD_SP(py); py += 4;
130 y7 = LD_SP(py); py += 4;
132 ST_SP(out0, x); x += 4;
134 ST_SP(out1, y); y += 4;
136 ST_SP(out2, x); x += 4;
138 ST_SP(out3, y); y += 4;
140 ST_SP(out4, x); x += 4;
142 ST_SP(out5, y); y += 4;
144 ST_SP(out6, x); x += 4;
146 ST_SP(out7, y); y += 4;
149 x0 = LD_SP(px); px += 4;
150 ST_SP(out8, x); x += 4;
151 x1 = LD_SP(px); px += 4;
152 ST_SP(out10, x); x += 4;
153 x2 = LD_SP(px); px += 4;
154 ST_SP(out12, x); x += 4;
155 x3 = LD_SP(px); px += 4;
156 ST_SP(out14, x); x += 4;
158 y0 = LD_SP(py); py += 4;
159 ST_SP(out9, y); y += 4;
160 y1 = LD_SP(py); py += 4;
161 ST_SP(out11, y); y += 4;
162 y2 = LD_SP(py); py += 4;
163 ST_SP(out13, y); y += 4;
164 y3 = LD_SP(py); py += 4;
165 ST_SP(out15, y); y += 4;
168 x4 = LD_SP(px); px += 4;
169 x5 = LD_SP(px); px += 4;
170 x6 = LD_SP(px); px += 4;
171 x7 = LD_SP(px); px += 4;
172 y4 = LD_SP(py); py += 4;
173 y5 = LD_SP(py); py += 4;
174 y6 = LD_SP(py); py += 4;
175 y7 = LD_SP(py); py += 4;
194 ST_SP8_INC(out0, out2, out4, out6, out8, out10, out12, out14, x, 4);
195 ST_SP8_INC(out1, out3, out5, out7, out9, out11, out13, out15, y, 4);
199 LD_SP4_INC(px, 4, x0, x1, x2, x3);
200 LD_SP4_INC(py, 4, y0, y1, y2, y3);
211 ST_SP4_INC(out0, out2, out4, out6, x, 4);
212 ST_SP4_INC(out1, out3, out5, out7, y, 4);
216 LD_SP2_INC(px, 4, x0, x1);
217 LD_SP2_INC(py, 4, y0, y1);
224 ST_SP2_INC(out0, out2, x, 4);
225 ST_SP2_INC(out1, out3, y, 4);
244 LD_GP2_INC(px, 1, fx0, fx1);
245 LD_GP2_INC(py, 1, fy0, fy1);
252 ST_GP2_INC(tp0, tp2, x, 1);
253 ST_GP2_INC(tp1, tp3, y, 1);
259 c0 = COPY_FLOAT_TO_VECTOR(c);
263 BLASLONG pref_offsetx, pref_offsety;
265 pref_offsetx = (BLASLONG)px & (L1_DATA_LINESIZE - 1);
266 if (pref_offsetx > 0)
268 pref_offsetx = L1_DATA_LINESIZE - pref_offsetx;
269 pref_offsetx = pref_offsetx / sizeof(FLOAT);
272 pref_offsety = (BLASLONG)py & (L1_DATA_LINESIZE - 1);
273 if (pref_offsety > 0)
275 pref_offsety = L1_DATA_LINESIZE - pref_offsety;
276 pref_offsety = pref_offsety / sizeof(FLOAT);
279 LD_SP8_INC(px, 4, x0, x1, x2, x3, x4, x5, x6, x7);
281 for (j = (n >> 4) - 1; j--;)
283 PREFETCH(px + pref_offsetx + 32);
284 PREFETCH(px + pref_offsetx + 40);
285 PREFETCH(px + pref_offsetx + 48);
286 PREFETCH(px + pref_offsetx + 56);
287 PREFETCH(py + pref_offsety + 32);
288 PREFETCH(py + pref_offsety + 40);
289 PREFETCH(py + pref_offsety + 48);
290 PREFETCH(py + pref_offsety + 56);
292 y0 = LD_SP(py); py += 4;
294 y1 = LD_SP(py); py += 4;
296 y2 = LD_SP(py); py += 4;
298 y3 = LD_SP(py); py += 4;
300 y4 = LD_SP(py); py += 4;
302 y5 = LD_SP(py); py += 4;
304 y6 = LD_SP(py); py += 4;
306 y7 = LD_SP(py); py += 4;
309 ST_SP(x0, x); x += 4;
311 ST_SP(x1, x); x += 4;
313 ST_SP(x2, x); x += 4;
315 ST_SP(x3, x); x += 4;
317 ST_SP(x4, x); x += 4;
319 ST_SP(x5, x); x += 4;
321 ST_SP(x6, x); x += 4;
323 ST_SP(x7, x); x += 4;
326 x0 = LD_SP(px); px += 4;
327 ST_SP(y0, y); y += 4;
328 x1 = LD_SP(px); px += 4;
329 ST_SP(y1, y); y += 4;
330 x2 = LD_SP(px); px += 4;
331 ST_SP(y2, y); y += 4;
332 x3 = LD_SP(px); px += 4;
333 ST_SP(y3, y); y += 4;
334 x4 = LD_SP(px); px += 4;
335 ST_SP(y4, y); y += 4;
336 x5 = LD_SP(px); px += 4;
337 ST_SP(y5, y); y += 4;
338 x6 = LD_SP(px); px += 4;
339 ST_SP(y6, y); y += 4;
340 x7 = LD_SP(px); px += 4;
341 ST_SP(y7, y); y += 4;
344 LD_SP8_INC(py, 4, y0, y1, y2, y3, y4, y5, y6, y7);
363 ST_SP8_INC(x0, x1, x2, x3, x4, x5, x6, x7, x, 4);
364 ST_SP8_INC(y0, y1, y2, y3, y4, y5, y6, y7, y, 4);
368 LD_SP4_INC(px, 4, x0, x1, x2, x3);
369 LD_SP4_INC(py, 4, y0, y1, y2, y3);
380 ST_SP4_INC(x0, x1, x2, x3, x, 4);
381 ST_SP4_INC(y0, y1, y2, y3, y, 4);
385 LD_SP2_INC(px, 4, x0, x1);
386 LD_SP2_INC(py, 4, y0, y1);
393 ST_SP2_INC(x0, x1, x, 4);
394 ST_SP2_INC(y0, y1, y, 4);
413 LD_GP2_INC(px, 1, fx0, fx1);
414 LD_GP2_INC(py, 1, fy0, fy1);
421 ST_GP2_INC(tp0, tp2, x, 1);
422 ST_GP2_INC(tp1, tp3, y, 1);
427 s0 = COPY_FLOAT_TO_VECTOR(s);
429 /* process 16 floats */
432 BLASLONG pref_offsetx, pref_offsety;
434 pref_offsetx = (BLASLONG)px & (L1_DATA_LINESIZE - 1);
435 if (pref_offsetx > 0)
437 pref_offsetx = L1_DATA_LINESIZE - pref_offsetx;
438 pref_offsetx = pref_offsetx / sizeof(FLOAT);
441 pref_offsety = (BLASLONG)py & (L1_DATA_LINESIZE - 1);
442 if (pref_offsety > 0)
444 pref_offsety = L1_DATA_LINESIZE - pref_offsety;
445 pref_offsety = pref_offsety / sizeof(FLOAT);
448 LD_SP4_INC(px, 4, x0, x1, x2, x3);
449 LD_SP4_INC(py, 4, y0, y1, y2, y3);
451 for (j = (n >> 4) - 1; j--;)
453 PREFETCH(px + pref_offsetx + 32);
454 PREFETCH(px + pref_offsetx + 40);
455 PREFETCH(px + pref_offsetx + 48);
456 PREFETCH(px + pref_offsetx + 56);
457 PREFETCH(py + pref_offsety + 32);
458 PREFETCH(py + pref_offsety + 40);
459 PREFETCH(py + pref_offsety + 48);
460 PREFETCH(py + pref_offsety + 56);
462 x4 = LD_SP(px); px += 4;
464 x5 = LD_SP(px); px += 4;
466 x6 = LD_SP(px); px += 4;
468 x7 = LD_SP(px); px += 4;
470 y4 = LD_SP(py); py += 4;
472 y5 = LD_SP(py); py += 4;
474 y6 = LD_SP(py); py += 4;
476 y7 = LD_SP(py); py += 4;
479 ST_SP(out0, x); x += 4;
481 ST_SP(out2, x); x += 4;
483 ST_SP(out4, x); x += 4;
485 ST_SP(out6, x); x += 4;
487 ST_SP(out1, y); y += 4;
489 ST_SP(out3, y); y += 4;
491 ST_SP(out5, y); y += 4;
493 ST_SP(out7, y); y += 4;
496 x0 = LD_SP(px); px += 4;
497 ST_SP(out0, x); x += 4;
498 x1 = LD_SP(px); px += 4;
499 ST_SP(out2, x); x += 4;
500 x2 = LD_SP(px); px += 4;
501 ST_SP(out4, x); x += 4;
502 x3 = LD_SP(px); px += 4;
503 ST_SP(out6, x); x += 4;
504 y0 = LD_SP(py); py += 4;
505 ST_SP(out1, y); y += 4;
506 y1 = LD_SP(py); py += 4;
507 ST_SP(out3, y); y += 4;
508 y2 = LD_SP(py); py += 4;
509 ST_SP(out5, y); y += 4;
510 y3 = LD_SP(py); py += 4;
511 ST_SP(out7, y); y += 4;
523 ST_SP4_INC(out0, out2, out4, out6, x, 4);
524 ST_SP4_INC(out1, out3, out5, out7, y, 4);
526 LD_SP4_INC(px, 4, x4, x5, x6, x7);
527 LD_SP4_INC(py, 4, y4, y5, y6, y7);
538 ST_SP4_INC(out0, out2, out4, out6, x, 4);
539 ST_SP4_INC(out1, out3, out5, out7, y, 4);
543 LD_SP4_INC(px, 4, x0, x1, x2, x3);
544 LD_SP4_INC(py, 4, y0, y1, y2, y3);
555 ST_SP4_INC(out0, out2, out4, out6, x, 4);
556 ST_SP4_INC(out1, out3, out5, out7, y, 4);
560 LD_SP2_INC(px, 4, x0, x1);
561 LD_SP2_INC(py, 4, y0, y1);
568 ST_SP2_INC(out0, out2, x, 4);
569 ST_SP2_INC(out1, out3, y, 4);
573 x0 = LD_SP(px); px += 4;
574 y0 = LD_SP(py); py += 4;
579 ST_SP(out0, x); x += 4;
580 ST_SP(out1, y); y += 4;
584 LD_GP2_INC(px, 1, fx0, fx1);
585 LD_GP2_INC(py, 1, fy0, fy1);
592 ST_GP2_INC(tp0, tp2, x, 1);
593 ST_GP2_INC(tp1, tp3, y, 1);
598 c0 = COPY_FLOAT_TO_VECTOR(c);
599 s0 = COPY_FLOAT_TO_VECTOR(s);
603 BLASLONG pref_offsetx, pref_offsety;
605 pref_offsetx = (BLASLONG)px & (L1_DATA_LINESIZE - 1);
606 if (pref_offsetx > 0)
608 pref_offsetx = L1_DATA_LINESIZE - pref_offsetx;
609 pref_offsetx = pref_offsetx / sizeof(FLOAT);
612 pref_offsety = (BLASLONG)py & (L1_DATA_LINESIZE - 1);
613 if (pref_offsety > 0)
615 pref_offsety = L1_DATA_LINESIZE - pref_offsety;
616 pref_offsety = pref_offsety / sizeof(FLOAT);
619 LD_SP4_INC(px, 4, x0, x1, x2, x3);
620 LD_SP4_INC(py, 4, y0, y1, y2, y3);
622 for (j = (n >> 4) - 1; j--;)
624 PREFETCH(px + pref_offsetx + 32);
625 PREFETCH(px + pref_offsetx + 40);
626 PREFETCH(px + pref_offsetx + 48);
627 PREFETCH(px + pref_offsetx + 56);
628 PREFETCH(py + pref_offsety + 32);
629 PREFETCH(py + pref_offsety + 40);
630 PREFETCH(py + pref_offsety + 48);
631 PREFETCH(py + pref_offsety + 56);
633 x4 = LD_SP(px); px += 4;
635 x5 = LD_SP(px); px += 4;
637 x6 = LD_SP(px); px += 4;
639 x7 = LD_SP(px); px += 4;
641 y4 = LD_SP(py); py += 4;
643 y5 = LD_SP(py); py += 4;
645 y6 = LD_SP(py); py += 4;
647 y7 = LD_SP(py); py += 4;
659 ST_SP(out0, x); x += 4;
661 ST_SP(out2, x); x += 4;
663 ST_SP(out4, x); x += 4;
665 ST_SP(out6, x); x += 4;
667 ST_SP(out1, y); y += 4;
669 ST_SP(out3, y); y += 4;
671 ST_SP(out5, y); y += 4;
673 ST_SP(out7, y); y += 4;
676 x0 = LD_SP(px); px += 4;
678 x1 = LD_SP(px); px += 4;
680 x2 = LD_SP(px); px += 4;
682 x3 = LD_SP(px); px += 4;
684 y0 = LD_SP(py); py += 4;
686 y1 = LD_SP(py); py += 4;
688 y2 = LD_SP(py); py += 4;
690 y3 = LD_SP(py); py += 4;
693 ST_SP(out8, x); x += 4;
694 ST_SP(out10, x); x += 4;
695 ST_SP(out12, x); x += 4;
696 ST_SP(out14, x); x += 4;
697 ST_SP(out9, y); y += 4;
698 ST_SP(out11, y); y += 4;
699 ST_SP(out13, y); y += 4;
700 ST_SP(out15, y); y += 4;
720 ST_SP4_INC(out0, out2, out4, out6, x, 4);
721 ST_SP4_INC(out1, out3, out5, out7, y, 4);
723 LD_SP4_INC(px, 4, x4, x5, x6, x7);
724 LD_SP4_INC(py, 4, y4, y5, y6, y7);
743 ST_SP4_INC(out8, out10, out12, out14, x, 4);
744 ST_SP4_INC(out9, out11, out13, out15, y, 4);
748 LD_SP4_INC(px, 4, x0, x1, x2, x3);
749 LD_SP4_INC(py, 4, y0, y1, y2, y3);
751 out0 = (c0 * x0) + (s0 * y0);
752 out1 = (c0 * y0) - (s0 * x0);
753 out2 = (c0 * x1) + (s0 * y1);
754 out3 = (c0 * y1) - (s0 * x1);
755 out4 = (c0 * x2) + (s0 * y2);
756 out5 = (c0 * y2) - (s0 * x2);
757 out6 = (c0 * x3) + (s0 * y3);
758 out7 = (c0 * y3) - (s0 * x3);
760 ST_SP4_INC(out0, out2, out4, out6, x, 4);
761 ST_SP4_INC(out1, out3, out5, out7, y, 4);
765 LD_SP2_INC(px, 4, x0, x1);
766 LD_SP2_INC(py, 4, y0, y1);
768 out0 = (c0 * x0) + (s0 * y0);
769 out1 = (c0 * y0) - (s0 * x0);
770 out2 = (c0 * x1) + (s0 * y1);
771 out3 = (c0 * y1) - (s0 * x1);
773 ST_SP2_INC(out0, out2, x, 4);
774 ST_SP2_INC(out1, out3, y, 4);
783 out0 = (c0 * x0) + (s0 * y0);
784 out1 = (c0 * y0) - (s0 * x0);
793 LD_GP2_INC(px, 1, fx0, fx1);
794 LD_GP2_INC(py, 1, fy0, fy1);
796 tp0 = (c * fx0) + (s * fy0);
797 tp1 = (c * fy0) - (s * fx0);
798 tp2 = (c * fx1) + (s * fy1);
799 tp3 = (c * fy1) - (s * fx1);
801 ST_GP2_INC(tp0, tp2, x, 1);
802 ST_GP2_INC(tp1, tp3, y, 1);
811 if ((0 == c) && (0 == s))
824 else if ((1 == c) && (1 == s))
829 fx1 = *(px+1); px += inc_x2;
831 fx3 = *(px+1); px += inc_x2;
834 fy1 = *(py+1); py += inc_y2;
836 fy3 = *(py+1); py += inc_y2;
838 for (i = (n >> 1) - 1; i--;)
851 fx1 = *(px+1); px += inc_x2;
852 *(x+1) = tp1; x += inc_x2;
855 fx3 = *(px+1); px += inc_x2;
856 *(x+1) = tp5; x += inc_x2;
860 fy1 = *(py+1); py += inc_y2;
861 *(y+1) = tp3; y += inc_y2;
864 fy3 = *(py+1); py += inc_y2;
865 *(y+1) = tp7; y += inc_y2;
878 *(x+1) = tp1; x += inc_x2;
880 *(x+1) = tp5; x += inc_x2;
883 *(y+1) = tp3; y += inc_y2;
885 *(y+1) = tp7; y += inc_y2;
912 fx1 = *(px+1); px += inc_x2;
914 fx3 = *(px+1); px += inc_x2;
917 fy1 = *(py+1); py += inc_y2;
919 fy3 = *(py+1); py += inc_y2;
921 for (i = (n >> 1) - 1; i--;)
934 fx1 = *(px+1); px += inc_x2;
935 *(x+1) = tp1; x += inc_x2;
938 fx3 = *(px+1); px += inc_x2;
939 *(x+1) = tp3; x += inc_x2;
942 fy1 = *(py+1); py += inc_y2;
943 *(y+1) = tp5; y += inc_y2;
946 fy3 = *(py+1); py += inc_y2;
947 *(y+1) = tp7; y += inc_y2;
960 *(x+1) = tp1; x += inc_x2;
962 *(x+1) = tp3; x += inc_x2;
965 *(y+1) = tp5; y += inc_y2;
967 *(y+1) = tp7; y += inc_y2;
994 fx1 = *(px+1); px += inc_x2;
996 fx3 = *(px+1); px += inc_x2;
998 fy1 = *(py+1); py += inc_y2;
1000 fy3 = *(py+1); py += inc_y2;
1002 for (i = (n >> 1) - 1; i--;)
1004 tp0 = c * fx0 + s * fy0;
1005 tp1 = c * fx1 + s * fy1;
1006 tp2 = c * fy0 - s * fx0;
1007 tp3 = c * fy1 - s * fx1;
1008 tp4 = c * fx2 + s * fy2;
1009 tp5 = c * fx3 + s * fy3;
1010 tp6 = c * fy2 - s * fx2;
1011 tp7 = c * fy3 - s * fx3;
1015 fx1 = *(px+1); px += inc_x2;
1016 *(x+1) = tp1; x += inc_x2;
1019 fx3 = *(px+1); px += inc_x2;
1020 *(x+1) = tp5; x += inc_x2;
1023 fy1 = *(py+1); py += inc_y2;
1024 *(y+1) = tp3; y += inc_y2;
1027 fy3 = *(py+1); py += inc_y2;
1028 *(y+1) = tp7; y += inc_y2;
1031 tp0 = c * fx0 + s * fy0;
1032 tp1 = c * fx1 + s * fy1;
1033 tp2 = c * fy0 - s * fx0;
1034 tp3 = c * fy1 - s * fx1;
1035 tp4 = c * fx2 + s * fy2;
1036 tp5 = c * fx3 + s * fy3;
1037 tp6 = c * fy2 - s * fx2;
1038 tp7 = c * fy3 - s * fx3;
1041 *(x+1) = tp1; x += inc_x2;
1043 *(x+1) = tp5; x += inc_x2;
1045 *(y+1) = tp3; y += inc_y2;
1047 *(y+1) = tp7; y += inc_y2;
1057 tp0 = c * fx0 + s * fy0;
1058 tp1 = c * fx1 + s * fy1;
1059 tp2 = c * fy0 - s * fx0;
1060 tp3 = c * fy1 - s * fx1;