\r
/*********************************************************************\r
*\r
-* 2013/10/18 Saar\r
+* 2013/10/31 Saar\r
* BLASTEST : OK\r
* CTEST : OK\r
* TEST : OK\r
*\r
*\r
-* 2013/10/18 Saar\r
+* 2013/10/31 Saar\r
*\r
* Parameter:\r
* UNROLL_M 8\r
* UNROLL_N 2\r
-* DGEMM_P 384\r
+* DGEMM_P 768\r
* DGEMM_Q 168\r
* DGEMM_R 12288\r
-* A_PR1 256\r
+* A_PR1 512\r
+* B_PR1 256\r
*\r
* Performance at m x n on AMD 8320 (ACML-Version: 5.3.1):\r
* \r
-* 6144x6912 84.1 GFLOPS with 8 threads on 4 modules (ACML: 81.4 GFLOPS)\r
-* 6144x6912 81.2 GFLOPS with 4 threads on 4 modules (ACML: 81.3 GFLOPS)\r
-* 6144x6912 40.9 GFLOPS with 2 threads on 2 modules (ACML: 41.8 GFLOPS)\r
-* 6144x6912 20.5 GFLOPS with 1 threads on 1 modules (ACML: 21.0 GFLOPS)\r
+* 4608x4608 83.9 GFLOPS with 8 threads on 4 modules (ACML: 78.4 GFLOPS)\r
+* 4608x4608 80.9 GFLOPS with 4 threads on 4 modules (ACML: 78.4 GFLOPS)\r
+* 4608x4608 41.3 GFLOPS with 2 threads on 2 modules (ACML: 40.9 GFLOPS)\r
+* 4608x4608 20.7 GFLOPS with 1 threads on 1 modules (ACML: 20.8 GFLOPS)\r
*\r
* Performance at m x n on AMD 6380 (ACML-Version: 5.3.1):\r
* \r
-* 12288x13824 244.5 GFLOPS with 32 threads on 16 modules (ACML: 120.3 GFLOPS) !strange thermal behavior\r
-* 12288x13824 233.9 GFLOPS with 16 threads on 16 modules (ACML: 129.5 GFLOPS) !strange thermal behavior\r
-* 12288x13824 138.1 GFLOPS with 8 threads on 8 modules (ACML: 106.5 GFLOPS)\r
-* 6144x6912 73.6 GFLOPS with 4 threads on 4 modules (ACML: 59.4 GFLOPS)\r
-* 6144x6912 36.8 GFLOPS with 2 threads on 2 modules (ACML: 34.9 GFLOPS)\r
-* 6144x6912 18.7 GFLOPS with 1 threads on 1 modules (ACML: 18.7 GFLOPS)\r
+* 13824x13824 234.5 GFLOPS with 32 threads on 16 modules (ACML: 88.5 GFLOPS) !strange thermal behavior\r
+* 13824x13824 241.9 GFLOPS with 16 threads on 16 modules (ACML: 191.5 GFLOPS) !strange thermal behavior\r
+* 9216x9216 137.6 GFLOPS with 8 threads on 8 modules (ACML: 106.5 GFLOPS)\r
+* 4608x4608 75.7 GFLOPS with 4 threads on 4 modules (ACML: 56.3 GFLOPS)\r
+* 4608x4608 38.6 GFLOPS with 2 threads on 2 modules (ACML: 34.1 GFLOPS)\r
+* 4608x4608 19.6 GFLOPS with 1 threads on 1 modules (ACML: 18.3 GFLOPS)\r
*\r
*********************************************************************/\r
\r
\r
\r
\r
-#define A_PR1 256\r
+#define A_PR1 512\r
#define B_PR1 256\r
-#define C_PR1 256\r
+#define C_PR1 64\r
\r
.macro INIT8x3\r
vxorpd %xmm4 , %xmm4 , %xmm4\r
.macro SAVE8x3\r
vmovddup ALPHA, %xmm0\r
\r
- prefetcht0 C_PR1(CO1)\r
- prefetcht0 C_PR1(CO1,LDC)\r
- prefetcht0 C_PR1(CO1,LDC,2)\r
\r
vfmaddpd (CO1),%xmm0, %xmm4,%xmm4\r
vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5\r
vmovups %xmm12, 4 * SIZE(CO1, LDC, 2)\r
vmovups %xmm15, 6 * SIZE(CO1, LDC, 2)\r
\r
+ prefetcht0 C_PR1(CO1)\r
+ prefetcht0 C_PR1(CO1,LDC)\r
+ prefetcht0 C_PR1(CO1,LDC,2)\r
+\r
addq $8 * SIZE, CO1 # coffset += 8\r
.endm\r
\r
cmpq $3, %rax\r
jl .L6_13\r
\r
+ prefetcht0 B_PR1(BO)\r
+ prefetcht0 B_PR1+64(BO)\r
+ prefetcht0 B_PR1+128(BO)\r
KERNEL8x3_INIT\r
KERNEL8x3_M2\r
KERNEL8x3_M3\r
\r
.L6_12:\r
\r
+ prefetcht0 B_PR1-24(BO)\r
+ prefetcht0 B_PR1+40(BO)\r
KERNEL8x3_M1\r
KERNEL8x3_M2\r
KERNEL8x3_M3\r
KERNEL8x3_M4\r
KERNEL8x3_M5\r
+ prefetcht0 B_PR1+104(BO)\r
KERNEL8x3_M6\r
KERNEL8x3_M7\r
KERNEL8x3_M8\r
\r
dec %rax\r
- //je .L6_12_E\r
-\r
jne .L6_12\r
\r
.L6_12_E:\r
\r
+ prefetcht0 B_PR1(BO)\r
+ prefetcht0 B_PR1+64(BO)\r
KERNEL8x3_M1\r
KERNEL8x3_M2\r
KERNEL8x3_M3\r
\r
.L6_22:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x3_1(xxx)\r
KERNEL4x3_2(xxx)\r
KERNEL4x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL4x3_4(xxx)\r
\r
KERNEL4x3_1(xxx)\r
KERNEL4x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL4x3_3(xxx)\r
KERNEL4x3_4(xxx)\r
\r
je .L6_26\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x3_1(xxx)\r
KERNEL4x3_2(xxx)\r
KERNEL4x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL4x3_4(xxx)\r
\r
KERNEL4x3_1(xxx)\r
KERNEL4x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL4x3_3(xxx)\r
KERNEL4x3_4(xxx)\r
\r
\r
.L6_32:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x3_1(xxx)\r
KERNEL2x3_2(xxx)\r
KERNEL2x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL2x3_4(xxx)\r
\r
KERNEL2x3_1(xxx)\r
KERNEL2x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL2x3_3(xxx)\r
KERNEL2x3_4(xxx)\r
\r
je .L6_36\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x3_1(xxx)\r
KERNEL2x3_2(xxx)\r
KERNEL2x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL2x3_4(xxx)\r
\r
KERNEL2x3_1(xxx)\r
KERNEL2x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL2x3_3(xxx)\r
KERNEL2x3_4(xxx)\r
\r
\r
.L6_42:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x3_1(xxx)\r
KERNEL1x3_2(xxx)\r
KERNEL1x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL1x3_4(xxx)\r
\r
KERNEL1x3_1(xxx)\r
KERNEL1x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL1x3_3(xxx)\r
KERNEL1x3_4(xxx)\r
\r
je .L6_46\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x3_1(xxx)\r
KERNEL1x3_2(xxx)\r
KERNEL1x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL1x3_4(xxx)\r
\r
KERNEL1x3_1(xxx)\r
KERNEL1x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL1x3_3(xxx)\r
KERNEL1x3_4(xxx)\r
\r
cmpq $3, %rax\r
jl .L7_13\r
\r
+ prefetcht0 B_PR1(BO)\r
+ prefetcht0 B_PR1+64(BO)\r
+ prefetcht0 B_PR1+128(BO)\r
KERNEL8x3_INIT\r
KERNEL8x3_M2\r
KERNEL8x3_M3\r
\r
.L7_12:\r
\r
+ prefetcht0 B_PR1-24(BO)\r
+ prefetcht0 B_PR1+40(BO)\r
KERNEL8x3_M1\r
KERNEL8x3_M2\r
KERNEL8x3_M3\r
KERNEL8x3_M4\r
+ prefetcht0 B_PR1+104(BO)\r
KERNEL8x3_M5\r
KERNEL8x3_M6\r
KERNEL8x3_M7\r
KERNEL8x3_M8\r
\r
dec %rax\r
- //je .L7_12_E\r
-\r
jne .L7_12\r
\r
.L7_12_E:\r
\r
+ prefetcht0 B_PR1(BO)\r
+ prefetcht0 B_PR1+64(BO)\r
KERNEL8x3_M1\r
KERNEL8x3_M2\r
KERNEL8x3_M3\r
\r
.L7_22:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x3_1(xxx)\r
KERNEL4x3_2(xxx)\r
KERNEL4x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL4x3_4(xxx)\r
\r
KERNEL4x3_1(xxx)\r
KERNEL4x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL4x3_3(xxx)\r
KERNEL4x3_4(xxx)\r
\r
je .L7_26\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x3_1(xxx)\r
KERNEL4x3_2(xxx)\r
KERNEL4x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL4x3_4(xxx)\r
\r
KERNEL4x3_1(xxx)\r
KERNEL4x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL4x3_3(xxx)\r
KERNEL4x3_4(xxx)\r
\r
\r
.L7_32:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x3_1(xxx)\r
KERNEL2x3_2(xxx)\r
KERNEL2x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL2x3_4(xxx)\r
\r
KERNEL2x3_1(xxx)\r
KERNEL2x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL2x3_3(xxx)\r
KERNEL2x3_4(xxx)\r
\r
je .L7_36\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x3_1(xxx)\r
KERNEL2x3_2(xxx)\r
KERNEL2x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL2x3_4(xxx)\r
\r
KERNEL2x3_1(xxx)\r
KERNEL2x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL2x3_3(xxx)\r
KERNEL2x3_4(xxx)\r
\r
\r
.L7_42:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x3_1(xxx)\r
KERNEL1x3_2(xxx)\r
KERNEL1x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL1x3_4(xxx)\r
\r
KERNEL1x3_1(xxx)\r
KERNEL1x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL1x3_3(xxx)\r
KERNEL1x3_4(xxx)\r
\r
je .L7_46\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x3_1(xxx)\r
KERNEL1x3_2(xxx)\r
KERNEL1x3_3(xxx)\r
- //prefetcht0 B_PR1+64(BO,BI,8)\r
KERNEL1x3_4(xxx)\r
\r
KERNEL1x3_1(xxx)\r
KERNEL1x3_2(xxx)\r
- //prefetcht0 B_PR1+32(BO,BI,8)\r
KERNEL1x3_3(xxx)\r
KERNEL1x3_4(xxx)\r
\r
\r
.L2_12:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x2_1(xxx)\r
KERNEL8x2_2(xxx)\r
KERNEL8x2_3(xxx)\r
KERNEL8x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x2_1(xxx)\r
KERNEL8x2_2(xxx)\r
KERNEL8x2_3(xxx)\r
\r
je .L2_16\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x2_1(xxx)\r
KERNEL8x2_2(xxx)\r
KERNEL8x2_3(xxx)\r
KERNEL8x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x2_1(xxx)\r
KERNEL8x2_2(xxx)\r
KERNEL8x2_3(xxx)\r
\r
.L2_22:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x2_1(xxx)\r
KERNEL4x2_2(xxx)\r
KERNEL4x2_3(xxx)\r
KERNEL4x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x2_1(xxx)\r
KERNEL4x2_2(xxx)\r
KERNEL4x2_3(xxx)\r
\r
je .L2_26\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x2_1(xxx)\r
KERNEL4x2_2(xxx)\r
KERNEL4x2_3(xxx)\r
KERNEL4x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x2_1(xxx)\r
KERNEL4x2_2(xxx)\r
KERNEL4x2_3(xxx)\r
\r
.L2_32:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x2_1(xxx)\r
KERNEL2x2_2(xxx)\r
KERNEL2x2_3(xxx)\r
KERNEL2x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x2_1(xxx)\r
KERNEL2x2_2(xxx)\r
KERNEL2x2_3(xxx)\r
\r
je .L2_36\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x2_1(xxx)\r
KERNEL2x2_2(xxx)\r
KERNEL2x2_3(xxx)\r
KERNEL2x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x2_1(xxx)\r
KERNEL2x2_2(xxx)\r
KERNEL2x2_3(xxx)\r
\r
.L2_42:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x2_1(xxx)\r
KERNEL1x2_2(xxx)\r
KERNEL1x2_3(xxx)\r
KERNEL1x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x2_1(xxx)\r
KERNEL1x2_2(xxx)\r
KERNEL1x2_3(xxx)\r
\r
je .L2_46\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x2_1(xxx)\r
KERNEL1x2_2(xxx)\r
KERNEL1x2_3(xxx)\r
KERNEL1x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x2_1(xxx)\r
KERNEL1x2_2(xxx)\r
KERNEL1x2_3(xxx)\r
\r
.L1_12:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x1_1(xxx)\r
KERNEL8x1_2(xxx)\r
KERNEL8x1_3(xxx)\r
\r
je .L1_16\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x1_1(xxx)\r
KERNEL8x1_2(xxx)\r
KERNEL8x1_3(xxx)\r
\r
.L1_22:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x1_1(xxx)\r
KERNEL4x1_2(xxx)\r
KERNEL4x1_3(xxx)\r
\r
je .L1_26\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x1_1(xxx)\r
KERNEL4x1_2(xxx)\r
KERNEL4x1_3(xxx)\r
\r
.L1_32:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x1_1(xxx)\r
KERNEL2x1_2(xxx)\r
KERNEL2x1_3(xxx)\r
\r
.L1_42:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x1_1(xxx)\r
KERNEL1x1_2(xxx)\r
KERNEL1x1_3(xxx)\r
\r
je .L1_46\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x1_1(xxx)\r
KERNEL1x1_2(xxx)\r
KERNEL1x1_3(xxx)\r
\r
.L2_12:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x2_1(xxx)\r
KERNEL8x2_2(xxx)\r
KERNEL8x2_3(xxx)\r
KERNEL8x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x2_1(xxx)\r
KERNEL8x2_2(xxx)\r
KERNEL8x2_3(xxx)\r
\r
je .L2_16\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x2_1(xxx)\r
KERNEL8x2_2(xxx)\r
KERNEL8x2_3(xxx)\r
KERNEL8x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x2_1(xxx)\r
KERNEL8x2_2(xxx)\r
KERNEL8x2_3(xxx)\r
\r
.L2_22:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x2_1(xxx)\r
KERNEL4x2_2(xxx)\r
KERNEL4x2_3(xxx)\r
KERNEL4x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x2_1(xxx)\r
KERNEL4x2_2(xxx)\r
KERNEL4x2_3(xxx)\r
\r
je .L2_26\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x2_1(xxx)\r
KERNEL4x2_2(xxx)\r
KERNEL4x2_3(xxx)\r
KERNEL4x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x2_1(xxx)\r
KERNEL4x2_2(xxx)\r
KERNEL4x2_3(xxx)\r
\r
.L2_32:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x2_1(xxx)\r
KERNEL2x2_2(xxx)\r
KERNEL2x2_3(xxx)\r
KERNEL2x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x2_1(xxx)\r
KERNEL2x2_2(xxx)\r
KERNEL2x2_3(xxx)\r
\r
je .L2_36\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x2_1(xxx)\r
KERNEL2x2_2(xxx)\r
KERNEL2x2_3(xxx)\r
KERNEL2x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x2_1(xxx)\r
KERNEL2x2_2(xxx)\r
KERNEL2x2_3(xxx)\r
\r
.L2_42:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x2_1(xxx)\r
KERNEL1x2_2(xxx)\r
KERNEL1x2_3(xxx)\r
KERNEL1x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x2_1(xxx)\r
KERNEL1x2_2(xxx)\r
KERNEL1x2_3(xxx)\r
\r
je .L2_46\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x2_1(xxx)\r
KERNEL1x2_2(xxx)\r
KERNEL1x2_3(xxx)\r
KERNEL1x2_4(xxx)\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x2_1(xxx)\r
KERNEL1x2_2(xxx)\r
KERNEL1x2_3(xxx)\r
\r
.L1_12:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x1_1(xxx)\r
KERNEL8x1_2(xxx)\r
KERNEL8x1_3(xxx)\r
\r
je .L1_16\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL8x1_1(xxx)\r
KERNEL8x1_2(xxx)\r
KERNEL8x1_3(xxx)\r
\r
.L1_22:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x1_1(xxx)\r
KERNEL4x1_2(xxx)\r
KERNEL4x1_3(xxx)\r
\r
je .L1_26\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL4x1_1(xxx)\r
KERNEL4x1_2(xxx)\r
KERNEL4x1_3(xxx)\r
\r
.L1_32:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL2x1_1(xxx)\r
KERNEL2x1_2(xxx)\r
KERNEL2x1_3(xxx)\r
\r
.L1_42:\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x1_1(xxx)\r
KERNEL1x1_2(xxx)\r
KERNEL1x1_3(xxx)\r
\r
je .L1_46\r
\r
- //prefetcht0 B_PR1(BO,BI,8)\r
KERNEL1x1_1(xxx)\r
KERNEL1x1_2(xxx)\r
KERNEL1x1_3(xxx)\r