{"action":"created","comment":{"url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/23092530","id":23092530,"diff_hunk":"@@ -0,0 +1,453 @@\n+#ifdef _MSC_VER\n+#include <intrin.h>\n+#else\n+#include <x86intrin.h>\n+#endif\n+\n+#include \"Common/CPUDetect.h\"\n+#include \"Common/x64ABI.h\"\n+#include \"VideoCommon/VertexLoaderX64.h\"\n+\n+using namespace Gen;\n+\n+static const X64Reg src_reg = ABI_PARAM1;\n+static const X64Reg dst_reg = ABI_PARAM2;\n+static const X64Reg scratch1 = RAX;\n+static const X64Reg scratch2 = ABI_PARAM3;\n+static const X64Reg scratch3 = ABI_PARAM4;\n+static const X64Reg count_reg = R10;\n+static const X64Reg skipped_reg = R11;\n+\n+VertexLoaderX64::VertexLoaderX64(const TVtxDesc& vtx_desc, const VAT& vtx_att): VertexLoaderBase(vtx_desc, vtx_att)\n+{\n+\tif (!IsInitialized())\n+\t\treturn;\n+\n+\tAllocCodeSpace(4096);\n+\tClearCodeSpace();\n+\tGenerateVertexLoader();\n+\tWriteProtect();\n+}\n+\n+OpArg VertexLoaderX64::GetVertexAddr(int array, u64 attribute)\n+{\n+\tOpArg data = MDisp(src_reg, m_src_ofs);\n+\tif (attribute & MASK_INDEXED)\n+\t{\n+\t\tif (attribute == INDEX8)\n+\t\t{\n+\t\t\tMOVZX(64, 8, scratch1, data);\n+\t\t\tm_src_ofs += 1;\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\tMOV(16, R(scratch1), data);\n+\t\t\tm_src_ofs += 2;\n+\t\t\tBSWAP(16, scratch1);\n+\t\t\tMOVZX(64, 16, scratch1, R(scratch1));\n+\t\t}\n+\t\tif (array == ARRAY_POSITION)\n+\t\t{\n+\t\t\tCMP(attribute == INDEX8 ? 8 : 16, R(scratch1), Imm8(-1));\n+\t\t\tm_skip_vertex = J_CC(CC_E, true);\n+\t\t}\n+\t\tMOVZX(64, 32, scratch2, M(&g_main_cp_state.array_strides[array]));\n+\t\tIMUL(64, scratch1, R(scratch2));\n+\t\tMOV(64, R(scratch2), M(&cached_arraybases[array]));\n+\t\treturn MRegSum(scratch1, scratch2);\n+\t}\n+\telse\n+\t{\n+\t\treturn data;\n+\t}\n+}\n+\n+int VertexLoaderX64::ReadVertex(OpArg data, u64 attribute, int format, int count_in, int count_out, u8 scaling_exponent, AttributeFormat* native_format)\n+{\n+\tstatic const __m128i shuffle_lut[5][3] = {\n+\t\t{_mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFFFF00L),  // 1x u8\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFFFF01L, 0xFFFFFF00L),  // 2x u8\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0xFFFFFF02L, 0xFFFFFF01L, 0xFFFFFF00L)}, // 3x u8\n+\t\t{_mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFFFFFFL, 0x00FFFFFFL),  // 1x s8\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0x01FFFFFFL, 0x00FFFFFFL),  // 2x s8\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0x02FFFFFFL, 0x01FFFFFFL, 0x00FFFFFFL)}, // 3x s8\n+\t\t{_mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFF0001L),  // 1x u16\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFF0203L, 0xFFFF0001L),  // 2x u16\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0xFFFF0405L, 0xFFFF0203L, 0xFFFF0001L)}, // 3x u16\n+\t\t{_mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFFFFFFL, 0x0001FFFFL),  // 1x s16\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0x0203FFFFL, 0x0001FFFFL),  // 2x s16\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0x0405FFFFL, 0x0203FFFFL, 0x0001FFFFL)}, // 3x s16\n+\t\t{_mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0xFFFFFFFFL, 0x00010203L),  // 1x float\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0xFFFFFFFFL, 0x04050607L, 0x00010203L),  // 2x float\n+\t\t _mm_set_epi32(0xFFFFFFFFL, 0x08090A0BL, 0x04050607L, 0x00010203L)}, // 3x float\n+\t};\n+\tstatic const __m128 scale_factors[32] = {\n+\t\t_mm_set_ps1(1./(1u<< 0)), _mm_set_ps1(1./(1u<< 1)), _mm_set_ps1(1./(1u<< 2)), _mm_set_ps1(1./(1u<< 3)),\n+\t\t_mm_set_ps1(1./(1u<< 4)), _mm_set_ps1(1./(1u<< 5)), _mm_set_ps1(1./(1u<< 6)), _mm_set_ps1(1./(1u<< 7)),\n+\t\t_mm_set_ps1(1./(1u<< 8)), _mm_set_ps1(1./(1u<< 9)), _mm_set_ps1(1./(1u<<10)), _mm_set_ps1(1./(1u<<11)),\n+\t\t_mm_set_ps1(1./(1u<<12)), _mm_set_ps1(1./(1u<<13)), _mm_set_ps1(1./(1u<<14)), _mm_set_ps1(1./(1u<<15)),\n+\t\t_mm_set_ps1(1./(1u<<16)), _mm_set_ps1(1./(1u<<17)), _mm_set_ps1(1./(1u<<18)), _mm_set_ps1(1./(1u<<19)),\n+\t\t_mm_set_ps1(1./(1u<<20)), _mm_set_ps1(1./(1u<<21)), _mm_set_ps1(1./(1u<<22)), _mm_set_ps1(1./(1u<<23)),\n+\t\t_mm_set_ps1(1./(1u<<24)), _mm_set_ps1(1./(1u<<25)), _mm_set_ps1(1./(1u<<26)), _mm_set_ps1(1./(1u<<27)),\n+\t\t_mm_set_ps1(1./(1u<<28)), _mm_set_ps1(1./(1u<<29)), _mm_set_ps1(1./(1u<<30)), _mm_set_ps1(1./(1u<<31)),\n+\t};\n+\n+\tX64Reg coords = XMM0;\n+\n+\tint elem_size = 1 << (format / 2);\n+\tint load_bytes  = elem_size * count_in;\n+\tint store_bytes = sizeof(float) * count_out;\n+\tif (load_bytes > 8)\n+\t\tMOVDQU(coords, data);\n+\telse if (load_bytes > 4)\n+\t\tMOVQ_xmm(coords, data);\n+\telse\n+\t\tMOVD_xmm(coords, data);\n+\tif (attribute == DIRECT)\n+\t\tm_src_ofs += load_bytes;\n+\n+\tPSHUFB(coords, M(&shuffle_lut[format][count_in - 1]));\n+\n+\tif (format != FORMAT_FLOAT)\n+\t{\n+\t\t// Sign extend\n+\t\tif (format == FORMAT_BYTE)\n+\t\t\tPSRAD(coords, 24);\n+\t\tif (format == FORMAT_SHORT)\n+\t\t\tPSRAD(coords, 16);\n+\n+\t\tCVTDQ2PS(coords, R(coords));\n+\n+\t\tif (scaling_exponent)\n+\t\t\tMULPS(coords, M(&scale_factors[scaling_exponent]));\n+\t}\n+\n+\tOpArg dest = MDisp(dst_reg, m_dst_ofs);\n+\tif (store_bytes > 8)\n+\t\tMOVUPS(dest, coords);\n+\telse\n+\t\tMOVLPS(dest, coords);\n+\n+\tnative_format->components = count_out;\n+\tnative_format->enable = true;\n+\tnative_format->offset = m_dst_ofs;\n+\tnative_format->type = VAR_FLOAT;\n+\tnative_format->integer = false;\n+\tm_dst_ofs += store_bytes;\n+\treturn load_bytes;\n+}\n+\n+void VertexLoaderX64::ReadColor(OpArg data, u64 attribute, int format, int elements)\n+{\n+\tint load_bytes = 0;\n+\tstatic const u32 mask_565 = 0xF8FCF800;\n+\tstatic const u32 mask_0f  = 0x0F0F0F0F;\n+\tstatic const u32 mask_f0  = 0xF0F0F0F0;\n+\tstatic const u32 mask_fc  = 0xFCFCFCFC;\n+\tswitch (format)\n+\t{\n+\t\tcase FORMAT_24B_888:\n+\t\tcase FORMAT_32B_888x:\n+\t\tcase FORMAT_32B_8888:\n+\t\t\tMOV(32, R(scratch1), data);\n+\t\t\tif (format != FORMAT_32B_8888 || !elements)\n+\t\t\t\tOR(32, R(scratch1), Imm32(0xFF000000));\n+\t\t\tMOV(32, MDisp(dst_reg, m_dst_ofs), R(scratch1));\n+\t\t\tload_bytes = 3 + (format != FORMAT_24B_888);\n+\t\t\tbreak;\n+\n+\t\tcase FORMAT_16B_565:\n+\t\t\t//                   RRRRRGGG GGGBBBBB\n+\t\t\t// AAAAAAAA BBBBBBBB GGGGGGGG RRRRRRRR\n+\t\t\tLoadAndSwap(16, scratch1, data);\n+\t\t\tif (cpu_info.bBMI2)\n+\t\t\t{\n+\t\t\t\tPDEP(32, scratch1, scratch1, M(&mask_565));\n+\t\t\t\tMOV(32, R(scratch2), R(scratch1));\n+\t\t\t}\n+\t\t\telse\n+\t\t\t{\n+\t\t\t\tMOV(32, R(scratch3), R(scratch1));\n+\t\t\t\tSHL(32, R(scratch1), Imm8(16));\n+\t\t\t\tAND(32, R(scratch1), Imm32(0xF8000000));\n+\n+\t\t\t\tMOV(32, R(scratch2), R(scratch3));\n+\t\t\t\tSHL(32, R(scratch2), Imm8(13));\n+\t\t\t\tAND(32, R(scratch2), Imm32(0x00FC0000));\n+\t\t\t\tOR(32, R(scratch1), R(scratch2));\n+\n+\t\t\t\tSHL(32, R(scratch3), Imm8(11));\n+\t\t\t\tAND(32, R(scratch3), Imm32(0x0000F800));\n+\t\t\t\tOR(32, R(scratch1), R(scratch3));\n+\t\t\t\tMOV(32, R(scratch2), R(scratch1));\n+\t\t\t}\n+\n+\t\t\tSHR(32, R(scratch1), Imm8(5));\n+\t\t\tAND(32, R(scratch1), Imm32(0x07000700));\n+\t\t\tOR(32, R(scratch1), R(scratch2));\n+\n+\t\t\tSHR(32, R(scratch2), Imm8(6));\n+\t\t\tAND(32, R(scratch2), Imm32(0x00030000));\n+\t\t\tOR(32, R(scratch1), R(scratch2));\n+\n+\t\t\tOR(8, R(scratch1), Imm8(0xFF));\n+\t\t\tSwapAndStore(32, MDisp(dst_reg, m_dst_ofs), scratch1);\n+\t\t\tload_bytes = 2;\n+\t\t\tbreak;\n+\n+\t\tcase FORMAT_16B_4444:\n+\t\t\t//                   RRRRGGGG BBBBAAAA\n+\t\t\t// AAAAAAAA BBBBBBBB GGGGGGGG RRRRRRRR\n+\t\t\tLoadAndSwap(16, scratch1, data);\n+\t\t\tif (cpu_info.bBMI2)\n+\t\t\t{\n+\t\t\t\tPDEP(32, scratch2, scratch1, M(&mask_0f));\n+\t\t\t\tPDEP(32, scratch1, scratch1, M(&mask_f0));\n+\t\t\t}\n+\t\t\telse\n+\t\t\t{\n+\t\t\t\tMOV(32, R(scratch3), R(scratch1));\n+\t\t\t\tSHL(32, R(scratch1), Imm8(12));\n+\t\t\t\tAND(32, R(scratch1), Imm32(0x0F000000));\n+\t\t\t\tMOV(32, R(scratch2), R(scratch1));\n+\n+\t\t\t\tMOV(32, R(scratch1), R(scratch3));\n+\t\t\t\tSHL(32, R(scratch1), Imm8(8));\n+\t\t\t\tAND(32, R(scratch1), Imm32(0x000F0000));\n+\t\t\t\tOR(32, R(scratch2), R(scratch1));\n+\n+\t\t\t\tMOV(32, R(scratch1), R(scratch3));\n+\t\t\t\tSHL(32, R(scratch1), Imm8(4));\n+\t\t\t\tAND(32, R(scratch1), Imm32(0x00000F00));\n+\t\t\t\tOR(32, R(scratch2), R(scratch1));\n+\n+\t\t\t\tAND(32, R(scratch3), Imm8(0x0F));\n+\t\t\t\tOR(32, R(scratch2), R(scratch3));\n+\n+\t\t\t\tMOV(32, R(scratch1), R(scratch2));\n+\t\t\t\tSHL(32, R(scratch1), Imm8(4));\n+\t\t\t}\n+\t\t\tOR(32, R(scratch1), R(scratch2));\n+\t\t\tSwapAndStore(32, MDisp(dst_reg, m_dst_ofs), scratch1);\n+\t\t\tload_bytes = 2;\n+\t\t\tbreak;\n+\n+\t\tcase FORMAT_24B_6666:\n+\t\t\t//          RRRRRRGG GGGGBBBB BBAAAAAA\n+\t\t\t// AAAAAAAA BBBBBBBB GGGGGGGG RRRRRRRR\n+\t\t\tdata.offset -= 1;\n+\t\t\tLoadAndSwap(32, scratch1, data);\n+\t\t\tif (cpu_info.bBMI2)\n+\t\t\t{\n+\t\t\t\tPDEP(32, scratch1, scratch1, M(&mask_fc));\n+\t\t\t\tMOV(32, R(scratch2), R(scratch1));\n+\t\t\t}\n+\t\t\telse\n+\t\t\t{\n+\t\t\t\tMOV(32, R(scratch3), R(scratch1));\n+\t\t\t\tSHL(32, R(scratch1), Imm8(8));\n+\t\t\t\tAND(32, R(scratch1), Imm32(0xFC000000));\n+\t\t\t\tMOV(32, R(scratch2), R(scratch1));\n+\n+\t\t\t\tMOV(32, R(scratch1), R(scratch3));\n+\t\t\t\tSHL(32, R(scratch1), Imm8(6));\n+\t\t\t\tAND(32, R(scratch1), Imm32(0x00FC0000));\n+\t\t\t\tOR(32, R(scratch2), R(scratch1));\n+\n+\t\t\t\tMOV(32, R(scratch1), R(scratch3));\n+\t\t\t\tSHL(32, R(scratch1), Imm8(4));\n+\t\t\t\tAND(32, R(scratch1), Imm32(0x0000FC00));\n+\t\t\t\tOR(32, R(scratch2), R(scratch1));\n+\n+\t\t\t\tSHL(32, R(scratch3), Imm8(2));\n+\t\t\t\tAND(32, R(scratch3), Imm32(0x000000FC));\n+\t\t\t\tOR(32, R(scratch2), R(scratch3));\n+\n+\t\t\t\tMOV(32, R(scratch1), R(scratch2));\n+\t\t\t}\n+\n+\t\t\tSHR(32, R(scratch1), Imm8(6));\n+\t\t\tAND(32, R(scratch1), Imm32(0x03030303));\n+\t\t\tOR(32, R(scratch1), R(scratch2));\n+\n+\t\t\tSwapAndStore(32, MDisp(dst_reg, m_dst_ofs), scratch1);\n+\t\t\tload_bytes = 3;\n+\t\t\tbreak;\n+\t}\n+\tif (attribute == DIRECT)\n+\t\tm_src_ofs += load_bytes;\n+}\n+\n+void VertexLoaderX64::GenerateVertexLoader()\n+{\n+\tm_native_components = 0;\n+\tmemset(&m_native_vtx_decl, 0, sizeof(m_native_vtx_decl));\n+\n+\t// Backup count since we're going to count it down.\n+\tPUSH(32, R(ABI_PARAM3));\n+\n+\t// We use ABI_PARAM3 for scratch2.\n+\tMOV(32, R(count_reg), R(ABI_PARAM3));\n+\n+\tif (m_VtxDesc.Position & MASK_INDEXED)\n+\t\tXOR(32, R(skipped_reg), R(skipped_reg));\n+\n+\t// TODO: load constants into registers outside the main loop\n+\n+\tconst u8* loop_start = GetCodePtr();\n+\n+\tu32 posmatidx_ofs = 0;\n+\tif (m_VtxDesc.PosMatIdx)\n+\t\tposmatidx_ofs = m_src_ofs++;\n+\n+\tu32 texmatidx_ofs[8];\n+\tconst u64 tm[8] = {\n+\t\tm_VtxDesc.Tex0MatIdx, m_VtxDesc.Tex1MatIdx, m_VtxDesc.Tex2MatIdx, m_VtxDesc.Tex3MatIdx,\n+\t\tm_VtxDesc.Tex4MatIdx, m_VtxDesc.Tex5MatIdx, m_VtxDesc.Tex6MatIdx, m_VtxDesc.Tex7MatIdx,\n+\t};\n+\tfor (int i = 0; i < 8; i++)\n+\t{\n+\t\tif (tm[i])\n+\t\t\ttexmatidx_ofs[i] = m_src_ofs++;\n+\t}\n+\n+\tOpArg data = GetVertexAddr(ARRAY_POSITION, m_VtxDesc.Position);\n+\tReadVertex(data, m_VtxDesc.Position, m_VtxAttr.PosFormat, m_VtxAttr.PosElements + 2, 3, m_VtxAttr.PosFrac, &m_native_vtx_decl.position);\n+\n+\tif (m_VtxDesc.Normal)\n+\t{\n+\t\tstatic const u8 map[] = {7, 6, 15, 14, 30};\n+\t\tu8 scaling_exponent = map[m_VtxAttr.NormalFormat];\n+\t\tif (m_VtxDesc.Normal & MASK_INDEXED && m_VtxAttr.NormalElements && m_VtxAttr.NormalIndex3)\n+\t\t{\n+\t\t\tfor (int i = 0; i < (m_VtxAttr.NormalIndex3 ? 3 : 1); i++)\n+\t\t\t{\n+\t\t\t\tdata = GetVertexAddr(ARRAY_NORMAL, m_VtxDesc.Normal);\n+\t\t\t\tReadVertex(data, m_VtxDesc.Normal, m_VtxAttr.NormalFormat, 3, 3, scaling_exponent, &m_native_vtx_decl.normals[i]);\n+\t\t\t}\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\tdata = GetVertexAddr(ARRAY_NORMAL, m_VtxDesc.Normal);\n+\t\t\tfor (int i = 0; i < (m_VtxAttr.NormalElements ? 3 : 1); i++)\n+\t\t\t\tdata.offset += ReadVertex(data, m_VtxDesc.Normal, m_VtxAttr.NormalFormat, 3, 3, scaling_exponent, &m_native_vtx_decl.normals[i]);\n+\t\t}\n+\n+\t\tm_native_components |= VB_HAS_NRM0;\n+\t\tif (m_VtxAttr.NormalElements)\n+\t\t\tm_native_components |= VB_HAS_NRM1 | VB_HAS_NRM2;\n+\t}\n+\n+\tconst u64 col[2] = {m_VtxDesc.Color0, m_VtxDesc.Color1};\n+\tfor (int i = 0; i < 2; i++)\n+\t{\n+\t\tif (col[i])\n+\t\t{\n+\t\t\tdata = GetVertexAddr(ARRAY_COLOR + i, col[i]);\n+\t\t\tReadColor(data, col[i], m_VtxAttr.color[i].Comp, m_VtxAttr.color[i].Elements);\n+\t\t\tm_native_components |= VB_HAS_COL0 << i;\n+\t\t\tm_native_vtx_decl.colors[i].components = 4;\n+\t\t\tm_native_vtx_decl.colors[i].enable = true;\n+\t\t\tm_native_vtx_decl.colors[i].offset = m_dst_ofs;\n+\t\t\tm_native_vtx_decl.colors[i].type = VAR_UNSIGNED_BYTE;\n+\t\t\tm_native_vtx_decl.colors[i].integer = false;\n+\t\t\tm_dst_ofs += 4;\n+\t\t}\n+\t}\n+\n+\tconst u64 tc[8] = {\n+\t\tm_VtxDesc.Tex0Coord, m_VtxDesc.Tex1Coord, m_VtxDesc.Tex2Coord, m_VtxDesc.Tex3Coord,\n+\t\tm_VtxDesc.Tex4Coord, m_VtxDesc.Tex5Coord, m_VtxDesc.Tex6Coord, m_VtxDesc.Tex7Coord,\n+\t};\n+\tfor (int i = 0; i < 8; i++)\n+\t{\n+\t\tint elements = m_VtxAttr.texCoord[i].Elements + 1;\n+\t\tif (tc[i])\n+\t\t{\n+\t\t\tdata = GetVertexAddr(ARRAY_TEXCOORD0 + i, tc[i]);\n+\t\t\tu8 scaling_exponent = m_VtxAttr.texCoord[i].Frac;\n+\t\t\tReadVertex(data, tc[i], m_VtxAttr.texCoord[i].Format, elements, elements, scaling_exponent, &m_native_vtx_decl.texcoords[i]);\n+\t\t\tm_native_components |= VB_HAS_UV0 << i;\n+\t\t}\n+\t\tif (tm[i])\n+\t\t{\n+\t\t\tm_native_components |= (VB_HAS_TEXMTXIDX0 | VB_HAS_UV0) << i;\n+\t\t\tm_native_vtx_decl.texcoords[i].enable = true;\n+\t\t\tMOVZX(64, 8, scratch1, MDisp(src_reg, texmatidx_ofs[i]));\n+\t\t\tPXOR(XMM0, R(XMM0));","path":"Source/Core/VideoCommon/VertexLoaderX64.cpp","position":377,"original_position":377,"commit_id":"e5856043781a82effb225b80d955b98b20a51c1f","original_commit_id":"e5856043781a82effb225b80d955b98b20a51c1f","user":{"login":"FioraAeterna","id":7761472,"avatar_url":"https://avatars.githubusercontent.com/u/7761472?v=3","gravatar_id":"","url":"https://api.github.com/users/FioraAeterna","html_url":"https://github.com/FioraAeterna","followers_url":"https://api.github.com/users/FioraAeterna/followers","following_url":"https://api.github.com/users/FioraAeterna/following{/other_user}","gists_url":"https://api.github.com/users/FioraAeterna/gists{/gist_id}","starred_url":"https://api.github.com/users/FioraAeterna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FioraAeterna/subscriptions","organizations_url":"https://api.github.com/users/FioraAeterna/orgs","repos_url":"https://api.github.com/users/FioraAeterna/repos","events_url":"https://api.github.com/users/FioraAeterna/events{/privacy}","received_events_url":"https://api.github.com/users/FioraAeterna/received_events","type":"User","site_admin":false},"body":"Is this pxor really needed? I'm not sure it is","created_at":"2015-01-16T16:52:36Z","updated_at":"2015-01-16T16:52:36Z","html_url":"https://github.com/dolphin-emu/dolphin/pull/1887#discussion_r23092530","pull_request_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/1887","_links":{"self":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/23092530"},"html":{"href":"https://github.com/dolphin-emu/dolphin/pull/1887#discussion_r23092530"},"pull_request":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/1887"}}},"pull_request":{"url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/1887","id":27395614,"html_url":"https://github.com/dolphin-emu/dolphin/pull/1887","diff_url":"https://github.com/dolphin-emu/dolphin/pull/1887.diff","patch_url":"https://github.com/dolphin-emu/dolphin/pull/1887.patch","issue_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues/1887","number":1887,"state":"open","locked":false,"title":"VertexLoader: rewrite x64 JIT","user":{"login":"Tilka","id":123798,"avatar_url":"https://avatars.githubusercontent.com/u/123798?v=3","gravatar_id":"","url":"https://api.github.com/users/Tilka","html_url":"https://github.com/Tilka","followers_url":"https://api.github.com/users/Tilka/followers","following_url":"https://api.github.com/users/Tilka/following{/other_user}","gists_url":"https://api.github.com/users/Tilka/gists{/gist_id}","starred_url":"https://api.github.com/users/Tilka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Tilka/subscriptions","organizations_url":"https://api.github.com/users/Tilka/orgs","repos_url":"https://api.github.com/users/Tilka/repos","events_url":"https://api.github.com/users/Tilka/events{/privacy}","received_events_url":"https://api.github.com/users/Tilka/received_events","type":"User","site_admin":false},"body":"~~The last commit should be dropped before this is merged.~~","created_at":"2015-01-15T00:06:26Z","updated_at":"2015-01-16T16:52:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"edbbdbdc30ed1ff675a4cad0e951ebcc94a91b43","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/1887/commits","review_comments_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/1887/comments","review_comment_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/{number}","comments_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues/1887/comments","statuses_url":"https://api.github.com/repos/dolphin-emu/dolphin/statuses/e5856043781a82effb225b80d955b98b20a51c1f","head":{"label":"Tilka:vertex_loader_jit","ref":"vertex_loader_jit","sha":"e5856043781a82effb225b80d955b98b20a51c1f","user":{"login":"Tilka","id":123798,"avatar_url":"https://avatars.githubusercontent.com/u/123798?v=3","gravatar_id":"","url":"https://api.github.com/users/Tilka","html_url":"https://github.com/Tilka","followers_url":"https://api.github.com/users/Tilka/followers","following_url":"https://api.github.com/users/Tilka/following{/other_user}","gists_url":"https://api.github.com/users/Tilka/gists{/gist_id}","starred_url":"https://api.github.com/users/Tilka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Tilka/subscriptions","organizations_url":"https://api.github.com/users/Tilka/orgs","repos_url":"https://api.github.com/users/Tilka/repos","events_url":"https://api.github.com/users/Tilka/events{/privacy}","received_events_url":"https://api.github.com/users/Tilka/received_events","type":"User","site_admin":false},"repo":{"id":16304949,"name":"dolphin","full_name":"Tilka/dolphin","owner":{"login":"Tilka","id":123798,"avatar_url":"https://avatars.githubusercontent.com/u/123798?v=3","gravatar_id":"","url":"https://api.github.com/users/Tilka","html_url":"https://github.com/Tilka","followers_url":"https://api.github.com/users/Tilka/followers","following_url":"https://api.github.com/users/Tilka/following{/other_user}","gists_url":"https://api.github.com/users/Tilka/gists{/gist_id}","starred_url":"https://api.github.com/users/Tilka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Tilka/subscriptions","organizations_url":"https://api.github.com/users/Tilka/orgs","repos_url":"https://api.github.com/users/Tilka/repos","events_url":"https://api.github.com/users/Tilka/events{/privacy}","received_events_url":"https://api.github.com/users/Tilka/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Tilka/dolphin","description":"Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.","fork":true,"url":"https://api.github.com/repos/Tilka/dolphin","forks_url":"https://api.github.com/repos/Tilka/dolphin/forks","keys_url":"https://api.github.com/repos/Tilka/dolphin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Tilka/dolphin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Tilka/dolphin/teams","hooks_url":"https://api.github.com/repos/Tilka/dolphin/hooks","issue_events_url":"https://api.github.com/repos/Tilka/dolphin/issues/events{/number}","events_url":"https://api.github.com/repos/Tilka/dolphin/events","assignees_url":"https://api.github.com/repos/Tilka/dolphin/assignees{/user}","branches_url":"https://api.github.com/repos/Tilka/dolphin/branches{/branch}","tags_url":"https://api.github.com/repos/Tilka/dolphin/tags","blobs_url":"https://api.github.com/repos/Tilka/dolphin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Tilka/dolphin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Tilka/dolphin/git/refs{/sha}","trees_url":"https://api.github.com/repos/Tilka/dolphin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Tilka/dolphin/statuses/{sha}","languages_url":"https://api.github.com/repos/Tilka/dolphin/languages","stargazers_url":"https://api.github.com/repos/Tilka/dolphin/stargazers","contributors_url":"https://api.github.com/repos/Tilka/dolphin/contributors","subscribers_url":"https://api.github.com/repos/Tilka/dolphin/subscribers","subscription_url":"https://api.github.com/repos/Tilka/dolphin/subscription","commits_url":"https://api.github.com/repos/Tilka/dolphin/commits{/sha}","git_commits_url":"https://api.github.com/repos/Tilka/dolphin/git/commits{/sha}","comments_url":"https://api.github.com/repos/Tilka/dolphin/comments{/number}","issue_comment_url":"https://api.github.com/repos/Tilka/dolphin/issues/comments/{number}","contents_url":"https://api.github.com/repos/Tilka/dolphin/contents/{+path}","compare_url":"https://api.github.com/repos/Tilka/dolphin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Tilka/dolphin/merges","archive_url":"https://api.github.com/repos/Tilka/dolphin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Tilka/dolphin/downloads","issues_url":"https://api.github.com/repos/Tilka/dolphin/issues{/number}","pulls_url":"https://api.github.com/repos/Tilka/dolphin/pulls{/number}","milestones_url":"https://api.github.com/repos/Tilka/dolphin/milestones{/number}","notifications_url":"https://api.github.com/repos/Tilka/dolphin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Tilka/dolphin/labels{/name}","releases_url":"https://api.github.com/repos/Tilka/dolphin/releases{/id}","created_at":"2014-01-28T07:24:53Z","updated_at":"2015-01-03T10:59:36Z","pushed_at":"2015-01-16T07:18:11Z","git_url":"git://github.com/Tilka/dolphin.git","ssh_url":"git@github.com:Tilka/dolphin.git","clone_url":"https://github.com/Tilka/dolphin.git","svn_url":"https://github.com/Tilka/dolphin","homepage":null,"size":197683,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"dolphin-emu:master","ref":"master","sha":"c2bdcbe71c8e559a3bb91ff1da7844dd65406582","user":{"login":"dolphin-emu","id":5050316,"avatar_url":"https://avatars.githubusercontent.com/u/5050316?v=3","gravatar_id":"","url":"https://api.github.com/users/dolphin-emu","html_url":"https://github.com/dolphin-emu","followers_url":"https://api.github.com/users/dolphin-emu/followers","following_url":"https://api.github.com/users/dolphin-emu/following{/other_user}","gists_url":"https://api.github.com/users/dolphin-emu/gists{/gist_id}","starred_url":"https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dolphin-emu/subscriptions","organizations_url":"https://api.github.com/users/dolphin-emu/orgs","repos_url":"https://api.github.com/users/dolphin-emu/repos","events_url":"https://api.github.com/users/dolphin-emu/events{/privacy}","received_events_url":"https://api.github.com/users/dolphin-emu/received_events","type":"Organization","site_admin":false},"repo":{"id":11577304,"name":"dolphin","full_name":"dolphin-emu/dolphin","owner":{"login":"dolphin-emu","id":5050316,"avatar_url":"https://avatars.githubusercontent.com/u/5050316?v=3","gravatar_id":"","url":"https://api.github.com/users/dolphin-emu","html_url":"https://github.com/dolphin-emu","followers_url":"https://api.github.com/users/dolphin-emu/followers","following_url":"https://api.github.com/users/dolphin-emu/following{/other_user}","gists_url":"https://api.github.com/users/dolphin-emu/gists{/gist_id}","starred_url":"https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dolphin-emu/subscriptions","organizations_url":"https://api.github.com/users/dolphin-emu/orgs","repos_url":"https://api.github.com/users/dolphin-emu/repos","events_url":"https://api.github.com/users/dolphin-emu/events{/privacy}","received_events_url":"https://api.github.com/users/dolphin-emu/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dolphin-emu/dolphin","description":"Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.","fork":false,"url":"https://api.github.com/repos/dolphin-emu/dolphin","forks_url":"https://api.github.com/repos/dolphin-emu/dolphin/forks","keys_url":"https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dolphin-emu/dolphin/teams","hooks_url":"https://api.github.com/repos/dolphin-emu/dolphin/hooks","issue_events_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}","events_url":"https://api.github.com/repos/dolphin-emu/dolphin/events","assignees_url":"https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}","branches_url":"https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}","tags_url":"https://api.github.com/repos/dolphin-emu/dolphin/tags","blobs_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}","trees_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}","languages_url":"https://api.github.com/repos/dolphin-emu/dolphin/languages","stargazers_url":"https://api.github.com/repos/dolphin-emu/dolphin/stargazers","contributors_url":"https://api.github.com/repos/dolphin-emu/dolphin/contributors","subscribers_url":"https://api.github.com/repos/dolphin-emu/dolphin/subscribers","subscription_url":"https://api.github.com/repos/dolphin-emu/dolphin/subscription","commits_url":"https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}","git_commits_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}","comments_url":"https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}","issue_comment_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/{number}","contents_url":"https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}","compare_url":"https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dolphin-emu/dolphin/merges","archive_url":"https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dolphin-emu/dolphin/downloads","issues_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}","pulls_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}","milestones_url":"https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}","notifications_url":"https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}","releases_url":"https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}","created_at":"2013-07-22T09:07:57Z","updated_at":"2015-01-16T05:55:39Z","pushed_at":"2015-01-16T01:39:24Z","git_url":"git://github.com/dolphin-emu/dolphin.git","ssh_url":"git@github.com:dolphin-emu/dolphin.git","clone_url":"https://github.com/dolphin-emu/dolphin.git","svn_url":"https://github.com/dolphin-emu/dolphin","homepage":null,"size":252561,"stargazers_count":945,"watchers_count":945,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":301,"mirror_url":null,"open_issues_count":66,"forks":301,"open_issues":66,"watchers":945,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/1887"},"html":{"href":"https://github.com/dolphin-emu/dolphin/pull/1887"},"issue":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/issues/1887"},"comments":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/issues/1887/comments"},"review_comments":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/1887/comments"},"review_comment":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/1887/commits"},"statuses":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/statuses/e5856043781a82effb225b80d955b98b20a51c1f"}}}}