小编And*_* S.的帖子

编写相当于mul/imul的VOP

因此, mul 和 imul 指令都将机器字相乘,并将结果和溢出都存储在某些寄存器中(例如参见https://c9x.me/x86/html/file_module_x86_id_210.html)。我正在尝试编写一个可以完全使用此信息并返回 2 个值的 vop。这可能吗?我找不到有关如何使 vop 返回多个值的任何信息。如果有人可以展示整个事情的样子,我也会很感激。

编辑:所以我想出了一些东西,但它仍然不够好。我会把它贴在这里,然后解释问题。

(defpackage #:fixmul
  (:use #:CL)
  (:export #:fixmul))

(in-package #:fixmul)


(sb-c:defknown fixmul (fixnum fixnum) (values fixnum fixnum &optional)
    (sb-c:foldable sb-c:flushable sb-c:movable)
  :overwrite-fndb-silently t)

(in-package #:sb-vm)

(define-vop (fixmul:fixmul)
  (:policy :fast-safe)
  (:translate fixmul:fixmul)
  (:args (x :scs (signed-reg) :target eax)
         (y :scs (signed-reg signed-stack)))
  (:arg-types fixnum fixnum)
  (:args-var args)
  (:temporary (:sc signed-reg :offset eax-offset :target quo
               :from (:argument 0) :to (:result 0)) eax)
  (:temporary (:sc signed-reg :offset edx-offset :target rem
               :from (:argument …
Run Code Online (Sandbox Code Playgroud)

x86 assembly sbcl common-lisp compiler-optimization

6
推荐指数
1
解决办法
150
查看次数

Lisp中的哈希表类型

我发现,在CL哈希表中有一个类型HASH-TABLE(令人惊讶).但是,矢量可以只是矢量,但也可以进一步指定为(矢量编号12).

散列表似乎很自然地有一个列表类型,比如,(hash-table number cons)或者其他东西,但它似乎不起作用,我找不到任何对它的引用.有什么建议?

lisp types hashtable common-lisp

4
推荐指数
1
解决办法
103
查看次数

_mm_movemask_epi8 的内在逆

首先我将描述该任务:

我需要:

  1. 比较两个__m128i
  2. 以某种方式对结果进行按位与某个uint16_t值(可能使用_mm_movemask_epi8先然后只是&)。
  3. 根据blend结果​​计算初始值。

所以问题是,正如您可能已经猜到的那样,混合接受__m128i作为掩模,而我将拥有uint16_t. 因此,我要么需要某种反向指令,_mm_movemask_epi8要么完全做其他事情。

有些观点——我可能无法将该uint16_t值更改为其他类型,这很复杂;我在 SSE4.2 上这样做,所以没有 AVX;这里有一个类似的问题How to Perform the inverse of _mm256_movemask_epi8 (VPMOVMSKB)? 但这是关于 avx 的,我对此非常缺乏经验,所以我无法采用该解决方案。

PS:我可能也需要为手臂做这件事,希望得到任何建议。

c x86 sse simd sse4

3
推荐指数
1
解决办法
734
查看次数

SBCL中的Make-array

如何make-array在SBCL工作?在C++中是否有一些等价物newdelete运算符,或者它是否是其他东西,也许是汇编程度?

我偷看了源头,却什么都不懂.

lisp compilation common-lisp vm-implementation

2
推荐指数
1
解决办法
132
查看次数

变量不在范围内:a

我试图做一个简单的合并排序功能.几乎完成了代码,但是:

m_sort :: (Ord a) => [a] -> [a]
m_sort d
     | d == [] = []
     | d == [a] = [a]
     | otherwise = merge (m_sort (fst $ split d)) (m_sort (snd $ split d))
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我得到了Haskell_training.hs:137:21: error: Variable not in scope: a.排除| d == [a] = [a]导致好的编译,但没有它就无法工作.我没有看到模式匹配有一些非常明显的问题吗?

mergesort haskell scope pattern-matching

1
推荐指数
1
解决办法
548
查看次数

DEFSETF 的用途

从标准描述中很难理解,所以:

例如,我试图将某个列表 (ls) 的第 k 个位置设置为特定值。甚至有我自己的功能,可以访问第 k 个 elt。

(defun kth-elt (lst k)
 (cond ((> 0 k) nil)
  ((equal 0 k) (car lst))
  ((< 0 k) (kth-elt (cdr lst) (- k 1))))).
Run Code Online (Sandbox Code Playgroud)

还创建了一个函数来更新该值。

 (defun kth-upd (lst k new)
  (cond ((> 0 k) nil)
    ((equal 0 k) (setf  (car lst) new))
    ((< 0 k) (kth-upd (cdr lst) (- k 1) new))))
Run Code Online (Sandbox Code Playgroud)

现在我实际上可以使用它,但我想了解它和 DEFSETF 之间的区别。另外我还是不明白。如何“教”defsetf 使用这些。谢谢帮助。

lisp common-lisp

1
推荐指数
1
解决办法
526
查看次数

类访问器的宏

我正在尝试编写一个宏,它会自动为所有插槽写一个类的加速器.我想出了这个

(defmacro defacc (class)
  (loop for name in (mapcar #'slot-definition-name
                            (class-slots (class-of (make-instance `,class))))
       do
       `(defun ,name (,class)
          (slot-value ,class ',name))))
Run Code Online (Sandbox Code Playgroud)

但它并没有定义任何功能(无环,它适用于单功能和单插槽名字.我不明白其中S的问题.我也试过(class-of (make-instance 'class))(class-of ',class),似乎仍然没有作用.

PS我没有忘记实际用我的类写这个宏.

lisp common-lisp

1
推荐指数
1
解决办法
92
查看次数

Lisp gethash的复杂性

功能的时间复杂度是gethash多少?例如,在用于map搜索的c ++中O(log(n)),虽然unordered_map它是O(1).这两件事都是用描述写的,但我gethash在Lisp中找不到任何这样的参考.

实际上,这扩展到所有标准库函数.哪里可以找到它们的复杂性,或者我可以吗?谈论sbcl,如果重要的话.

lisp algorithm hashtable common-lisp

1
推荐指数
1
解决办法
145
查看次数

具有更高级别功能的lisp中的二进制搜索

我正在尝试编写一个(更高阶函数),它接受一个向量和一个函数,并根据该函数进行二进制搜索,即如果它返回-1,我们需要更低,为1 - 更高,为0我们找到了合适的地方.我想出了类似的东西,但似乎我把函数作为参数传递出错了:

(defun bin-search (ls fpred)
 (let ((l (length ls))
       (x (aref ls (floor (length ls) 2))))
       (labels (binsearch (ls fpred l m)
                (case (funcall #'fpred (aref ls m))
                 (-1 (binsearch (ls fpred l (floor (- m l) 2))))
                 (0 (return-from binsearch m))
                 (1 (binsearch (ls fpred m (+ m (floor (- m l) 2)))))))
 (binsearch ls fpred 0 l))))
Run Code Online (Sandbox Code Playgroud)

编译器说变量FPRED已定义但从未使用过.怎么了?

lisp common-lisp binary-search

1
推荐指数
1
解决办法
255
查看次数

在lisp中访问数组的优化

我正在尝试学习如何在lisp中进行类型声明.我发现aref导致问题:

(defun getref (seq k)
  (declare (optimize (speed 3) (safety 0)))
  (declare (type (vector fixnum *) seq) (type fixnum k))
  (aref seq k))
Run Code Online (Sandbox Code Playgroud)

编译,它说:

; in: DEFUN GETREF
;     (AREF MORE-LISP::SEQ MORE-LISP::K)
; ==>
;   (SB-KERNEL:HAIRY-DATA-VECTOR-REF ARRAY SB-INT:INDEX)
; 
; note: unable to
;   avoid runtime dispatch on array element type
; due to type uncertainty:
;   The first argument is a (VECTOR FIXNUM), not a SIMPLE-ARRAY.
; 
; compilation unit finished
;   printed 1 note
Run Code Online (Sandbox Code Playgroud)

所以在其他所有函数中,我想使用aref(而且我这样做,因为我需要可调整的向量),这也会发生.我如何解决它?

lisp optimization sbcl common-lisp

1
推荐指数
2
解决办法
176
查看次数

Lisp,向后迭代

有没有办法(使用循环或迭代,无关紧要)向后迭代序列?

除了(loop for i downfrom 10 to 1 by 1 do (print i))使用索引,需要长度,或(loop for elt in (reverse seq))需要反转序列(甚至比第一个选项更糟糕).

lisp iteration common-lisp

0
推荐指数
1
解决办法
309
查看次数