天道酬勤,学无止境

When to use ADOX instead of ADCX?

The only difference mentioned in the Intel instruction set reference is the usage of the overflow-flag instead of the carry-flag. When does one use ADOX instead of ADCX to perform an unsigned addition with a carry?

标签

评论

ADOX can be used when you don't want to overwrite the carry flag, like you've stored something like a rotation out.

However their main usage is to accelerate big-int arithmetics because now you can do two additions with carry in parallel in conjunction with mulx

From Intel's paper New Instructions Support Large Integer Arithmetic

ADCX/ADOX Instructions

The adcx and adox instructions are extensions of the adc instruction, designed to support two separate carry chains. They are defined as:

adcx dest/src1, src2
adox dest/src1, src2

Both instructions compute the sum of src1 and src2 plus a carry-in and generate an output sum dest and a carry-out. The difference between these two instructions is that adcx uses the CF flag for the carry in and carry out (leaving the OF flag unchanged), whereas the adox instruction uses the OF flag for the carry in and carry out (leaving the CF flag unchanged).

Related:

What is the difference between the ADC and ADCX instructions on ia32/ia64?

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 带有MSVC和ICC的_addcarry_u64和_addcarryx_u64(_addcarry_u64 and _addcarryx_u64 with MSVC and ICC)
    问题 MSVC和ICC都支持内在函数_addcarry_u64和_addcarryx_u64 。 根据英特尔的内部指南和白皮书,这些应该分别映射到adcx和adox 。 但是,通过查看生成的程序集,很明显它们分别映射到adc和adcx并且没有内部映射到adox 。 此外,告诉编译器在MSVC中使用/arch:AVX2启用AVX2或在Linux上通过ICC启用-march=core-avx2都没有什么区别。 我不确定如何通过MSVC和ICC启用ADX。 MSVC的文档列出_addcarryx_u64具有ADX技术的_addcarryx_u64 ,而_addcarry_u64没有列出技术。 但是,MSVC文档中有关这些内在函数的链接直接转到了Intel Intrinsic指南,该指南与MSVC自己的文档和生成的程序集相矛盾。 由此得出的结论是,英特尔的内部指南和白皮书是错误的。 从MSVC的意义上讲这是有意义的,因为它不允许进行内联汇编,它应该提供一种使用_addcarry_u64 adc的方式。 adcx和adox一大优点是它们可以在不同的标志(进位CF和溢出OF )上运行,并且允许两条独立的并行进位链。 但是,由于adox没有内在的特性, adox怎么可能? 使用ICC,至少有一个可以使用内联汇编,但是对于64位模式下的MSVC,这是不可能的。 微软和英特尔的文档
  • ia32/ia64上的ADC和ADCX指令有什么区别?(What is the difference between the ADC and ADCX instructions on ia32/ia64?)
    问题 我在ADCX Intel软件开发手册的时候遇到了ADCX指令,以前不知道的; 它的编码是66 0F 38 F6 。 它似乎与ADC指令几乎相同,那么在以下情况下为什么要使用ADCX : 它仅在现代 CPU 中受支持指令编码占用更多空间(4 个字节对ADC 1 个字节) 是否存在其他一些副作用或特殊情况,其中ADCX证明优于ADC ? 一定有一些很好的理由将其添加到指令库中。 回答1 这些指令用于加速大整数运算。 在这些指令之前,添加大量数字通常会产生如下所示的代码序列: add adc adc adc adc 这里要注意的重要部分是,如果加法的结果不适合机器字,进位标志将被设置并“结转”到下一个更高的机器字。 所有这些指令都相互依赖,因为它们会考虑之前的加法进位标志,并在执行后生成新的进位标志值。 由于 x86 处理器能够同时执行多条指令,这成为了一个巨大的瓶颈。 依赖链使处理器无法并行执行任何算术。 (为了在实践中正确,您会在 add/adc 序列之间找到加载和存储,但性能仍然受到进位依赖性的限制)。 为了改进这一点,英特尔通过重新解释溢出标志添加了第二个进位链。 adc指令有两个新闻变体: adcx和adox adcx与adc相同,只是它不再修改 OF(溢出)标志。 adox与adc相同,但它将进位信息存储在 OF 标志中。 它也不再修改进位标志。 正如您所看到的
  • adcx 和 adox 的测试用例(Test case for adcx and adox)
    问题 我正在测试 Intel ADX 添加进位和溢出添加到管道添加大整数。 我想看看预期的代码生成应该是什么样的。 从 _addcarry_u64 和 _addcarryx_u64 与 MSVC 和 ICC,我认为这将是一个合适的测试用例: #include <stdint.h> #include <x86intrin.h> #include "immintrin.h" int main(int argc, char* argv[]) { #define MAX_ARRAY 100 uint8_t c1 = 0, c2 = 0; uint64_t a[MAX_ARRAY]={0}, b[MAX_ARRAY]={0}, res[MAX_ARRAY]; for(unsigned int i=0; i< MAX_ARRAY; i++){ c1 = _addcarryx_u64(c1, res[i], a[i], (unsigned long long int*)&res[i]); c2 = _addcarryx_u64(c2, res[i], b[i], (unsigned long long int*)&res[i]); } return 0; } 当我使用-O3和-madx检查从 GCC 6.1 生成的代码时,它显示了序列化的addc 。 -O1和-O2产生类似的结果: main
  • Test case for adcx and adox
    I'm testing Intel ADX add with carry and add with overflow to pipeline adds on large integers. I'd like to see what expected code generation should look like. From _addcarry_u64 and _addcarryx_u64 with MSVC and ICC, I thought this would be a suitable test case: #include <stdint.h> #include <x86intrin.h> #include "immintrin.h" int main(int argc, char* argv[]) { #define MAX_ARRAY 100 uint8_t c1 = 0, c2 = 0; uint64_t a[MAX_ARRAY]={0}, b[MAX_ARRAY]={0}, res[MAX_ARRAY]; for(unsigned int i=0; i< MAX_ARRAY; i++){ c1 = _addcarryx_u64(c1, res[i], a[i], (unsigned long long int*)&res[i]); c2 = _addcarryx
  • _addcarry_u64 and _addcarryx_u64 with MSVC and ICC
    MSVC and ICC both support the intrinsics _addcarry_u64 and _addcarryx_u64. According to Intel's Intrinsic Guide and white paper these should map to adcx and adox respectively. However, by looking at the generated assembly it's clear they map to adc and adcx respectively and there is no intrinsic which maps to adox. Additionally, telling the compiler to enable AVX2 with /arch:AVX2 in MSVC or -march=core-avx2 with ICC on Linux makes no difference. I'm not sure how to enable ADX with MSVC and ICC. The documentation for MSVC lists _addcarryx_u64 with the technology of ADX whereas _addcarry_u64 has
  • multi-word addition using the carry flag
    GCC has 128-bit integers. Using these I can get the compiler to use the mul (or imul with only one operand) instructions. For example uint64_t x,y; unsigned __int128 z = (unsigned __int128)x*y; produces mul. I have used this to create a 128x128 to 256 function (see the end of this question, before the update, for code for that if you're interested). Now I want to do 256-bit addition and I have not found a way to get the compiler to use ADC except by using assembly. I could use an assembler but I want inline functions for efficiency. The compiler already produces an efficient 128x128 to 256
  • 使用进位标志进行多词加法(multi-word addition using the carry flag)
    问题 GCC具有128位整数。 使用这些,我可以使编译器使用mul (或只有一个操作数的imul )指令。 例如 uint64_t x,y; unsigned __int128 z = (unsigned __int128)x*y; 产mul 。 我已经使用它创建了一个128x128到256的函数(如果您有兴趣,请在更新之前查看问题末尾的代码)。 现在,我想进行256位加法ADC除了通过汇编,我还没有找到一种使编译器使用ADC的方法。 我可以使用汇编程序,但我希望使用内联函数以提高效率。 编译器已经产生了有效的128x128到256函数(由于我在这个问题开始时解释的原因),所以我不明白为什么还要在汇编中重写此函数(或编译器已经有效实现的任何其他函数)。 。 这是我想出的内联汇编函数: #define ADD256(X1, X2, X3, X4, Y1, Y2, Y3, Y4) \ __asm__ __volatile__ ( \ "addq %[v1], %[u1] \n" \ "adcq %[v2], %[u2] \n" \ "adcq %[v3], %[u3] \n" \ "adcq %[v4], %[u4] \n" \ : [u1] "+&r" (X1), [u2] "+&r" (X2), [u3] "+&r" (X3), [u4] "+&r" (X4) \ : [v1]
  • 128 乘除法的内函数(Intrinsics for 128 multiplication and division)
    问题 在 x86_64 中,我知道 mul 和 div opp 代码通过将低 64 位放在 rax 中并将高位放在 rdx 寄存器中来支持 128 个整数。 我在 intel 内在指南中寻找某种内在来做到这一点,但我找不到。 我正在编写一个大数字库,其中字长为 64 位。 现在我正在用这样的一个词进行除法。 int ubi_div_i64(ubigint_t* a, ubi_i64_t b, ubi_i64_t* rem) { if(b == 0) return UBI_MATH_ERR; ubi_i64_t r = 0; for(size_t i = a->used; i-- > 0;) { ubi_i64_t out; __asm__("\t" "div %[d] \n\t" : "=a"(out), "=d"(r) : "a"(a->data[i]), "d"(r), [d]"r"(b) : "cc"); a->data[i] = out; //ubi_i128_t top = (r << 64) + a->data[i]; //r = top % b; //a->data[i] = top / b; } if(rem) *rem = r; return ubi_strip_leading_zeros(a); } 如果我可以在 x86intrinsics.h
  • 为什么我的处理器没有内置 BigInt 支持?(Why doesn't my processor have built-in BigInt support?)
    问题 据我所知,BigInts 通常在大多数编程语言中实现为包含数字的数组,其中,例如:将其中的两个相加时,每个数字都会一个接一个地相加,就像我们在学校知道的那样,例如: 246 816 * * ---- 1062 其中 * 表示存在溢出。 我是在学校以这种方式学习的,并且我实现的所有 BigInt 添加函数的工作类似于上面的示例。 所以我们都知道我们的处理器只能本地管理从 0 到2^32 / 2^64整数。 这意味着大多数脚本语言为了成为高级语言并提供大整数算术,必须实现/使用 BigInt 库,这些库将整数作为数组处理,就像上面一样。 但这当然意味着它们将比处理器慢得多。 所以我问自己的是: 为什么我的处理器没有内置的 BigInt 函数? 它会像任何其他 BigInt 库一样工作,只是(很多)更快,并且级别较低:处理器从缓存/RAM 中获取一位数字,添加它,然后再次将结果写回。 对我来说似乎是个好主意,那么为什么没有这样的东西呢? 回答1 有太多的问题需要处理器处理大量不是它的工作的东西。 假设处理器确实具有该功能。 我们可以计算出一个系统,在该系统中我们知道给定的 BigInt 使用了多少字节——只需使用与大多数字符串库相同的原理并记录长度。 但是如果 BigInt 操作的结果超过了保留的空间量会发生什么? 有两种选择: 它会环绕在它确实拥有的空间内或它会使用更多的内存。
  • 用Clang的进位代码产生良好的加法(Producing good add with carry code from clang)
    问题 我正在尝试生成代码(当前使用clang ++-3.8),该代码将由多个机器字组成的两个数字相加。 为了简化当前的工作,我仅添加128位数字,但是我希望能够对此进行概括。 首先是一些typedef: typedef unsigned long long unsigned_word; typedef __uint128_t unsigned_128; 和“结果”类型: struct Result { unsigned_word lo; unsigned_word hi; }; 第一个函数f接受两对无符号字并返回结果,这是作为一个中间步骤,将这两个64位字都放入一个128位字中,然后再添加它们,如下所示: Result f (unsigned_word lo1, unsigned_word hi1, unsigned_word lo2, unsigned_word hi2) { Result x; unsigned_128 n1 = lo1 + (static_cast<unsigned_128>(hi1) << 64); unsigned_128 n2 = lo2 + (static_cast<unsigned_128>(hi2) << 64); unsigned_128 r1 = n1 + n2; x.lo = r1 & ((static_cast<unsigned_128>
  • 如何在 Delphi XE4 中使用 ADOX 组件?(How can I use ADOX components in Delphi XE4?)
    问题 我读了一篇写到 Delphi 6 的教程:要安装 ADOX 组件,请从主菜单 Project\Add type Library 菜单项中选择。 但是在 Delphi XE4 中没有这样的菜单项。 如何在 Delphi XE4 中安装/使用 ADOX 组件以编程方式创建一个空的 mdb 数据库? 或者有没有其他方法可以在没有 ADOX 的情况下创建它? 回答1 您可以在不导入类型库的情况下使用后期绑定,例如: uses ComObj; procedure CreateNewMDB(const FileName: WideString); var AdoX: OleVariant; begin AdoX := CreateOleObject('ADOX.Catalog'); AdoX.Create('Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;Data Source=' + FileName); end; 如果这就是你所需要的,我认为导入 ADOX 类型库的努力是不值得的。 回答2 Add type library是旧版 Delphi 中的一个选项。 在更现代的版本中,请转至Component > Import Component ,其中可以选择Import a Type Library 。
  • 在 64 位 x 64 位乘法中使用唐叶算法真的有效吗?(Is it really efficient to use Karatsuba algorithm in 64-bit x 64-bit multiplication?)
    问题 我在 AVX2 上工作,需要计算 64 位 x64 位 -> 128 位加宽乘法,并以最快的方式获得 64 位高部分。 既然AVX2没有这样的指令,那么我用唐叶算法来提高效率和提速合理吗? 回答1 不是。在现代体系结构中,Karatsuba 击败教科书乘法的交叉点通常介于 8 到 24 个机器字之间(例如,在 x86_64 上介于 512 到 1536 位之间)。 对于固定大小,阈值位于该范围的较小端,新的 ADCX/ADOX 指令可能会将其进一步引入标量代码,但 64x64 仍然太小,无法从 Karatsuba 中受益。 回答2 AVX2 不太可能击败在一条指令中执行 64bx64b 到 128b 的 mulx 指令。 有一个例外,我知道使用浮点 FFT 的大乘法。 但是,如果您不需要完全 64bx64b 到 128b,您可以考虑使用双倍算术将 53bx53b 到 106b。 将四个 53 位数字a和b相乘得到四个 106 位数字只需要两条指令: __m256 p = _mm256_mul_pd(a,b); __m256 e = _mm256_fmsub_pd(a,b,p); 与使用mulx一条指令中的一个 128 位数字相比,这在两条指令中给出了四个 106 位数字。 回答3 不尝试就很难判断,但是使用 AMD64 MUL 指令可能会更快,该指令支持 64x64=128
  • 实用的BigNum AVX / SSE可行吗?(practical BigNum AVX/SSE possible?)
    问题 SSE / AVX寄存器可以视为整数或浮点数BigNum。 也就是说,可以忽略根本存在车道。 是否存在一种简单的方法来利用这种观点并将这些寄存器单独或组合用作BigNum? 我问,因为从我对BigNum库的了解很少,它们几乎普遍地在数组上而不是在SSE / AVX寄存器上存储和进行算术运算。 可移植性? 例子: 假设您将SSE寄存器的内容作为键存储在std::set ,则可以将这些内容作为BigNum进行比较。 回答1 我认为使用SIMD高效地实现BigNum可能是可行的,但并非您建议的那样。 而不是使用SIMD寄存器(或SIMD寄存器数组)实现单个BigNum,您应该一次处理多个BigNum。 让我们考虑一下128位加法。 让128位整数由一对高和低64位值定义,并假设我们想将128位整数(y_low, y_high)到128位整数(x_low, x_high) 。 对于标量64位寄存器,这仅需要两条指令 add rax, rdi // x_low += y_low; adc rdx, rsi // x_high += y_high + (x_low < y_low); 正如其他人所解释的那样,使用SSE / AVX时,问题在于没有SIMD进位标志。 必须先计算进位标志,然后再添加。 这需要64位无符号比较。 SSE唯一可行的选择是来自AMD XOP指令vpcomgtuq
  • Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?
    LOOP (Intel ref manual entry) decrements ecx / rcx, and then jumps if non-zero. It's slow, but couldn't Intel have cheaply made it fast? dec/jnz already macro-fuses into a single uop on Sandybridge-family; the only difference being that that sets flags. loop on various microarchitectures, from Agner Fog's instruction tables: K8/K10: 7 m-ops Bulldozer-family/Ryzen: 1 m-op (same cost as macro-fused test-and-branch, or jecxz) P4: 4 uops (same as jecxz) P6 (PII/PIII): 8 uops Pentium M, Core2: 11 uops Nehalem: 6 uops. (11 for loope / loopne). Throughput = 4c (loop) or 7c (loope/ne). SnB-family: 7
  • 如何以编程方式将链接表复制到Ms Access中的本地表?(How to copy a linked table to a local table in Ms Access programmatically?)
    问题 因此,我想在MS Access 2003中将链接表的代码,结构和数据复制到本地表中。 代码为:VBA或C#。 或其他与此有关的问题。 更新:我希望从ms访问的副本结构和数据行为保持主键。 如果复制链接表,则可以选择将其粘贴为“结构和数据(本地表)”,这是我想在代码中实现的。 回答1 我的理解是DAO不支持十进制数据类型,但ADOX支持。 这是一个更新的过程,该过程使用ADOX代替将架构复制到新表中。 需要注意的一个有趣事项:Jet的OLEDB提供程序按字母顺序对列进行排序,而不是按此KB文章中说明的顺序排列。 我并不关心保留顺序位置,但是您可能会保留,在这种情况下,您可以更新此过程以满足您的需求。 为了使代码的ADOX版本起作用,您需要设置对Microsoft ADO Ext的引用。 2.x用于DDL和安全性(其中x =版本号;我使用2.8来测试此过程)。 您还需要对ADO的引用。 Public Sub CopySchemaAndData_ADOX(ByVal sourceTableName As String, ByVal destinationTableName As String) On Error GoTo Err_Handler Dim cn As ADODB.Connection Dim cat As ADOX.Catalog Dim sourceTable As
  • 基于AT32(STM32)单片机的模块化代码之——ADC代码模块化
    基于AT32(STM32)单片机的模块化代码之——ADC代码模块化 1.环境介绍 平台:AT32F415单片机,雅特力公司的AT32系列单片机其实跟STM32系列单片机大同小异,包括库函数等基本都是一样的,所以这款代码无论是AT32还是STM32都是适用的。 开发环境:MDK V5 for arm 简介:在实际的项目开发中,经常会用到多路ADC检测,所以特意在32的库函数之上做了2次封装,形成一个模块化的代码,以便于下次项目便捷开发 2.代码模块化思路 2.1在adc.h文件中枚举用到的adc通道 typedef enum { ADC1_CHAN2, ADC1_CHAN4, ADC1_CHAN1, ADC1_CHAN5, ADC1_CHAN11, ADC1_CHAN10, NUM_ADC1CHN }ENUM_ADC1CHN; typedef enum { //如果有用到ADC2的检测通道,在后面添加枚举类型变量即可 ADC2_CHAN1=NUM_ADC1CHN, //... //.. NUM_ADCCHN }ENUM_ADC2CHN; #define NUM_ADC2CHN (NUM_ADCCHN-NUM_ADC1CHN) #if(NUM_ADC2CHN) #define NUM_ADC 2 #else #define NUM_ADC 1 #endif
  • STM32—ADC详解
    文章目录 一.ADC简介二.ADC功能框图讲解1.电压输入范围2.输入通道3.转换顺序4.触发源5.转换时间6.数据寄存器7.中断8.电压转换 三.初始化结构体四.单通道电压采集1.头文件2.引脚配置函数3.NVIC配置函数4.ADC配置函数5.中断函数6.主函数 一.ADC简介 STM32f103系列有3个ADC,精度为12位,每个ADC最多有16个外部通道。其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次、连续、扫描或间断执行,ADC转换的结果可以左对齐或右对齐储存在16位数据寄存器中。ADC的输入时钟不得超过14MHz,其时钟频率由PCLK2分频产生。 二.ADC功能框图讲解 学习STM32开发板上的外设时首先要了解其外设的功能框图,如下: 功能框图可以大体分为7部分,下面一一讲解: 1.电压输入范围 ADC所能测量的电压范围就是VREF- ≤ VIN ≤ VREF+,把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的输入电压范围为: 0~3.3V。 2.输入通道 ADC的信号输入就是通过通道来实现的,信号通过通道输入到单片机中,单片机经过转换后,将模拟信号输出为数字信号。STM32中的ADC有着18个通道,其中外部的16个通道已经在框图中标出,如下: 这16个通道对应着不同的IO口
  • STM32的ADC实验的原理简介
    STM32的ADC实验的原理简介 ADC简介 Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 STM32的ADC的配置 战舰V3开发板的ADC通道与引脚的对应关系 模拟量输入的范围(ADC正常工作的范围) STM32F103ZET6芯片中的电源部分(VREF与VSSA): 我们看到Vref-连接到了GND,而VREF+通过跳线帽连接到了VDD(VDD连接到了开发板的3.3V供电电源上),因此我们的DAC通道正常工作的模拟量输入范围为(2.4V,3.3V)。 ADC工作逻辑图解析(以ADC通道1为例) ADC中断的三种类型 注入通道与规则通道的区别 STM32 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。 假如你在家里的院子内放了5个温度探头,室内放了3个温度探头;你需要时刻监视室外温度即可,但偶尔你想看看室内的温度;因此你可以使用规则通道组 循环扫描室外的5个探头并显示AD转换结果,当你想看室内温度时,通过一个按钮启动注入转换组(3个室内探头
  • 2021-05-5 ADC基本原理
    ADC基本原理—M3 STM32 ADC 寄存器和库函数配置 1.1 ADC: Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。 1.2 STM32F10x ADC特点: · 12位逐次逼近型的模拟数字转换器; · 最多带3个ADC控制器,可以单独使用,也可以使用双重模式提高采样率; · 最多支持23个通道,可最多测量21个外部和2个内部信号源; · 支持单次和连续转换模式; · 转换结束,注入转换结束,和发生模拟看门狗事件时产生中断; · 通道0到通道n的自动扫描模式; · 自动校准; · 采样间隔可以按通道编程; · 规则通道和注入通道均有外部触发选项; · 转换结果支持左对齐或右对齐方式存储在16位数据寄存器; · ADC转换时间:最大转换速率 1us(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到); · ADC供电要求:2.4V-3.6V;(通常是0~3.3v) · ADC输入范围:VREF- ≤ VIN ≤ VREF+ 1.3 STM32F10x大容量芯片带3个ADC控制器 其中144脚芯片因为带PF脚,所以多5个通道,为21个外部通道。
  • 创建一个超链接类型的字段的MS Access SQL语法是什么?(What is the MS Access SQL syntax to create a field of type Hyperlink?)
    问题 我正在使用C#项目,该项目使用System.Data.OleDb.OleDbCommand类在MS Access DB中创建和更改表。 我生成SQL语句,将其传递给对象,然后调用ExecuteNonQuery函数。 我能够找出正确的MS Access SQL语法来创建以下Access数据类型的列: AutoNumber: ALTER TABLE table-name ADD COLUMN column-name COUNTER|AUTOINCREMENT Currency: ALTER TABLE table-name ADD COLUMN column-name MONEY Date/Time: ALTER TABLE table-name ADD COLUMN column-name DATE Memo: ALTER TABLE table-name ADD COLUMN column-name MEMO|TEXT Number: ALTER TABLE table-name ADD COLUMN column-name NUMBER OLE Object: ALTER TABLE table-name ADD COLUMN column-name OLEOBJECT Text: ALTER TABLE table-name ADD COLUMN column-name