* cleaning up tcgsize: it makes no sense to declare every combination and type

the different vector types must be either handled in the high level cg or
    by using the shuffle parameter

git-svn-id: trunk@43860 -
(cherry picked from commit b7c6e01b03)
This commit is contained in:
florian 2020-01-04 21:54:53 +00:00 committed by Jonas Maebe
parent dba65567f1
commit 3ef2ab1019
8 changed files with 53 additions and 259 deletions

View File

@ -168,14 +168,9 @@ interface
OS_S8, OS_S16, OS_S32, OS_S64, OS_S128,
{ single, double, extended, comp, float128 }
OS_F32, OS_F64, OS_F80, OS_C64, OS_F128,
{ multi-media sizes: split in byte, word, dword, ... }
{ entities, then the signed counterparts }
OS_M8, OS_M16, OS_M32, OS_M64, OS_M128, OS_M256, OS_M512,
OS_MS8, OS_MS16, OS_MS32, OS_MS64, OS_MS128, OS_MS256, OS_MS512,
{ multi-media sizes: single-precision floating-point }
OS_MF32, OS_MF128, OS_MF256, OS_MF512,
{ multi-media sizes: double-precision floating-point }
OS_MD64, OS_MD128, OS_MD256, OS_MD512);
{ multi-media sizes, describes only the register size but not how it is split,
this information must be passed separately }
OS_M8, OS_M16, OS_M32, OS_M64, OS_M128, OS_M256, OS_M512);
{ Register types }
TRegisterType = (
@ -319,12 +314,7 @@ interface
{ floating point values }
4, 8, 10, 8, 16,
{ multimedia values }
1, 2, 4, 8, 16, 32, 64,
1, 2, 4, 8, 16, 32, 64,
{ single-precision multimedia values }
4, 16, 32, 64,
{ double-precision multimedia values }
8, 16, 32, 64);
1, 2, 4, 8, 16, 32, 64);
tfloat2tcgsize: array[tfloattype] of tcgsize =
(OS_F32,OS_F64,OS_F80,OS_F80,OS_C64,OS_C64,OS_F128);
@ -364,10 +354,7 @@ interface
OS_8, OS_16, OS_32, OS_64, OS_128,
OS_F32, OS_F64, OS_F80, OS_C64, OS_F128,
OS_M8, OS_M16, OS_M32, OS_M64, OS_M128, OS_M256, OS_M512,
OS_M8, OS_M16, OS_M32, OS_M64, OS_M128, OS_M256, OS_M512,
OS_MF32, OS_MF128,OS_MF256,OS_MF512,
OS_MD64, OS_MD128,OS_MD256,OS_MD512);
OS_M8, OS_M16, OS_M32, OS_M64, OS_M128, OS_M256, OS_M512);
tcgsize2signed : array[tcgsize] of tcgsize = (OS_NO,
@ -375,10 +362,7 @@ interface
OS_S8, OS_S16, OS_S32, OS_S64, OS_S128,
OS_F32, OS_F64, OS_F80, OS_C64, OS_F128,
OS_MS8, OS_MS16, OS_MS32, OS_MS64, OS_MS128,OS_MS256,OS_MS512,
OS_MS8, OS_MS16, OS_MS32, OS_MS64, OS_MS128,OS_MS256,OS_MS512,
OS_MF32, OS_MF128,OS_MF256,OS_MF512,
OS_MD64, OS_MD128,OS_MD256,OS_MD512);
OS_M8, OS_M16, OS_M32, OS_M64, OS_M128, OS_M256,OS_M512);
tcgloc2str : array[TCGLoc] of string[12] = (
@ -730,13 +714,13 @@ implementation
begin
case a of
4:
result := OS_MF32;
result := OS_M32;
16:
result := OS_MF128;
result := OS_M128;
32:
result := OS_MF256;
result := OS_M256;
64:
result := OS_MF512;
result := OS_M512;
else
result := int_cgsize(a);
end;
@ -746,13 +730,13 @@ implementation
begin
case a of
8:
result := OS_MD64;
result := OS_M64;
16:
result := OS_MD128;
result := OS_M128;
32:
result := OS_MD256;
result := OS_M256;
64:
result := OS_MD512;
result := OS_M512;
else
result := int_cgsize(a);
end;

View File

@ -1150,8 +1150,7 @@ implementation
OS_F64,
OS_F128:
a_loadmm_ref_reg(list,location^.size,location^.size,tmpref,location^.register,mms_movescalar);
OS_M8..OS_M128,
OS_MS8..OS_MS128:
OS_M8..OS_M512:
a_loadmm_ref_reg(list,location^.size,location^.size,tmpref,location^.register,nil);
else
internalerror(2010053101);
@ -1356,8 +1355,7 @@ implementation
OS_F64,
OS_F128:
a_loadmm_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref,mms_movescalar);
OS_M8..OS_M128,
OS_MS8..OS_MS128:
OS_M8..OS_M512:
a_loadmm_reg_ref(list,paraloc.size,paraloc.size,paraloc.register,ref,nil);
else
internalerror(2010053102);
@ -1413,8 +1411,7 @@ implementation
OS_F64,
OS_F128:
a_loadmm_reg_reg(list,paraloc.size,regsize,paraloc.register,reg,mms_movescalar);
OS_M8..OS_M128,
OS_MS8..OS_MS128:
OS_M8..OS_M512:
a_loadmm_reg_reg(list,paraloc.size,paraloc.size,paraloc.register,reg,nil);
else
internalerror(2010053102);

View File

@ -1551,19 +1551,19 @@ implementation
case TFloatDef(tarraydef(def).elementdef).floattype of
s32real:
case def.size of
4: result:=OS_MF32;
16: result:=OS_MF128;
32: result:=OS_MF256;
64: result:=OS_MF512;
4: result:=OS_M32;
16: result:=OS_M128;
32: result:=OS_M256;
64: result:=OS_M512;
else
internalerror(2017121400);
end;
s64real:
case def.size of
8: result:=OS_MD64;
16: result:=OS_MD128;
32: result:=OS_MD256;
64: result:=OS_MD512;
8: result:=OS_M64;
16: result:=OS_M128;
32: result:=OS_M256;
64: result:=OS_M512;
else
internalerror(2017121401);
end;

View File

@ -1066,8 +1066,7 @@ implementation
OS_F64,
OS_F128:
a_loadmm_ref_reg(list,location^.def,location^.def,tmpref,location^.register,mms_movescalar);
OS_M8..OS_M128,
OS_MS8..OS_MS128:
OS_M8..OS_M128:
a_loadmm_ref_reg(list,location^.def,location^.def,tmpref,location^.register,nil);
else
internalerror(2010053101);

View File

@ -343,10 +343,7 @@ unit cpubase;
tcgsize2opsize: Array[tcgsize] of topsize =
(S_NO,S_B,S_W,S_L,S_L,S_NO,S_B,S_W,S_L,S_L,S_NO,
S_FS,S_FD,S_FX,S_NO,S_NO,
S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,
S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,
S_NO,S_NO,S_NO,S_NO,S_NO,
S_NO,S_NO,S_NO,S_NO,S_NO);
S_NO,S_NO,S_NO,S_NO,S_NO,S_NO,S_NO);
function is_calljmp(o:tasmop):boolean;

View File

@ -159,26 +159,17 @@ unit cgx86;
TCGSize2OpSize: Array[tcgsize] of topsize =
(S_NO,S_B,S_W,S_L,S_Q,S_XMM,S_B,S_W,S_L,S_Q,S_XMM,
S_FS,S_FL,S_FX,S_IQ,S_FXX,
S_NO,S_NO,S_NO,S_MD,S_XMM,S_YMM,S_ZMM,
S_NO,S_NO,S_NO,S_NO,S_XMM,S_YMM,S_ZMM,
S_NO,S_XMM,S_YMM,S_ZMM,
S_NO,S_XMM,S_YMM,S_ZMM);
S_NO,S_NO,S_NO,S_MD,S_XMM,S_YMM,S_ZMM);
{$elseif defined(i386)}
TCGSize2OpSize: Array[tcgsize] of topsize =
(S_NO,S_B,S_W,S_L,S_L,S_T,S_B,S_W,S_L,S_L,S_L,
S_FS,S_FL,S_FX,S_IQ,S_FXX,
S_NO,S_NO,S_NO,S_MD,S_XMM,S_YMM,S_ZMM,
S_NO,S_NO,S_NO,S_NO,S_XMM,S_YMM,S_ZMM,
S_NO,S_XMM,S_YMM,S_ZMM,
S_NO,S_XMM,S_YMM,S_ZMM);
S_NO,S_NO,S_NO,S_MD,S_XMM,S_YMM,S_ZMM);
{$elseif defined(i8086)}
TCGSize2OpSize: Array[tcgsize] of topsize =
(S_NO,S_B,S_W,S_W,S_W,S_T,S_B,S_W,S_W,S_W,S_W,
S_FS,S_FL,S_FX,S_IQ,S_FXX,
S_NO,S_NO,S_NO,S_MD,S_XMM,S_YMM,S_ZMM,
S_NO,S_NO,S_NO,S_NO,S_XMM,S_YMM,S_ZMM,
S_NO,S_XMM,S_YMM,S_ZMM,
S_NO,S_XMM,S_YMM,S_ZMM);
S_NO,S_NO,S_NO,S_MD,S_XMM,S_YMM,S_ZMM);
{$endif}
{$ifndef NOTARGETWIN}
@ -295,17 +286,11 @@ unit cgx86;
OS_M64:
result:=rg[R_MMREGISTER].getregister(list,R_SUBQ);
OS_M128,
OS_F128,
OS_MF128,
OS_MD128:
OS_F128:
result:=rg[R_MMREGISTER].getregister(list,R_SUBMMX); { R_SUBMMWHOLE seems a bit dangerous and ambiguous, so changed to R_SUBMMX. [Kit] }
OS_M256,
OS_MF256,
OS_MD256:
OS_M256:
result:=rg[R_MMREGISTER].getregister(list,R_SUBMMY);
OS_M512,
OS_MF512,
OS_MD512:
OS_M512:
result:=rg[R_MMREGISTER].getregister(list,R_SUBMMZ);
else
internalerror(200506041);
@ -1374,14 +1359,12 @@ unit cgx86;
if fromsize=tosize then
{ needs correct size in case of spilling }
case fromsize of
OS_F32,
OS_MF128:
OS_F32:
if UseAVX then
instr:=taicpu.op_reg_reg(A_VMOVAPS,S_NO,reg1,reg2)
else
instr:=taicpu.op_reg_reg(A_MOVAPS,S_NO,reg1,reg2);
OS_F64,
OS_MD128:
OS_F64:
if UseAVX then
instr:=taicpu.op_reg_reg(A_VMOVAPD,S_NO,reg1,reg2)
else
@ -1391,27 +1374,13 @@ unit cgx86;
instr:=taicpu.op_reg_reg(A_VMOVQ,S_NO,reg1,reg2)
else
instr:=taicpu.op_reg_reg(A_MOVQ,S_NO,reg1,reg2);
OS_M128, OS_MS128:
OS_M128:
if UseAVX then
instr:=taicpu.op_reg_reg(A_VMOVDQA,S_NO,reg1,reg2)
else
instr:=taicpu.op_reg_reg(A_MOVDQA,S_NO,reg1,reg2);
OS_MF256,
OS_MF512:
if UseAVX then
instr:=taicpu.op_reg_reg(A_VMOVAPS,S_NO,reg1,reg2)
else
{ SSE doesn't support 512-bit vectors }
InternalError(2018012931);
OS_MD256,
OS_MD512:
if UseAVX then
instr:=taicpu.op_reg_reg(A_VMOVAPD,S_NO,reg1,reg2)
else
{ SSE doesn't support 512-bit vectors }
InternalError(2018012932);
OS_M256, OS_MS256,
OS_M512, OS_MS512:
OS_M256,
OS_M512:
if UseAVX then
instr:=taicpu.op_reg_reg(A_VMOVDQA,S_NO,reg1,reg2)
else
@ -1496,39 +1465,7 @@ unit cgx86;
op := A_VMOVQ
else
op := A_MOVQ;
OS_MF128:
{ Use XMM transfer of packed singles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 16 then
op := A_VMOVAPS
else
op := A_VMOVUPS
end
else
begin
if GetRefAlignment(tmpref) = 16 then
op := A_MOVAPS
else
op := A_MOVUPS
end;
OS_MD128:
{ Use XMM transfer of packed doubles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 16 then
op := A_VMOVAPD
else
op := A_VMOVUPD
end
else
begin
if GetRefAlignment(tmpref) = 16 then
op := A_MOVAPD
else
op := A_MOVUPD
end;
OS_M128, OS_MS128:
OS_M128:
{ Use XMM integer transfer }
if UseAVX then
begin
@ -1542,33 +1479,9 @@ unit cgx86;
if GetRefAlignment(tmpref) = 16 then
op := A_MOVDQA
else
op := A_MOVDQU
op := A_MOVDQU;
end;
OS_MF256:
{ Use YMM transfer of packed singles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 32 then
op := A_VMOVAPS
else
op := A_VMOVUPS
end
else
{ SSE doesn't support 256-bit vectors }
InternalError(2018012934);
OS_MD256:
{ Use YMM transfer of packed doubles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 32 then
op := A_VMOVAPD
else
op := A_VMOVUPD
end
else
{ SSE doesn't support 256-bit vectors }
InternalError(2018012935);
OS_M256, OS_MS256:
OS_M256:
{ Use YMM integer transfer }
if UseAVX then
begin
@ -1579,32 +1492,8 @@ unit cgx86;
end
else
{ SSE doesn't support 256-bit vectors }
InternalError(2018012936);
OS_MF512:
{ Use ZMM transfer of packed singles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 64 then
op := A_VMOVAPS
else
op := A_VMOVUPS
end
else
{ SSE doesn't support 512-bit vectors }
InternalError(2018012937);
OS_MD512:
{ Use ZMM transfer of packed doubles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 64 then
op := A_VMOVAPD
else
op := A_VMOVUPD
end
else
{ SSE doesn't support 512-bit vectors }
InternalError(2018012938);
OS_M512, OS_MS512:
Internalerror(2020010401);
OS_M512:
{ Use ZMM integer transfer }
if UseAVX then
begin
@ -1670,37 +1559,7 @@ unit cgx86;
op := A_VMOVQ
else
op := A_MOVQ;
OS_MF128:
{ Use XMM transfer of packed singles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 16 then
op := A_VMOVAPS
else
op := A_VMOVUPS
end else
begin
if GetRefAlignment(tmpref) = 16 then
op := A_MOVAPS
else
op := A_MOVUPS
end;
OS_MD128:
{ Use XMM transfer of packed doubles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 16 then
op := A_VMOVAPD
else
op := A_VMOVUPD
end else
begin
if GetRefAlignment(tmpref) = 16 then
op := A_MOVAPD
else
op := A_MOVUPD
end;
OS_M128, OS_MS128:
OS_M128:
{ Use XMM integer transfer }
if UseAVX then
begin
@ -1715,29 +1574,7 @@ unit cgx86;
else
op := A_MOVDQU
end;
OS_MF256:
{ Use XMM transfer of packed singles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 32 then
op := A_VMOVAPS
else
op := A_VMOVUPS
end else
{ SSE doesn't support 256-bit vectors }
InternalError(2018012940);
OS_MD256:
{ Use XMM transfer of packed doubles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 32 then
op := A_VMOVAPD
else
op := A_VMOVUPD
end else
{ SSE doesn't support 256-bit vectors }
InternalError(2018012941);
OS_M256, OS_MS256:
OS_M256:
{ Use XMM integer transfer }
if UseAVX then
begin
@ -1748,29 +1585,7 @@ unit cgx86;
end else
{ SSE doesn't support 256-bit vectors }
InternalError(2018012942);
OS_MF512:
{ Use XMM transfer of packed singles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 64 then
op := A_VMOVAPS
else
op := A_VMOVUPS
end else
{ SSE doesn't support 512-bit vectors }
InternalError(2018012943);
OS_MD512:
{ Use XMM transfer of packed doubles }
if UseAVX then
begin
if GetRefAlignment(tmpref) = 64 then
op := A_VMOVAPD
else
op := A_VMOVUPD
end else
{ SSE doesn't support 512-bit vectors }
InternalError(2018012944);
OS_M512, OS_MS512:
OS_M512:
{ Use XMM integer transfer }
if UseAVX then
begin

View File

@ -447,11 +447,11 @@ implementation
else
internalerror(2009071902);
end;
OS_M128,OS_MS128,OS_MF128,OS_MD128:
OS_M128:
cgsize2subreg:=R_SUBMMX;
OS_M256,OS_MS256,OS_MF256,OS_MD256:
OS_M256:
cgsize2subreg:=R_SUBMMY;
OS_M512,OS_MS512,OS_MF512,OS_MD512:
OS_M512:
cgsize2subreg:=R_SUBMMZ;
OS_NO:
{ error message should have been thrown already before, so avoid only

View File

@ -1288,10 +1288,12 @@ begin
asize:=OT_BITS64;
OS_F80 :
asize:=OT_BITS80;
OS_128,OS_M128,OS_MS128:
OS_128,OS_M128:
asize := OT_BITS128;
OS_M256,OS_MS256:
OS_M256:
asize := OT_BITS256;
OS_M512:
asize := OT_BITS512;
end;
if asize<>0 then
ai.oper[i-1]^.ot:=(ai.oper[i-1]^.ot and not OT_SIZE_MASK) or asize;