예제 #1
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string initInstrs = "  vmovups ymm1, [r8]\n" +
                                "  vmovaps ymm0, ymm1\n" +
                                "  vmovaps ymm0, ymm2\n" +
                                "  vaddps ymm3, ymm1, ymm2\n" +
                                "  vaddps ymm4, ymm1, ymm3\n" +
                                "  vaddps ymm5, ymm1, ymm4\n" +
                                "  vaddps ymm6, ymm1, ymm5\n" +
                                "  vaddps ymm7, ymm1, ymm1\n" +
                                "  vaddps ymm8, ymm1, ymm2\n" +
                                "  vaddps ymm9, ymm1, ymm3\n" +
                                "  vaddps ymm10, ymm2, ymm4\n" +
                                "  vaddps ymm11, ymm2, ymm5\n" +
                                "  vaddps ymm12, ymm2, ymm1\n" +
                                "  vaddps ymm13, ymm2, ymm2\n" +
                                "  vaddps ymm14, ymm2, ymm3\n" +
                                "  vaddps ymm15, ymm2, ymm4\n";

            string postLoadInstr = "  vaddps ymm3, ymm1, ymm2";

            string[] unrolledAdds = new string[11];
            unrolledAdds[0]  = "  add r8, r11";
            unrolledAdds[1]  = "  add r14, r11";
            unrolledAdds[2]  = "  add r13, r11";
            unrolledAdds[3]  = "  add r12, r11";
            unrolledAdds[4]  = "  add r11, r11";
            unrolledAdds[5]  = "  add r8, r11";
            unrolledAdds[6]  = "  add r15, r11";
            unrolledAdds[7]  = "  add r14, r11";
            unrolledAdds[8]  = "  add r13, r11";
            unrolledAdds[9]  = "  add r12, r11";
            unrolledAdds[10] = "  add r8, r11";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledAdds, unrolledAdds, true, initInstrs: initInstrs, postLoadInstrs1: postLoadInstr, postLoadInstrs2: postLoadInstr);
        }
예제 #2
0
 public override void GenerateX86NasmAsm(StringBuilder sb)
 {
     string[] setMxcsrInstrs = new string[2];
     setMxcsrInstrs[0] = "  mov r15, 0x1f80\n  mov [r8], r15\n  ldmxcsr [r8]\n  addss xmm0, xmm1"; // default
     setMxcsrInstrs[1] = "  mov r15, 0x9fc0\n  mov [r8], r15\n  ldmxcsr [r8]\n  addss xmm0, xmm1"; // set denormals are zero, flush to zero
     UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, setMxcsrInstrs, setMxcsrInstrs, false);
 }
예제 #3
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string postLoadInstr1 = "  mov r15, rdi";
            string postLoadInstr2 = "  mov r15, rsi";

            string[] rors = new string[1];
            rors[0] = "  ror r15, 1";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, rors, rors, false, postLoadInstrs1: postLoadInstr1, postLoadInstrs2: postLoadInstr2);
        }
예제 #4
0
 public override void GenerateX86NasmAsm(StringBuilder sb)
 {
     string[] instrs = new string[4];
     instrs[0] = "  mov [r8], r15";
     instrs[1] = "  mov r14, [rdx]";
     instrs[2] = "  mov [r8], r13";
     instrs[3] = "  mov r12, [rdx]";
     UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, instrs, instrs, true);
 }
예제 #5
0
 public override void GenerateX86NasmAsm(StringBuilder sb)
 {
     string[] unrolledAdds = new string[4];
     unrolledAdds[0] = "  kaddb k1, k1, k0";
     unrolledAdds[1] = "  kaddb k2, k2, k0";
     unrolledAdds[2] = "  kaddb k3, k3, k0";
     unrolledAdds[3] = "  kaddb k4, k4, k0";
     UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledAdds, unrolledAdds, false);
 }
예제 #6
0
 public override void GenerateX86NasmAsm(StringBuilder sb)
 {
     string[] unrolledLoads = new string[4];
     unrolledLoads[0] = "  mov [r8], r15";
     unrolledLoads[1] = "  mov [r8], r14";
     unrolledLoads[2] = "  mov [r8], r13";
     unrolledLoads[3] = "  mov [r8], r12";
     UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledLoads, unrolledLoads, true);
 }
예제 #7
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string[] unrolledJumps = new string[1];
            unrolledJumps[0] = "  cmp rdi, rsi\n  je jumpsched_reallybadthing";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledJumps, unrolledJumps, false);

            sb.AppendLine("jumpsched_reallybadthing:");
            sb.AppendLine("  int3");
        }
예제 #8
0
 public override void GenerateX86NasmAsm(StringBuilder sb)
 {
     string[] unrolledAdds = new string[4];
     unrolledAdds[0] = "  add r15, r11";
     unrolledAdds[1] = "  add r14, r11";
     unrolledAdds[2] = "  add r13, r11";
     unrolledAdds[3] = "  add r12, r11";
     UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledAdds, unrolledAdds, true);
 }
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string postLoadInstr1 = "  movq xmm0, rdi\n  pshufd xmm0, xmm0, 0\n";
            string postLoadInstr2 = "  movq xmm0, rsi\n  pshufd xmm0, xmm0, 0\n";

            string[] unrolledAdds = new string[4];
            unrolledAdds[0] = "  paddd xmm1, xmm0";
            unrolledAdds[1] = "  paddd xmm2, xmm0";
            unrolledAdds[2] = "  paddd xmm3, xmm0";
            unrolledAdds[3] = "  paddd xmm4, xmm0";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledAdds, unrolledAdds, postLoadInstrs1: postLoadInstr1, postLoadInstrs2: postLoadInstr2);
        }
예제 #10
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string postLoadInstr1 = "  mov r15, rdi";
            string postLoadInstr2 = "  mov r15, rsi";

            string[] instrs = new string[2];
            instrs[0] = "  bts r15, rdi";
            instrs[1] = "  imul r12d, edi";
            string[] instrs1 = new string[2];
            instrs1[0] = "  bts r15, rsi";
            instrs1[1] = "  imul r11d, esi";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, instrs, instrs1, false, postLoadInstrs1: postLoadInstr1, postLoadInstrs2: postLoadInstr2);
        }
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string initInstrs     = "  vpcmpeqd xmm1, xmm1, xmm1\n  vpxor xmm0, xmm0, xmm1";
            string postLoadInstr1 = "  cvtsi2ss xmm0, rdi";
            string postLoadInstr2 = "  cvtsi2ss xmm0, rsi";

            string[] dependentStores = new string[4];
            dependentStores[0] = "  movups [r8], xmm0";
            dependentStores[1] = "  movups [r8 + r14 * 8], xmm0";
            dependentStores[2] = "  movups [r8 + r13 * 8], xmm0";
            dependentStores[3] = "  movups [r8 + r12 * 8], xmm0";

            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, dependentStores, dependentStores, false, initInstrs, postLoadInstr1, postLoadInstr2);
        }
예제 #12
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string[] unrolledInstrs = new string[4];
            unrolledInstrs[0] = "  cvtsi2ss xmm1, rdi";
            unrolledInstrs[1] = "  cvtsi2ss xmm2, rdi";
            unrolledInstrs[2] = "  cvtsi2ss xmm3, rdi";
            unrolledInstrs[3] = "  cvtsi2ss xmm4, rdi";

            string[] unrolledInstrs1 = new string[4];
            unrolledInstrs1[0] = "  cvtsi2ss xmm1, rsi";
            unrolledInstrs1[1] = "  cvtsi2ss xmm2, rsi";
            unrolledInstrs1[2] = "  cvtsi2ss xmm3, rsi";
            unrolledInstrs1[3] = "  cvtsi2ss xmm4, rsi";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledInstrs, unrolledInstrs1, false);
        }
예제 #13
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string initInstrs = "  movss xmm1, [r8]\n" +
                                "  movss xmm2, [r8 + 4]\n" +
                                "  movss xmm3, [r8 + 8]\n" +
                                "  movss xmm4, [r8 + 12]\n" +
                                "  movss xmm5, [r8 + 16]\n";

            string[] unrolledAdds = new string[4];
            unrolledAdds[0] = "  addss xmm2, xmm1";
            unrolledAdds[1] = "  addss xmm3, xmm1";
            unrolledAdds[2] = "  addss xmm4, xmm1";
            unrolledAdds[3] = "  addss xmm5, xmm1";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledAdds, unrolledAdds, false, initInstrs);
        }
예제 #14
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string initInstrs = "  movq mm0, [rdx]\n" +
                                "  movq mm1, [rdx + 8]\n" +
                                "  movq mm2, [rdx + 16]\n" +
                                "  movq mm3, [rdx + 24]\n" +
                                "  movq mm4, [rdx + 32]\n";

            string[] unrolledAdds = new string[4];
            unrolledAdds[0] = "  paddw mm1, mm0";
            unrolledAdds[1] = "  paddw mm2, mm0";
            unrolledAdds[2] = "  paddw mm3, mm0";
            unrolledAdds[3] = "  paddw mm4, mm0";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledAdds, unrolledAdds, initInstrs: initInstrs);
        }
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string[] dependentStores = new string[4];
            dependentStores[0] = "  mov [r8 + rdi * 4], r15";
            dependentStores[1] = "  mov [r8 + rdi * 4], r15";
            dependentStores[2] = "  mov [r8 + rdi * 4], r15";
            dependentStores[3] = "  mov [r8 + rdi * 4], r15";

            string[] dependentStores1 = new string[4];
            dependentStores1[0] = "  mov [r8 + rsi * 4], r11";
            dependentStores1[1] = "  mov [r8 + rsi * 4], r11";
            dependentStores1[2] = "  mov [r8 + rsi * 4], r11";
            dependentStores1[3] = "  mov [r8 + rsi * 4], r11";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, dependentStores, dependentStores1, false);
        }
예제 #16
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string initInstrs = "  vmovdqu ymm0, [r8]\n" +
                                "  vmovdqa ymm1, ymm0\n" +
                                "  vmovdqa ymm2, ymm0\n" +
                                "  vmovdqa ymm3, ymm0\n" +
                                "  vmovdqa ymm4, ymm0\n";

            string[] unrolledAdds = new string[4];
            unrolledAdds[0] = "  vpaddd ymm1, ymm1, ymm0";
            unrolledAdds[1] = "  vpaddd ymm2, ymm2, ymm0";
            unrolledAdds[2] = "  vpaddd ymm3, ymm3, ymm0";
            unrolledAdds[3] = "  vpaddd ymm4, ymm4, ymm0";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledAdds, unrolledAdds, initInstrs: initInstrs);
        }
예제 #17
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string[] unrolledMuls = new string[4];
            unrolledMuls[0] = "  imul r15, rdi";
            unrolledMuls[1] = "  imul r14, rdi";
            unrolledMuls[2] = "  imul r13, rdi";
            unrolledMuls[3] = "  imul r12, rdi";

            string[] unrolledMuls1 = new string[4];
            unrolledMuls1[0] = "  imul r15, rsi";
            unrolledMuls1[1] = "  imul r14, rsi";
            unrolledMuls1[2] = "  imul r13, rsi";
            unrolledMuls1[3] = "  imul r12, rsi";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledMuls, unrolledMuls, false);
        }
예제 #18
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string[] instrs = new string[4];
            instrs[0] = "  pdep r15, rdi, r14";
            instrs[1] = "  pdep r15, rdi, r13";
            instrs[2] = "  pdep r15, rdi, r12";
            instrs[3] = "  pdep r15, rdi, r11";

            string[] instrs1 = new string[4];
            instrs1[0] = "  pdep r15, rsi, r14";
            instrs1[1] = "  pdep r15, rsi, r13";
            instrs1[2] = "  pdep r15, rsi, r12";
            instrs1[3] = "  pdep r15, rsi, r11";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, instrs, instrs1, false);
        }
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            // todo
            string[] dependentLoads = new string[4];
            dependentLoads[0] = "  mov r15, [r8 + rdi * 4]";
            dependentLoads[1] = "  mov r14, [r8 + rdi * 4]";
            dependentLoads[2] = "  mov r13, [r8 + rdi * 4]";
            dependentLoads[3] = "  mov r12, [r8 + rdi * 4]";

            string[] dependentLoads1 = new string[4];
            dependentLoads1[0] = "  mov r15, [r8 + rsi * 4]";
            dependentLoads1[1] = "  mov r14, [r8 + rsi * 4]";
            dependentLoads1[2] = "  mov r13, [r8 + rsi * 4]";
            dependentLoads1[3] = "  mov r12, [r8 + rsi * 4]";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, dependentLoads, dependentLoads1, false);
        }
예제 #20
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            // todo im tired
            string[] unrolledAdds = new string[4];
            unrolledAdds[0] = "  add r15, rdi";
            unrolledAdds[1] = "  add r14, rdi";
            unrolledAdds[2] = "  add r13, rdi";
            unrolledAdds[3] = "  add r12, rdi";

            string[] unrolledAdds1 = new string[4];
            unrolledAdds1[0] = "  add r15, rsi";
            unrolledAdds1[1] = "  add r14, rsi";
            unrolledAdds1[2] = "  add r13, rsi";
            unrolledAdds1[3] = "  add r12, rsi";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, unrolledAdds, unrolledAdds1, false);
        }
예제 #21
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string initInstrs = "  movss xmm1, [r8]\n" +
                                "  movss xmm2, [r8 + 4]\n" +
                                "  movss xmm3, [r8 + 8]\n" +
                                "  movss xmm4, [r8 + 12]\n" +
                                "  movss xmm5, [r8 + 16]\n";

            string[] instrs = new string[8];
            instrs[0] = "add r14, r15";
            instrs[1] = "addss xmm2, xmm1";
            instrs[2] = "add r13, r15";
            instrs[3] = "addss xmm3, xmm1";
            instrs[4] = "add r12, r15";
            instrs[5] = "addss xmm4, xmm1";
            instrs[6] = "add r11, r15";
            instrs[7] = "addss xmm5, xmm1";
            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, instrs, instrs, true, initInstrs);
        }
예제 #22
0
        public override void GenerateX86NasmAsm(StringBuilder sb)
        {
            string postLoadInstr1 = "  add r11, rdi";

            string[] unrolledAdds = new string[4];
            unrolledAdds[0] = "  add r15, r11";
            unrolledAdds[1] = "  add r14, r11";
            unrolledAdds[2] = "  add r13, r11";
            unrolledAdds[3] = "  add r12, r11";

            string postLoadInstr2 = "  add r11, rsi";

            UarchTestHelpers.GenerateX86NasmStructureTestFuncs(
                sb,
                this.Counts,
                this.Prefix,
                unrolledAdds,
                unrolledAdds,
                false,
                postLoadInstrs1: postLoadInstr1,
                postLoadInstrs2: postLoadInstr2);
        }
예제 #23
0
 public override void GenerateX86NasmAsm(StringBuilder sb)
 {
     string[] nops = new string[1];
     nops[0] = "test r15, r14";
     UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, nops, nops, true);
 }
예제 #24
0
 public override void GenerateX86NasmAsm(StringBuilder sb)
 {
     UarchTestHelpers.GenerateX86NasmStructureTestFuncs(sb, this.Counts, this.Prefix, nops, nops, true);
 }