dqily update on 20230423 by nitload youmu
This commit is contained in:
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -17,8 +17,16 @@ void main()
|
||||
|
||||
|
||||
float a = 400.0f;
|
||||
a = sseSqrt(a);
|
||||
printf("%f",a);
|
||||
/**/
|
||||
}
|
||||
|
||||
|
||||
float sseSqrt(float x)
|
||||
{
|
||||
float r[4];
|
||||
float* pa = &a;
|
||||
float* pa = &x;
|
||||
|
||||
__m128 b;
|
||||
__m128 c;
|
||||
@@ -27,21 +35,6 @@ void main()
|
||||
c = _mm_sqrt_ss(b);
|
||||
_mm_store_ss(r, c);
|
||||
|
||||
printf("%f", r[0]);
|
||||
/**/
|
||||
}
|
||||
|
||||
/*
|
||||
float sseSqrt(float x)
|
||||
{
|
||||
float* a = &x;
|
||||
float result[4];
|
||||
|
||||
__m128 b = _mm_load_ss(a);
|
||||
__m128 c = _mm_sqrt_ss(b);
|
||||
|
||||
_mm_store_ss(result, c);
|
||||
|
||||
return result[0];
|
||||
return r[0];
|
||||
}
|
||||
/**/
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,7 @@
|
||||
using StgSharp.Math;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using static StgSharp.Optimization.CpuInfo;
|
||||
@@ -10,6 +11,7 @@ namespace StgSharp.Optimization
|
||||
public static unsafe partial class SSE
|
||||
{
|
||||
public static m128 sqrtssM128Cache = new m128();
|
||||
public static m128* sqrtssM128CachePointer;
|
||||
|
||||
private static IntPtr sqrtssCodePointer;
|
||||
|
||||
@@ -18,7 +20,8 @@ namespace StgSharp.Optimization
|
||||
private static byte[] sqrtssCodeBytes
|
||||
= new byte[]
|
||||
{
|
||||
0x48,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // mov rax, [m128 location]
|
||||
0x48,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // mov rax, [pointer location]
|
||||
0x48,0x8b,0x00, // mov rax, [rax]
|
||||
0xf3,0x0f,0x6f,0x00, // movqdu xmm0,xmmword ptr [rax]
|
||||
0xf3,0x0f,0x51,0xc0, // sqrtss xmm0,xmm0
|
||||
0xf3,0x0f,0x7f,0x00 // movdqu xmmword ptr [rax],xmm0
|
||||
@@ -39,14 +42,37 @@ namespace StgSharp.Optimization
|
||||
UInt32 dwFreeType
|
||||
);
|
||||
|
||||
[Flags()]
|
||||
protected enum AllocationType : uint
|
||||
{
|
||||
COMMIT = 0x1000,
|
||||
RESERVE = 0x2000,
|
||||
RESET = 0x80000,
|
||||
LARGE_PAGES = 0x20000000,
|
||||
PHYSICAL = 0x400000,
|
||||
TOP_DOWN = 0x100000,
|
||||
WRITE_WATCH = 0x200000
|
||||
}
|
||||
|
||||
[Flags()]
|
||||
protected enum MemoryProtection : uint
|
||||
{
|
||||
EXECUTE = 0x10,
|
||||
EXECUTE_READ = 0x20,
|
||||
EXECUTE_READWRITE = 0x40,
|
||||
EXECUTE_WRITECOPY = 0x80,
|
||||
NOACCESS = 0x01,
|
||||
READONLY = 0x02,
|
||||
READWRITE = 0x04,
|
||||
WRITECOPY = 0x08,
|
||||
GUARD_Modifierflag = 0x100,
|
||||
NOCACHE_Modifierflag = 0x200,
|
||||
WRITECOMBINE_Modifierflag = 0x400
|
||||
}
|
||||
|
||||
private unsafe static void InitSqrtss()
|
||||
{
|
||||
var marshalPtr = Marshal.AllocHGlobal(32);
|
||||
var m128ptr = new IntPtr(16*((long)marshalPtr/16+1));
|
||||
m128* sqrtssCachePointer = (m128*)m128ptr.ToPointer();
|
||||
|
||||
sqrtssM128Cache = *sqrtssCachePointer;
|
||||
byte[] sqrtssM128PointerBytes = BitConverter.GetBytes((ulong)sqrtssCachePointer);
|
||||
byte[] sqrtssM128PointerBytes = BitConverter.GetBytes((ulong)sqrtssM128CachePointer);
|
||||
for (int i = 0; i < sqrtssM128PointerBytes.Length; i++)
|
||||
{
|
||||
sqrtssCodeBytes[2+i] = sqrtssCodeBytes[7-i];
|
||||
@@ -70,14 +96,17 @@ namespace StgSharp.Optimization
|
||||
|
||||
public static float Sqrtss(float a)
|
||||
{
|
||||
sqrtssM128Cache.float0 = a;
|
||||
sqrtssDele();
|
||||
return sqrtssM128Cache.float0;
|
||||
fixed (m128* p = &sqrtssM128Cache)
|
||||
{
|
||||
sqrtssM128Cache.float0 = a;
|
||||
sqrtssDele(sqrtssM128Cache);
|
||||
return sqrtssM128Cache.float0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
[UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]
|
||||
internal delegate void sqrtssDelegate();
|
||||
[UnmanagedFunctionPointerAttribute(CallingConvention.ThisCall)]
|
||||
internal delegate void sqrtssDelegate(m128 a);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,10 @@ namespace StgSharp.Optimization
|
||||
static SSE()
|
||||
{
|
||||
//编译模拟Sqrtss指令
|
||||
|
||||
var sqrtssCachePointer = stackalloc ulong[1];
|
||||
InitSqrtss();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -62,4 +62,9 @@ namespace StgSharp.Optimization
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Explicit,Size = 32)]
|
||||
internal struct m128cache
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace StgSharp.Optimization
|
||||
{
|
||||
public static unsafe class x86
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
508c7d643da3ffba0187af6df00e8fd1f0a8c855
|
||||
8cab6b2db52187a41fdaeb6d4e3db4542fe3cc35
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user