2
0
florian 1 долоо хоног өмнө
parent
commit
cddf16a3dd

+ 117 - 293
tests/test/units/linux/thwprobe.pp

@@ -1,303 +1,127 @@
 { %target=linux }
 { %cpu=riscv32,riscv64 }
+{$mode objfpc}
 uses
   linux,sysutils;
 
+type
+  TRiscvExtension = record
+    mask: QWord;
+    name: string;
+  end;
+
+const
+  { Define all extensions to check }
+  RISCV_EXTENSIONS: array[0..58] of TRiscvExtension = (
+    { 0 } (mask: RISCV_HWPROBE_IMA_FD; name: 'F and D'),
+    { 1 } (mask: RISCV_HWPROBE_IMA_C; name: 'C'),
+    { 2 } (mask: RISCV_HWPROBE_IMA_V; name: 'V'),
+    { 3 } (mask: RISCV_HWPROBE_EXT_ZBA; name: 'ZBA'),
+    { 4 } (mask: RISCV_HWPROBE_EXT_ZBB; name: 'ZBB'),
+    { 5 } (mask: RISCV_HWPROBE_EXT_ZBS; name: 'ZBS'),
+    { 6 } (mask: RISCV_HWPROBE_EXT_ZICBOZ; name: 'ZICBOZ'),
+    { 7 } (mask: RISCV_HWPROBE_EXT_ZBC; name: 'ZBC'),
+    { 8 } (mask: RISCV_HWPROBE_EXT_ZBKB; name: 'ZBKB'),
+    { 9 } (mask: RISCV_HWPROBE_EXT_ZBKC; name: 'ZBKC'),
+    { 10 } (mask: RISCV_HWPROBE_EXT_ZBKX; name: 'ZBKX'),
+    { 11 } (mask: RISCV_HWPROBE_EXT_ZKND; name: 'ZKND'),
+    { 12 } (mask: RISCV_HWPROBE_EXT_ZKNE; name: 'ZKNE'),
+    { 13 } (mask: RISCV_HWPROBE_EXT_ZKNH; name: 'ZKNH'),
+    { 14 } (mask: RISCV_HWPROBE_EXT_ZKSED; name: 'ZKSED'),
+    { 15 } (mask: RISCV_HWPROBE_EXT_ZKSH; name: 'ZKSH'),
+    { 16 } (mask: RISCV_HWPROBE_EXT_ZKT; name: 'ZKT'),
+    { 17 } (mask: RISCV_HWPROBE_EXT_ZVBB; name: 'ZVBB'),
+    { 18 } (mask: RISCV_HWPROBE_EXT_ZVBC; name: 'ZVBC'),
+    { 19 } (mask: RISCV_HWPROBE_EXT_ZVKB; name: 'ZVKB'),
+    { 20 } (mask: RISCV_HWPROBE_EXT_ZVKG; name: 'ZVKG'),
+    { 21 } (mask: RISCV_HWPROBE_EXT_ZVKNED; name: 'ZVKNED'),
+    { 22 } (mask: RISCV_HWPROBE_EXT_ZVKNHA; name: 'ZVKNHA'),
+    { 23 } (mask: RISCV_HWPROBE_EXT_ZVKNHB; name: 'ZVKNHB'),
+    { 24 } (mask: RISCV_HWPROBE_EXT_ZVKSED; name: 'ZVKSED'),
+    { 25 } (mask: RISCV_HWPROBE_EXT_ZVKSH; name: 'ZVKSH'),
+    { 26 } (mask: RISCV_HWPROBE_EXT_ZVKT; name: 'ZVKT'),
+    { 27 } (mask: RISCV_HWPROBE_EXT_ZFH; name: 'ZFH'),
+    { 28 } (mask: RISCV_HWPROBE_EXT_ZFHMIN; name: 'ZFHMIN'),
+    { 29 } (mask: RISCV_HWPROBE_EXT_ZIHINTNTL; name: 'ZIHINTNTL'),
+    { 30 } (mask: RISCV_HWPROBE_EXT_ZVFH; name: 'ZVFH'),
+    { 31 } (mask: RISCV_HWPROBE_EXT_ZVFHMIN; name: 'ZVFHMIN'),
+    { 32 } (mask: RISCV_HWPROBE_EXT_ZFA; name: 'ZFA'),
+    { 33 } (mask: RISCV_HWPROBE_EXT_ZTSO; name: 'ZTSO'),
+    { 34 } (mask: RISCV_HWPROBE_EXT_ZACAS; name: 'ZACAS'),
+    { 35 } (mask: RISCV_HWPROBE_EXT_ZICOND; name: 'ZICOND'),
+    { 36 } (mask: RISCV_HWPROBE_EXT_ZIHINTPAUSE; name: 'ZIHINTPAUSE'),
+    { 37 } (mask: RISCV_HWPROBE_EXT_ZVE32X; name: 'ZVE32X'),
+    { 38 } (mask: RISCV_HWPROBE_EXT_ZVE32F; name: 'ZVE32F'),
+    { 39 } (mask: RISCV_HWPROBE_EXT_ZVE64X; name: 'ZVE64X'),
+    { 40 } (mask: RISCV_HWPROBE_EXT_ZVE64F; name: 'ZVE64F'),
+    { 41 } (mask: RISCV_HWPROBE_EXT_ZVE64D; name: 'ZVE64D'),
+    { 42 } (mask: RISCV_HWPROBE_EXT_ZIMOP; name: 'ZIMOP'),
+    { 43 } (mask: RISCV_HWPROBE_EXT_ZCA; name: 'ZCA'),
+    { 44 } (mask: RISCV_HWPROBE_EXT_ZCB; name: 'ZCB'),
+    { 45 } (mask: RISCV_HWPROBE_EXT_ZCD; name: 'ZCD'),
+    { 46 } (mask: RISCV_HWPROBE_EXT_ZCF; name: 'ZCF'),
+    { 47 } (mask: RISCV_HWPROBE_EXT_ZCMOP; name: 'ZCMOP'),
+    { 48 } (mask: RISCV_HWPROBE_EXT_ZAWRS; name: 'ZAWRS'),
+    { 49 } (mask: RISCV_HWPROBE_EXT_SUPM; name: 'SUPM'),
+    { 50 } (mask: RISCV_HWPROBE_EXT_ZFBFMIN; name: 'ZFBFMIN'),
+    { 51 } (mask: RISCV_HWPROBE_EXT_ZIHPM; name: 'ZIHPM'),
+    { 52 } (mask: RISCV_HWPROBE_EXT_ZFBMIN; name: 'ZFBMIN'),
+    { 53 } (mask: RISCV_HWPROBE_EXT_ZVFBFMIN; name: 'ZVFBFMIN'),
+    { 54 } (mask: RISCV_HWPROBE_EXT_ZVFBFWMA; name: 'ZVFBFWMA'),
+    { 55 } (mask: RISCV_HWPROBE_EXT_ZICBOM; name: 'ZICBOM'),
+    { 56 } (mask: RISCV_HWPROBE_EXT_ZAAMO; name: 'ZAAMO'),
+    { 57 } (mask: RISCV_HWPROBE_EXT_ZALRSC; name: 'ZALRSC'),
+    { 58 } (mask: RISCV_HWPROBE_EXT_ZABHA; name: 'ZABHA')
+  );
+
+procedure CheckExtension(value: QWord; ext: TRiscvExtension);
+  begin
+    if (value and ext.mask) <> 0 then
+      writeln(ext.name, ' extension supported')
+    else
+      writeln('  ', ext.name, ' extension not supported');
+  end;
+
+
+function GetAllTestedBits: QWord;
+  var
+    i: Integer;
+  begin
+    Result := 0;
+    for i := Low(RISCV_EXTENSIONS) to High(RISCV_EXTENSIONS) do
+      Result := Result or RISCV_EXTENSIONS[i].mask;
+  end;
+
+
 var
   ariscv_hwprobe: triscv_hwprobe;
+  i: Integer;
+  all_tested_bits: QWord;
+  untested_bits: QWord;
 
 begin
-  ariscv_hwprobe.key:=RISCV_HWPROBE_KEY_IMA_EXT_0;
-  riscv_hwprobe(@ariscv_hwprobe,1,0,nil,0);
-  writeln('Raw key value returned by RISCV_HWPROBE_KEY_IMA_EXT_0: %',Binstr(ariscv_hwprobe.value,64));
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_IMA_FD)<>0 then
-    writeln('F and D extensions supported')
-  else
-    writeln('  F and D extensions not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_IMA_V)<>0 then
-    writeln('V extension supported')
-  else
-    writeln('  V extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZBA)<>0 then
-    writeln('ZBA extension supported')
-  else
-    writeln('  ZBA extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZBB)<>0 then
-    writeln('ZBB extension supported')
-  else
-    writeln('  ZBB extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZBS)<>0 then
-    writeln('ZBS extension supported')
-  else
-    writeln('  ZBS extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZICBOZ)<>0 then
-    writeln('ZICBOZ extension supported')
-  else
-    writeln('  ZICBOZ extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZBC)<>0 then
-    writeln('ZBC extension supported')
-  else
-    writeln('  ZBC extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZBKB)<>0 then
-    writeln('ZBKB extension supported')
-  else
-    writeln('  ZBKB extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZBKC)<>0 then
-    writeln('ZBKC extension supported')
-  else
-    writeln('  ZBKC extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZBKX)<>0 then
-    writeln('ZBKX extension supported')
-  else
-    writeln('  ZBKX extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZKND)<>0 then
-    writeln('ZKND extension supported')
-  else
-    writeln('  ZKND extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZKNE)<>0 then
-    writeln('ZKNE extension supported')
-  else
-    writeln('  ZKNE extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZKNH)<>0 then
-    writeln('ZKNH extension supported')
-  else
-    writeln('  ZKNH extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZKSED)<>0 then
-    writeln('ZKSED extension supported')
-  else
-    writeln('  ZKSED extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZKSH)<>0 then
-    writeln('ZKSH extension supported')
-  else
-    writeln('  ZKSH extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZKT)<>0 then
-    writeln('ZKT extension supported')
-  else
-    writeln('  ZKT extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVBB)<>0 then
-    writeln('ZVBB extension supported')
-  else
-    writeln('  ZVBB extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVBC)<>0 then
-    writeln('ZVBC extension supported')
-  else
-    writeln('  ZVBC extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVKB)<>0 then
-    writeln('ZVKB extension supported')
-  else
-    writeln('  ZVKB extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVKG)<>0 then
-    writeln('ZVKG extension supported')
-  else
-    writeln('  ZVKG extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVKNED)<>0 then
-    writeln('ZVKNED extension supported')
-  else
-    writeln('  ZVKNED extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVKNHA)<>0 then
-    writeln('ZVKNHA extension supported')
-  else
-    writeln('  ZVKNHA extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVKNHB)<>0 then
-    writeln('ZVKNHB extension supported')
-  else
-    writeln('  ZVKNHB extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVKSED)<>0 then
-    writeln('ZVKSED extension supported')
-  else
-    writeln('  ZVKSED extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVKSH)<>0 then
-    writeln('ZVKSH extension supported')
-  else
-    writeln('  ZVKSH extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVKT)<>0 then
-    writeln('ZVKT extension supported')
-  else
-    writeln('  ZVKT extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZFH)<>0 then
-    writeln('ZFH extension supported')
-  else
-    writeln('  ZFH extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZFHMIN)<>0 then
-    writeln('ZFHMIN extension supported')
-  else
-    writeln('  ZFHMIN extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZIHINTNTL)<>0 then
-    writeln('ZIHINTNTL extension supported')
-  else
-    writeln('  ZIHINTNTL extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVFH)<>0 then
-    writeln('ZVFH extension supported')
-  else
-    writeln('  ZVFH extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVFHMIN)<>0 then
-    writeln('ZVFHMIN extension supported')
-  else
-    writeln('  ZVFHMIN extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZFA)<>0 then
-    writeln('ZFA extension supported')
-  else
-    writeln('  ZFA extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZTSO)<>0 then
-    writeln('ZTSO extension supported')
-  else
-    writeln('  ZTSO extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZACAS)<>0 then
-    writeln('ZACAS extension supported')
-  else
-    writeln('  ZACAS extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZICOND)<>0 then
-    writeln('ZICOND extension supported')
-  else
-    writeln('  ZICOND extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZIHINTPAUSE)<>0 then
-    writeln('ZIHINTPAUSE extension supported')
-  else
-    writeln('  ZIHINTPAUSE extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVE32X)<>0 then
-    writeln('ZVE32X extension supported')
-  else
-    writeln('  ZVE32X extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVE32F)<>0 then
-    writeln('ZVE32F extension supported')
-  else
-    writeln('  ZVE32F extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVE64X)<>0 then
-    writeln('ZVE64X extension supported')
-  else
-    writeln('  ZVE64X extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVE64F)<>0 then
-    writeln('ZVE64F extension supported')
-  else
-    writeln('  ZVE64F extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVE64D)<>0 then
-    writeln('ZVE64D extension supported')
-  else
-    writeln('  ZVE64D extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZIMOP)<>0 then
-    writeln('ZIMOP extension supported')
-  else
-    writeln('  ZIMOP extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZCA)<>0 then
-    writeln('ZCA extension supported')
-  else
-    writeln('  ZCA extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZCB)<>0 then
-    writeln('ZCB extension supported')
-  else
-    writeln('  ZCB extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZCD)<>0 then
-    writeln('ZCD extension supported')
-  else
-    writeln('  ZCD extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZCF)<>0 then
-    writeln('ZCF extension supported')
-  else
-    writeln('  ZCF extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZCMOP)<>0 then
-    writeln('ZCMOP extension supported')
-  else
-    writeln('  ZCMOP extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZAWRS)<>0 then
-    writeln('ZAWRS extension supported')
-  else
-    writeln('  ZAWRS extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_SUPM)<>0 then
-    writeln('SUPM extension supported')
-  else
-    writeln('  SUPM extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZFBFMIN)<>0 then
-    writeln('ZFBFMIN extension supported')
-  else
-    writeln('  ZFBFMIN extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVFBFMIN)<>0 then
-    writeln('ZVFBFMIN extension supported')
-  else
-    writeln('  ZVFBFMIN extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVFBFWMA)<>0 then
-    writeln('ZVFBFWMA extension supported')
-  else
-    writeln('  ZVFBFWMA extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVFBFMIN)<>0 then
-    writeln('ZVFBFMIN extension supported')
-  else
-    writeln('  ZVFBFMIN extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZVFBFWMA)<>0 then
-    writeln('ZVFBFWMA extension supported')
-  else
-    writeln('  ZVFBFWMA extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZICBOM)<>0 then
-    writeln('ZICBOM extension supported')
-  else
-    writeln('  ZICBOM extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZAAMO)<>0 then
-    writeln('ZAAMO extension supported')
-  else
-    writeln('  ZAAMO extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZALRSC)<>0 then
-    writeln('ZALRSC extension supported')
-  else
-    writeln('  ZALRSC extension not supported');
-
-  if (ariscv_hwprobe.value and RISCV_HWPROBE_EXT_ZABHA)<>0 then
-    writeln('ZABHA extension supported')
-  else
-    writeln('  ZABHA extension not supported');
+  ariscv_hwprobe.key := RISCV_HWPROBE_KEY_IMA_EXT_0;
+  riscv_hwprobe(@ariscv_hwprobe, 1, 0, nil, 0);
+  writeln('Raw key value returned by RISCV_HWPROBE_KEY_IMA_EXT_0: %',
+          Binstr(ariscv_hwprobe.value, 64));
+
+  { Check all extensions }
+  for i := Low(RISCV_EXTENSIONS) to High(RISCV_EXTENSIONS) do
+    CheckExtension(ariscv_hwprobe.value, RISCV_EXTENSIONS[i]);
+
+  { Verify all set bits are tested }
+  all_tested_bits := GetAllTestedBits;
+  untested_bits := ariscv_hwprobe.value and (not all_tested_bits);
+
+  if untested_bits <> 0 then
+  begin
+    writeln;
+    writeln('WARNING: The following bits are set but not tested:');
+    writeln('  Untested bits: %', Binstr(untested_bits, 64));
+  end
+  else
+  begin
+    writeln;
+    writeln('All set bits have been tested.');
+  end;
 end.