Section courante

A propos

Section administrative du site

Assembleur 80x86

CRC32

Nehalem+, SSE4.2 Accumulate CRC32 Value

Syntaxe

CRC32 dest,source

Description

Cette instruction débute avec une valeur initiale dans l'opérande de destination, accumule une valeur de code CRC-32 (polynomial de 11EDC6F41h) dans l'opérande source et enregistre le résultat dans l'opérande de destination.

Algorithme

MODULE BIT_REFLECT64
   dest(63...0) ← source(0...63)

MODULE MODULE BIT_REFLECT32
   dest(31...0) ← source(0...31)

MODULE BIT_REFLECT16
   dest(15...0) ← source(0...15)

MODULE BIT_REFLECT8
   dest(7...0) ← source(0...7)

MODULE CRC32(dest,source)
   SI taille de l'opérande source = 64 bits ET taille de l'opérande de destination = 64 bits ALORS
      TEMP1(63...0) ← BIT_REFLECT64 (source(63...0))
      TEMP2(31...0) ← BIT_REFLECT32 (dest(31...0))
      TEMP3(95...0) ← TEMP1(63...0) << 32
      TEMP4(95...0) ← TEMP2(31...0) << 64
      TEMP5(95...0) ← TEMP3(95...0) XOR TEMP4(95...0)
      TEMP6(31...0) ← TEMP5(95...0) MOD2 11EDC6F41h
      dest(31...0) ← BIT_REFLECT (TEMP6(31...0))
      dest(63...32) ← 00000000h
   SINON SI taille de l'opérande source = 32 bits ET taille de l'opérande de destination = 32 bits ALORS
      TEMP1(31...0) ← BIT_REFLECT32 (source(31...0))
      TEMP2(31...0) ← BIT_REFLECT32 (dest(31...0))
      TEMP3(63...0) ← TEMP1(31...0) << 32
      TEMP4(63...0) ← TEMP2(31...0) << 32
      TEMP5(63...0) ← TEMP3(63...0) XOR TEMP4(63..0)
      TEMP6(31...0) ← TEMP5(63...0) MOD2 11EDC6F41h
      dest(31...0) ← BIT_REFLECT (TEMP6(31..0))
   SINON SI taille de l'opérande source = 16 bits ET taille de l'opérande de destination = 32 bits ALORS
      TEMP1(15...0) ← BIT_REFLECT16 (source(15...0))
      TEMP2(31...0) ← BIT_REFLECT32 (dest(31...0))
      TEMP3(47...0) ← TEMP1(15...0) << 32
      TEMP4(47...0) ← TEMP2(31...0) << 16
      TEMP5(47...0) ← TEMP3(47...0) XOR TEMP4(47...0)
      TEMP6(31...0) ← TEMP5(47...0) MOD2 11EDC6F41h
      dest(31...0) ← BIT_REFLECT (TEMP6(31...0))
   SINON SI taille de l'opérande source = 8 bits ET taille de l'opérande de destination = 64 bits ALORS
      TEMP1(7...0) ← BIT_REFLECT8(source(7...0))
      TEMP2(31...0) ← BIT_REFLECT32 (dest(31...0))
      TEMP3(39...0) ← TEMP1(7...0) << 32
      TEMP4(39...0) ← TEMP2(31...0) << 8
      TEMP5(39...0) ← TEMP3(39...0) XOR TEMP4(39...0)
      TEMP6(31...0) ← TEMP5(39...0) MOD2 11EDC6F41h
      dest(31...0) ← BIT_REFLECT (TEMP6(31...0))
      dest(63...32) ← 00000000h
   SINON SI taille de l'opérande source = 8 bits ET taille de l'opérande de destination = 32 bits ALORS
      TEMP1(7...0) ← BIT_REFLECT8(source(7...0))
      TEMP2(31...0) ← BIT_REFLECT32 (dest(31...0))
      TEMP3(39...0) ← TEMP1(7...0) << 32
      TEMP4(39...0) ← TEMP2(31...0) << 8
      TEMP5(39...0) ← TEMP3(39...0) XOR TEMP4(39...0)
      TEMP6(31...0) ← TEMP5(39...0) MOD2 11EDC6F41h
      dest(31...0) ← BIT_REFLECT (TEMP6(31...0))
   FIN SI

Mnémonique

Instruction Opcode Description
CRC32 r32, r/m8 F2h 0Fh 38h F0h /r Cette instruction débute avec une valeur initiale dans l'opérande de destination, accumule une valeur de code CRC-32 (polynomial de 11EDC6F41h) dans l'opérande source et enregistre le résultat dans l'opérande de destination.
CRC32 r32, r/m8 F2h REX 0Fh 38h F0h /r Cette instruction débute avec une valeur initiale dans l'opérande de destination, accumule une valeur de code CRC-32 (polynomial de 11EDC6F41h) dans l'opérande source et enregistre le résultat dans l'opérande de destination.
CRC32 r32, r/m16 F2h 0Fh 38h F1h /r Cette instruction débute avec une valeur initiale dans l'opérande de destination, accumule une valeur de code CRC-32 (polynomial de 11EDC6F41h) dans l'opérande source et enregistre le résultat dans l'opérande de destination.
CRC32 r32, r/m32 F2h 0Fh 38h F1h /r Cette instruction débute avec une valeur initiale dans l'opérande de destination, accumule une valeur de code CRC-32 (polynomial de 11EDC6F41h) dans l'opérande source et enregistre le résultat dans l'opérande de destination.
CRC32 r64, r/m8 F2h REX.W 0Fh 38h F0h /r Cette instruction débute avec une valeur initiale dans l'opérande de destination, accumule une valeur de code CRC-32 (polynomial de 11EDC6F41h) dans l'opérande source et enregistre le résultat dans l'opérande de destination.
CRC32 r64, r/m64 F2h REX.W 0Fh 38h F1h /r Cette instruction débute avec une valeur initiale dans l'opérande de destination, accumule une valeur de code CRC-32 (polynomial de 11EDC6F41h) dans l'opérande source et enregistre le résultat dans l'opérande de destination.

Références

Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M, Edition Intel, Mars 2010, Publication No. 253666-034US, page 280 à 283.

Dernière mise à jour : Samedi, le 2 août 2014